From bd4d8cb6b2b8f2703c5208d2651a1f3ec73863c5 Mon Sep 17 00:00:00 2001 From: Nic Wolfe <nic@wolfeden.ca> Date: Wed, 6 Jun 2012 23:50:57 -0600 Subject: [PATCH] Made the name parser a little more robust when trying to find release groups. Made the release name migration try to parse the filenames to see if they are valid scene names rather than just looking in the history. --- sickbeard/databases/mainDB.py | 25 +++++++++++++++++++++++++ sickbeard/name_parser/parser.py | 2 +- sickbeard/name_parser/regexes.py | 27 ++++++++++++++++++--------- sickbeard/naming.py | 4 ---- sickbeard/tv.py | 4 ++-- tests/name_parser_tests.py | 23 ++++++++++++++++------- 6 files changed, 62 insertions(+), 23 deletions(-) diff --git a/sickbeard/databases/mainDB.py b/sickbeard/databases/mainDB.py index 70f6eacf0..9595846a6 100644 --- a/sickbeard/databases/mainDB.py +++ b/sickbeard/databases/mainDB.py @@ -469,6 +469,31 @@ class AddSizeAndSceneNameFields(FixAirByDateSetting): self.connection.action("UPDATE tv_episodes SET release_name = ? WHERE episode_id = ?", [cur_name, ep_results[0]["episode_id"]]) break + # check each snatch to see if we can use it to get a release name from + empty_results = self.connection.select("SELECT episode_id, location FROM tv_episodes WHERE release_name = ''") + + logger.log(u"Adding release name to all episodes with obvious scene filenames") + for cur_result in empty_results: + + ep_file_name = ek.ek(os.path.basename, cur_result["location"]) + ep_file_name = ek.ek(os.path.splitext, ep_file_name)[0] + + # I only want to find real scene names here so anything with a space in it is out + if ' ' in ep_file_name: + continue + + try: + np = NameParser(False) + parse_result = np.parse(ep_file_name) + except InvalidNameException: + continue + + if not parse_result.release_group: + continue + + logger.log(u"Name "+ep_file_name+" gave release group of "+parse_result.release_group+", seems valid", logger.DEBUG) + self.connection.action("UPDATE tv_episodes SET release_name = ? WHERE episode_id = ?", [ep_file_name, cur_result["episode_id"]]) + self.incDBVersion() class RenameSeasonFolders(AddSizeAndSceneNameFields): diff --git a/sickbeard/name_parser/parser.py b/sickbeard/name_parser/parser.py index 116375f53..6d467c76b 100644 --- a/sickbeard/name_parser/parser.py +++ b/sickbeard/name_parser/parser.py @@ -330,7 +330,7 @@ class NameParserCache(object): def get(self, name): if name in self._previous_parsed: - logger.log("Using cached parse result for: " + str(name), logger.DEBUG) + logger.log("Using cached parse result for: " + name, logger.DEBUG) return self._previous_parsed[name] else: return None diff --git a/sickbeard/name_parser/regexes.py b/sickbeard/name_parser/regexes.py index f5593be36..704016d77 100644 --- a/sickbeard/name_parser/regexes.py +++ b/sickbeard/name_parser/regexes.py @@ -29,7 +29,8 @@ ep_regexes = [ ([. _-]+s(?P=season_num)[. _-]* # S01 and optional separator e(?P<extra_ep_num>\d+))+ # E03/etc and separator [. _-]*((?P<extra_info>.+?) # Source_Quality_Etc- - ((?<![. _-])-(?P<release_group>[^-]+))?)?$ # Group + ((?<![. _-])(?<!WEB) # Make sure this is really the release group + -(?P<release_group>[^- ]+))?)?$ # Group '''), ('fov_repeat', @@ -42,7 +43,8 @@ ep_regexes = [ ([. _-]+(?P=season_num)x # 1x (?P<extra_ep_num>\d+))+ # 03/etc and separator [. _-]*((?P<extra_info>.+?) # Source_Quality_Etc- - ((?<![. _-])-(?P<release_group>[^-]+))?)?$ # Group + ((?<![. _-])(?<!WEB) # Make sure this is really the release group + -(?P<release_group>[^- ]+))?)?$ # Group '''), ('standard', @@ -59,7 +61,8 @@ ep_regexes = [ (([. _-]*e|-) # linking e/- char (?P<extra_ep_num>(?!(1080|720)[pi])\d+))* # additional E03/etc [. _-]*((?P<extra_info>.+?) # Source_Quality_Etc- - ((?<![. _-])-(?P<release_group>[^-]+))?)?$ # Group + ((?<![. _-])(?<!WEB) # Make sure this is really the release group + -(?P<release_group>[^- ]+))?)?$ # Group '''), ('fov', @@ -76,7 +79,8 @@ ep_regexes = [ (?!(1080|720)[pi])(?!(?<=x)264) # ignore obviously wrong multi-eps \d+))* # additional x03/etc [\]. _-]*((?P<extra_info>.+?) # Source_Quality_Etc- - ((?<![. _-])-(?P<release_group>[^-]+))?)?$ # Group + ((?<![. _-])(?<!WEB) # Make sure this is really the release group + -(?P<release_group>[^- ]+))?)?$ # Group '''), ('scene_date_format', @@ -88,7 +92,8 @@ ep_regexes = [ (?P<air_month>\d{2})[. _-]+ # 11 and separator (?P<air_day>\d{2}) # 23 and separator [. _-]*((?P<extra_info>.+?) # Source_Quality_Etc- - ((?<![. _-])-(?P<release_group>[^-]+))?)?$ # Group + ((?<![. _-])(?<!WEB) # Make sure this is really the release group + -(?P<release_group>[^- ]+))?)?$ # Group '''), ('stupid', @@ -118,7 +123,8 @@ ep_regexes = [ s(eason[. _-])? # S01/Season 01 (?P<season_num>\d+)[. _-]* # S01 and optional separator [. _-]*((?P<extra_info>.+?) # Source_Quality_Etc- - ((?<![. _-])-(?P<release_group>[^-]+))?)?$ # Group + ((?<![. _-])(?<!WEB) # Make sure this is really the release group + -(?P<release_group>[^- ]+))?)?$ # Group ''' ), @@ -132,7 +138,8 @@ ep_regexes = [ ((([. _-]+(and|&|to)[. _-]+)|-) # and/&/to joiner (?P<extra_ep_num>(?!(1080|720)[pi])(\d+|[ivx]+))[. _-]) # second ep num ([. _-]*(?P<extra_info>.+?) # Source_Quality_Etc- - ((?<![. _-])-(?P<release_group>[^-]+))?)?$ # Group + ((?<![. _-])(?<!WEB) # Make sure this is really the release group + -(?P<release_group>[^- ]+))?)?$ # Group ''' ), @@ -149,7 +156,8 @@ ep_regexes = [ (?P<extra_ep_num>(?!(1080|720)[pi]) (\d+|([ivx]+(?=[. _-]))))[. _-])* # second ep num ([. _-]*(?P<extra_info>.+?) # Source_Quality_Etc- - ((?<![. _-])-(?P<release_group>[^-]+))?)?$ # Group + ((?<![. _-])(?<!WEB) # Make sure this is really the release group + -(?P<release_group>[^- ]+))?)?$ # Group ''' ), @@ -172,7 +180,8 @@ ep_regexes = [ (?P<ep_num>\d{1,2}) # 02 (?:-(?P<extra_ep_num>\d{1,2}))? # 02 [. _-]+((?P<extra_info>.+?) # Source_Quality_Etc- - ((?<![. _-])-(?P<release_group>[^-]+))?)?$ # Group + ((?<![. _-])(?<!WEB) # Make sure this is really the release group + -(?P<release_group>[^- ]+))?)?$ # Group ''' ), ] diff --git a/sickbeard/naming.py b/sickbeard/naming.py index e750e7fb6..8e1e4d0c0 100644 --- a/sickbeard/naming.py +++ b/sickbeard/naming.py @@ -28,10 +28,6 @@ from sickbeard.name_parser.parser import NameParser, InvalidNameException from common import Quality, DOWNLOADED -dir_presets = ('Season %0S', - '%RN', - ) - name_presets = ('%SN - %Sx%0E - %EN', '%S.N.S%0SE%0E.%E.N', '%Sx%0E - %EN', diff --git a/sickbeard/tv.py b/sickbeard/tv.py index 641c0a989..c6d9dae67 100644 --- a/sickbeard/tv.py +++ b/sickbeard/tv.py @@ -1522,14 +1522,14 @@ class TVEpisode(object): continue # start with the ep string, eg. E03 - ep_string = self._format_string(ep_format.upper())#replace_map[ep_format.upper()] + ep_string = self._format_string(ep_format.upper()) for other_ep in self.relatedEps: if multi == NAMING_DUPLICATE: # add " - S01" ep_string += sep + season_format # add "E04" ep_string += ep_sep - ep_string += other_ep._format_string(ep_format.upper())#._replace_map()[ep_format.upper()] + ep_string += other_ep._format_string(ep_format.upper()) if season_ep_match: regex_replacement = r'\g<pre_sep>\g<2>\g<3>' + ep_string + r'\g<post_sep>' diff --git a/tests/name_parser_tests.py b/tests/name_parser_tests.py index 5b976043b..9828f9107 100644 --- a/tests/name_parser_tests.py +++ b/tests/name_parser_tests.py @@ -27,6 +27,8 @@ simple_test_cases = { 'Show Name - S06E01 - -30-': parser.ParseResult(None, 'Show Name', 6, [1], '30-' ), 'Show-Name-S06E01-720p': parser.ParseResult(None, 'Show-Name', 6, [1], '720p' ), 'Show-Name-S06E01-1080i': parser.ParseResult(None, 'Show-Name', 6, [1], '1080i' ), + 'Show.Name.S06E01.Other.WEB-DL': parser.ParseResult(None, 'Show Name', 6, [1], 'Other.WEB-DL' ), + 'Show.Name.S06E01 Some-Stuff Here': parser.ParseResult(None, 'Show Name', 6, [1], 'Some-Stuff Here' ), }, 'fov': { @@ -40,18 +42,21 @@ simple_test_cases = { 'Show-Name-1x02-720p': parser.ParseResult(None, 'Show-Name', 1, [2], '720p'), 'Show-Name-1x02-1080i': parser.ParseResult(None, 'Show-Name', 1, [2], '1080i'), 'Show Name [05x12] Ep Name': parser.ParseResult(None, 'Show Name', 5, [12], 'Ep Name'), + 'Show.Name.1x02.WEB-DL': parser.ParseResult(None, 'Show Name', 1, [2], 'WEB-DL'), }, 'standard_repeat': { 'Show.Name.S01E02.S01E03.Source.Quality.Etc-Group': parser.ParseResult(None, 'Show Name', 1, [2,3], 'Source.Quality.Etc', 'Group'), 'Show.Name.S01E02.S01E03': parser.ParseResult(None, 'Show Name', 1, [2,3]), 'Show Name - S01E02 - S01E03 - S01E04 - Ep Name': parser.ParseResult(None, 'Show Name', 1, [2,3,4], 'Ep Name'), + 'Show.Name.S01E02.S01E03.WEB-DL': parser.ParseResult(None, 'Show Name', 1, [2,3], 'WEB-DL'), }, 'fov_repeat': { 'Show.Name.1x02.1x03.Source.Quality.Etc-Group': parser.ParseResult(None, 'Show Name', 1, [2,3], 'Source.Quality.Etc', 'Group'), 'Show.Name.1x02.1x03': parser.ParseResult(None, 'Show Name', 1, [2,3]), 'Show Name - 1x02 - 1x03 - 1x04 - Ep Name': parser.ParseResult(None, 'Show Name', 1, [2,3,4], 'Ep Name'), + 'Show.Name.1x02.1x03.WEB-DL': parser.ParseResult(None, 'Show Name', 1, [2,3], 'WEB-DL'), }, 'bare': { @@ -71,20 +76,23 @@ simple_test_cases = { 'no_season': { 'Show Name - 01 - Ep Name': parser.ParseResult(None, 'Show Name', None, [1], 'Ep Name'), '01 - Ep Name': parser.ParseResult(None, None, None, [1], 'Ep Name'), + 'Show Name - 01 - Ep Name - WEB-DL': parser.ParseResult(None, 'Show Name', None, [1], 'Ep Name - WEB-DL'), }, 'no_season_general': { - 'Deconstructed.E07.1080i.HDTV.DD5.1.MPEG2-TrollHD': parser.ParseResult(None, 'Deconstructed', None, [7], '1080i.HDTV.DD5.1.MPEG2', 'TrollHD'), 'Show.Name.E23.Source.Quality.Etc-Group': parser.ParseResult(None, 'Show Name', None, [23], 'Source.Quality.Etc', 'Group'), 'Show Name - Episode 01 - Ep Name': parser.ParseResult(None, 'Show Name', None, [1], 'Ep Name'), 'Show.Name.Part.3.Source.Quality.Etc-Group': parser.ParseResult(None, 'Show Name', None, [3], 'Source.Quality.Etc', 'Group'), 'Show.Name.Part.1.and.Part.2.Blah-Group': parser.ParseResult(None, 'Show Name', None, [1,2], 'Blah', 'Group'), 'Show.Name.Part.IV.Source.Quality.Etc-Group': parser.ParseResult(None, 'Show Name', None, [4], 'Source.Quality.Etc', 'Group'), + 'Deconstructed.E07.1080i.HDTV.DD5.1.MPEG2-TrollHD': parser.ParseResult(None, 'Deconstructed', None, [7], '1080i.HDTV.DD5.1.MPEG2', 'TrollHD'), + 'Show.Name.E23.WEB-DL': parser.ParseResult(None, 'Show Name', None, [23], 'WEB-DL'), }, 'no_season_multi_ep': { 'Show.Name.E23-24.Source.Quality.Etc-Group': parser.ParseResult(None, 'Show Name', None, [23,24], 'Source.Quality.Etc', 'Group'), 'Show Name - Episode 01-02 - Ep Name': parser.ParseResult(None, 'Show Name', None, [1,2], 'Ep Name'), + 'Show.Name.E23-24.WEB-DL': parser.ParseResult(None, 'Show Name', None, [23,24], 'WEB-DL'), }, 'season_only': { @@ -99,6 +107,7 @@ simple_test_cases = { 'Show.Name.2010.23.11.Source.Quality.Etc-Group': parser.ParseResult(None, 'Show Name', None, [], 'Source.Quality.Etc', 'Group', datetime.date(2010,11,23)), 'Show Name - 2010-11-23 - Ep Name': parser.ParseResult(None, 'Show Name', extra_info = 'Ep Name', air_date = datetime.date(2010,11,23)), '2010-11-23 - Ep Name': parser.ParseResult(None, extra_info = 'Ep Name', air_date = datetime.date(2010,11,23)), + 'Show.Name.2010.11.23.WEB-DL': parser.ParseResult(None, 'Show Name', None, [], 'WEB-DL', None, datetime.date(2010,11,23)), } } @@ -328,11 +337,11 @@ if __name__ == '__main__': suite = unittest.TestLoader().loadTestsFromTestCase(BasicTests) unittest.TextTestRunner(verbosity=2).run(suite) - suite = unittest.TestLoader().loadTestsFromTestCase(ComboTests) - unittest.TextTestRunner(verbosity=2).run(suite) + #suite = unittest.TestLoader().loadTestsFromTestCase(ComboTests) + #unittest.TextTestRunner(verbosity=2).run(suite) - suite = unittest.TestLoader().loadTestsFromTestCase(UnicodeTests) - unittest.TextTestRunner(verbosity=2).run(suite) + #suite = unittest.TestLoader().loadTestsFromTestCase(UnicodeTests) + #unittest.TextTestRunner(verbosity=2).run(suite) - suite = unittest.TestLoader().loadTestsFromTestCase(FailureCaseTests) - unittest.TextTestRunner(verbosity=2).run(suite) + #suite = unittest.TestLoader().loadTestsFromTestCase(FailureCaseTests) + #unittest.TextTestRunner(verbosity=2).run(suite) -- GitLab