From 490900f7f5761618e53941d60d789b8916cf5069 Mon Sep 17 00:00:00 2001 From: Prinz23 Date: Sun, 5 Apr 2020 05:02:25 +0100 Subject: [PATCH 1/2] Fix failure time reset of service URLs. Change improve clarity of show update/refresh API failure message. --- sickbeard/providers/generic.py | 8 ++++++-- sickbeard/webapi.py | 10 +++++----- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/sickbeard/providers/generic.py b/sickbeard/providers/generic.py index 4921d3f..eecbe6e 100644 --- a/sickbeard/providers/generic.py +++ b/sickbeard/providers/generic.py @@ -335,8 +335,12 @@ class GenericProvider(object): changed_val = self._failure_time != value self._failure_time = value if changed_val: - # noinspection PyCallByClass,PyTypeChecker - self._save_fail_value('failure_time', (SGDatetime.totimestamp(value), value)[None is value]) + if isinstance(value, datetime.datetime): + # noinspection PyCallByClass,PyTypeChecker + save_value = SGDatetime.totimestamp(value) + else: + save_value = value + self._save_fail_value('failure_time', save_value) @property def tmr_limit_count(self): diff --git a/sickbeard/webapi.py b/sickbeard/webapi.py index ab4f2a8..d9ac37e 100644 --- a/sickbeard/webapi.py +++ b/sickbeard/webapi.py @@ -3915,10 +3915,10 @@ class CMD_SickGearShowRefresh(ApiCall): try: sickbeard.showQueueScheduler.action.refreshShow(show_obj) - return _responds(RESULT_SUCCESS, msg=str(show_obj.name) + " has queued to be refreshed") - except exceptions_helper.CantRefreshException: + return _responds(RESULT_SUCCESS, msg="%s has queued to be refreshed" % show_obj.name) + except exceptions_helper.CantRefreshException as e: # TODO: log the exception - return _responds(RESULT_FAILURE, msg="Unable to refresh " + str(show_obj.name)) + return _responds(RESULT_FAILURE, msg="Unable to refresh %s. %s" % (show_obj.name, ex(e))) class CMD_ShowRefresh(CMD_SickGearShowRefresh): @@ -4336,10 +4336,10 @@ class CMD_SickGearShowUpdate(ApiCall): try: sickbeard.showQueueScheduler.action.updateShow(show_obj, True) - return _responds(RESULT_SUCCESS, msg=str(show_obj.name) + " has queued to be updated") + return _responds(RESULT_SUCCESS, msg="%s has queued to be updated" % show_obj.name) except exceptions_helper.CantUpdateException as e: self.log(u"Unable to update %s. %s" % (show_obj.name, ex(e)), logger.ERROR) - return _responds(RESULT_FAILURE, msg="Unable to update " + str(show_obj.name)) + return _responds(RESULT_FAILURE, msg="Unable to update %s. %s" % (show_obj.name, ex(e))) class CMD_ShowUpdate(CMD_SickGearShowUpdate): From ab419f3726d05ed411606b40d6a49a7e022ba68e Mon Sep 17 00:00:00 2001 From: JackDandy Date: Thu, 9 Apr 2020 00:21:29 +0100 Subject: [PATCH 2/2] Fix Kodi uniqueid tag not validated during import. Change slightly improve performance iterating metadata providers. Fix AttributeError in anime manager while editing show. Remove DigitalHive torrent provider. --- CHANGES.md | 12 ++- gui/slick/images/providers/digitalhive.png | Bin 532 -> 0 bytes sickbeard/anime.py | 2 +- sickbeard/metadata/generic.py | 13 +++- sickbeard/providers/__init__.py | 2 +- sickbeard/providers/dh.py | 119 ----------------------------- sickbeard/webserve.py | 2 +- 7 files changed, 23 insertions(+), 127 deletions(-) delete mode 100644 gui/slick/images/providers/digitalhive.png delete mode 100644 sickbeard/providers/dh.py diff --git a/CHANGES.md b/CHANGES.md index bb2dcc8..cccede9 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,4 +1,14 @@ -### 0.21.24 (2020-04-04 00:30:00 UTC) +### 0.21.25 (2020-04-10 01:50:00 UTC) + +* Fix Kodi uniqueid tag not validated during import +* Change slightly improve performance iterating metadata providers +* Fix AttributeError in anime manager while editing show +* Remove DigitalHive torrent provider +* Fix failure time reset of service URLs +* Change improve clarity of show update/refresh API failure message + + +### 0.21.24 (2020-04-04 00:30:00 UTC) * Fix use release group for Propers check from history if status is snatched * Change add provider filter fallbacks into Propers search flow diff --git a/gui/slick/images/providers/digitalhive.png b/gui/slick/images/providers/digitalhive.png deleted file mode 100644 index 3a873985e608ad74fc5cb6906da0be10dc226748..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 532 zcmV+v0_**WP)dhqH-FcCu{ zF|7Hwo7vf!p7Jo!ECv-xK|#}0eRS3D*HRRPaf8sCGz0kGFA_1H4FXP;?US07Tv!O6 z!;6NEVf;71(ek)|8=oY+-Z`Pa6j)x&**==EF+BYfz<7Euu)dn{{;;G)X;JJlTa;en zc>W+~rRRC^Va(=!3xE_wVS~k%&4+7<3T=$2IuO{}Ii|l9xU<*;Gt3N8rJT+fygXnM zwOitHrnDkNgN=7zsbfP#FrWn@!sp`)UJXY?gb)&z!rTZdT_M1E1JOEV+qo>GF|NC_ z0bb_-ZCz3A4ZEgFnH_vW1)39>wMKO+G!uwpq53ic0W7@&hzQPi`xG(MJDdorhEv0N zMV%pHIPb2jAfouRBZ^M(q4R)tP|uBkkYqUkYYPn_%TZNaa)A$? zBn!B*LS0Rg<((RwT>*B-h9)Vhjz{-zfe3=&e1i)KKFx3e)Ehp{yBEkD;N!&cWb26a z)too`C3kxcRb}_A;q5_1FO-a?k-hWCx9N8PMl-oG5`bMwCnDGE`nUM?7yh^LXZ!%u WuCR6M+{z;W0000. - -import re -import traceback - -from . import generic -from .. import logger -from ..helpers import try_int -from bs4_parser import BS4Parser - -from _23 import unidecode -from six import iteritems - - -class DHProvider(generic.TorrentProvider): - - def __init__(self): - generic.TorrentProvider.__init__(self, 'DigitalHive') - - self.url_base = 'https://www.digitalhive.org/' - self.urls = {'config_provider_home_uri': self.url_base, - 'login': self.url_base + 'getrss.php', - 'search': self.url_base + 'browse.php?search=%s&%s&titleonly=1&incldead=%s'} - - self.categories = {'Season': [34], 'Episode': [7, 32, 55, 57], 'anime': [2]} - self.categories['Cache'] = self.categories['Season'] + self.categories['Episode'] - - self.url = self.urls['config_provider_home_uri'] - - self.digest, self.freeleech, self.minseed, self.minleech = 4 * [None] - - def _authorised(self, **kwargs): - - return super(DHProvider, self)._authorised( - logged_in=(lambda y=None: (None is y or re.search(r'(?i)rss\slink', y)) and self.has_all_cookies() and - self.session.cookies['uid'] in self.digest and self.session.cookies['pass'] in self.digest), - failed_msg=(lambda y=None: u'Invalid cookie details for %s. Check settings')) - - def _search_provider(self, search_params, **kwargs): - - results = [] - if not self._authorised(): - return results - - items = {'Cache': [], 'Season': [], 'Episode': [], 'Propers': []} - - rc = dict([(k, re.compile('(?i)' + v)) for (k, v) in iteritems({'info': 'details', 'get': 'download'})]) - for mode in search_params: - rc['cats'] = re.compile('(?i)cat=(?:%s)' % self._categories_string(mode, template='', delimiter='|')) - for search_string in search_params[mode]: - search_string = unidecode(search_string) - - html = self.get_url(self.urls['search'] % ( - '+'.join(search_string.split()), self._categories_string(mode), ('3', '0')[not self.freeleech])) - if self.should_skip(): - return results - - cnt = len(items[mode]) - try: - if not html or self._has_no_results(html): - raise generic.HaltParseException - - with BS4Parser(html, parse_only=dict(table={'cellpadding': 0})) as tbl: - tbl_rows = [] if not tbl else tbl.find_all('tr') - - if 2 > len(tbl_rows): - raise generic.HaltParseException - - head = None - for tr in tbl_rows[1:]: - cells = tr.find_all('td') - if 6 > len(cells): - continue - try: - head = head if None is not head else self._header_row(tr) - seeders, leechers, size = [try_int(n, n) for n in [ - cells[head[x]].get_text().strip() for x in ('seed', 'leech', 'size')]] - if not tr.find('a', href=rc['cats']) or self._reject_item(seeders, leechers): - continue - - title = tr.find('a', href=rc['info']).get_text().strip() - download_url = self._link(tr.find('a', href=rc['get'])['href']) - except (AttributeError, TypeError, ValueError, IndexError): - continue - - if title and download_url: - items[mode].append((title, download_url, seeders, self._bytesizer(size))) - - except generic.HaltParseException: - pass - except (BaseException, Exception): - logger.log(u'Failed to parse. Traceback: %s' % traceback.format_exc(), logger.ERROR) - - self._log_search(mode, len(items[mode]) - cnt, self.session.response.get('url')) - - results = self._sort_seeding(mode, results + items[mode]) - - return results - - def ui_string(self, key): - return ('%s_digest' % self.get_id()) == key and 'use... \'uid=xx; pass=yy\'' or '' - - -provider = DHProvider() diff --git a/sickbeard/webserve.py b/sickbeard/webserve.py index 1a8f6ee..f1a328a 100644 --- a/sickbeard/webserve.py +++ b/sickbeard/webserve.py @@ -3630,7 +3630,7 @@ class AddShows(Home): prodid = show_name = tvid = None for cur_provider in itervalues(sickbeard.metadata_provider_dict): if prodid and show_name: - continue + break (tvid, prodid, show_name) = cur_provider.retrieveShowMetadata(cur_path)