Browse Source

Change improve speed of backlog overview.

Fix the missing snatched low quality on backlog overview.
Fix print trace to webinterface.
Change tweak performance of async call.
Change make backlog_overview variable names pythonic.
pull/1289/head
Prinz23 5 years ago
committed by JackDandy
parent
commit
b61438d6a9
  1. 3
      CHANGES.md
  2. 57
      gui/slick/interfaces/default/manage_backlogOverview.tmpl
  3. 5
      sickbeard/common.py
  4. 6
      sickbeard/helpers.py
  5. 4
      sickbeard/tv.py
  6. 91
      sickbeard/webserve.py

3
CHANGES.md

@ -2,6 +2,9 @@
* Add menu Shows/"Metacritic Cards"
* Change make web UI calls async so that, for example, process media will not block page requests
* Change improve speed of backlog overview
* Fix the missing snatched low quality on backlog overview
* Fix print trace to webinterface
* Fix creating show list when there is no list at the cycle of backlog search spread
* Change improve Python performance of handling core objects
* Change improve performance for find_show_by_id

57
gui/slick/interfaces/default/manage_backlogOverview.tmpl

@ -25,7 +25,7 @@
});
#set $fuzzydate = 'airdate'
#if $sickbeard.FUZZY_DATING:
#if $sickbeard.FUZZY_DATING
fuzzyMoment({
containerClass: '.${fuzzydate}',
dateHasTime: !1,
@ -46,27 +46,27 @@
<h1 class="title">$title</h1>
#end if
##
#set $totalWanted = 0
#set $totalQual = 0
#set $total_wanted = 0
#set $total_qual = 0
#for $cur_show_obj in $sickbeard.showList
#set $totalWanted += $showCounts[$cur_show_obj.tvid_prodid][$Overview.WANTED]
#set $totalQual += $showCounts[$cur_show_obj.tvid_prodid][$Overview.QUAL]
#set $total_wanted += $show_counts[$cur_show_obj.tvid_prodid][$Overview.WANTED]
#set $total_qual += $show_counts[$cur_show_obj.tvid_prodid][$Overview.QUAL]
#end for
##
<div class="h2footer pull-right">
<span class="listing-key wanted">Wanted: <b>$totalWanted</b></span>
<span class="listing-key qual">Low Quality: <b>$totalQual</b></span>
<span class="listing-key wanted">Wanted: <b>$total_wanted</b></span>
<span class="listing-key qual">Low Quality: <b>$total_qual</b></span>
</div>
<br/>
#if not $totalWanted
#if not $total_wanted
<h3>no shows require a <span class="grey-text">backlog search</span></h3>
#else
<div class="pull-left">
Jump to Show
<select id="pickShow" class="form-control form-control-inline input-sm">
#for $cur_show_obj in sorted($sickbeard.showList, key = operator.attrgetter('name')):
#if 0 != $showCounts[$cur_show_obj.tvid_prodid][$Overview.QUAL] + $showCounts[$cur_show_obj.tvid_prodid][$Overview.WANTED]:
#for $cur_show_obj in sorted($sickbeard.showList, key = operator.attrgetter('name'))
#if 0 != $show_counts[$cur_show_obj.tvid_prodid][$Overview.QUAL] + $show_counts[$cur_show_obj.tvid_prodid][$Overview.WANTED]
<option value="$cur_show_obj.tvid_prodid">$cur_show_obj.name</option>
#end if
#end for
@ -75,9 +75,9 @@
#end if
<table class="sickbeardTable" border="0">
#for $cur_show_obj in sorted($sickbeard.showList, key = operator.attrgetter('name')):
#for $cur_show_obj in sorted($sickbeard.showList, key = operator.attrgetter('name'))
##
#if 0 == $showCounts[$cur_show_obj.tvid_prodid][$Overview.QUAL] + $showCounts[$cur_show_obj.tvid_prodid][$Overview.WANTED]:
#if 0 == $show_counts[$cur_show_obj.tvid_prodid][$Overview.QUAL] + $show_counts[$cur_show_obj.tvid_prodid][$Overview.WANTED]
#continue
#end if
@ -85,10 +85,10 @@
<td colspan="3" class="text-left">
<br/>
<h2><a href="$sbRoot/home/view-show?tvid_prodid=$cur_show_obj.tvid_prodid">$cur_show_obj.name</a></h2>
#if not $cur_show_obj.paused and not $backlog_active_providers:
#if not $cur_show_obj.paused and not $backlog_active_providers
#set $text = 'Enable allow active searching for one or more providers at config media providers'
#for ($tag_class, $sub) in (
('grey-text', 'Enable'), ('grey-text', 'for one or more providers at config')):
('grey-text', 'Enable'), ('grey-text', 'for one or more providers at config'))
#set $text = $text.replace($sub, '<span class="%s">%s</span>' % ($tag_class, $sub))
#end for
#set $sub = 'media providers'
@ -97,9 +97,9 @@
<span style="position:relative;float:right;margin-top:-48px;text-align:right;"><i class="img-warning-16"></i>$text</span>
#end if
<div class="pull-right">
<span class="listing-key wanted">Wanted: <b>$showCounts[$cur_show_obj.tvid_prodid][$Overview.WANTED]</b></span>
<span class="listing-key qual">Low Quality: <b>$showCounts[$cur_show_obj.tvid_prodid][$Overview.QUAL]</b></span>
#if not $cur_show_obj.paused:
<span class="listing-key wanted">Wanted: <b>$show_counts[$cur_show_obj.tvid_prodid][$Overview.WANTED]</b></span>
<span class="listing-key qual">Low Quality: <b>$show_counts[$cur_show_obj.tvid_prodid][$Overview.QUAL]</b></span>
#if not $cur_show_obj.paused
<a class="btn btn-inline forceBacklog #if not $backlog_active_providers# disabled#end if#" href="$sbRoot/manage/backlog-show?tvid_prodid=$cur_show_obj.tvid_prodid"><i class="sgicon-play"></i> Force Backlog</a>
#else
<span class="quality SD btn-inline forceBacklog" style="padding:4px 10px; margin-bottom:1px"><i class="sgicon-pause"></i> Paused</span>
@ -110,20 +110,25 @@
<tr class="seasoncols"><th style="width:10%">Episode</th><th class="text-left">Name</th><th class="text-nowrap">Airdate</th></tr>
##
#for $curResult in $showSQLResults[$cur_show_obj.tvid_prodid]:
#set $whichStr = '%sx%s' % ($str($curResult['season']), $str($curResult['episode']))
#try:
#set $overview = $showCats[$cur_show_obj.tvid_prodid][$whichStr]
#for $cur_result in $ep_sql_results[$cur_show_obj.tvid_prodid]
#set $which_idx = '%sx%s' % ($cur_result['season'], $cur_result['episode'])
#try
#set $which_str = '%s x %02d' % ($cur_result['season'], $cur_result['episode'])
#except Exception
#set $which_str = '%s x %s' % ($cur_result['season'], $cur_result['episode'])
#end try
#try
#set $overview = $show_cats[$cur_show_obj.tvid_prodid][$which_idx]
#except Exception
#continue
#end try
##
#if $overview in ($Overview.QUAL, $Overview.WANTED)
#if $cur_result['backlog']
#
<tr class="seasonstyle $Overview.overviewStrings[$showCats[$cur_show_obj.tvid_prodid][$whichStr]]">
<td>$whichStr</td>
<td class="text-left">$curResult['name']</td>
<td class="text-nowrap"><div class="${fuzzydate}">#if 1 == int($curResult['airdate']) then 'never' else $SGDatetime.sbfdate($SGDatetime.convert_to_setting($network_timezones.parse_date_time($curResult['airdate'], $cur_show_obj.airs, $cur_show_obj.network)))#</div></td>
<tr class="seasonstyle $Overview.overviewStrings[$show_cats[$cur_show_obj.tvid_prodid][$which_idx]]">
<td>$which_str</td>
<td class="text-left">$cur_result['name']</td>
<td class="text-nowrap"><div class="${fuzzydate}">#if 1 == int($cur_result['airdate']) then 'never' else $SGDatetime.sbfdate($SGDatetime.convert_to_setting($network_timezones.parse_date_time($cur_result['airdate'], $cur_show_obj.airs, $cur_show_obj.network)))#</div></td>
</tr>
#
#end if

5
sickbeard/common.py

@ -636,13 +636,16 @@ class Overview(object):
# For both snatched statuses. Note: SNATCHED/QUAL have same value and break dict.
SNATCHED = SNATCHED_PROPER = SNATCHED_BEST # 9
SNATCHED_QUAL = 15
overviewStrings = {UNKNOWN: 'unknown',
SKIPPED: 'skipped',
WANTED: 'wanted',
QUAL: 'qual',
GOOD: 'good',
UNAIRED: 'unaired',
SNATCHED: 'snatched'}
SNATCHED: 'snatched',
SNATCHED_QUAL: 'snatched/qual'}
countryList = {'Australia': 'AU',

6
sickbeard/helpers.py

@ -1732,7 +1732,7 @@ def path_mapper(search, replace, subject):
return result, result != subject
def get_overview(ep_status, show_quality, upgrade_once):
def get_overview(ep_status, show_quality, upgrade_once, split_snatch=False):
"""
:param ep_status: episode status
@ -1757,7 +1757,7 @@ def get_overview(ep_status, show_quality, upgrade_once):
if FAILED == status:
return Overview.WANTED
if status in SNATCHED_ANY:
if not split_snatch and status in SNATCHED_ANY:
return Overview.SNATCHED
void, best_qualities = Quality.splitQuality(show_quality)
@ -1770,7 +1770,7 @@ def get_overview(ep_status, show_quality, upgrade_once):
or (upgrade_once and
(quality in best_qualities or (None is not min_best and quality > min_best))):
return Overview.GOOD
return Overview.QUAL
return (Overview.QUAL, Overview.SNATCHED_QUAL)[status in SNATCHED_ANY]
def generate_show_dir_name(root_dir, show_name):

4
sickbeard/tv.py

@ -1977,7 +1977,7 @@ class TVShow(TVShowBase):
logger.log('None of the conditions were met, ignoring found episode', logger.DEBUG)
return False
def get_overview(self, ep_status):
def get_overview(self, ep_status, split_snatch=False):
"""
:param ep_status: episode status
@ -1985,7 +1985,7 @@ class TVShow(TVShowBase):
:return:
:rtype: int
"""
return helpers.get_overview(ep_status, self.quality, self.upgrade_once)
return helpers.get_overview(ep_status, self.quality, self.upgrade_once, split_snatch=split_snatch)
def __getstate__(self):
d = dict(self.__dict__)

91
sickbeard/webserve.py

@ -218,26 +218,17 @@ class RouteHandler(LegacyBaseHandler):
if not isinstance(arg, list):
arg = [arg]
method_args += [item for item in arg if None is not item]
try:
if 'kwargs' in method_args or re.search('[A-Z]', route):
# no filtering for legacy and routes that depend on *args and **kwargs
result = yield self.async_call(method, request_kwargs) # method(**request_kwargs)
else:
filter_kwargs = dict(filter_iter(lambda kv: kv[0] in method_args, iteritems(request_kwargs)))
result = yield self.async_call(method, filter_kwargs) # method(**filter_kwargs)
self.finish(result)
except (BaseException, Exception) as e:
logger.log(ex(e), logger.ERROR)
self.finish(use_404 and self.page_not_found() or None)
if 'kwargs' in method_args or re.search('[A-Z]', route):
# no filtering for legacy and routes that depend on *args and **kwargs
result = yield self.async_call(method, request_kwargs) # method(**request_kwargs)
else:
filter_kwargs = dict(filter_iter(lambda kv: kv[0] in method_args, iteritems(request_kwargs)))
result = yield self.async_call(method, filter_kwargs) # method(**filter_kwargs)
self.finish(result)
@run_on_executor
def async_call(self, function, kw):
try:
result = function(**kw)
return result
except Exception as e:
logger.log(ex(e), logger.ERROR)
raise e
return function(**kw)
def page_not_found(self):
self.set_status(404)
@ -5238,43 +5229,51 @@ class Manage(MainHandler):
t = PageTemplate(web_handler=self, file='manage_backlogOverview.tmpl')
t.submenu = self.manage_menu('Backlog')
showCounts = {}
showCats = {}
showSQLResults = {}
show_counts = {}
show_cats = {}
t.ep_sql_results = {}
my_db = db.DBConnection()
my_db = db.DBConnection(row_type='dict')
sql_cmds = []
show_objects = []
for cur_show_obj in sickbeard.showList:
epCounts = {}
epCats = {}
epCounts[Overview.SKIPPED] = 0
epCounts[Overview.WANTED] = 0
epCounts[Overview.QUAL] = 0
epCounts[Overview.GOOD] = 0
epCounts[Overview.UNAIRED] = 0
epCounts[Overview.SNATCHED] = 0
sql_result = my_db.select(
'SELECT * FROM tv_episodes'
sql_cmds.append([
'SELECT season, episode, status, airdate, name'
' FROM tv_episodes'
' WHERE indexer = ? AND showid = ?'
' ORDER BY season DESC, episode DESC',
[cur_show_obj.tvid, cur_show_obj.prodid])
[cur_show_obj.tvid, cur_show_obj.prodid]])
show_objects.append(cur_show_obj)
sql_results = my_db.mass_action(sql_cmds)
for i, sql_result in enumerate(sql_results):
ep_cats = {}
ep_counts = {
Overview.UNAIRED: 0, Overview.GOOD: 0, Overview.SKIPPED: 0,
Overview.WANTED: 0, Overview.QUAL: 0, Overview.SNATCHED: 0}
for cur_result in sql_result:
if not sickbeard.SEARCH_UNAIRED and 1 == cur_result['airdate']:
continue
curEpCat = cur_show_obj.get_overview(int(cur_result['status']))
if curEpCat:
epCats[str(cur_result['season']) + 'x' + str(cur_result['episode'])] = curEpCat
epCounts[curEpCat] += 1
showCounts[cur_show_obj.tvid_prodid] = epCounts
showCats[cur_show_obj.tvid_prodid] = epCats
showSQLResults[cur_show_obj.tvid_prodid] = sql_result
t.showCounts = showCounts
t.showCats = showCats
t.showSQLResults = showSQLResults
ep_cat = show_objects[i].get_overview(int(cur_result['status']), split_snatch=True)
if ep_cat in (Overview.WANTED, Overview.QUAL, Overview.SNATCHED_QUAL):
cur_result['backlog'] = True
if Overview.SNATCHED_QUAL == ep_cat:
ep_cat = Overview.SNATCHED
else:
cur_result['backlog'] = False
if ep_cat:
ep_cats['%sx%s' % (cur_result['season'], cur_result['episode'])] = ep_cat
ep_counts[ep_cat] += 1
tvid_prodid = show_objects[i].tvid_prodid
show_counts[tvid_prodid] = ep_counts
show_cats[tvid_prodid] = ep_cats
t.ep_sql_results[tvid_prodid] = sql_result
t.show_counts = show_counts
t.show_cats = show_cats
t.backlog_active_providers = sickbeard.search_backlog.BacklogSearcher.providers_active(scheduled=False)
return t.respond()

Loading…
Cancel
Save