mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-09-06 07:56:52 +08:00
refactor: expand chain runtime config snapshot
This commit is contained in:
@@ -4,6 +4,7 @@
|
||||
共享识别成功后回填本地缓存、音乐识别上报/查询载荷,以及命中缓存不重复上报等场景。
|
||||
"""
|
||||
import asyncio
|
||||
from dataclasses import replace
|
||||
from unittest.mock import AsyncMock, Mock, patch
|
||||
|
||||
from app.chain import ChainBase
|
||||
@@ -41,6 +42,14 @@ def _tmdb_media(
|
||||
)
|
||||
|
||||
|
||||
def _enable_media_recognize_share(chain: ChainBase) -> None:
|
||||
"""为单个链实例启用共享识别配置快照。"""
|
||||
chain.runtime_config = replace(
|
||||
chain.runtime_config,
|
||||
media_recognize_share=True,
|
||||
)
|
||||
|
||||
|
||||
def test_report_shared_result_after_local_recognize_success():
|
||||
"""本地识别成功后应上报共享识别结果。"""
|
||||
chain = ChainBase()
|
||||
@@ -64,6 +73,7 @@ def test_report_shared_result_after_local_recognize_success():
|
||||
def test_query_shared_result_when_local_recognize_failed():
|
||||
"""本地识别失败后应回查共享识别结果,并按共享ID再次识别。"""
|
||||
chain = ChainBase()
|
||||
_enable_media_recognize_share(chain)
|
||||
meta = _build_meta("测试剧集")
|
||||
shared_media = _tmdb_media("测试剧集", 200, MediaType.TV, year="2024")
|
||||
|
||||
@@ -109,6 +119,7 @@ def test_query_shared_result_when_local_recognize_failed():
|
||||
def test_async_query_shared_result_when_local_recognize_failed():
|
||||
"""异步识别失败后也应回查共享识别结果。"""
|
||||
chain = ChainBase()
|
||||
_enable_media_recognize_share(chain)
|
||||
meta = _build_meta("测试异步剧集")
|
||||
shared_media = _tmdb_media("测试异步剧集", 300, MediaType.TV, year="2025")
|
||||
async_run_module = AsyncMock(side_effect=[None, shared_media])
|
||||
@@ -157,6 +168,7 @@ def test_async_query_shared_result_when_local_recognize_failed():
|
||||
def test_backfill_local_cache_after_shared_recognize_success():
|
||||
"""共享识别后二次本地识别成功时,应回填原始名称对应的本地识别缓存。"""
|
||||
chain = ChainBase()
|
||||
_enable_media_recognize_share(chain)
|
||||
meta = _build_meta("测试缓存回填", MediaType.MOVIE)
|
||||
shared_media = MediaInfo(
|
||||
media_source=MediaSource.TMDB,
|
||||
@@ -304,6 +316,7 @@ def test_report_shared_result_with_distinct_keyword_meta():
|
||||
def test_query_shared_result_with_distinct_keyword_meta():
|
||||
"""本地识别失败后应按辅助前名称回查共享结果。"""
|
||||
chain = ChainBase()
|
||||
_enable_media_recognize_share(chain)
|
||||
meta = _build_meta("辅助识别后的名称", MediaType.TV)
|
||||
meta.year = "2024"
|
||||
share_meta = _build_meta("辅助识别前的名称", MediaType.UNKNOWN)
|
||||
@@ -594,6 +607,7 @@ def test_chain_recognize_media_reports_music_share_result():
|
||||
def test_chain_recognize_media_queries_music_share_when_local_failed():
|
||||
"""音乐本地识别失败后应回查共享识别并按数据源原生 ID 二次识别。"""
|
||||
chain = MediaChain()
|
||||
_enable_media_recognize_share(chain)
|
||||
meta = MetaMusic(title="晴天", artists=["周杰伦"])
|
||||
music = _music_info()
|
||||
|
||||
@@ -641,6 +655,7 @@ def test_chain_recognize_media_queries_music_share_when_local_failed():
|
||||
def test_chain_recognize_media_queries_music_share_after_local_fallback():
|
||||
"""本地标签兜底没有远端身份时,仍应通过共享结果补成标准音乐身份。"""
|
||||
chain = MediaChain()
|
||||
_enable_media_recognize_share(chain)
|
||||
meta = MetaMusic(title="晴天", artists=["周杰伦"])
|
||||
fallback = MusicInfo(title="晴天", artists=["周杰伦"])
|
||||
music = _music_info()
|
||||
@@ -669,9 +684,6 @@ def test_chain_recognize_media_queries_music_share_after_local_fallback():
|
||||
), patch.object(
|
||||
chain,
|
||||
"_update_local_recognize_cache",
|
||||
), patch(
|
||||
"app.chain._recognition.settings.MEDIA_RECOGNIZE_SHARE",
|
||||
True,
|
||||
):
|
||||
result = chain.recognize_media(meta=meta, cache=False)
|
||||
|
||||
@@ -687,6 +699,7 @@ def test_chain_recognize_media_queries_music_share_after_local_fallback():
|
||||
def test_chain_async_recognize_media_queries_music_share_after_local_fallback():
|
||||
"""异步音乐识别也必须在返回本地兜底前尝试共享身份补全。"""
|
||||
chain = MediaChain()
|
||||
_enable_media_recognize_share(chain)
|
||||
meta = MetaMusic(title="晴天", artists=["周杰伦"])
|
||||
fallback = MusicInfo(title="晴天", artists=["周杰伦"])
|
||||
music = _music_info()
|
||||
@@ -717,9 +730,6 @@ def test_chain_async_recognize_media_queries_music_share_after_local_fallback():
|
||||
chain,
|
||||
"_async_update_local_recognize_cache",
|
||||
new=AsyncMock(),
|
||||
), patch(
|
||||
"app.chain._recognition.settings.MEDIA_RECOGNIZE_SHARE",
|
||||
True,
|
||||
):
|
||||
result = await chain.async_recognize_media(meta=meta, cache=False)
|
||||
return result, query_share, recognize_source
|
||||
@@ -745,6 +755,7 @@ def test_chain_async_recognize_media_queries_music_share_after_local_fallback():
|
||||
def test_chain_recognize_media_skips_music_report_for_fallback_result():
|
||||
"""共享也未命中时保留音乐标签兜底,且不把无身份结果上报。"""
|
||||
chain = MediaChain()
|
||||
_enable_media_recognize_share(chain)
|
||||
meta = MetaMusic(title="未知曲目", artists=["未知艺术家"])
|
||||
fallback = MusicInfo(title="未知曲目", artists=["未知艺术家"])
|
||||
|
||||
@@ -753,9 +764,7 @@ def test_chain_recognize_media_skips_music_report_for_fallback_result():
|
||||
return_value=None,
|
||||
) as query_mock, patch(
|
||||
"app.chain._recognition.MoviePilotServerHelper.report_recognize_share"
|
||||
) as report_mock, patch(
|
||||
"app.chain._recognition.settings.MEDIA_RECOGNIZE_SHARE", True
|
||||
):
|
||||
) as report_mock:
|
||||
result = chain.recognize_media(meta=meta, cache=False)
|
||||
|
||||
assert result is fallback
|
||||
|
||||
Reference in New Issue
Block a user