mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-08-15 19:14:01 +08:00
- 音乐识别统一走 recognize_media,移除 MusicChain.recognize/async_recognize 及 /music/search 独立端点 - 音乐刮削收拢到 MediaChain.scrape_music_metadata,消除 MusicChain 对 MediaChain 的嵌套引用 - MetaInfo/MetaInfoPath 增加 force_video 参数,影视附加音轨保留季集归属 - 整理、订阅、搜索、API 层音乐识别入口全部统一
85 lines
2.5 KiB
Python
85 lines
2.5 KiB
Python
from unittest.mock import Mock, patch
|
|
|
|
from app.chain.search import SearchChain
|
|
from app.core.meta import MetaMusic
|
|
from app.core.context import MusicInfo
|
|
from app.schemas.context import TorrentInfo
|
|
from app.schemas.types import MediaType
|
|
|
|
|
|
def test_music_context_builder_keeps_only_music_category():
|
|
"""精确音乐搜索只应保留明确标记为音乐分类的站点资源。"""
|
|
chain = SearchChain()
|
|
music = MusicInfo(
|
|
source="musicbrainz",
|
|
media_id="recording-1",
|
|
title="Get Lucky",
|
|
artists=["Daft Punk"],
|
|
album="Random Access Memories",
|
|
)
|
|
torrents = [
|
|
TorrentInfo(
|
|
title="Daft Punk - Random Access Memories FLAC",
|
|
category=MediaType.MUSIC.value,
|
|
site_name="MusicSite",
|
|
),
|
|
TorrentInfo(
|
|
title="Unrelated Movie",
|
|
category=MediaType.MOVIE.value,
|
|
site_name="VideoSite",
|
|
),
|
|
]
|
|
|
|
with patch.object(chain, "filter_torrents", return_value=torrents[:1]):
|
|
contexts = chain._build_music_contexts(
|
|
torrents=torrents,
|
|
mediainfo=music,
|
|
rule_groups=["music"],
|
|
)
|
|
|
|
assert len(contexts) == 1
|
|
assert contexts[0].media_info is music
|
|
assert isinstance(contexts[0].meta_info, MetaMusic)
|
|
assert contexts[0].meta_info.media_id == "recording-1"
|
|
assert contexts[0].torrent_info.category == MediaType.MUSIC.value
|
|
|
|
|
|
def test_search_by_id_routes_music_identity_to_recognize_and_process():
|
|
"""MusicBrainz 精确身份搜索应经统一识别入口识别后进入现有搜索处理链。"""
|
|
chain = SearchChain()
|
|
music = MusicInfo(
|
|
source="musicbrainz",
|
|
media_id="recording-1",
|
|
title="晴天",
|
|
artists=["周杰伦"],
|
|
)
|
|
expected = [Mock()]
|
|
|
|
with (
|
|
patch.object(chain, "recognize_media", return_value=music) as recognize,
|
|
patch.object(chain, "process", return_value=expected) as process,
|
|
):
|
|
result = chain.search_by_id(
|
|
source="musicbrainz",
|
|
mediaid="recording-1",
|
|
mtype=MediaType.MUSIC,
|
|
sites=[1],
|
|
)
|
|
|
|
assert result == expected
|
|
recognize.assert_called_once_with(
|
|
source="musicbrainz",
|
|
mediaid="recording-1",
|
|
tmdbid=None,
|
|
doubanid=None,
|
|
bangumiid=None,
|
|
anilistid=None,
|
|
mtype=MediaType.MUSIC,
|
|
)
|
|
process.assert_called_once_with(
|
|
mediainfo=music,
|
|
sites=[1],
|
|
area="title",
|
|
no_exists=None,
|
|
)
|