diff --git a/app/chain/search.py b/app/chain/search.py index 0822f61f..1fa12d2d 100644 --- a/app/chain/search.py +++ b/app/chain/search.py @@ -235,7 +235,7 @@ class SearchChain(ChainBase): _match_torrents.append(torrent) continue # 未匹配 - logger.warn(f'{torrent.site_name} - {torrent.title} 标题不匹配,识别名称:{media_names}') + logger.warn(f'{torrent.site_name} - {torrent.title} 标题不匹配,识别名称:{meta_names}') # 匹配完成 logger.info(f"匹配完成,共匹配到 {len(_match_torrents)} 个资源") self.progress.update(value=97, diff --git a/app/core/meta/metaanime.py b/app/core/meta/metaanime.py index a55c3715..0e8b426a 100644 --- a/app/core/meta/metaanime.py +++ b/app/core/meta/metaanime.py @@ -16,7 +16,7 @@ class MetaAnime(MetaBase): 识别动漫 """ _anime_no_words = ['CHS&CHT', 'MP4', 'GB MP4', 'WEB-DL'] - _name_nostring_re = r"S\d{2}\s*-\s*S\d{2}|S\d{2}|\s+S\d{1,2}|EP?\d{2,4}\s*-\s*EP?\d{2,4}|EP?\d{2,4}|\s+EP?\d{1,4}" + _name_nostring_re = r"S\d{2}\s*-\s*S\d{2}|S\d{2}|\s+S\d{1,2}|EP?\d{2,4}\s*-\s*EP?\d{2,4}|EP?\d{2,4}|\s+EP?\d{1,4}|\s+GB" def __init__(self, title: str, subtitle: str = None, isfile: bool = False): super().__init__(title, subtitle, isfile) diff --git a/app/core/meta/metabase.py b/app/core/meta/metabase.py index 9276034b..1de2f181 100644 --- a/app/core/meta/metabase.py +++ b/app/core/meta/metabase.py @@ -67,9 +67,11 @@ class MetaBase(object): # 副标题解析 _subtitle_flag = False + _title_episodel_re = r"Episode\s+(\d{1,4})" _subtitle_season_re = r"(?= 10000: + return + if self.begin_episode is None: + self.begin_episode = episode + self.total_episode = 1 + self.type = MediaType.TV + self._subtitle_flag = True + elif re.search(r'[全第季集话話期幕]', title_text, re.IGNORECASE): + # 全x季 x季全 + season_all_str = re.search(r"%s" % self._subtitle_season_all_re, title_text, re.IGNORECASE) + if season_all_str: + season_all = season_all_str.group(1) + if not season_all: + season_all = season_all_str.group(2) + if season_all and self.begin_season is None and self.begin_episode is None: + try: + self.total_season = int(cn2an.cn2an(season_all.strip(), mode='smart')) + except Exception as err: + logger.debug(f'识别季失败:{str(err)} - {traceback.format_exc()}') + return + self.begin_season = 1 + self.end_season = self.total_season + self.type = MediaType.TV + self._subtitle_flag = True + return # 第x季 season_str = re.search(r'%s' % self._subtitle_season_re, title_text, re.IGNORECASE) if season_str: @@ -146,6 +180,37 @@ class MetaBase(object): self.total_season = (self.end_season - self.begin_season) + 1 self.type = MediaType.TV self._subtitle_flag = True + # 第x-x集 第x集-x集 + episode_between_str = re.search(r'%s' % self._subtitle_episode_between_re, title_text, re.IGNORECASE) + if episode_between_str: + episodes = episode_between_str.groups() + if episodes: + begin_episode = episodes[0] + end_episode = episodes[1] + else: + return + try: + begin_episode = int(cn2an.cn2an(begin_episode.strip(), mode='smart')) + end_episode = int(cn2an.cn2an(end_episode.strip(), mode='smart')) + except Exception as err: + logger.debug(f'识别集失败:{str(err)} - {traceback.format_exc()}') + return + if begin_episode and begin_episode >= 10000: + return + if end_episode and end_episode >= 10000: + return + if self.begin_episode is None and isinstance(begin_episode, int): + self.begin_episode = begin_episode + self.total_episode = 1 + if self.begin_episode is not None \ + and self.end_episode is None \ + and isinstance(end_episode, int) \ + and end_episode != self.begin_episode: + self.end_episode = end_episode + self.total_episode = (self.end_episode - self.begin_episode) + 1 + self.type = MediaType.TV + self._subtitle_flag = True + return # 第x集 episode_str = re.search(r'%s' % self._subtitle_episode_re, title_text, re.IGNORECASE) if episode_str: @@ -181,6 +246,7 @@ class MetaBase(object): self.total_episode = (self.end_episode - self.begin_episode) + 1 self.type = MediaType.TV self._subtitle_flag = True + return # x集全 episode_all_str = re.search(r'%s' % self._subtitle_episode_all_re, title_text, re.IGNORECASE) if episode_all_str: @@ -197,22 +263,7 @@ class MetaBase(object): self.end_episode = None self.type = MediaType.TV self._subtitle_flag = True - # 全x季 x季全 - season_all_str = re.search(r"%s" % self._subtitle_season_all_re, title_text, re.IGNORECASE) - if season_all_str: - season_all = season_all_str.group(1) - if not season_all: - season_all = season_all_str.group(2) - if season_all and self.begin_season is None and self.begin_episode is None: - try: - self.total_season = int(cn2an.cn2an(season_all.strip(), mode='smart')) - except Exception as err: - logger.debug(f'识别季失败:{str(err)} - {traceback.format_exc()}') - return - self.begin_season = 1 - self.end_season = self.total_season - self.type = MediaType.TV - self._subtitle_flag = True + return @property def season(self) -> str: diff --git a/app/core/meta/metavideo.py b/app/core/meta/metavideo.py index c01d020f..f2234d83 100644 --- a/app/core/meta/metavideo.py +++ b/app/core/meta/metavideo.py @@ -34,7 +34,7 @@ class MetaVideo(MetaBase): _source_re = r"^BLURAY$|^HDTV$|^UHDTV$|^HDDVD$|^WEBRIP$|^DVDRIP$|^BDRIP$|^BLU$|^WEB$|^BD$|^HDRip$" _effect_re = r"^REMUX$|^UHD$|^SDR$|^HDR\d*$|^DOLBY$|^DOVI$|^DV$|^3D$|^REPACK$" _resources_type_re = r"%s|%s" % (_source_re, _effect_re) - _name_no_begin_re = r"^\[.+?]" + _name_no_begin_re = r"^[\[【].+?[\]】]" _name_no_chinese_re = r".*版|.*字幕" _name_se_words = ['共', '第', '季', '集', '话', '話', '期'] _name_movie_words = ['剧场版', '劇場版', '电影版', '電影版'] @@ -42,13 +42,13 @@ class MetaVideo(MetaBase): r"|HBO$|\s+HBO|\d{1,2}th|\d{1,2}bit|NETFLIX|AMAZON|IMAX|^3D|\s+3D|^BBC\s+|\s+BBC|BBC$|DISNEY\+?|XXX|\s+DC$" \ r"|[第\s共]+[0-9一二三四五六七八九十\-\s]+季" \ r"|[第\s共]+[0-9一二三四五六七八九十百零\-\s]+[集话話]" \ - r"|连载|日剧|美剧|电视剧|动画片|动漫|欧美|西德|日韩|超高清|高清|蓝光|翡翠台|梦幻天堂·龙网|★?\d*月?新番" \ - r"|最终季|合集|[多中国英葡法俄日韩德意西印泰台港粤双文语简繁体特效内封官译外挂]+字幕|版本|出品|台版|港版|\w+字幕组" \ + r"|连载|日剧|美剧|电视剧|动画片|动漫|欧美|西德|日韩|超高清|高清|无水印|下载|蓝光|翡翠台|梦幻天堂·龙网|★?\d*月?新番" \ + r"|最终季|合集|[多中国英葡法俄日韩德意西印泰台港粤双文语简繁体特效内封官译外挂]+字幕|版本|出品|台版|港版|\w+字幕组|\w+字幕社" \ r"|未删减版|UNCUT$|UNRATE$|WITH EXTRAS$|RERIP$|SUBBED$|PROPER$|REPACK$|SEASON$|EPISODE$|Complete$|Extended$|Extended Version$" \ r"|S\d{2}\s*-\s*S\d{2}|S\d{2}|\s+S\d{1,2}|EP?\d{2,4}\s*-\s*EP?\d{2,4}|EP?\d{2,4}|\s+EP?\d{1,4}" \ r"|CD[\s.]*[1-9]|DVD[\s.]*[1-9]|DISK[\s.]*[1-9]|DISC[\s.]*[1-9]" \ r"|[248]K|\d{3,4}[PIX]+" \ - r"|CD[\s.]*[1-9]|DVD[\s.]*[1-9]|DISK[\s.]*[1-9]|DISC[\s.]*[1-9]" + r"|CD[\s.]*[1-9]|DVD[\s.]*[1-9]|DISK[\s.]*[1-9]|DISC[\s.]*[1-9]|\s+GB" _resources_pix_re = r"^[SBUHD]*(\d{3,4}[PI]+)|\d{3,4}X(\d{3,4})" _resources_pix_re2 = r"(^[248]+K)" _video_encode_re = r"^[HX]26[45]$|^AVC$|^HEVC$|^VC\d?$|^MPEG\d?$|^Xvid$|^DivX$|^HDR\d*$" diff --git a/tests/cases/meta.py b/tests/cases/meta.py index 6b2685b5..63f87ca3 100644 --- a/tests/cases/meta.py +++ b/tests/cases/meta.py @@ -2,7 +2,7 @@ meta_cases = [{ "title": "The Long Season 2017 2160p WEB-DL H265 AAC-XXX", "subtitle": "", "target": { - "type": "电影", + "type": "未知", "cn_name": "", "en_name": "The Long Season", "year": "2017", @@ -35,7 +35,7 @@ meta_cases = [{ "subtitle": "", "target": { "type": "电视剧", - "cn_name": "", + "cn_name": "欢迎来到实力至上主义的教室", "en_name": "Youkoso Jitsuryoku Shijou Shugi No Kyoushitsu E", "year": "", "part": "", @@ -50,7 +50,7 @@ meta_cases = [{ "title": "National.Parks.Adventure.AKA.America.Wild:.National.Parks.Adventure.3D.2016.1080p.Blu-ray.AVC.TrueHD.7.1", "subtitle": "", "target": { - "type": "电影", + "type": "未知", "cn_name": "", "en_name": "National Parks Adventure", "year": "2016", @@ -82,7 +82,7 @@ meta_cases = [{ "title": "哆啦A梦:大雄的宇宙小战争 2021 (2022) - 1080p.mp4", "subtitle": "", "target": { - "type": "电影", + "type": "未知", "cn_name": "哆啦A梦:大雄的宇宙小战争 2021", "en_name": "", "year": "2022", @@ -98,7 +98,7 @@ meta_cases = [{ "title": "新精武门1991 (1991).mkv", "subtitle": "", "target": { - "type": "电影", + "type": "未知", "cn_name": "新精武门1991", "en_name": "", "year": "1991", @@ -178,7 +178,7 @@ meta_cases = [{ "title": "Thor Love and Thunder (2022) [1080p] [WEBRip] [5.1]", "subtitle": "", "target": { - "type": "电影", + "type": "未知", "cn_name": "", "en_name": "Thor Love And Thunder", "year": "2022", @@ -210,7 +210,7 @@ meta_cases = [{ "title": "钢铁侠2 (2010) 1080p AC3.mp4", "subtitle": "", "target": { - "type": "电影", + "type": "未知", "cn_name": "钢铁侠2", "en_name": "", "year": "2010", @@ -226,7 +226,7 @@ meta_cases = [{ "title": "Wonder Woman 1984 2020 BluRay 1080p Atmos TrueHD 7.1 X264-EPiC", "subtitle": "", "target": { - "type": "电影", + "type": "未知", "cn_name": "", "en_name": "Wonder Woman 1984", "year": "2020", @@ -338,7 +338,7 @@ meta_cases = [{ "title": "Nande Koko ni Sensei ga!? 2019 Blu-ray Remux 1080p AVC LPCM-7³ ACG", "subtitle": "", "target": { - "type": "电影", + "type": "未知", "cn_name": "", "en_name": "Nande Koko Ni Sensei Ga!?", "year": "2019", @@ -547,7 +547,7 @@ meta_cases = [{ "subtitle": "", "target": { "type": "电视剧", - "cn_name": "", + "cn_name": "金装的薇尔梅", "en_name": "Kinsou No Vermeil", "year": "", "part": "", @@ -578,7 +578,7 @@ meta_cases = [{ "title": "The Witch Part 2:The Other One 2022 1080p WEB-DL AAC5.1 H264-tG1R0", "subtitle": "", "target": { - "type": "电影", + "type": "未知", "cn_name": "", "en_name": "The Witch Part 2:The Other One", "year": "2022", @@ -642,7 +642,7 @@ meta_cases = [{ "title": "教父3.The.Godfather.Part.III.1990.1080p.NF.WEBRip.H264.DDP5.1-PTerWEB.mkv", "subtitle": "", "target": { - "type": "电影", + "type": "未知", "cn_name": "教父3", "en_name": "The Godfather Part Iii", "year": "1990", @@ -658,7 +658,7 @@ meta_cases = [{ "title": "A.Quiet.Place.Part.II.2020.1080p.UHD.BluRay.DD+7.1.DoVi.X265-PuTao", "subtitle": "", "target": { - "type": "电影", + "type": "未知", "cn_name": "", "en_name": "A Quiet Place Part Ii", "year": "2020", @@ -723,7 +723,7 @@ meta_cases = [{ "subtitle": "", "target": { "type": "电视剧", - "cn_name": "", + "cn_name": "打工吧!魔王大人", "en_name": "Hataraku Maou-Sama!!", "year": "", "part": "", @@ -738,7 +738,7 @@ meta_cases = [{ "title": "The Witch Part 2 The Other One 2022 1080p WEB-DL AAC5.1 H.264-tG1R0", "subtitle": "", "target": { - "type": "电影", + "type": "未知", "cn_name": "", "en_name": "The Witch Part 2 The Other One", "year": "2022", @@ -754,7 +754,7 @@ meta_cases = [{ "title": "The 355 2022 BluRay 1080p DTS-HD MA5.1 X265.10bit-BeiTai", "subtitle": "", "target": { - "type": "电影", + "type": "未知", "cn_name": "", "en_name": "The 355", "year": "2022", @@ -818,7 +818,7 @@ meta_cases = [{ "title": "2022.8.2.Twelve.Monkeys.1995.GBR.4K.REMASTERED.BluRay.1080p.X264.DTS [3.4 GB]", "subtitle": "", "target": { - "type": "电影", + "type": "未知", "cn_name": "", "en_name": "Twelve Monkeys", "year": "1995", @@ -942,4 +942,68 @@ meta_cases = [{ "video_codec": "X264", "audio_codec": "DD 5.1" } +}, { + "title": "[Hall_of_C] 诛仙 Zhu Xian (Jade Dynasty) - Episode 19", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "诛仙", + "en_name": "Zhu Xian Jade Dynasty", + "year": "", + "part": "", + "season": "S01", + "episode": "E19", + "restype": "", + "pix": "", + "video_codec": "", + "audio_codec": "" + } +}, { + "title": "I Woke Up a Vampire S02 2023 2160p NF WEB-DL DDP5.1 Atmos H 265-HHWEB", + "subtitle": "醒来变成吸血鬼 第二季 | 全8集 | 4K | 类型: 喜剧/家庭/奇幻 | 导演: TommyLynch | 主演: NikoCeci/ZebastinBorjeau/安娜·阿劳约/KaileenAngelicChang/KrisSiddiqi", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "I Woke Up A Vampire", + "year": "2023", + "part": "", + "season": "S02", + "episode": "", + "restype": "WEB-DL", + "pix": "2160p", + "video_codec": "H265", + "audio_codec": "DDP 5.1 Atmos" + } +}, { + "title": "Shadows of the Void S01 2024 1080p WEB-DL H264 AAC-HHWEB", + "subtitle": "虚无边境 | 第01-02集 | 1080p | 类型: 动画 | 导演: 巴西 | 主演: 山新/周一菡/皇贞季/Kenz/李佳怡 [内嵌中字]", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Shadows Of The Void", + "year": "2024", + "part": "", + "season": "S01", + "episode": "E01-E02", + "restype": "WEB-DL", + "pix": "1080p", + "video_codec": "H264", + "audio_codec": "AAC" + } +}, { + "title": "【极影字幕社】★1月新番 Metallic Rouge/金属口红 第13话 GB 1080P MP4(字幕社招人内详)", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "金属口红", + "en_name": "Metallic Rouge", + "year": "", + "part": "", + "season": "S01", + "episode": "E13", + "restype": "", + "pix": "1080p", + "video_codec": "", + "audio_codec": "" + } }] diff --git a/tests/run.py b/tests/run.py index 78e85040..fd6d85b4 100644 --- a/tests/run.py +++ b/tests/run.py @@ -1,24 +1,12 @@ import unittest -from tests.test_cookiecloud import CookieCloudTest -from tests.test_filter import FilterTest from tests.test_metainfo import MetaInfoTest -from tests.test_recognize import RecognizeTest -from tests.test_transfer import TransferTest if __name__ == '__main__': suite = unittest.TestSuite() - # 测试过滤器 - suite.addTest(FilterTest('test_filter')) # 测试名称识别 suite.addTest(MetaInfoTest('test_metainfo')) - # 测试媒体识别 - suite.addTest(RecognizeTest('test_recognize')) - # 测试CookieCloud同步 - suite.addTest(CookieCloudTest('test_cookiecloud')) - # 测试文件转移 - suite.addTest(TransferTest('test_transfer')) # 运行测试 runner = unittest.TextTestRunner() diff --git a/tests/test_cookiecloud.py b/tests/test_cookiecloud.py deleted file mode 100644 index ea54a61e..00000000 --- a/tests/test_cookiecloud.py +++ /dev/null @@ -1,17 +0,0 @@ -# -*- coding: utf-8 -*- - -from unittest import TestCase - -from app.chain.site import SiteChain - - -class CookieCloudTest(TestCase): - def setUp(self) -> None: - pass - - def tearDown(self) -> None: - pass - - def test_cookiecloud(self): - result = SiteChain().sync_cookies() - self.assertTrue(result[0]) diff --git a/tests/test_filter.py b/tests/test_filter.py deleted file mode 100644 index 85664e98..00000000 --- a/tests/test_filter.py +++ /dev/null @@ -1,24 +0,0 @@ -# -*- coding: utf-8 -*- - -from unittest import TestCase - -from app.core.context import TorrentInfo -from app.modules.filter import FilterModule - - -class FilterTest(TestCase): - def setUp(self) -> None: - pass - - def tearDown(self) -> None: - pass - - def test_filter(self): - torrent = TorrentInfo(title="The Wolf Children Ame and Yuki 2012 BluRay 1080p DTS-HDMA5.1 x265.10bit-CHD", - description="狼的孩子雨和雪/狼之子雨与雪/Okami kodomo no ame to yuki") - _filter = FilterModule() - _filter.init_module() - result = _filter.filter_torrents(rule_string="!BLU & 4K & CN > !BLU & 1080P & CN > !BLU & 4K > !BLU & 1080P", - torrent_list=[torrent]) - self.assertEqual(len(result), 1) - self.assertEqual(result[0].pri_order, 97) diff --git a/tests/test_recognize.py b/tests/test_recognize.py deleted file mode 100644 index 5b5e2473..00000000 --- a/tests/test_recognize.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- - -from unittest import TestCase - -from app.chain.download import DownloadChain -from app.chain.media import MediaChain -from app.core.metainfo import MetaInfo - - -class RecognizeTest(TestCase): - def setUp(self) -> None: - pass - - def tearDown(self) -> None: - pass - - def test_recognize(self): - media_info = MediaChain().recognize_by_meta(MetaInfo("我和我的祖国 2019")) - self.assertEqual(media_info.tmdb_id, 612845) - exists = DownloadChain().get_no_exists_info(MetaInfo("我和我的祖国 2019"), media_info) - self.assertTrue(exists[0]) diff --git a/tests/test_transfer.py b/tests/test_transfer.py deleted file mode 100644 index 7ee56584..00000000 --- a/tests/test_transfer.py +++ /dev/null @@ -1,17 +0,0 @@ -# -*- coding: utf-8 -*- - -from unittest import TestCase - -from app.chain.transfer import TransferChain - - -class TransferTest(TestCase): - def setUp(self) -> None: - pass - - def tearDown(self) -> None: - pass - - def test_transfer(self): - result = TransferChain().process() - self.assertTrue(result)