fix: use original name for media recognize share

This commit is contained in:
jxxghp
2026-05-08 20:36:33 +08:00
parent a59afe4cc9
commit 64b4de3900
6 changed files with 65 additions and 10 deletions
+1
View File
@@ -39,3 +39,4 @@ def should_use_parent_title_for_file_stem(
def clear_parsed_title_for_parent_merge(meta: MetaBase) -> None: def clear_parsed_title_for_parent_merge(meta: MetaBase) -> None:
meta.cn_name = None meta.cn_name = None
meta.en_name = None meta.en_name = None
meta.original_name = None
+5
View File
@@ -29,6 +29,8 @@ class MetaBase(object):
cn_name: Optional[str] = None cn_name: Optional[str] = None
# 识别的英文名 # 识别的英文名
en_name: Optional[str] = None en_name: Optional[str] = None
# 未应用识别词时识别出的名称
original_name: Optional[str] = None
# 年份 # 年份
year: Optional[str] = None year: Optional[str] = None
# 总季数 # 总季数
@@ -555,6 +557,9 @@ class MetaBase(object):
if not self.name: if not self.name:
self.cn_name = meta.cn_name self.cn_name = meta.cn_name
self.en_name = meta.en_name self.en_name = meta.en_name
# 未应用识别词时识别出的名称
if not self.original_name:
self.original_name = meta.original_name
# 年份 # 年份
if not self.year: if not self.year:
self.year = meta.year self.year = meta.year
+24 -7
View File
@@ -14,13 +14,13 @@ from app.log import logger
from app.schemas.types import MediaType 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 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 = MetaAnime(title, subtitle, isfile) if is_anime(title) else MetaVideo(title, subtitle, isfile)
# 记录原标题 # 记录原标题
meta.title = org_title meta.title = org_title
# 记录使用的识别词 # 记录使用的识别词
meta.apply_words = apply_words or [] meta.apply_words = apply_words or []
# 修正媒体信息 # 修正媒体信息
if metainfo.get('tmdbid'): if metainfo.get('tmdbid'):
@@ -67,6 +67,23 @@ def MetaInfo(title: str, subtitle: Optional[str] = None, custom_words: List[str]
return meta 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: def MetaInfoPath(path: Path, custom_words: List[str] = None) -> MetaBase:
""" """
根据路径识别元数据 根据路径识别元数据
+1 -1
View File
@@ -39,7 +39,7 @@ class MediaRecognizeShareHelper(metaclass=WeakSingleton):
""" """
if not meta: if not meta:
return None return None
keyword = getattr(meta, "name", None) keyword = getattr(meta, "original_name", None) or getattr(meta, "name", None)
if keyword: if keyword:
keyword = str(keyword).strip() keyword = str(keyword).strip()
return keyword or None return keyword or None
+26 -2
View File
@@ -13,6 +13,7 @@ sys.modules.setdefault("psutil", ModuleType("psutil"))
from app.chain import ChainBase from app.chain import ChainBase
from app.core.context import MediaInfo from app.core.context import MediaInfo
from app.core.meta import MetaBase from app.core.meta import MetaBase
from app.helper.recognize import MediaRecognizeShareHelper
from app.schemas.types import MediaType from app.schemas.types import MediaType
@@ -86,7 +87,7 @@ class TestMediaRecognizeShare(unittest.TestCase):
second_call = run_module.call_args_list[1] second_call = run_module.call_args_list[1]
self.assertEqual(second_call.kwargs["tmdbid"], 200) self.assertEqual(second_call.kwargs["tmdbid"], 200)
self.assertEqual(second_call.kwargs["mtype"], MediaType.TV) 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): 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.assertIs(result, shared_media)
self.assertEqual(async_run_module.await_count, 2) self.assertEqual(async_run_module.await_count, 2)
query_mock.assert_awaited_once_with(meta=meta, mtype=None) 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__": if __name__ == "__main__":
+8
View File
@@ -117,6 +117,13 @@ class MetaInfoTest(TestCase):
if meta.apply_words: if meta.apply_words:
self.assertIn("替换词 => 新词", 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): def test_metainfopath_auxiliary_chinese_stem_uses_parent_title(self):
""" """
文件名为简英双语/特效等压制标签、父目录为拉丁片名时,应合并父目录标题与年份。 文件名为简英双语/特效等压制标签、父目录为拉丁片名时,应合并父目录标题与年份。
@@ -127,6 +134,7 @@ class MetaInfoTest(TestCase):
meta = MetaInfoPath(path) meta = MetaInfoPath(path)
self.assertEqual(meta.en_name, "Marty Supreme") self.assertEqual(meta.en_name, "Marty Supreme")
self.assertEqual(meta.year, "2025") self.assertEqual(meta.year, "2025")
self.assertEqual(meta.original_name, "Marty Supreme")
def test_metainfopath_chinese_parent_not_replaced_by_auxiliary_rule(self): def test_metainfopath_chinese_parent_not_replaced_by_auxiliary_rule(self):
""" """