mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-08-28 19:47:41 +08:00
fix: use original name for media recognize share
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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
@@ -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:
|
||||||
"""
|
"""
|
||||||
根据路径识别元数据
|
根据路径识别元数据
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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__":
|
||||||
|
|||||||
@@ -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):
|
||||||
"""
|
"""
|
||||||
|
|||||||
Reference in New Issue
Block a user