diff --git a/app/modules/douban/__init__.py b/app/modules/douban/__init__.py index c86fd6c6f..800c0921d 100644 --- a/app/modules/douban/__init__.py +++ b/app/modules/douban/__init__.py @@ -1,6 +1,6 @@ import re from dataclasses import dataclass -from typing import Any, List, Optional, Tuple, Union, cast +from typing import Any, Iterable, List, Optional, Tuple, Union, cast import cn2an @@ -35,6 +35,7 @@ from app.schemas.types import ( MediaSourceSelection, MediaType, ModuleType, + MusicEntityType, ) @@ -154,8 +155,10 @@ class DoubanModule(MediaAuxiliaryProviderMixin, _ModuleBase): meta: MetaMusic, limit: int = 20, media_source: Optional[MediaSourceSelection] = None, + music_types: Optional[Iterable[MusicEntityType]] = None, ) -> Optional[List[MusicInfo]]: - """按请求来源搜索豆瓣音乐专辑,并转换为统一音乐候选。""" + """按请求来源搜索豆瓣音乐专辑,并兼容统一音乐搜索的实体过滤参数。""" + del music_types if not is_media_source_selected(media_source, self._music_source): return None keyword = meta.album or meta.title diff --git a/app/modules/theaudiodb/__init__.py b/app/modules/theaudiodb/__init__.py index 4b557a733..d0e9f9cbe 100644 --- a/app/modules/theaudiodb/__init__.py +++ b/app/modules/theaudiodb/__init__.py @@ -1,5 +1,5 @@ from dataclasses import dataclass -from typing import Any, Optional, Tuple, Union +from typing import Any, Iterable, Optional, Tuple, Union from app.adapters.network.http import AsyncRequestUtils, RequestUtils from app.domain.context import ( @@ -23,6 +23,7 @@ from app.schemas.types import ( MediaSourceSelection, MediaType, ModuleType, + MusicEntityType, ) @@ -117,8 +118,10 @@ class TheAudioDbModule(_ModuleBase): meta: MetaMusic, limit: int = 20, media_source: Optional[MediaSourceSelection] = None, + music_types: Optional[Iterable[MusicEntityType]] = None, ) -> Optional[list[MusicInfo]]: - """按请求来源搜索 TheAudioDB 单曲、专辑和艺术家。""" + """按请求来源搜索 TheAudioDB 单曲、专辑和艺术家,并兼容实体过滤参数。""" + del music_types if not is_media_source_selected(media_source, self._source): return None normalized_limit = max(1, min(limit, 100)) diff --git a/tests/test_music_metadata_sources.py b/tests/test_music_metadata_sources.py index 39eb76517..d8d4027ac 100644 --- a/tests/test_music_metadata_sources.py +++ b/tests/test_music_metadata_sources.py @@ -219,6 +219,18 @@ def test_theaudiodb_module_ignores_other_sources(monkeypatch): request.assert_not_called() +@pytest.mark.parametrize("module_class", [DoubanModule, TheAudioDbModule]) +def test_music_search_modules_accept_entity_filter_from_shared_dispatch(module_class): + """共享模块调度器广播实体过滤参数时,各内置音乐来源都必须保持签名兼容。""" + module = module_class() + + assert module.search_music( + MetaMusic(title="Yellow"), + media_source=MediaSource.MusicBrainz, + music_types=("recording", "album"), + ) is None + + def test_theaudiodb_title_only_search_skips_incomplete_track_and_album_requests(monkeypatch): """缺少艺术家时只搜索艺术家,避免请求会返回空正文的曲目和专辑接口。""" module = TheAudioDbModule()