fix: 修复音乐搜索统一入口参数名不匹配导致 500

/media/search?type=music 调用 MusicChain.async_search 时应传 query 关键字参数,
原实现误传 title 导致 TypeError;补充端点回归测试。
This commit is contained in:
jxxghp
2026-08-09 10:54:11 +08:00
parent 60aa762ca1
commit 8d71bcbddd
2 changed files with 42 additions and 1 deletions
+1 -1
View File
@@ -223,7 +223,7 @@ async def search(
media_chain = MediaChain() media_chain = MediaChain()
if type == "music" or source == "musicbrainz": if type == "music" or source == "musicbrainz":
# 音乐搜索统一入口,与影视搜索共用 /media/search # 音乐搜索统一入口,与影视搜索共用 /media/search
music_infos = await MusicChain().async_search(title=title, limit=count) music_infos = await MusicChain().async_search(query=title, limit=count)
return [ return [
info.to_dict() info.to_dict()
for info in music_infos for info in music_infos
+41
View File
@@ -13,6 +13,7 @@ from app.api.endpoints.music import (
music_artist_related, music_artist_related,
recognize_music, recognize_music,
) )
from app.api.endpoints import media as media_endpoints
from app.core.context import MusicAlbumInfo, MusicArtistInfo, MusicInfo, MusicRelease from app.core.context import MusicAlbumInfo, MusicArtistInfo, MusicInfo, MusicRelease
from app.schemas.music import MusicRecognizeRequest from app.schemas.music import MusicRecognizeRequest
from app.schemas.types import MediaType from app.schemas.types import MediaType
@@ -39,6 +40,46 @@ def test_music_routes_are_registered():
) )
def test_media_search_routes_music_queries_with_query_kwarg():
"""统一媒体搜索的音乐分支应以 AsyncSearch 的关键字参数调用 MusicChain。"""
from app.chain.music import MusicChain
chain = Mock()
chain.async_search = AsyncMock(
return_value=[
MusicInfo(
source="musicbrainz",
media_id="recording-1",
music_type="recording",
title="晴天",
artists=["周杰伦"],
release_date="2003-07-31",
category="Album / Studio",
)
]
)
with (
patch("app.api.endpoints.media.MusicChain", return_value=chain) as music_chain,
patch.object(media_endpoints, "MediaChain") as media_chain,
):
result = asyncio.run(
media_endpoints.search(
title="晴天",
type="music",
count=30,
page=1,
_=Mock(),
)
)
assert result[0]["media_id"] == "recording-1"
assert result[0]["music_type"] == "recording"
assert result[0]["title"] == "晴天"
chain.async_search.assert_awaited_once_with(query="晴天", limit=30)
media_chain.return_value.async_search.assert_not_called()
def test_recognize_music_returns_detail(): def test_recognize_music_returns_detail():
"""音乐识别接口应按来源和 ID 经统一识别入口返回详情。""" """音乐识别接口应按来源和 ID 经统一识别入口返回详情。"""
from app.chain.media import MediaChain from app.chain.media import MediaChain