diff --git a/sickbeard/databases/mainDB.py b/sickbeard/databases/mainDB.py index 70f6eacf0207efc9ca40e2af0dd24f411ff9c75e..9595846a639e89a46b8d9cf87a02dc562a9bb2ad 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 116375f53ad5e0a89334c84d79235dbf3ba2dbfc..6d467c76b0e031d8c55c614d23c268d8429a2e50 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 f5593be36fe417fbd85df59f80c4a5a49a14ec0d..704016d773b5ba34d39e42c373e37c45f4cb2a38 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 e750e7fb669708e6c69c18058b548c3cd97039da..8e1e4d0c02f79598569e267b1277d3e0852df08a 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 641c0a9895eaac272021ae78e239624a4f93db6b..c6d9dae6773cb36aa77cbc70bf60432f320795dc 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 5b976043bdb6360e4d6d36e3309ac8cfce4f9654..9828f91077ddbc9c978b78499cba7b3a152e7516 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)