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. 77
      sickbeard/webserve.py

3
CHANGES.md

@ -2,6 +2,9 @@
* Add menu Shows/"Metacritic Cards" * Add menu Shows/"Metacritic Cards"
* Change make web UI calls async so that, for example, process media will not block page requests * 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 * 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 Python performance of handling core objects
* Change improve performance for find_show_by_id * Change improve performance for find_show_by_id

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

@ -25,7 +25,7 @@
}); });
#set $fuzzydate = 'airdate' #set $fuzzydate = 'airdate'
#if $sickbeard.FUZZY_DATING: #if $sickbeard.FUZZY_DATING
fuzzyMoment({ fuzzyMoment({
containerClass: '.${fuzzydate}', containerClass: '.${fuzzydate}',
dateHasTime: !1, dateHasTime: !1,
@ -46,27 +46,27 @@
<h1 class="title">$title</h1> <h1 class="title">$title</h1>
#end if #end if
## ##
#set $totalWanted = 0 #set $total_wanted = 0
#set $totalQual = 0 #set $total_qual = 0
#for $cur_show_obj in $sickbeard.showList #for $cur_show_obj in $sickbeard.showList
#set $totalWanted += $showCounts[$cur_show_obj.tvid_prodid][$Overview.WANTED] #set $total_wanted += $show_counts[$cur_show_obj.tvid_prodid][$Overview.WANTED]
#set $totalQual += $showCounts[$cur_show_obj.tvid_prodid][$Overview.QUAL] #set $total_qual += $show_counts[$cur_show_obj.tvid_prodid][$Overview.QUAL]
#end for #end for
## ##
<div class="h2footer pull-right"> <div class="h2footer pull-right">
<span class="listing-key wanted">Wanted: <b>$totalWanted</b></span> <span class="listing-key wanted">Wanted: <b>$total_wanted</b></span>
<span class="listing-key qual">Low Quality: <b>$totalQual</b></span> <span class="listing-key qual">Low Quality: <b>$total_qual</b></span>
</div> </div>
<br/> <br/>
#if not $totalWanted #if not $total_wanted
<h3>no shows require a <span class="grey-text">backlog search</span></h3> <h3>no shows require a <span class="grey-text">backlog search</span></h3>
#else #else
<div class="pull-left"> <div class="pull-left">
Jump to Show Jump to Show
<select id="pickShow" class="form-control form-control-inline input-sm"> <select id="pickShow" class="form-control form-control-inline input-sm">
#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]
<option value="$cur_show_obj.tvid_prodid">$cur_show_obj.name</option> <option value="$cur_show_obj.tvid_prodid">$cur_show_obj.name</option>
#end if #end if
#end for #end for
@ -75,9 +75,9 @@
#end if #end if
<table class="sickbeardTable" border="0"> <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 #continue
#end if #end if
@ -85,10 +85,10 @@
<td colspan="3" class="text-left"> <td colspan="3" class="text-left">
<br/> <br/>
<h2><a href="$sbRoot/home/view-show?tvid_prodid=$cur_show_obj.tvid_prodid">$cur_show_obj.name</a></h2> <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' #set $text = 'Enable allow active searching for one or more providers at config media providers'
#for ($tag_class, $sub) in ( #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)) #set $text = $text.replace($sub, '<span class="%s">%s</span>' % ($tag_class, $sub))
#end for #end for
#set $sub = 'media providers' #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> <span style="position:relative;float:right;margin-top:-48px;text-align:right;"><i class="img-warning-16"></i>$text</span>
#end if #end if
<div class="pull-right"> <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 wanted">Wanted: <b>$show_counts[$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> <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: #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> <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 #else
<span class="quality SD btn-inline forceBacklog" style="padding:4px 10px; margin-bottom:1px"><i class="sgicon-pause"></i> Paused</span> <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> <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]: #for $cur_result in $ep_sql_results[$cur_show_obj.tvid_prodid]
#set $whichStr = '%sx%s' % ($str($curResult['season']), $str($curResult['episode'])) #set $which_idx = '%sx%s' % ($cur_result['season'], $cur_result['episode'])
#try: #try
#set $overview = $showCats[$cur_show_obj.tvid_prodid][$whichStr] #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 #except Exception
#continue #continue
#end try #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]]"> <tr class="seasonstyle $Overview.overviewStrings[$show_cats[$cur_show_obj.tvid_prodid][$which_idx]]">
<td>$whichStr</td> <td>$which_str</td>
<td class="text-left">$curResult['name']</td> <td class="text-left">$cur_result['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> <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> </tr>
# #
#end if #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. # For both snatched statuses. Note: SNATCHED/QUAL have same value and break dict.
SNATCHED = SNATCHED_PROPER = SNATCHED_BEST # 9 SNATCHED = SNATCHED_PROPER = SNATCHED_BEST # 9
SNATCHED_QUAL = 15
overviewStrings = {UNKNOWN: 'unknown', overviewStrings = {UNKNOWN: 'unknown',
SKIPPED: 'skipped', SKIPPED: 'skipped',
WANTED: 'wanted', WANTED: 'wanted',
QUAL: 'qual', QUAL: 'qual',
GOOD: 'good', GOOD: 'good',
UNAIRED: 'unaired', UNAIRED: 'unaired',
SNATCHED: 'snatched'} SNATCHED: 'snatched',
SNATCHED_QUAL: 'snatched/qual'}
countryList = {'Australia': 'AU', countryList = {'Australia': 'AU',

6
sickbeard/helpers.py

@ -1732,7 +1732,7 @@ def path_mapper(search, replace, subject):
return result, result != 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 :param ep_status: episode status
@ -1757,7 +1757,7 @@ def get_overview(ep_status, show_quality, upgrade_once):
if FAILED == status: if FAILED == status:
return Overview.WANTED return Overview.WANTED
if status in SNATCHED_ANY: if not split_snatch and status in SNATCHED_ANY:
return Overview.SNATCHED return Overview.SNATCHED
void, best_qualities = Quality.splitQuality(show_quality) void, best_qualities = Quality.splitQuality(show_quality)
@ -1770,7 +1770,7 @@ def get_overview(ep_status, show_quality, upgrade_once):
or (upgrade_once and or (upgrade_once and
(quality in best_qualities or (None is not min_best and quality > min_best))): (quality in best_qualities or (None is not min_best and quality > min_best))):
return Overview.GOOD 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): 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) logger.log('None of the conditions were met, ignoring found episode', logger.DEBUG)
return False return False
def get_overview(self, ep_status): def get_overview(self, ep_status, split_snatch=False):
""" """
:param ep_status: episode status :param ep_status: episode status
@ -1985,7 +1985,7 @@ class TVShow(TVShowBase):
:return: :return:
:rtype: int :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): def __getstate__(self):
d = dict(self.__dict__) d = dict(self.__dict__)

77
sickbeard/webserve.py

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

Loading…
Cancel
Save