mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-08-16 11:33:59 +08:00
fix(search): 支持单次搜索启用多个媒体数据源,合并显示所有源结果 (#6270)
- 新增 is_media_source_enabled/is_media_source_selected,请求级 source 支持逗号分隔多数据源,缺省回退全局 SEARCH_SOURCE 配置 - 四个媒体模块的搜索/人物/合集方法统一接入多源判断 - 补充多数据源搜索相关测试
This commit is contained in:
@@ -7,6 +7,7 @@ from app.api.endpoints.media import search
|
||||
from app.chain import ChainBase
|
||||
from app.modules.douban import DoubanModule
|
||||
from app.modules.themoviedb import TheMovieDbModule
|
||||
from app.schemas.types import MediaType
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
@@ -38,6 +39,27 @@ def test_media_search_endpoint_forwards_source(
|
||||
search_method.assert_awaited_once_with(name="测试", source=source)
|
||||
|
||||
|
||||
def test_media_search_endpoint_forwards_multi_source() -> None:
|
||||
"""媒体搜索接口应将逗号分隔的多数据源原样下传到处理链。"""
|
||||
chain = Mock()
|
||||
chain.async_search = AsyncMock(return_value=(Mock(), []))
|
||||
|
||||
with patch("app.api.endpoints.media.MediaChain", return_value=chain):
|
||||
result = asyncio.run(
|
||||
search(
|
||||
title="测试",
|
||||
type="media",
|
||||
source="themoviedb,douban",
|
||||
_=Mock(),
|
||||
)
|
||||
)
|
||||
|
||||
assert result == []
|
||||
chain.async_search.assert_awaited_once_with(
|
||||
title="测试", source="themoviedb,douban"
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
("method_name", "module_method_name"),
|
||||
[
|
||||
@@ -120,3 +142,72 @@ def test_tmdb_collection_search_rejects_unsupported_source() -> None:
|
||||
|
||||
assert result is None
|
||||
module.tmdb.async_search_collections.assert_not_awaited()
|
||||
|
||||
|
||||
def test_tmdb_collection_search_supports_multi_source_request() -> None:
|
||||
"""TMDB合集搜索应支持请求级逗号分隔多数据源。"""
|
||||
module = TheMovieDbModule()
|
||||
module.tmdb = Mock()
|
||||
module.tmdb.async_search_collections = AsyncMock(return_value=[])
|
||||
|
||||
result = asyncio.run(
|
||||
module.async_search_collections(
|
||||
name="测试", source="themoviedb,douban"
|
||||
)
|
||||
)
|
||||
|
||||
assert result == []
|
||||
module.tmdb.async_search_collections.assert_awaited_once_with("测试")
|
||||
|
||||
|
||||
def test_tmdb_media_search_supports_multi_source_request(monkeypatch) -> None:
|
||||
"""TMDB媒体搜索应支持请求级逗号分隔多数据源,不被其他来源请求阻断。"""
|
||||
monkeypatch.setattr("app.modules.themoviedb.settings.SEARCH_SOURCE", "douban")
|
||||
module = TheMovieDbModule()
|
||||
module.tmdb = Mock()
|
||||
module.tmdb.search_multiis = Mock(return_value=[])
|
||||
meta = Mock()
|
||||
meta.name = "测试"
|
||||
meta.type = MediaType.UNKNOWN
|
||||
meta.year = None
|
||||
|
||||
skipped = module.search_medias(meta=meta, source="douban")
|
||||
result = module.search_medias(meta=meta, source="themoviedb,douban")
|
||||
|
||||
assert skipped is None
|
||||
assert result == []
|
||||
module.tmdb.search_multiis.assert_called_once_with("测试")
|
||||
|
||||
|
||||
def test_douban_media_search_supports_multi_source_request(monkeypatch) -> None:
|
||||
"""豆瓣媒体搜索应支持请求级逗号分隔多数据源,并跟随全局配置参与搜索。"""
|
||||
monkeypatch.setattr("app.modules.douban.settings.SEARCH_SOURCE", "themoviedb")
|
||||
module = DoubanModule()
|
||||
module.doubanapi = Mock()
|
||||
module.doubanapi.async_search = AsyncMock(return_value={"items": []})
|
||||
meta = Mock()
|
||||
meta.name = "测试"
|
||||
|
||||
result = asyncio.run(
|
||||
module.async_search_medias(meta=meta, source="themoviedb,douban")
|
||||
)
|
||||
|
||||
assert result == []
|
||||
module.doubanapi.async_search.assert_awaited_once_with("测试")
|
||||
|
||||
|
||||
def test_multi_source_request_keeps_missing_module_skipped(monkeypatch) -> None:
|
||||
"""请求级多数据源未包含的模块应跳过,避免无关模块参与搜索。"""
|
||||
monkeypatch.setattr("app.modules.douban.settings.SEARCH_SOURCE", "themoviedb")
|
||||
module = DoubanModule()
|
||||
module.doubanapi = Mock()
|
||||
module.doubanapi.async_search = AsyncMock(return_value={"items": []})
|
||||
meta = Mock()
|
||||
meta.name = "测试"
|
||||
|
||||
skipped = asyncio.run(
|
||||
module.async_search_medias(meta=meta, source="themoviedb")
|
||||
)
|
||||
|
||||
assert skipped is None
|
||||
module.doubanapi.async_search.assert_not_awaited()
|
||||
|
||||
Reference in New Issue
Block a user