From 64b4de390087c0df18bdfa07cbf7ba7396b85f01 Mon Sep 17 00:00:00 2001 From: jxxghp Date: Fri, 8 May 2026 20:36:33 +0800 Subject: [PATCH] fix: use original name for media recognize share --- app/core/meta/infopath.py | 1 + app/core/meta/metabase.py | 5 +++++ app/core/metainfo.py | 31 ++++++++++++++++++++++------- app/helper/recognize.py | 2 +- tests/test_media_recognize_share.py | 28 ++++++++++++++++++++++++-- tests/test_metainfo.py | 8 ++++++++ 6 files changed, 65 insertions(+), 10 deletions(-) diff --git a/app/core/meta/infopath.py b/app/core/meta/infopath.py index 4d679473..843f5b45 100644 --- a/app/core/meta/infopath.py +++ b/app/core/meta/infopath.py @@ -39,3 +39,4 @@ def should_use_parent_title_for_file_stem( def clear_parsed_title_for_parent_merge(meta: MetaBase) -> None: meta.cn_name = None meta.en_name = None + meta.original_name = None diff --git a/app/core/meta/metabase.py b/app/core/meta/metabase.py index f0754951..3736d613 100644 --- a/app/core/meta/metabase.py +++ b/app/core/meta/metabase.py @@ -29,6 +29,8 @@ class MetaBase(object): cn_name: Optional[str] = None # 识别的英文名 en_name: Optional[str] = None + # 未应用识别词时识别出的名称 + original_name: Optional[str] = None # 年份 year: Optional[str] = None # 总季数 @@ -555,6 +557,9 @@ class MetaBase(object): if not self.name: self.cn_name = meta.cn_name self.en_name = meta.en_name + # 未应用识别词时识别出的名称 + if not self.original_name: + self.original_name = meta.original_name # 年份 if not self.year: self.year = meta.year diff --git a/app/core/metainfo.py b/app/core/metainfo.py index ded4d803..03da4236 100644 --- a/app/core/metainfo.py +++ b/app/core/metainfo.py @@ -14,13 +14,13 @@ from app.log import logger from app.schemas.types import MediaType -def MetaInfo(title: str, subtitle: Optional[str] = None, custom_words: List[str] = None) -> MetaBase: +def _build_meta_info( + title: str, + subtitle: Optional[str] = None, + custom_words: List[str] = None, +) -> MetaBase: """ - 根据标题和副标题识别元数据 - :param title: 标题、种子名、文件名 - :param subtitle: 副标题、描述 - :param custom_words: 自定义识别词列表 - :return: MetaAnime、MetaVideo + 根据标题构造元数据 """ # 原标题 org_title = title @@ -40,7 +40,7 @@ def MetaInfo(title: str, subtitle: Optional[str] = None, custom_words: List[str] meta = MetaAnime(title, subtitle, isfile) if is_anime(title) else MetaVideo(title, subtitle, isfile) # 记录原标题 meta.title = org_title - # 记录使用的识别词 + # 记录使用的识别词 meta.apply_words = apply_words or [] # 修正媒体信息 if metainfo.get('tmdbid'): @@ -67,6 +67,23 @@ def MetaInfo(title: str, subtitle: Optional[str] = None, custom_words: List[str] return meta +def MetaInfo(title: str, subtitle: Optional[str] = None, custom_words: List[str] = None) -> MetaBase: + """ + 根据标题和副标题识别元数据 + :param title: 标题、种子名、文件名 + :param subtitle: 副标题、描述 + :param custom_words: 自定义识别词列表 + :return: MetaAnime、MetaVideo + """ + meta = _build_meta_info(title=title, subtitle=subtitle, custom_words=custom_words) + if meta.apply_words: + original_meta = _build_meta_info(title=title, subtitle=subtitle) + meta.original_name = original_meta.name or meta.name + else: + meta.original_name = meta.name + return meta + + def MetaInfoPath(path: Path, custom_words: List[str] = None) -> MetaBase: """ 根据路径识别元数据 diff --git a/app/helper/recognize.py b/app/helper/recognize.py index 3592e401..410c71f0 100644 --- a/app/helper/recognize.py +++ b/app/helper/recognize.py @@ -39,7 +39,7 @@ class MediaRecognizeShareHelper(metaclass=WeakSingleton): """ if not meta: return None - keyword = getattr(meta, "name", None) + keyword = getattr(meta, "original_name", None) or getattr(meta, "name", None) if keyword: keyword = str(keyword).strip() return keyword or None diff --git a/tests/test_media_recognize_share.py b/tests/test_media_recognize_share.py index 49063a11..890f431a 100644 --- a/tests/test_media_recognize_share.py +++ b/tests/test_media_recognize_share.py @@ -13,6 +13,7 @@ sys.modules.setdefault("psutil", ModuleType("psutil")) from app.chain import ChainBase from app.core.context import MediaInfo from app.core.meta import MetaBase +from app.helper.recognize import MediaRecognizeShareHelper from app.schemas.types import MediaType @@ -86,7 +87,7 @@ class TestMediaRecognizeShare(unittest.TestCase): second_call = run_module.call_args_list[1] self.assertEqual(second_call.kwargs["tmdbid"], 200) self.assertEqual(second_call.kwargs["mtype"], MediaType.TV) - self.assertEqual(meta.begin_season, 1) + self.assertIsNone(meta.begin_season) def test_async_query_shared_result_when_local_recognize_failed(self): """ @@ -125,7 +126,30 @@ class TestMediaRecognizeShare(unittest.TestCase): self.assertIs(result, shared_media) self.assertEqual(async_run_module.await_count, 2) query_mock.assert_awaited_once_with(meta=meta, mtype=None) - self.assertEqual(meta.begin_season, 2) + self.assertIsNone(meta.begin_season) + + def test_query_and_report_prefer_original_name_keyword(self): + """ + 查询和上报共享识别时应优先使用未应用识别词的识别名称 + """ + helper = MediaRecognizeShareHelper() + meta = self._build_meta("应用识别词后的名称", MediaType.TV) + meta.original_name = "未应用识别词的名称" + meta.year = "2024" + meta.begin_season = 1 + mediainfo = MediaInfo( + title="测试剧集", + year="2024", + tmdb_id=400, + type=MediaType.TV, + season=1, + ) + + query_params = helper._build_query_params(meta=meta) + report_payload = helper._build_report_payload(meta=meta, mediainfo=mediainfo) + + self.assertEqual(query_params["keyword"], "未应用识别词的名称") + self.assertEqual(report_payload["keyword"], "未应用识别词的名称") if __name__ == "__main__": diff --git a/tests/test_metainfo.py b/tests/test_metainfo.py index e1fefcd6..08e4854d 100644 --- a/tests/test_metainfo.py +++ b/tests/test_metainfo.py @@ -117,6 +117,13 @@ class MetaInfoTest(TestCase): if meta.apply_words: self.assertIn("替换词 => 新词", meta.apply_words) + def test_metainfo_preserves_original_name_when_custom_words_applied(self): + """测试应用识别词后仍保留未应用识别词时识别出的名称""" + custom_words = ["测试替换 => "] + meta = MetaInfo(title="电影测试替换名称 (2024)", custom_words=custom_words) + self.assertEqual(meta.name, "电影名称") + self.assertEqual(meta.original_name, "电影测试替换名称") + def test_metainfopath_auxiliary_chinese_stem_uses_parent_title(self): """ 文件名为简英双语/特效等压制标签、父目录为拉丁片名时,应合并父目录标题与年份。 @@ -127,6 +134,7 @@ class MetaInfoTest(TestCase): meta = MetaInfoPath(path) self.assertEqual(meta.en_name, "Marty Supreme") self.assertEqual(meta.year, "2025") + self.assertEqual(meta.original_name, "Marty Supreme") def test_metainfopath_chinese_parent_not_replaced_by_auxiliary_rule(self): """