diff --git a/gui/slick/interfaces/default/config_postProcessing.tmpl b/gui/slick/interfaces/default/config_postProcessing.tmpl index 3bc218ab..664f8a5b 100644 --- a/gui/slick/interfaces/default/config_postProcessing.tmpl +++ b/gui/slick/interfaces/default/config_postProcessing.tmpl @@ -776,7 +776,7 @@ Release Name: %RN - Show.Name.9.Mar.2011.HDTV.XviD-RLSGROUP + Show.Name.9th.Mar.2011.HDTV.XviD-RLSGROUP Release Group: diff --git a/sickbeard/name_parser/parser.py b/sickbeard/name_parser/parser.py index f2fe09b1..fddae778 100644 --- a/sickbeard/name_parser/parser.py +++ b/sickbeard/name_parser/parser.py @@ -19,18 +19,11 @@ import datetime import os.path import re -import copy import regexes import sickbeard import calendar -from sickbeard import logger, classes -from sickbeard import scene_numbering, scene_exceptions - -from lib.dateutil.parser import parse - -from time import strptime - +from sickbeard import logger, helpers, scene_numbering class NameParser(object): ALL_REGEX = 0 @@ -114,6 +107,11 @@ class NameParser(object): if result.series_name: result.series_name = self.clean_series_name(result.series_name) + if 'sports_event_title' in named_groups: + result.sports_event_title = match.group('sports_event_title') + if result.sports_event_title: + result.sports_event_title = self.clean_series_name(result.sports_event_title) + if 'season_num' in named_groups: tmp_season = int(match.group('season_num')) if cur_regex_name == 'bare' and tmp_season in (19, 20): @@ -129,16 +127,12 @@ class NameParser(object): if 'air_year' in named_groups and 'air_month' in named_groups and 'air_day' in named_groups: year = int(match.group('air_year')) - month = match.group('air_month') + month = int(match.group('air_month')) day = int(match.group('air_day')) try: - try: - dtStr = '%s-%s-%s' % (year, month, day) - result.air_date = datetime.datetime.strptime(dtStr, "%Y-%m-%d").date() - except: - dtStr = '%s-%s-%s' % (day, month, year) - result.air_date = datetime.datetime.strptime(dtStr, "%d-%b-%Y").date() + dtStr = '%s-%s-%s' % (year, month, day) + result.air_date = datetime.datetime.strptime(dtStr, "%Y-%m-%d").date() except ValueError, e: raise InvalidNameException(e.message) @@ -235,7 +229,9 @@ class NameParser(object): # build the ParseResult object final_result.air_date = self._combine_results(file_name_result, dir_name_result, 'air_date') - final_result.sports_date = self._combine_results(file_name_result, dir_name_result, 'sports_date') + + # sports event title + final_result.sports_event_title = self._combine_results(file_name_result, dir_name_result, 'sports_event_title') if not final_result.air_date: final_result.season_number = self._combine_results(file_name_result, dir_name_result, 'season_number') @@ -268,12 +264,12 @@ class ParseResult(object): def __init__(self, original_name, series_name=None, + sports_event_title=None, season_number=None, episode_numbers=None, extra_info=None, release_group=None, air_date=None, - sports_date=None ): self.original_name = original_name @@ -289,7 +285,8 @@ class ParseResult(object): self.release_group = release_group self.air_date = air_date - self.sports_date = sports_date + + self.sports_event_title = sports_event_title self.which_regex = None @@ -309,7 +306,7 @@ class ParseResult(object): return False if self.air_date != other.air_date: return False - if self.sports_date != other.sports_date: + if self.sports_event_title != other.sports_event_title: return False return True @@ -328,7 +325,7 @@ class ParseResult(object): if self.air_by_date: to_return += str(self.air_date) if self.sports: - to_return += str(self.sports_date) + to_return += str(self.sports_event_title) if self.extra_info: to_return += ' - ' + self.extra_info @@ -341,14 +338,47 @@ class ParseResult(object): return to_return.encode('utf-8') + def convert(self): + if self.air_by_date: return # scene numbering does not apply to air-by-date + if self.season_number == None: return self # can't work without a season + if len(self.episode_numbers) == 0: return self # need at least one episode + + # convert scene numbered releases before storing to cache + indexer_id = helpers.searchDBForShow(self.series_name) + if indexer_id: + new_episode_numbers = [] + new_season_numbers = [] + for epNo in self.episode_numbers: + (s, e) = scene_numbering.get_indexer_numbering(indexer_id, self.season_number, epNo) + new_episode_numbers.append(e) + new_season_numbers.append(s) + + # need to do a quick sanity check here. It's possible that we now have episodes + # from more than one season (by tvdb numbering), and this is just too much + # for sickbeard, so we'd need to flag it. + new_season_numbers = list(set(new_season_numbers)) # remove duplicates + if len(new_season_numbers) > 1: + raise InvalidNameException("Scene numbering results episodes from " + "seasons %s, (i.e. more than one) and " + "sickbeard does not support this. " + "Sorry." % (str(new_season_numbers))) + + # I guess it's possible that we'd have duplicate episodes too, so lets + # eliminate them + new_episode_numbers = list(set(new_episode_numbers)) + new_episode_numbers.sort() + + self.episode_numbers = new_episode_numbers + self.season_number = new_season_numbers[0] + def _is_air_by_date(self): - if self.season_number == None and len(self.episode_numbers) == 0 and self.air_date and not self.sports_date: + if self.season_number == None and len(self.episode_numbers) == 0 and self.air_date: return True return False air_by_date = property(_is_air_by_date) def _is_sports(self): - if self.season_number == None and len(self.episode_numbers) == 0 and self.sports_date: + if self.sports_event_title: return True return False sports = property(_is_sports) @@ -359,14 +389,14 @@ class NameParserCache(object): _previous_parsed = {} _cache_size = 100 - def add(self, name, parse_result): + def add(self, name, parse_result, convert=False): self._previous_parsed[name] = parse_result self._previous_parsed_list.append(name) while len(self._previous_parsed_list) > self._cache_size: del_me = self._previous_parsed_list.pop(0) self._previous_parsed.pop(del_me) - def get(self, name): + def get(self, name, convert=False): if name in self._previous_parsed: logger.log("Using cached parse result for: " + name, logger.DEBUG) return self._previous_parsed[name] diff --git a/sickbeard/name_parser/regexes.py b/sickbeard/name_parser/regexes.py index 4e5be696..6b769557 100644 --- a/sickbeard/name_parser/regexes.py +++ b/sickbeard/name_parser/regexes.py @@ -187,16 +187,13 @@ ep_regexes = [ ] sports_regexs = [ - ('sports_event', - # Show.Name.123.Event.Nov.23rd.2010.Source.Quality.Etc-Group - ''' - ^((?P.+?)[. _-]+)? - ^((?P.+?)[. _-]+)? - ((?P\d{1,2}))[. _-]+ - (?P\w{3,})[. _-]+ - (?P\d{4}) - [. _-]*((?P.+?) - ((?[^- ]+))?)?$ - '''), + ('sports_event_mma', + # Show.Name.123.Event.23rd.Nov.2010.Source.Quality.Etc-Group + ''' + ^(?P.+?)[. _-]+ + (?P\d{3}[. _-]+\w+[. _-]vs[. _-]\w+) + ([. _-]*(?P.+?)((?[^- ]+))?)?$ + ''' + ), ] \ No newline at end of file diff --git a/sickbeard/naming.py b/sickbeard/naming.py index 26762c0e..2dc40233 100644 --- a/sickbeard/naming.py +++ b/sickbeard/naming.py @@ -40,9 +40,11 @@ name_abd_presets = ('%SN - %A-D - %EN', '%Y/%0M/%S.N.%A.D.%E.N-%RG' ) -name_sports_presets = ('%SN - %A-D - %EN', - '%S.N.%A.D.%E.N.%Q.N', - '%Y/%0M/%S.N.%A.D.%E.N-%RG' +name_sports_presets = ('%SN - %Sx%0E - %EN', + '%S.N.S%0SE%0E.%E.N', + '%Sx%0E - %EN', + 'S%0SE%0E - %EN', + 'Season %0S/%S.N.S%0SE%0E.%Q.N-%RG' ) class TVShow(): @@ -135,11 +137,7 @@ def check_valid_sports_naming(pattern=None): def validate_name(pattern, multi=None, file_only=False, abd=False, sports=False): ep = _generate_sample_ep(multi, abd, sports) - regexMode = 0 - if sports: - regexMode = 2 - - parser = NameParser(True, regexMode) + parser = NameParser(True) new_name = ep.formatted_filename(pattern, multi) + '.ext' new_path = ep.formatted_dir(pattern, multi) @@ -164,10 +162,6 @@ def validate_name(pattern, multi=None, file_only=False, abd=False, sports=False) if result.air_date != ep.airdate: logger.log(u"Air date incorrect in parsed episode, pattern isn't valid", logger.DEBUG) return False - elif sports: - if result.air_date != ep.airdate: - logger.log(u"Sports air date incorrect in parsed episode, pattern isn't valid", logger.DEBUG) - return False else: if result.season_number != ep.season: logger.log(u"Season incorrect in parsed episode, pattern isn't valid", logger.DEBUG) @@ -182,6 +176,7 @@ def validate_name(pattern, multi=None, file_only=False, abd=False, sports=False) def _generate_sample_ep(multi=None, abd=False, sports=False): # make a fake episode object ep = TVEpisode(2, 3, "Ep Name") + ep._status = Quality.compositeStatus(DOWNLOADED, Quality.HDTV) ep._airdate = datetime.date(2011, 3, 9) @@ -189,7 +184,7 @@ def _generate_sample_ep(multi=None, abd=False, sports=False): ep._release_name = 'Show.Name.2011.03.09.HDTV.XviD-RLSGROUP' ep.show.air_by_date = 1 elif sports: - ep._release_name = 'Show.Name.09.Mar.2011.HDTV.XviD-RLSGROUP' + ep._release_name = 'Show.Name.100.Fighter.vs.Fighter.HDTV.XviD-RLSGROUP' ep.show.sports = 1 else: ep._release_name = 'Show.Name.S02E03.HDTV.XviD-RLSGROUP' diff --git a/sickbeard/postProcessor.py b/sickbeard/postProcessor.py index d6c17e94..c9752ea0 100644 --- a/sickbeard/postProcessor.py +++ b/sickbeard/postProcessor.py @@ -457,16 +457,13 @@ class PostProcessor(object): # parse the name to break it into show name, season, and episode np = NameParser(file) - parse_result = np.parse(name) + parse_result = np.parse(name).convert() self._log("Parsed " + name + " into " + str(parse_result).decode('utf-8'), logger.DEBUG) if parse_result.air_by_date: season = -1 episodes = [parse_result.air_date] - elif parse_result.sports: - season = -1 - episodes = [parse_result.sports_date] else: season = parse_result.season_number episodes = parse_result.episode_numbers @@ -698,7 +695,7 @@ class PostProcessor(object): # now that we've figured out which episode this file is just load it manually try: # convert scene numbered release and load episode from database - curEp = show_obj.getEpisode(season, cur_episode, sceneConvert=True) + curEp = show_obj.getEpisode(season, cur_episode) except exceptions.EpisodeNotFoundException, e: self._log(u"Unable to create episode: " + ex(e), logger.DEBUG) raise exceptions.PostProcessingFailed() diff --git a/sickbeard/properFinder.py b/sickbeard/properFinder.py index 31409098..7438182f 100644 --- a/sickbeard/properFinder.py +++ b/sickbeard/properFinder.py @@ -100,7 +100,7 @@ class ProperFinder(): # parse the file name try: myParser = NameParser(False) - parse_result = myParser.parse(curProper.name) + parse_result = myParser.parse(curProper.name).convert() except InvalidNameException: logger.log(u"Unable to parse the filename " + curProper.name + " into a valid episode", logger.DEBUG) continue @@ -115,9 +115,6 @@ class ProperFinder(): if parse_result.air_by_date: curProper.season = -1 curProper.episode = parse_result.air_date - elif parse_result.sports: - curProper.season = -1 - curProper.episode = parse_result.sports_date else: curProper.season = parse_result.season_number if parse_result.season_number != None else 1 curProper.episode = parse_result.episode_numbers[0] @@ -200,7 +197,7 @@ class ProperFinder(): continue else: # items stored in cache are scene numbered, convert before lookups - epObj = showObj.getEpisode(curProper.season, curProper.episode, sceneConvert=True) + epObj = showObj.getEpisode(curProper.season, curProper.episode) curProper.season = epObj.season curProper.episode = epObj.episode diff --git a/sickbeard/providers/ezrss.py b/sickbeard/providers/ezrss.py index 2b0dd608..719e523b 100644 --- a/sickbeard/providers/ezrss.py +++ b/sickbeard/providers/ezrss.py @@ -61,7 +61,7 @@ class EZRSSProvider(generic.TorrentProvider): results = {} - if self.show.air_by_date or show.sports: + if self.show.air_by_date or self.show.sports: logger.log(self.name + u" doesn't support air-by-date or sports backloging because of limitations on their RSS search.", logger.WARNING) return results diff --git a/sickbeard/providers/generic.py b/sickbeard/providers/generic.py index 635f83eb..01001b83 100644 --- a/sickbeard/providers/generic.py +++ b/sickbeard/providers/generic.py @@ -257,18 +257,14 @@ class GenericProvider: regexMode = 2 for ep_obj in ep_objs: - if show.sports: - logger.log( - u'Searching "%s" for "%s" as "%s"' % (self.name, ep_obj.prettyName(), ep_obj.sports_prettyName())) - else: - logger.log(u'Searching "%s" for "%s" as "%s"' % (self.name, ep_obj.prettyName(), ep_obj.scene_prettyName())) + logger.log(u'Searching "%s" for "%s" as "%s"' % (self.name, ep_obj.prettyName(), ep_obj.scene_prettyName())) if seasonSearch: - for curString in self._get_season_search_strings(ep_obj.scene_season, ep_obj.airdate if show.air_by_date or show.sports else ep_obj.scene_episode): - itemList += self._doSearch(curString, show=show) + for curString in self._get_season_search_strings(ep_obj.scene_season, ep_obj.airdate if show.air_by_date else ep_obj.scene_episode): + itemList += self._doSearch(curString) else: - for curString in self._get_episode_search_strings(ep_obj.scene_season, ep_obj.airdate if show.air_by_date or show.sports else ep_obj.scene_episode): - itemList += self._doSearch(curString, show=show) + for curString in self._get_episode_search_strings(ep_obj.scene_season, ep_obj.airdate if show.air_by_date else ep_obj.scene_episode): + itemList += self._doSearch(curString) for item in itemList: @@ -279,12 +275,12 @@ class GenericProvider: # parse the file name try: myParser = NameParser(False, regexMode=regexMode) - parse_result = myParser.parse(title) + parse_result = myParser.parse(title).convert() except InvalidNameException: logger.log(u"Unable to parse the filename " + title + " into a valid episode", logger.WARNING) continue - if not show.air_by_date and not show.sports: + if not show.air_by_date: # this check is meaningless for non-season searches if (parse_result.season_number != None and parse_result.season_number != season) or ( parse_result.season_number == None and season != 1): @@ -303,19 +299,10 @@ class GenericProvider: logger.DEBUG) continue - if show.sports and not parse_result.sports: - logger.log( - u"This is supposed to be an sports search but the result " + title + " didn't parse as one, skipping it", - logger.DEBUG) - continue - myDB = db.DBConnection() if parse_result.air_by_date: sql_results = myDB.select("SELECT season, episode FROM tv_episodes WHERE showid = ? AND airdate = ?", [show.indexerid, parse_result.air_date.toordinal()]) - elif parse_result.sports: - sql_results = myDB.select("SELECT season, episode FROM tv_episodes WHERE showid = ? AND airdate = ?", - [show.indexerid, parse_result.sports_date.toordinal()]) if len(sql_results) != 1: logger.log( diff --git a/sickbeard/providers/hdtorrents.py b/sickbeard/providers/hdtorrents.py index 496f5f49..6b6d937b 100644 --- a/sickbeard/providers/hdtorrents.py +++ b/sickbeard/providers/hdtorrents.py @@ -309,7 +309,7 @@ class HDTorrentsProvider(generic.TorrentProvider): self.show = self.show = curshow = helpers.findCertainShow(sickbeard.showList, int(sqlshow["showid"])) curEp = curshow.getEpisode(int(sqlshow["season"]), int(sqlshow["episode"])) - searchString = self._get_episode_search_strings(curEp.scene_season, curEp.airdate if curshow.air_by_date or curshow.sports else curEp.scene_episode, add_string='PROPER|REPACK') + searchString = self._get_episode_search_strings(curEp.scene_season, curEp.airdate if curshow.air_by_date else curEp.scene_episode, add_string='PROPER|REPACK') for item in self._doSearch(searchString[0], show=curshow): title, url = self._get_title_and_url(item) diff --git a/sickbeard/providers/iptorrents.py b/sickbeard/providers/iptorrents.py index 28e85692..c75b7c77 100644 --- a/sickbeard/providers/iptorrents.py +++ b/sickbeard/providers/iptorrents.py @@ -257,7 +257,9 @@ class IPTorrentsProvider(generic.TorrentProvider): for sqlshow in sqlResults: self.show = curshow = helpers.findCertainShow(sickbeard.showList, int(sqlshow["showid"])) curEp = curshow.getEpisode(int(sqlshow["season"]), int(sqlshow["episode"])) - searchString = self._get_episode_search_strings(curshow, curEp.scene_season, curEp.scene_episode, curshow.air_by_date or curshow.sports, add_string='PROPER|REPACK') + searchString = self._get_episode_search_strings(curEp.scene_season, + curEp.airdate if curshow.air_by_date else curEp.scene_episode, + add_string='PROPER|REPACK') for item in self._doSearch(searchString[0], show=curshow): title, url = self._get_title_and_url(item) diff --git a/sickbeard/providers/kat.py b/sickbeard/providers/kat.py index 64720ca1..2b6fc2f9 100644 --- a/sickbeard/providers/kat.py +++ b/sickbeard/providers/kat.py @@ -383,7 +383,7 @@ class KATProvider(generic.TorrentProvider): self.show = curshow = helpers.findCertainShow(sickbeard.showList, int(sqlshow["showid"])) curEp = curshow.getEpisode(int(sqlshow["season"]), int(sqlshow["episode"])) - searchString = self._get_episode_search_strings(curEp.scene_season, curEp.airdate if curshow.air_by_date or curshow.sports else curEp.scene_episode, add_string='PROPER|REPACK') + searchString = self._get_episode_search_strings(curEp.scene_season, curEp.airdate if curshow.air_by_date else curEp.scene_episode, add_string='PROPER|REPACK') for item in self._doSearch(searchString[0], show=curshow): title, url = self._get_title_and_url(item) diff --git a/sickbeard/providers/newznab.py b/sickbeard/providers/newznab.py index e35f5689..f65bd767 100644 --- a/sickbeard/providers/newznab.py +++ b/sickbeard/providers/newznab.py @@ -118,11 +118,9 @@ class NewznabProvider(generic.NZBProvider): params['season'] = date_str.partition('-')[0] params['ep'] = date_str.partition('-')[2].replace('-', '/') - elif self.show.sports: - date_str = str(episode) - - params['season'] = date_str.partition('-')[0] - params['ep'] = date_str.partition('-')[2].replace('-', '/') +# elif self.show.sports: +# params['season'] +# params['ep'] else: params['season'] = season params['ep'] = episode diff --git a/sickbeard/providers/nextgen.py b/sickbeard/providers/nextgen.py index cdad7d6d..604d68f1 100644 --- a/sickbeard/providers/nextgen.py +++ b/sickbeard/providers/nextgen.py @@ -305,7 +305,7 @@ class NextGenProvider(generic.TorrentProvider): for sqlshow in sqlResults: self.show = curshow = helpers.findCertainShow(sickbeard.showList, int(sqlshow["showid"])) curEp = curshow.getEpisode(int(sqlshow["season"]), int(sqlshow["episode"])) - searchString = self._get_episode_search_strings(curEp.scene_season, curEp.airdate if curshow.air_by_date or curshow.sports else curEp.scene_episode, add_string='PROPER|REPACK') + searchString = self._get_episode_search_strings(curEp.scene_season, curEp.airdate if curshow.air_by_date else curEp.scene_episode, add_string='PROPER|REPACK') for item in self._doSearch(searchString[0], show=curshow): title, url = self._get_title_and_url(item) diff --git a/sickbeard/providers/publichd.py b/sickbeard/providers/publichd.py index beca9f1f..50cedea2 100644 --- a/sickbeard/providers/publichd.py +++ b/sickbeard/providers/publichd.py @@ -278,12 +278,7 @@ class PublicHDProvider(generic.TorrentProvider): self.show = curshow = helpers.findCertainShow(sickbeard.showList, int(sqlshow["showid"])) curEp = curshow.getEpisode(int(sqlshow["season"]), int(sqlshow["episode"])) - season = curEp.scene_season - episode = curEp.scene_episode - if curshow.air_by_date or curshow.sports: - episode = curEp.airdate - - searchString = self._get_episode_search_strings(curEp.scene_season, curEp.airdate if curshow.air_by_date or curshow.sports else curEp.scene_episode, add_string='PROPER|REPACK') + searchString = self._get_episode_search_strings(curEp.scene_season, curEp.airdate if curshow.air_by_date else curEp.scene_episode, add_string='PROPER|REPACK') for item in self._doSearch(searchString[0], show=curshow): title, url = self._get_title_and_url(item) diff --git a/sickbeard/providers/scc.py b/sickbeard/providers/scc.py index cc59204f..4ff9efa7 100644 --- a/sickbeard/providers/scc.py +++ b/sickbeard/providers/scc.py @@ -283,12 +283,7 @@ class SCCProvider(generic.TorrentProvider): self.show = curshow = helpers.findCertainShow(sickbeard.showList, int(sqlshow["showid"])) curEp = curshow.getEpisode(int(sqlshow["season"]), int(sqlshow["episode"])) - season = curEp.scene_season - episode = curEp.scene_episode - if curshow.air_by_date or curshow.sports: - episode = curEp.airdate - - searchString = self._get_episode_search_strings(curEp.scene_season, curEp.airdate if curshow.air_by_date or curshow.sports else curEp.scene_episode, add_string='PROPER|REPACK') + searchString = self._get_episode_search_strings(curEp.scene_season, curEp.airdate if curshow.air_by_date else curEp.scene_episode, add_string='PROPER|REPACK') for item in self._doSearch(searchString[0], show=curshow): title, url = self._get_title_and_url(item) diff --git a/sickbeard/providers/speedcd.py b/sickbeard/providers/speedcd.py index d6d45044..ef4ccba5 100644 --- a/sickbeard/providers/speedcd.py +++ b/sickbeard/providers/speedcd.py @@ -236,12 +236,7 @@ class SpeedCDProvider(generic.TorrentProvider): self.show = curshow = helpers.findCertainShow(sickbeard.showList, int(sqlshow["showid"])) curEp = curshow.getEpisode(int(sqlshow["season"]), int(sqlshow["episode"])) - season = curEp.scene_season - episode = curEp.scene_episode - if curshow.air_by_date or curshow.sports: - episode = curEp.airdate - - searchString = self._get_episode_search_strings(curshow, season, episode,add_string='PROPER|REPACK') + searchString = self._get_episode_search_strings(curEp.scene_season, curEp.airdate if curshow.air_by_date else curEp.scene_episode, add_string='PROPER|REPACK') for item in self._doSearch(searchString[0], show=curshow): title, url = self._get_title_and_url(item) diff --git a/sickbeard/providers/thepiratebay.py b/sickbeard/providers/thepiratebay.py index 94782bf8..a9bd92b5 100644 --- a/sickbeard/providers/thepiratebay.py +++ b/sickbeard/providers/thepiratebay.py @@ -376,7 +376,7 @@ class ThePirateBayProvider(generic.TorrentProvider): self.show = curshow = helpers.findCertainShow(sickbeard.showList, int(sqlshow["showid"])) curEp = curshow.getEpisode(int(sqlshow["season"]), int(sqlshow["episode"])) - searchString = self._get_episode_search_strings(curEp.scene_season, curEp.airdate if curshow.air_by_date or curshow.sports else curEp.scene_episode, add_string='PROPER|REPACK') + searchString = self._get_episode_search_strings(curEp.scene_season, curEp.airdate if curshow.air_by_date else curEp.scene_episode, add_string='PROPER|REPACK') for item in self._doSearch(searchString[0], show=curshow): title, url = self._get_title_and_url(item) diff --git a/sickbeard/providers/torrentday.py b/sickbeard/providers/torrentday.py index 88067de5..582490db 100644 --- a/sickbeard/providers/torrentday.py +++ b/sickbeard/providers/torrentday.py @@ -255,12 +255,7 @@ class TorrentDayProvider(generic.TorrentProvider): self.show = curshow = helpers.findCertainShow(sickbeard.showList, int(sqlshow["showid"])) curEp = curshow.getEpisode(int(sqlshow["season"]), int(sqlshow["episode"])) - season = curEp.scene_season - episode = curEp.scene_episode - if curshow.air_by_date or curshow.sports: - episode = curEp.airdate - - searchString = self._get_episode_search_strings(curEp.scene_season, curEp.airdate if curshow.air_by_date or curshow.sports else curEp.scene_episode, add_string='PROPER|REPACK') + searchString = self._get_episode_search_strings(curEp.scene_season, curEp.airdate if curshow.air_by_date else curEp.scene_episode, add_string='PROPER|REPACK') for item in self._doSearch(searchString[0], show=curshow): title, url = self._get_title_and_url(item) diff --git a/sickbeard/providers/torrentleech.py b/sickbeard/providers/torrentleech.py index 44dc8e8e..6cdd9178 100644 --- a/sickbeard/providers/torrentleech.py +++ b/sickbeard/providers/torrentleech.py @@ -256,7 +256,7 @@ class TorrentLeechProvider(generic.TorrentProvider): self.show = curshow = helpers.findCertainShow(sickbeard.showList, int(sqlshow["showid"])) curEp = curshow.getEpisode(int(sqlshow["season"]), int(sqlshow["episode"])) - searchString = self._get_episode_search_strings(curEp.scene_season, curEp.airdate if curshow.air_by_date or curshow.sports else curEp.scene_episode, add_string='PROPER|REPACK') + searchString = self._get_episode_search_strings(curEp.scene_season, curEp.airdate if curshow.air_by_date else curEp.scene_episode, add_string='PROPER|REPACK') for item in self._doSearch(searchString[0], show=curshow): title, url = self._get_title_and_url(item) diff --git a/sickbeard/search.py b/sickbeard/search.py index 8df01dd6..53a01cc5 100644 --- a/sickbeard/search.py +++ b/sickbeard/search.py @@ -378,7 +378,9 @@ def searchProviders(show, season, episode=None, manualSearch=False): # search cache first for wanted episodes for ep_obj in wantedEps: - curResults.update(curProvider.cache.searchCache(ep_obj, manualSearch)) + results = curProvider.cache.searchCache(ep_obj, manualSearch) + if results: + curResults.update(results) # did we find our results ? if curResults: diff --git a/sickbeard/search_queue.py b/sickbeard/search_queue.py index 7f871ed7..79be7ec4 100644 --- a/sickbeard/search_queue.py +++ b/sickbeard/search_queue.py @@ -192,7 +192,7 @@ class BacklogQueueItem(generic_queue.QueueItem): myDB = db.DBConnection() # see if there is anything in this season worth searching for - if not self.show.air_by_date and not self.show.sports: + if not self.show.air_by_date: statusResults = myDB.select("SELECT status FROM tv_episodes WHERE showid = ? AND season = ?", [self.show.indexerid, self.segment]) else: diff --git a/sickbeard/tv.py b/sickbeard/tv.py index bce67a5e..86b8ef73 100644 --- a/sickbeard/tv.py +++ b/sickbeard/tv.py @@ -182,24 +182,7 @@ class TVShow(object): return ep_list - def getEpisode(self, season, episode, file=None, noCreate=False, sceneConvert=False): - - #return TVEpisode(self, season, episode) - if sceneConvert: - for curSeason in self.episodes: - for curEp in self.episodes[curSeason]: - myEp = self.episodes[curSeason][curEp] - try: - scene_season = myEp.scene_season - scene_episode = myEp.scene_episode - except:continue - - if season != scene_season or episode != scene_episode: - continue - - # found correct ep info - season = int(myEp.season) - episode = int(myEp.episode) + def getEpisode(self, season, episode, file=None, noCreate=False): if not season in self.episodes: self.episodes[season] = {} @@ -594,8 +577,6 @@ class TVShow(object): epObj = None if parse_result.air_by_date: epObj = t[self.indexerid].airedOn(parse_result.air_date)[0] - elif parse_result.sports: - epObj = t[self.indexerid].airedOn(parse_result.sports_date)[0] season = int(epObj["seasonnumber"]) episodes = [int(epObj["episodenumber"])] @@ -1910,70 +1891,37 @@ class TVEpisode(object): else: show_name = self.show.name - if self.show.sports: - return { - '%SN': show_name, - '%S.N': dot(show_name), - '%S_N': us(show_name), - '%EN': ep_name, - '%E.N': dot(ep_name), - '%E_N': us(ep_name), - '%QN': Quality.qualityStrings[epQual], - '%Q.N': dot(Quality.qualityStrings[epQual]), - '%Q_N': us(Quality.qualityStrings[epQual]), - '%S': str(self.season), - '%0S': '%02d' % self.season, - '%E': str(self.episode), - '%0E': '%02d' % self.episode, - '%XMS': str(self.scene_season), - '%0XMS': '%02d' % self.scene_season, - '%XME': str(self.scene_episode), - '%0XME': '%02d' % self.scene_episode, - '%RN': release_name(self.release_name), - '%RG': release_group(self.release_name), - '%AD': self.airdate.strftime('%d %b %Y'), - '%A.D': self.airdate.strftime('%d.%b.%Y'), - '%A_D': us(self.airdate.strftime('%d-%b-%Y')), - '%A-D': self.airdate.strftime('%d-%b-%Y'), - '%Y': str(self.airdate.year), - '%M': self.airdate.strftime('%b'), - '%D': str(self.airdate.day), - '%0M': '%02d' % self.airdate.month, - '%0D': '%02d' % self.airdate.day, - '%RT': "PROPER" if self.is_proper else "", - } - else: - return { - '%SN': show_name, - '%S.N': dot(show_name), - '%S_N': us(show_name), - '%EN': ep_name, - '%E.N': dot(ep_name), - '%E_N': us(ep_name), - '%QN': Quality.qualityStrings[epQual], - '%Q.N': dot(Quality.qualityStrings[epQual]), - '%Q_N': us(Quality.qualityStrings[epQual]), - '%S': str(self.season), - '%0S': '%02d' % self.season, - '%E': str(self.episode), - '%0E': '%02d' % self.episode, - '%XMS': str(self.scene_season), - '%0XMS': '%02d' % self.scene_season, - '%XME': str(self.scene_episode), - '%0XME': '%02d' % self.scene_episode, - '%RN': release_name(self.release_name), - '%RG': release_group(self.release_name), - '%AD': str(self.airdate).replace('-', ' '), - '%A.D': str(self.airdate).replace('-', '.'), - '%A_D': us(str(self.airdate)), - '%A-D': str(self.airdate), - '%Y': str(self.airdate.year), - '%M': str(self.airdate.month), - '%D': str(self.airdate.day), - '%0M': '%02d' % self.airdate.month, - '%0D': '%02d' % self.airdate.day, - '%RT': "PROPER" if self.is_proper else "", - } + return { + '%SN': show_name, + '%S.N': dot(show_name), + '%S_N': us(show_name), + '%EN': ep_name, + '%E.N': dot(ep_name), + '%E_N': us(ep_name), + '%QN': Quality.qualityStrings[epQual], + '%Q.N': dot(Quality.qualityStrings[epQual]), + '%Q_N': us(Quality.qualityStrings[epQual]), + '%S': str(self.season), + '%0S': '%02d' % self.season, + '%E': str(self.episode), + '%0E': '%02d' % self.episode, + '%XMS': str(self.scene_season), + '%0XMS': '%02d' % self.scene_season, + '%XME': str(self.scene_episode), + '%0XME': '%02d' % self.scene_episode, + '%RN': release_name(self.release_name), + '%RG': release_group(self.release_name), + '%AD': str(self.airdate).replace('-', ' '), + '%A.D': str(self.airdate).replace('-', '.'), + '%A_D': us(str(self.airdate)), + '%A-D': str(self.airdate), + '%Y': str(self.airdate.year), + '%M': str(self.airdate.month), + '%D': str(self.airdate.day), + '%0M': '%02d' % self.airdate.month, + '%0D': '%02d' % self.airdate.day, + '%RT': "PROPER" if self.is_proper else "", + } def _format_string(self, pattern, replace_map): """ diff --git a/sickbeard/tvcache.py b/sickbeard/tvcache.py index 47357937..33148e57 100644 --- a/sickbeard/tvcache.py +++ b/sickbeard/tvcache.py @@ -194,14 +194,16 @@ class TVCache(): cacheDB = self._getDB() parse_result = None - from_cache = False indexer_id = None + season = None + episodes = None + from_cache = False # if we don't have complete info then parse the filename to get it while(True): try: myParser = NameParser() - parse_result = myParser.parse(name) + parse_result = myParser.parse(name).convert() except InvalidNameException: logger.log(u"Unable to parse the filename " + name + " into a valid episode", logger.DEBUG) return None @@ -239,64 +241,39 @@ class TVCache(): break # if we didn't find a Indexer ID return None - if not indexer_id: - return None + if indexer_id: + # if the show isn't in out database then return None + try: + showObj = helpers.findCertainShow(sickbeard.showList, indexer_id) + myDB = db.DBConnection() + if parse_result.air_by_date: + sql_results = myDB.select("SELECT season, episode FROM tv_episodes WHERE showid = ? AND airdate = ?", + [showObj.indexerid, parse_result.air_date.toordinal()]) + if sql_results > 0: + season = int(sql_results[0]["season"]) + episodes = [int(sql_results[0]["episode"])] + else: + season = parse_result.season_number + episodes = parse_result.episode_numbers - # if the show isn't in out database then return None - try:showObj = helpers.findCertainShow(sickbeard.showList, indexer_id) - except:return None + if season and episodes: + # store episodes as a seperated string + episodeText = "|" + "|".join(map(str, episodes)) + "|" - if not showObj: - return None + # get the current timestamp + curTimestamp = int(time.mktime(datetime.datetime.today().timetuple())) - # if we weren't provided with season/episode information then get it from the name that we parsed - season = None - episodes = None - myDB = db.DBConnection() - if parse_result.air_by_date: - sql_results = myDB.select("SELECT season, episode FROM tv_episodes WHERE showid = ? AND airdate = ?", - [showObj.indexerid, parse_result.air_date.toordinal()]) - if sql_results > 0: - season = int(sql_results[0]["season"]) - episodes = [int(sql_results[0]["episode"])] - elif parse_result.sports: - sql_results = myDB.select("SELECT season, episode FROM tv_episodes WHERE showid = ? AND airdate = ?", - [showObj.indexerid, parse_result.sports_date.toordinal()]) - if sql_results > 0: - season = int(sql_results[0]["season"]) - episodes = [int(sql_results[0]["episode"])] - else: - season = parse_result.season_number - episodes = parse_result.episode_numbers + # get quality of release + quality = Quality.sceneQuality(name) - if not (season and episodes): - return None - - # convert scene numbered releases before storing to cache - convertedEps = {} - for curEp in episodes: - epObj = showObj.getEpisode(season, curEp, sceneConvert=True) - if not epObj: - return None - if not epObj.season in convertedEps: - convertedEps[epObj.season] = [] - convertedEps[epObj.season].append(epObj.episode) - - # get the current timestamp - curTimestamp = int(time.mktime(datetime.datetime.today().timetuple())) - - # get quality of release - quality = Quality.sceneQuality(name) - - if not isinstance(name, unicode): - name = unicode(name, 'utf-8') - - for season, episodes in convertedEps.items(): - episodeText = "|" + "|".join(map(str, episodes)) + "|" - cacheDB.action( - "INSERT INTO [" + self.providerID + "] (name, season, episodes, indexerid, url, time, quality) VALUES (?,?,?,?,?,?,?)", - [name, season, episodeText, indexer_id, url, curTimestamp, quality]) + if not isinstance(name, unicode): + name = unicode(name, 'utf-8') + cacheDB.action( + "INSERT INTO [" + self.providerID + "] (name, season, episodes, indexerid, url, time, quality) VALUES (?,?,?,?,?,?,?)", + [name, season, episodeText, indexer_id, url, curTimestamp, quality]) + except: + return def searchCache(self, episode, manualSearch=False): neededEps = self.findNeededEpisodes(episode, manualSearch) diff --git a/tests/xem_tests.py b/tests/xem_tests.py index a95ed719..44f4f69a 100644 --- a/tests/xem_tests.py +++ b/tests/xem_tests.py @@ -48,49 +48,22 @@ class XEMBasicTests(test.SickbeardTestDBCase): except Exception, e: print "There was an error creating the show" - def test_formating(self): + def test_parsing_scene_release(self): self.loadFromDB() - show = sickbeard.helpers.findCertainShow(sickbeard.showList, 111051) - show.loadEpisodesFromDB() - ep = show.getEpisode(8, 56, sceneConvert=True) - ep.airdate = datetime.date.today() # parse the file name - pattern = u'%SN - %A-D - %EN' - title = 'UFC.166.Velasquez.v.Dos Santos.III.19th.Oct.2013.HDTV.x264-Sir.Paul' + scene_parsse_results1 = '' + scene_parsse_results2 = '' + scene_release = 'Pawn Stars S08E41 Field Trip HDTV x264-tNe' try: myParser = NameParser(False, 1) - parse_result = myParser.parse(title) + scene_parsse_results1 = myParser.parse(scene_release) + scene_parsse_results2 = myParser.parse(scene_release).convert() except InvalidNameException: - print(u"Unable to parse the filename " + ep.name + " into a valid episode") + print(u"Unable to parse the filename " + scene_release + " into a valid episode") - print parse_result - - search_string = {'Episode':[]} - episode = ep.airdate - str(episode).replace('-', '|') - ep_string = sanitizeSceneName(show.name) + ' ' + \ - str(episode).replace('-', '|') + '|' + \ - episode.strftime('%b') - - search_string['Episode'].append(ep_string) - - scene_ep_string = sanitizeSceneName(show.name) + ' ' + \ - sickbeard.config.naming_ep_type[2] % {'seasonnumber': ep.scene_season, - 'episodenumber': ep.scene_episode} + '|' + \ - sickbeard.config.naming_ep_type[0] % {'seasonnumber': ep.scene_season, - 'episodenumber': ep.scene_episode} + '|' + \ - sickbeard.config.naming_ep_type[3] % {'seasonnumber': ep.scene_season, - 'episodenumber': ep.scene_episode} + ' %s category:tv' % '' - - scene_season_string = show.name + ' S%02d' % int(ep.scene_season) + ' -S%02d' % int(ep.scene_season) + 'E' + ' category:tv' #1) ShowName SXX -SXXE - - print( - u'Searching "%s" for "%s" as "%s"' % (show.name, ep.prettyName(), ep.scene_prettyName())) - - print('Scene episode search strings: %s' % (scene_ep_string)) - - print('Scene season search strings: %s' % (scene_season_string)) + print scene_parsse_results1 + print scene_parsse_results2 if __name__ == "__main__": print "=================="