diff --git a/CHANGES.md b/CHANGES.md index d347184..7a99dff 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,6 +1,7 @@ ### 0.16.6 (2018-05-14 01:00:00 UTC) * Change improve tolerance to parse a release title with a badly placed episode name +* Change improve handling tvdb_api data when adding upcoming shows with unfilled data ### 0.16.5 (2018-05-07 21:15:00 UTC) diff --git a/lib/tvdb_api/tvdb_api.py b/lib/tvdb_api/tvdb_api.py index 9fa54db..909b115 100644 --- a/lib/tvdb_api/tvdb_api.py +++ b/lib/tvdb_api/tvdb_api.py @@ -563,6 +563,10 @@ class Tvdb: return os.path.join(tempfile.gettempdir(), 'tvdb_api-%s' % uid) + def _match_url_pattern(self, pattern, url): + if pattern in self.config: + return re.search('^%s$' % re.escape(self.config[pattern]).replace('\\%s', '[^/]+'), url) + @retry((tvdb_error, tvdb_tokenexpired)) def _load_url(self, url, params=None, language=None): log().debug('Retrieving URL %s' % url) @@ -583,7 +587,7 @@ class Tvdb: session.headers.update({'Accept-Language': language}) resp = None - if re.search(re.escape(self.config['url_seriesInfo']).replace('%s', '.*'), url): + if self._match_url_pattern('url_seriesInfo', url): self.show_not_found = False self.not_found = False try: @@ -595,8 +599,10 @@ class Tvdb: sickbeard.THETVDB_V2_API_TOKEN = self.get_new_token() raise tvdb_tokenexpired elif 404 == e.response.status_code: - if re.search(re.escape(self.config['url_seriesInfo']).replace('%s', '.*'), url): + if self._match_url_pattern('url_seriesInfo', url): self.show_not_found = True + elif self._match_url_pattern('url_epInfo', url): + resp = {'data': []} self.not_found = True elif 404 != e.response.status_code: raise tvdb_error @@ -647,10 +653,16 @@ class Tvdb: try: src = self._load_url(url, params=params, language=language) if isinstance(src, dict): - data = src['data'] or {} + if None is not src['data']: + data = src['data'] + else: + data = {} + # data = src['data'] or {} if isinstance(data, list): - data = data[0] or {} - if 1 > len(data.keys()): + if 0 < len(data): + data = data[0] + # data = data[0] or {} + if None is data or (isinstance(data, dict) and 1 > len(data.keys())): raise ValueError return src except (KeyError, IndexError, Exception): @@ -912,9 +924,9 @@ class Tvdb: episode_data = self._getetsrc(self.config['url_epInfo'] % (sid, page), language=language) if None is episode_data: raise tvdb_error('Exception retrieving episodes for show') - if None is not episode_data.get('data'): + if not getattr(self, 'not_found', False) and None is not episode_data.get('data'): episodes.extend(episode_data['data']) - page = episode_data.get('links', {}).get('next') + page = episode_data.get('links', {}).get('next', None) ep_map_keys = {'absolutenumber': u'absolute_number', 'airedepisodenumber': u'episodenumber', 'airedseason': u'seasonnumber', 'airedseasonid': u'seasonid', diff --git a/sickbeard/metadata/generic.py b/sickbeard/metadata/generic.py index bd18759..c4b3def 100644 --- a/sickbeard/metadata/generic.py +++ b/sickbeard/metadata/generic.py @@ -290,17 +290,29 @@ class GenericMetadata(): return None def create_show_metadata(self, show_obj): + result = False if self.show_metadata and show_obj and not self._has_show_metadata(show_obj): - logger.log(u"Metadata provider " + self.name + " creating show metadata for " + show_obj.name, logger.DEBUG) - return self.write_show_file(show_obj) - return False + logger.log('Metadata provider %s creating show metadata for %s' % (self.name, show_obj.name), logger.DEBUG) + try: + result = self.write_show_file(show_obj) + except sickbeard.indexer_error as e: + logger.log('Unable to find useful show metadata for %s on %s: %s' % ( + self.name, sickbeard.indexerApi(show_obj.indexer).name, ex(e)), logger.WARNING) + + return result def create_episode_metadata(self, ep_obj): + result = False if self.episode_metadata and ep_obj and not self._has_episode_metadata(ep_obj): - logger.log(u"Metadata provider " + self.name + " creating episode metadata for " + ep_obj.prettyName(), + logger.log('Metadata provider %s creating episode metadata for %s' % (self.name, ep_obj.prettyName()), logger.DEBUG) - return self.write_ep_file(ep_obj) - return False + try: + result = self.write_ep_file(ep_obj) + except sickbeard.indexer_error as e: + logger.log('Unable to find useful episode metadata for %s on %s: %s' % ( + self.name, sickbeard.indexerApi(ep_obj.show.indexer).name, ex(e)), logger.WARNING) + + return result def update_show_indexer_metadata(self, show_obj): if self.show_metadata and show_obj and self._has_show_metadata(show_obj): @@ -804,7 +816,7 @@ class GenericMetadata(): indexer_show_obj = t[show_obj.indexerid, False] except (sickbeard.indexer_error, IOError) as e: logger.log(u"Unable to look up show on " + sickbeard.indexerApi( - show_obj.indexer).name + ", not downloading images: " + ex(e), logger.ERROR) + show_obj.indexer).name + ", not downloading images: " + ex(e), logger.WARNING) return None if not self._valid_show(indexer_show_obj, show_obj): @@ -893,7 +905,7 @@ class GenericMetadata(): indexer_show_obj = t[show_obj.indexerid] except (sickbeard.indexer_error, IOError) as e: logger.log(u'Unable to look up show on ' + sickbeard.indexerApi( - show_obj.indexer).name + ', not downloading images: ' + ex(e), logger.ERROR) + show_obj.indexer).name + ', not downloading images: ' + ex(e), logger.WARNING) return result if not self._valid_show(indexer_show_obj, show_obj): diff --git a/sickbeard/tv.py b/sickbeard/tv.py index 05aba0b..da9f494 100644 --- a/sickbeard/tv.py +++ b/sickbeard/tv.py @@ -580,7 +580,6 @@ class TVShow(object): myDB = db.DBConnection() myDB.mass_action(sql_l) - def loadEpisodesFromDB(self, update=False): logger.log('Loading all episodes for [%s] from the DB' % self.name) @@ -601,7 +600,12 @@ class TVShow(object): t = sickbeard.indexerApi(self.indexer).indexer(**lINDEXER_API_PARMS) - cachedShow = t[self.indexerid] + cachedShow = None + try: + cachedShow = t[self.indexerid] + except sickbeard.indexer_error as e: + logger.log('Unable to find cached seasons from %s: %s' % ( + sickbeard.indexerApi(self.indexer).name, ex(e)), logger.WARNING) if None is cachedShow: return scannedEps @@ -878,16 +882,17 @@ class TVShow(object): sqlResults = myDB.select('SELECT * FROM tv_shows WHERE indexer_id = ?', [self.indexerid]) if 1 != len(sqlResults): - lINDEXER_API_PARMS = sickbeard.indexerApi(self.indexer).api_params.copy() - if self.lang: - lINDEXER_API_PARMS['language'] = self.lang - t = sickbeard.indexerApi(self.indexer).indexer(**lINDEXER_API_PARMS) - cached_show = t[self.indexerid] - vals = (self.indexerid, '' if not cached_show else ' [%s]' % cached_show['seriesname'].strip()) - if 0 != len(sqlResults): - logger.log('%s: Loading show info%s from database' % vals) - raise exceptions.MultipleDBShowsException() - logger.log('%s: Unable to find the show%s in the database' % vals) + if 1 < len(sqlResults): + lINDEXER_API_PARMS = sickbeard.indexerApi(self.indexer).api_params.copy() + if self.lang: + lINDEXER_API_PARMS['language'] = self.lang + t = sickbeard.indexerApi(self.indexer).indexer(**lINDEXER_API_PARMS) + cached_show = t[self.indexerid] + vals = (self.indexerid, '' if not cached_show else ' [%s]' % cached_show['seriesname'].strip()) + if 0 != len(sqlResults): + logger.log('%s: Loading show info%s from database' % vals) + raise exceptions.MultipleDBShowsException() + logger.log('%s: Unable to find the show%s in the database' % (self.indexerid, self.name)) return else: if not self.indexer: