fix(music): keep shared search signatures compatible

This commit is contained in:
jxxghp
2026-09-10 10:16:09 +08:00
parent 1af5b8f019
commit 554e7388b3
3 changed files with 22 additions and 4 deletions

View File

@@ -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

View File

@@ -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))

View File

@@ -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()