diff --git a/sickbeard/__init__.py b/sickbeard/__init__.py index ccf1d72d14728bc9be927765180188b3f27653cf..61330544b7c66c5beed6ca74e4b1d109353e7e25 100644 --- a/sickbeard/__init__.py +++ b/sickbeard/__init__.py @@ -58,6 +58,7 @@ from sickbeard.databases import mainDB, cache_db, failed_db from sickrage.helper.encoding import ek from sickrage.helper.exceptions import ex +from sickrage.show.Show import Show from sickrage.system.Shutdown import Shutdown from configobj import ConfigObj @@ -2207,7 +2208,7 @@ def getEpList(epIDs, showid=None): epList = [] for curEp in sqlResults: - curShowObj = helpers.findCertainShow(showList, int(curEp["showid"])) + curShowObj = Show.find(showList, int(curEp["showid"])) curEpObj = curShowObj.getEpisode(int(curEp["season"]), int(curEp["episode"])) epList.append(curEpObj) diff --git a/sickbeard/dailysearcher.py b/sickbeard/dailysearcher.py index 89abc9ca1695d15409959450414420f082026496..fd6f8443b22b50fe3663b4aff0d2fbcb89e8d5b8 100644 --- a/sickbeard/dailysearcher.py +++ b/sickbeard/dailysearcher.py @@ -17,7 +17,6 @@ # You should have received a copy of the GNU General Public License # along with SickRage. If not, see <http://www.gnu.org/licenses/>. - import datetime import threading @@ -25,8 +24,8 @@ import sickbeard from sickbeard import logger from sickbeard import db from sickbeard import common -from sickbeard import helpers from sickbeard import network_timezones +from sickrage.show.Show import Show from sickrage.helper.exceptions import MultipleShowObjectsException @@ -68,7 +67,7 @@ class DailySearcher(): for sqlEp in sqlResults: try: if not show or int(sqlEp["showid"]) != show.indexerid: - show = helpers.findCertainShow(sickbeard.showList, int(sqlEp["showid"])) + show = Show.find(sickbeard.showList, int(sqlEp["showid"])) # for when there is orphaned series in the database but not loaded into our showlist if not show or show.paused: diff --git a/sickbeard/helpers.py b/sickbeard/helpers.py index 9b3810da3d848b7d67aa52159436c29b03d0c471..e35c57295f5028a9bced3c5056d08bb414e96859 100644 --- a/sickbeard/helpers.py +++ b/sickbeard/helpers.py @@ -55,7 +55,8 @@ from sickbeard.notifiers.synoindex import notifier as synoindex_notifier from sickbeard import clients from sickrage.helper.common import media_extensions, pretty_file_size, subtitle_extensions from sickrage.helper.encoding import ek -from sickrage.helper.exceptions import ex, MultipleShowObjectsException +from sickrage.helper.exceptions import ex +from sickrage.show.Show import Show from cachecontrol import CacheControl, caches from itertools import izip, cycle @@ -68,6 +69,7 @@ shutil.copyfile = shutil_custom.copyfile_custom # Access to a protected member of a client class urllib._urlopener = classes.SickBeardURLopener() + def fixGlob(path): path = re.sub(r'\[', '[[]', path) return re.sub(r'(?<!\[)\]', '[]]', path) @@ -91,6 +93,7 @@ def indentXML(elem, level=0): if level and (not elem.tail or not elem.tail.strip()): elem.tail = i + def remove_non_release_groups(name): """ Remove non release groups from name @@ -227,32 +230,6 @@ def remove_file_failed(failed_file): pass -def findCertainShow(showList, indexerid): - """ - Find a show by indexer ID in the show list - - :param showList: List of shows to search in (needle) - :param indexerid: Show to look for - :return: result list - """ - - results = [] - - if not isinstance(indexerid, list): - indexerid = [indexerid] - - if showList and indexerid: - results = [show for show in showList if show.indexerid in indexerid] - - if not results: - return None - - if len(results) == 1: - return results[0] - elif len(results) > 1: - raise MultipleShowObjectsException() - - def makeDir(path): """ Make a directory on the filesystem @@ -357,7 +334,7 @@ def searchIndexerForShowID(regShowName, indexer=None, indexer_id=None, ui=None): if not (seriesname and series_id): continue - ShowObj = findCertainShow(sickbeard.showList, int(series_id)) + ShowObj = Show.find(sickbeard.showList, int(series_id)) # Check if we can find the show in our list (if not, it's not the right show) if (indexer_id is None) and (ShowObj is not None) and (ShowObj.indexerid == int(series_id)): return seriesname, i, int(series_id) @@ -775,7 +752,7 @@ def get_all_episodes_from_absolute_number(show, absolute_numbers, indexer_id=Non if len(absolute_numbers): if not show and indexer_id: - show = findCertainShow(sickbeard.showList, indexer_id) + show = Show.find(sickbeard.showList, indexer_id) for absolute_number in absolute_numbers if show else []: ep = show.getEpisode(None, None, absolute_number=absolute_number) @@ -1130,18 +1107,18 @@ def get_show(name, tryIndexers=False): cache = sickbeard.name_cache.retrieveNameFromCache(name) if cache: fromCache = True - showObj = findCertainShow(sickbeard.showList, int(cache)) + showObj = Show.find(sickbeard.showList, int(cache)) # try indexers if not showObj and tryIndexers: - showObj = findCertainShow(sickbeard.showList, + showObj = Show.find(sickbeard.showList, searchIndexerForShowID(full_sanitizeSceneName(name), ui=classes.ShowListUI)[2]) # try scene exceptions if not showObj: ShowID = sickbeard.scene_exceptions.get_scene_exception_by_name(name)[0] if ShowID: - showObj = findCertainShow(sickbeard.showList, int(ShowID)) + showObj = Show.find(sickbeard.showList, int(ShowID)) # add show to cache if showObj and not fromCache: diff --git a/sickbeard/postProcessor.py b/sickbeard/postProcessor.py index 10a881957bcca33fbd81232adc979f93008b325d..0e33b65de3d96861666ffd15c0249c4070749584 100644 --- a/sickbeard/postProcessor.py +++ b/sickbeard/postProcessor.py @@ -39,6 +39,7 @@ from sickrage.helper.common import remove_extension, replace_extension, subtitle from sickrage.helper.encoding import ek from sickrage.helper.exceptions import EpisodeNotFoundException, EpisodePostProcessingFailedException, ex from sickrage.helper.exceptions import ShowDirectoryNotFoundException +from sickrage.show.Show import Show from babelfish import language_converters import adba @@ -499,7 +500,7 @@ class PostProcessor(object): if quality == common.Quality.UNKNOWN: quality = None - show = helpers.findCertainShow(sickbeard.showList, indexer_id) + show = Show.find(sickbeard.showList, indexer_id) self.in_history = True self.version = version diff --git a/sickbeard/providers/generic.py b/sickbeard/providers/generic.py index 76b628c51eefba9b109c1ea2afcd7ca755462c4a..99b80f6e7148bc331683fab26b61923c95bd8e0e 100644 --- a/sickbeard/providers/generic.py +++ b/sickbeard/providers/generic.py @@ -37,6 +37,7 @@ from sickbeard.common import user_agents from sickrage.helper.common import sanitize_filename from sickrage.helper.encoding import ek from sickrage.helper.exceptions import ex +from sickrage.show.Show import Show from sickbeard import show_name_helpers @@ -655,7 +656,7 @@ class TorrentProvider(GenericProvider): ) for sqlshow in sqlResults or []: - show = helpers.findCertainShow(sickbeard.showList, int(sqlshow["showid"])) + show = Show.find(sickbeard.showList, int(sqlshow["showid"])) if show: curEp = show.getEpisode(int(sqlshow["season"]), int(sqlshow["episode"])) for term in self.proper_strings: diff --git a/sickbeard/providers/newznab.py b/sickbeard/providers/newznab.py index 203c39174cbbfe10f6eafd0b314723181ebec34b..14cc97e69aed09aab5bd5615662fb4c328db183f 100644 --- a/sickbeard/providers/newznab.py +++ b/sickbeard/providers/newznab.py @@ -37,6 +37,7 @@ from sickbeard import db from sickbeard.common import Quality from sickbeard.providers import generic from sickrage.helper.encoding import ek +from sickrage.show.Show import Show from sickbeard.common import USER_AGENT @@ -333,7 +334,7 @@ class NewznabProvider(generic.NZBProvider): return results for sqlshow in sqlResults: - self.show = helpers.findCertainShow(sickbeard.showList, int(sqlshow["showid"])) + self.show = Show.find(sickbeard.showList, int(sqlshow["showid"])) if self.show: curEp = self.show.getEpisode(int(sqlshow["season"]), int(sqlshow["episode"])) searchStrings = self._get_episode_search_strings(curEp, add_string='PROPER|REPACK') diff --git a/sickbeard/scene_numbering.py b/sickbeard/scene_numbering.py index d4bb071d542420c676dcd2580a7dfd04b1b50f4a..23ba5f06c53477973a852cad0cc4817f54039453 100644 --- a/sickbeard/scene_numbering.py +++ b/sickbeard/scene_numbering.py @@ -29,8 +29,8 @@ import traceback import sickbeard from sickbeard import logger from sickbeard import db -from sickbeard import helpers from sickrage.helper.exceptions import ex +from sickrage.show.Show import Show def get_scene_numbering(indexer_id, indexer, season, episode, fallback_to_xem=True): @@ -49,7 +49,7 @@ def get_scene_numbering(indexer_id, indexer, season, episode, fallback_to_xem=Tr if indexer_id is None or season is None or episode is None: return (season, episode) - showObj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(indexer_id)) + showObj = Show.find(sickbeard.showList, int(indexer_id)) if showObj and not showObj.is_scene: return (season, episode) @@ -101,7 +101,7 @@ def get_scene_absolute_numbering(indexer_id, indexer, absolute_number, fallback_ indexer_id = int(indexer_id) indexer = int(indexer) - showObj = sickbeard.helpers.findCertainShow(sickbeard.showList, indexer_id) + showObj = Show.find(sickbeard.showList, indexer_id) if showObj and not showObj.is_scene: return absolute_number @@ -219,7 +219,7 @@ def set_scene_numbering(indexer_id, indexer, season=None, episode=None, absolute [sceneAbsolute, indexer, indexer_id, absolute_number]) # Reload data from DB so that cache and db are in sync - show = helpers.findCertainShow(sickbeard.showList, indexer_id) + show = Show.find(sickbeard.showList, indexer_id) show.flushEpisodes() diff --git a/sickbeard/subtitles.py b/sickbeard/subtitles.py index bc69e645981e9ce5cedeb8e7cb8142ef5267bb57..b862646d75683cfb7934f954b633cfc0ae987d54 100644 --- a/sickbeard/subtitles.py +++ b/sickbeard/subtitles.py @@ -35,6 +35,7 @@ from sickbeard import processTV from sickrage.helper.common import media_extensions, dateTimeFormat from sickrage.helper.encoding import ek from sickrage.helper.exceptions import ex +from sickrage.show.Show import Show DISTRIBUTION = pkg_resources.Distribution(location=os.path.dirname(os.path.dirname(__file__)), project_name='fake_entry_points', version='1.0.0') @@ -440,7 +441,7 @@ class SubtitlesFinder(object): logger.log(u'Downloading subtitles for episode %dx%d of show %s' % (ep_to_sub['season'], ep_to_sub['episode'], ep_to_sub['show_name']), logger.DEBUG) - show_object = sickbeard.helpers.findCertainShow(sickbeard.showList, int(ep_to_sub['showid'])) + show_object = Show.find(sickbeard.showList, int(ep_to_sub['showid'])) if not show_object: logger.log(u'Show not found', logger.DEBUG) self.amActive = False diff --git a/sickbeard/traktChecker.py b/sickbeard/traktChecker.py index 530673a228e351b55e971255f569d212ba008b64..651dcb08f51f65b4de70f924360f8a308663205e 100644 --- a/sickbeard/traktChecker.py +++ b/sickbeard/traktChecker.py @@ -36,6 +36,7 @@ from sickbeard.common import Quality from sickrage.helper.common import sanitize_filename from sickrage.helper.encoding import ek from sickrage.helper.exceptions import ex +from sickrage.show.Show import Show def setEpisodeToWanted(show, s, e): @@ -388,7 +389,7 @@ class TraktChecker(object): self.addDefaultShow(indexer, indexer_id, show['title'], WANTED) if int(sickbeard.TRAKT_METHOD_ADD) == 1: - newShow = helpers.findCertainShow(sickbeard.showList, indexer_id) + newShow = Show.find(sickbeard.showList, indexer_id) if newShow is not None: setEpisodeToWanted(newShow, 1, 1) @@ -415,7 +416,7 @@ class TraktChecker(object): indexer_id = int(show_el) show = self.EpisodeWatchlist[trakt_id][show_el] - newShow = helpers.findCertainShow(sickbeard.showList, indexer_id) + newShow = Show.find(sickbeard.showList, indexer_id) try: if newShow is None: @@ -444,7 +445,7 @@ class TraktChecker(object): """ Adds a new show with the default settings """ - if not helpers.findCertainShow(sickbeard.showList, int(indexer_id)): + if not Show.find(sickbeard.showList, int(indexer_id)): logger.log(u"Adding show " + str(indexer_id)) root_dirs = sickbeard.ROOT_DIRS.split('|') diff --git a/sickbeard/tv.py b/sickbeard/tv.py index b689479d2e1ebf5121ec72d969d9e4f8605f55a0..a6fef33e2f81c3d978fb6543368ec3209da002b0 100644 --- a/sickbeard/tv.py +++ b/sickbeard/tv.py @@ -53,6 +53,7 @@ from sickrage.helper.exceptions import EpisodeDeletedException, EpisodeNotFoundE from sickrage.helper.exceptions import MultipleEpisodesInDatabaseException, MultipleShowsInDatabaseException from sickrage.helper.exceptions import MultipleShowObjectsException, NoNFOException, ShowDirectoryNotFoundException from sickrage.helper.exceptions import ShowNotFoundException +from sickrage.show.Show import Show from sickbeard.common import Quality, Overview, statusStrings from sickbeard.common import DOWNLOADED, SNATCHED, SNATCHED_PROPER, ARCHIVED, IGNORED, UNAIRED, WANTED, SKIPPED, UNKNOWN @@ -112,7 +113,7 @@ class TVShow(object): self.nextaired = "" self.release_groups = None - otherShow = helpers.findCertainShow(sickbeard.showList, self.indexerid) + otherShow = Show.find(sickbeard.showList, self.indexerid) if otherShow is not None: raise MultipleShowObjectsException("Can't create a show if it already exists") diff --git a/sickbeard/tvcache.py b/sickbeard/tvcache.py index 5a9229bffa4c9fd47f5f07c2a828592891489ac3..6ace5591a924705406e53fc3e043c9489fef182b 100644 --- a/sickbeard/tvcache.py +++ b/sickbeard/tvcache.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU General Public License # along with SickRage. If not, see <http://www.gnu.org/licenses/>. - import time import datetime import itertools @@ -25,12 +24,12 @@ import urllib2 import sickbeard from sickbeard import db from sickbeard import logger -from sickbeard import helpers from sickbeard.common import Quality from sickbeard.rssfeeds import getFeed from sickbeard import show_name_helpers from sickrage.helper.encoding import ss from sickrage.helper.exceptions import AuthException, ex +from sickrage.show.Show import Show from sickbeard.name_parser.parser import NameParser, InvalidNameException, InvalidShowException @@ -246,7 +245,7 @@ class TVCache(object): # create showObj from indexer_id if available showObj = None if indexer_id: - showObj = helpers.findCertainShow(sickbeard.showList, indexer_id) + showObj = Show.find(sickbeard.showList, indexer_id) try: myParser = NameParser(showObj=showObj) @@ -333,7 +332,7 @@ class TVCache(object): continue # get the show object, or if it's not one of our shows then ignore it - showObj = helpers.findCertainShow(sickbeard.showList, int(curResult["indexerid"])) + showObj = Show.find(sickbeard.showList, int(curResult["indexerid"])) if not showObj: continue diff --git a/sickbeard/webapi.py b/sickbeard/webapi.py index b3b8088d5a019f1e5a3bcfd13dde758d9000e876..199fec6f6c4a38969c7d08da985f187d0facf98f 100644 --- a/sickbeard/webapi.py +++ b/sickbeard/webapi.py @@ -719,7 +719,7 @@ class CMD_Episode(ApiCall): def run(self): """ Get detailed information about an episode """ - show_obj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(self.indexerid)) + show_obj = Show.find(sickbeard.showList, int(self.indexerid)) if not show_obj: return _responds(RESULT_FAILURE, msg="Show not found") @@ -784,7 +784,7 @@ class CMD_EpisodeSearch(ApiCall): def run(self): """ Search for an episode """ - show_obj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(self.indexerid)) + show_obj = Show.find(sickbeard.showList, int(self.indexerid)) if not show_obj: return _responds(RESULT_FAILURE, msg="Show not found") @@ -840,7 +840,7 @@ class CMD_EpisodeSetStatus(ApiCall): def run(self): """ Set the status of an episode or a season (when no episode is provided) """ - show_obj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(self.indexerid)) + show_obj = Show.find(sickbeard.showList, int(self.indexerid)) if not show_obj: return _responds(RESULT_FAILURE, msg="Show not found") @@ -953,7 +953,7 @@ class CMD_SubtitleSearch(ApiCall): def run(self): """ Search for an episode subtitles """ - show_obj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(self.indexerid)) + show_obj = Show.find(sickbeard.showList, int(self.indexerid)) if not show_obj: return _responds(RESULT_FAILURE, msg="Show not found") @@ -1016,7 +1016,7 @@ class CMD_Exceptions(ApiCall): scene_exceptions[indexerid].append(row["show_name"]) else: - show_obj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(self.indexerid)) + show_obj = Show.find(sickbeard.showList, int(self.indexerid)) if not show_obj: return _responds(RESULT_FAILURE, msg="Show not found") @@ -1853,7 +1853,7 @@ class CMD_Show(ApiCall): def run(self): """ Get detailed information about a show """ - show_obj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(self.indexerid)) + show_obj = Show.find(sickbeard.showList, int(self.indexerid)) if not show_obj: return _responds(RESULT_FAILURE, msg="Show not found") @@ -1961,7 +1961,7 @@ class CMD_ShowAddExisting(ApiCall): def run(self): """ Add an existing show in SickRage """ - show_obj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(self.indexerid)) + show_obj = Show.find(sickbeard.showList, int(self.indexerid)) if show_obj: return _responds(RESULT_FAILURE, msg="An existing indexerid already exists in the database") @@ -2076,7 +2076,7 @@ class CMD_ShowAddNew(ApiCall): def run(self): """ Add a new show to SickRage """ - show_obj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(self.indexerid)) + show_obj = Show.find(sickbeard.showList, int(self.indexerid)) if show_obj: return _responds(RESULT_FAILURE, msg="An existing indexerid already exists in database") @@ -2211,7 +2211,7 @@ class CMD_ShowCache(ApiCall): def run(self): """ Check SickRage's cache to see if the images (poster, banner, fanart) for a show are valid """ - show_obj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(self.indexerid)) + show_obj = Show.find(sickbeard.showList, int(self.indexerid)) if not show_obj: return _responds(RESULT_FAILURE, msg="Show not found") @@ -2283,7 +2283,7 @@ class CMD_ShowGetQuality(ApiCall): def run(self): """ Get the quality setting of a show """ - show_obj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(self.indexerid)) + show_obj = Show.find(sickbeard.showList, int(self.indexerid)) if not show_obj: return _responds(RESULT_FAILURE, msg="Show not found") @@ -2478,7 +2478,7 @@ class CMD_ShowSeasonList(ApiCall): def run(self): """ Get the list of seasons of a show """ - show_obj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(self.indexerid)) + show_obj = Show.find(sickbeard.showList, int(self.indexerid)) if not show_obj: return _responds(RESULT_FAILURE, msg="Show not found") @@ -2518,7 +2518,7 @@ class CMD_ShowSeasons(ApiCall): def run(self): """ Get the list of episodes for one or all seasons of a show """ - sho_obj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(self.indexerid)) + sho_obj = Show.find(sickbeard.showList, int(self.indexerid)) if not sho_obj: return _responds(RESULT_FAILURE, msg="Show not found") @@ -2604,7 +2604,7 @@ class CMD_ShowSetQuality(ApiCall): def run(self): """ Set the quality setting of a show. If no quality is provided, the default user setting is used. """ - show_obj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(self.indexerid)) + show_obj = Show.find(sickbeard.showList, int(self.indexerid)) if not show_obj: return _responds(RESULT_FAILURE, msg="Show not found") @@ -2659,7 +2659,7 @@ class CMD_ShowStats(ApiCall): def run(self): """ Get episode statistics for a given show """ - show_obj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(self.indexerid)) + show_obj = Show.find(sickbeard.showList, int(self.indexerid)) if not show_obj: return _responds(RESULT_FAILURE, msg="Show not found") @@ -2764,7 +2764,7 @@ class CMD_ShowUpdate(ApiCall): def run(self): """ Update a show in SickRage """ - show_obj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(self.indexerid)) + show_obj = Show.find(sickbeard.showList, int(self.indexerid)) if not show_obj: return _responds(RESULT_FAILURE, msg="Show not found") diff --git a/sickbeard/webserve.py b/sickbeard/webserve.py index f9035a09c28825fff9d5f866e4300bb3ac66bed7..c67bffbe2117ab131e57379587c84f6e35c6f3a8 100644 --- a/sickbeard/webserve.py +++ b/sickbeard/webserve.py @@ -651,7 +651,7 @@ class Home(WebRoot): if show is None: return "Invalid show parameters" - showObj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(show)) + showObj = Show.find(sickbeard.showList, int(show)) if showObj is None: return "Invalid show paramaters" @@ -1186,7 +1186,7 @@ class Home(WebRoot): # todo: add more comprehensive show validation try: show = int(show) # fails if show id ends in a period SickRage/sickrage-issues#65 - showObj = sickbeard.helpers.findCertainShow(sickbeard.showList, show) + showObj = Show.find(sickbeard.showList, show) except (ValueError, TypeError): return self._genericMessage("Error", "Invalid show ID: %s" % str(show)) @@ -1359,7 +1359,7 @@ class Home(WebRoot): else: return self._genericMessage("Error", errString) - showObj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(show)) + showObj = Show.find(sickbeard.showList, int(show)) if not showObj: errString = "Unable to find the specified show: " + str(show) @@ -1598,7 +1598,7 @@ class Home(WebRoot): if show is None: return self._genericMessage("Error", "Invalid show ID") - showObj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(show)) + showObj = Show.find(sickbeard.showList, int(show)) if showObj is None: return self._genericMessage("Error", "Unable to find the specified show") @@ -1619,7 +1619,7 @@ class Home(WebRoot): if show is None: return self._genericMessage("Error", "Invalid show ID") - showObj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(show)) + showObj = Show.find(sickbeard.showList, int(show)) if showObj is None: return self._genericMessage("Error", "Unable to find the specified show") @@ -1636,7 +1636,7 @@ class Home(WebRoot): showObj = None if show: - showObj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(show)) + showObj = Show.find(sickbeard.showList, int(show)) if showObj: showName = urllib.quote_plus(showObj.name.encode('utf-8')) @@ -1667,7 +1667,7 @@ class Home(WebRoot): showObj = None if show: - showObj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(show)) + showObj = Show.find(sickbeard.showList, int(show)) if notifiers.emby_notifier.update_library(showObj): ui.notifications.message( @@ -1699,7 +1699,7 @@ class Home(WebRoot): else: return self._genericMessage("Error", errMsg) - showObj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(show)) + showObj = Show.find(sickbeard.showList, int(show)) if not showObj: errMsg = "Error", "Show not in show list" @@ -1829,7 +1829,7 @@ class Home(WebRoot): if show is None: return self._genericMessage("Error", "You must specify a show") - showObj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(show)) + showObj = Show.find(sickbeard.showList, int(show)) if showObj is None: return self._genericMessage("Error", "Show not in show list") @@ -1875,7 +1875,7 @@ class Home(WebRoot): errMsg = "You must specify a show and at least one episode" return self._genericMessage("Error", errMsg) - show_obj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(show)) + show_obj = Show.find(sickbeard.showList, int(show)) if show_obj is None: errMsg = "Error", "Show not in show list" @@ -1942,7 +1942,7 @@ class Home(WebRoot): def getManualSearchStatus(self, show=None): def getEpisodes(searchThread, searchstatus): results = [] - showObj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(searchThread.show.indexerid)) + showObj = Show.find(sickbeard.showList, int(searchThread.show.indexerid)) if not showObj: logger.log(u'No Show Object found for show with indexerID: ' + str(searchThread.show.indexerid), logger.ERROR) @@ -2057,7 +2057,7 @@ class Home(WebRoot): if sceneAbsolute in ['null', '']: sceneAbsolute = None - showObj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(show)) + showObj = Show.find(sickbeard.showList, int(show)) if showObj.is_anime: result = { @@ -2397,7 +2397,7 @@ class HomeAddShows(Home): cur_dir['existing_info'] = (indexer_id, show_name, indexer) - if indexer_id and helpers.findCertainShow(sickbeard.showList, indexer_id): + if indexer_id and Show.find(sickbeard.showList, indexer_id): cur_dir['added_already'] = True return t.render(dirList=dir_list) @@ -2479,7 +2479,7 @@ class HomeAddShows(Home): for show_detail in shows: show = {'show': show_detail} try: - if not helpers.findCertainShow(sickbeard.showList, [int(show['show']['ids']['tvdb'])]): + if not Show.find(sickbeard.showList, [int(show['show']['ids']['tvdb'])]): if show['show']['ids']['tvdb'] not in (lshow['show']['ids']['tvdb'] for lshow in library_shows): if not_liked_show: if show['show']['ids']['tvdb'] not in (show['show']['ids']['tvdb'] for show in not_liked_show if show['type'] == 'show'): @@ -2534,7 +2534,7 @@ class HomeAddShows(Home): library_shows = trakt_api.traktRequest("sync/collection/shows?extended=full") or [] for show in shows: try: - if not helpers.findCertainShow(sickbeard.showList, [int(show['show']['ids']['tvdb'])]): + if not Show.find(sickbeard.showList, [int(show['show']['ids']['tvdb'])]): if show['show']['ids']['tvdb'] not in (lshow['show']['ids']['tvdb'] for lshow in library_shows): if not_liked_show: if show['show']['ids']['tvdb'] not in (show['show']['ids']['tvdb'] for show in not_liked_show if show['type'] == 'show'): @@ -2590,7 +2590,7 @@ class HomeAddShows(Home): controller="addShows", action="addExistingShow") def addTraktShow(self, indexer_id, showName): - if helpers.findCertainShow(sickbeard.showList, int(indexer_id)): + if Show.find(sickbeard.showList, int(indexer_id)): return if sickbeard.ROOT_DIRS: @@ -3033,13 +3033,13 @@ class Manage(Home, WebRoot): for epResult in to_download[cur_indexer_id]: season, episode = epResult.split('x') - show = sickbeard.helpers.findCertainShow(sickbeard.showList, int(cur_indexer_id)) + show = Show.find(sickbeard.showList, int(cur_indexer_id)) show.getEpisode(int(season), int(episode)).download_subtitles() return self.redirect('/manage/subtitleMissed/') def backlogShow(self, indexer_id): - show_obj = helpers.findCertainShow(sickbeard.showList, int(indexer_id)) + show_obj = Show.find(sickbeard.showList, int(indexer_id)) if show_obj: sickbeard.backlogSearchScheduler.action.searchBacklog([show_obj]) @@ -3095,7 +3095,7 @@ class Manage(Home, WebRoot): showNames = [] for curID in showIDs: curID = int(curID) - showObj = helpers.findCertainShow(sickbeard.showList, curID) + showObj = Show.find(sickbeard.showList, curID) if showObj: showList.append(showObj) showNames.append(showObj.name) @@ -3235,7 +3235,7 @@ class Manage(Home, WebRoot): errors = [] for curShow in showIDs: curErrors = [] - showObj = helpers.findCertainShow(sickbeard.showList, int(curShow)) + showObj = Show.find(sickbeard.showList, int(curShow)) if not showObj: continue @@ -3378,7 +3378,7 @@ class Manage(Home, WebRoot): if curShowID == '': continue - showObj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(curShowID)) + showObj = Show.find(sickbeard.showList, int(curShowID)) if showObj is None: continue diff --git a/sickrage/media/GenericMedia.py b/sickrage/media/GenericMedia.py index d323e2909e113b35aa824c2aa14c6932919ee865..0c8bf7f6fe096348052b70bb5284b4ee62692d0b 100644 --- a/sickrage/media/GenericMedia.py +++ b/sickrage/media/GenericMedia.py @@ -21,9 +21,9 @@ import sickbeard from abc import abstractmethod from mimetypes import guess_type from os.path import isfile, join, normpath -from sickbeard.helpers import findCertainShow from sickrage.helper.encoding import ek from sickrage.helper.exceptions import MultipleShowObjectsException +from sickrage.show.Show import Show class GenericMedia: @@ -98,7 +98,7 @@ class GenericMedia: """ try: - return findCertainShow(sickbeard.showList, self.indexer_id) + return Show.find(sickbeard.showList, self.indexer_id) except MultipleShowObjectsException: return None diff --git a/sickrage/show/Show.py b/sickrage/show/Show.py index 0634beb0175d985ffeb154750e812d9e5672d66c..83354f37cacc55335d11cd508af98dbb02fa8dcc 100644 --- a/sickrage/show/Show.py +++ b/sickrage/show/Show.py @@ -21,7 +21,6 @@ import sickbeard from datetime import date from sickbeard.common import Quality, SKIPPED, WANTED from sickbeard.db import DBConnection -from sickbeard.helpers import findCertainShow from sickrage.helper.exceptions import CantRefreshShowException, CantRemoveShowException, ex from sickrage.helper.exceptions import MultipleShowObjectsException @@ -53,6 +52,30 @@ class Show: return None, show + @staticmethod + def find(shows, indexer_id): + """ + Find a show by its indexer id in the provided list of shows + :param shows: The list of shows to search in + :param indexer_id: The indexer id of the desired show + :return: The desired show if found, ``None`` if not found + :throw: ``MultipleShowObjectsException`` if multiple shows match the provided ``indexer_id`` + """ + + if indexer_id is None or shows is None or len(shows) == 0: + return None + + indexer_ids = [indexer_id] if not isinstance(indexer_id, list) else indexer_id + results = [show for show in shows if show.indexerid in indexer_ids] + + if len(results) == 0: + return None + + if len(results) == 1: + return results[0] + + raise MultipleShowObjectsException() + @staticmethod def overall_stats(): db = DBConnection() @@ -158,7 +181,7 @@ class Show: return 'Invalid show ID', None try: - show = findCertainShow(sickbeard.showList, int(indexer_id)) + show = Show.find(sickbeard.showList, int(indexer_id)) except MultipleShowObjectsException: return 'Unable to find the specified show', None diff --git a/tests/helpers_tests.py b/tests/helpers_tests.py index 2438691401221c19a3b9afb8d4321d81ff9eea8c..3eef330dd8504cfdfacfd7bf0c6a678b981177ee 100755 --- a/tests/helpers_tests.py +++ b/tests/helpers_tests.py @@ -29,7 +29,6 @@ Methods: isRarFile isBeingWritten remove_file_failed - findCertainShow makeDir searchDBForShow searchIndexerForShowID @@ -459,13 +458,6 @@ class HelpersShowTests(unittest.TestCase): """ Test show methods """ - @unittest.skip('Not yet implemented') - def test_find_certain_show(self): - """ - Test findCertainShow - """ - pass - @unittest.skip('Not yet implemented') def test_search_db_for_show(self): """ diff --git a/tests/sickrage_tests/show/show_tests.py b/tests/sickrage_tests/show/show_tests.py index 9cbed26040002b8f32219740f3586432ad38f7c0..ab53550f74df3e19ee60403ec98af27044d6c335 100644 --- a/tests/sickrage_tests/show/show_tests.py +++ b/tests/sickrage_tests/show/show_tests.py @@ -33,8 +33,10 @@ sys.path.insert(1, os.path.abspath(os.path.join(os.path.dirname(__file__), '../. sys.path.insert(1, os.path.abspath(os.path.join(os.path.dirname(__file__), '../../..'))) import sickbeard + from sickbeard.common import Quality from sickbeard.tv import TVShow +from sickrage.helper.exceptions import MultipleShowObjectsException from sickrage.show.Show import Show @@ -42,6 +44,51 @@ class ShowTests(unittest.TestCase): """ Test shows """ + + def test_find(self): + """ + Test find + """ + sickbeard.QUALITY_DEFAULT = Quality.FULLHDTV + + show123 = TestTVShow(0, 123) + show456 = TestTVShow(0, 456) + show789 = TestTVShow(0, 789) + shows = [show123, show456, show789] + shows_duplicate = shows + shows + + test_cases = { + (False, None): None, + (False, ''): None, + (False, '123'): None, + (False, 123): None, + (False, 12.3): None, + (True, None): None, + (True, ''): None, + (True, '123'): None, + (True, 123): show123, + (True, 12.3): None, + (True, 456): show456, + (True, 789): show789, + } + + unicode_test_cases = { + (False, u''): None, + (False, u'123'): None, + (True, u''): None, + (True, u'123'): None, + } + + for tests in test_cases, unicode_test_cases: + for ((use_shows, indexer_id), result) in tests.iteritems(): + if use_shows: + self.assertEqual(Show.find(shows, indexer_id), result) + else: + self.assertEqual(Show.find(None, indexer_id), result) + + with self.assertRaises(MultipleShowObjectsException): + Show.find(shows_duplicate, 456) + def test_validate_indexer_id(self): """ Test validate indexer id