From 734de67684f494442e7f4eabf89fb81cf29d09ed Mon Sep 17 00:00:00 2001 From: echel0n Date: Tue, 13 May 2014 14:47:54 -0700 Subject: [PATCH] Improved manual, failed, and backlog searching. --- sickbeard/search.py | 42 +++++++++++++++++++++++++++------------ sickbeard/search_queue.py | 41 +++++++++++++++----------------------- 2 files changed, 45 insertions(+), 38 deletions(-) diff --git a/sickbeard/search.py b/sickbeard/search.py index 7cf55977..ea2fdc92 100644 --- a/sickbeard/search.py +++ b/sickbeard/search.py @@ -523,30 +523,46 @@ def searchProviders(queueItem, show, season, episodes, seasonSearch=False, manua finalResults.append(bestResult) - if manualSearch: - logger.log(u"Checking if we should snatch " + bestResult.name, logger.DEBUG) - any_qualities, best_qualities = Quality.splitQuality(show.quality) + logger.log(u"Checking if we should snatch " + bestResult.name, logger.DEBUG) + any_qualities, best_qualities = Quality.splitQuality(show.quality) - # if there is a redownload that's higher than this then we definitely need to keep looking - if best_qualities and bestResult.quality == max(best_qualities): - logger.log(u"Found a highest quality archive match to snatch [" + bestResult.name + "]", logger.DEBUG) - queueItem.results = [bestResult] + # if there is a redownload that's higher than this then we definitely need to keep looking + if best_qualities and bestResult.quality == max(best_qualities): + logger.log(u"Found a highest quality archive match to snatch [" + bestResult.name + "]", logger.DEBUG) + queueItem.results += [bestResult] + + # check that we got all the episodes we wanted first before doing a match and snatch + wantedEpCount = 0 + for wantedEp in episodes: + for result in queueItem.results: + if wantedEp in result.episodes: + wantedEpCount += 1 + if wantedEpCount == len(episodes): return queueItem - # if there's no redownload that's higher (above) and this is the highest initial download then we're good - elif any_qualities and bestResult.quality in any_qualities: - logger.log(u"Found a initial quality match to snatch [" + bestResult.name + "]", logger.DEBUG) - queueItem.results = [bestResult] + # if there's no redownload that's higher (above) and this is the highest initial download then we're good + elif any_qualities and bestResult.quality in any_qualities: + logger.log(u"Found a initial quality match to snatch [" + bestResult.name + "]", logger.DEBUG) + queueItem.results += [bestResult] + + # check that we got all the episodes we wanted first before doing a match and snatch + wantedEpCount = 0 + for wantedEp in episodes: + for result in queueItem.results: + if wantedEp in result.episodes: + wantedEpCount += 1 + if wantedEpCount == len(episodes): return queueItem + # make sure we search every provider for results - if providerNum < len(providers): + if providerNum != len(providers): continue # remove duplicates and insures snatch of highest quality from results for i1, result1 in enumerate(finalResults): for i2, result2 in enumerate(finalResults): - if result2.provider.show == show and result2.episodes.sort() == episodes.sort() and len(finalResults) > 1: + if result1.provider.show == result2.provider.show and result1.episodes.sort() == result2.episodes.sort(): if result1.quality >= result2.quality: finalResults.pop(i2) diff --git a/sickbeard/search_queue.py b/sickbeard/search_queue.py index 4af14f5d..9f14a5e9 100644 --- a/sickbeard/search_queue.py +++ b/sickbeard/search_queue.py @@ -90,7 +90,6 @@ class SearchQueue(generic_queue.GenericQueue): status = search.snatchEpisode(result) item.success = status generic_queue.QueueItem.finish(item) - return status class ManualSearchQueueItem(generic_queue.QueueItem): def __init__(self, ep_obj): @@ -100,6 +99,7 @@ class ManualSearchQueueItem(generic_queue.QueueItem): self.success = None self.show = ep_obj.show self.ep_obj = ep_obj + self.results = [] def execute(self): generic_queue.QueueItem.execute(self) @@ -109,25 +109,18 @@ class ManualSearchQueueItem(generic_queue.QueueItem): searchResult = search.searchProviders(self, self.show, self.ep_obj.season, [self.ep_obj],False,True) if searchResult: - self.success = SearchQueue().snatch_item(searchResult) + SearchQueue().snatch_item(searchResult) + else: + ui.notifications.message('No downloads were found', + "Couldn't find a download for %s" % self.ep_obj.prettyName()) + + logger.log(u"Unable to find a download for " + self.ep_obj.prettyName()) except Exception: logger.log(traceback.format_exc(), logger.DEBUG) - if not self.success: - ui.notifications.message('No downloads were found', - "Couldn't find a download for %s" % self.ep_obj.prettyName()) - logger.log(u"Unable to find a download for " + self.ep_obj.prettyName()) - self.finish() - def finish(self): - # don't let this linger if something goes wrong - if self.success == None: - self.success = False - generic_queue.QueueItem.finish(self) - - class BacklogQueueItem(generic_queue.QueueItem): def __init__(self, show, segment): generic_queue.QueueItem.__init__(self, 'Backlog', BACKLOG_SEARCH) @@ -137,6 +130,7 @@ class BacklogQueueItem(generic_queue.QueueItem): self.show = show self.segment = segment self.wantedEpisodes = [] + self.results = [] self._changeMissingEpisodes() @@ -174,21 +168,18 @@ class BacklogQueueItem(generic_queue.QueueItem): if len(seasonEps) == len(self.wantedEpisodes): seasonSearch = True - providers = [x for x in sickbeard.providers.sortedProviderList() if x.isActive() and x] - try: logger.log("Beginning backlog search for episodes from [" + self.show.name + "] - Season[" + str(self.segment) + "]") searchResult = search.searchProviders(self, self.show, self.segment, self.wantedEpisodes, seasonSearch, False) if searchResult: - self.success = SearchQueue().snatch_item(searchResult) + SearchQueue().snatch_item(searchResult) + else: + logger.log(u"No needed episodes found during backlog search") except Exception: logger.log(traceback.format_exc(), logger.DEBUG) - if not self.success: - logger.log(u"No needed episodes found during backlog search") - self.finish() def _need_any_episodes(self, statusResults, bestQualities): @@ -253,6 +244,7 @@ class FailedQueueItem(generic_queue.QueueItem): self.show = show self.episodes = episodes self.success = None + self.results = [] def execute(self): generic_queue.QueueItem.execute(self) @@ -274,13 +266,12 @@ class FailedQueueItem(generic_queue.QueueItem): "Beginning failed download search for episodes from Season [" + str(self.episodes[0].season) + "]") searchResult = search.searchProviders(self, self.show, failed_episodes[0].season, failed_episodes, False, True) - if searchResult: - self.success = SearchQueue().snatch_item(searchResult) + if searchResult: + SearchQueue().snatch_item(searchResult) + else: + logger.log(u"No episodes found to retry for failed downloads return from providers!") except Exception, e: logger.log(traceback.format_exc(), logger.DEBUG) - if not self.success: - logger.log(u"No episodes found to retry for failed downloads return from providers!") - self.finish() \ No newline at end of file