fix(music): preserve transfer entry compatibility

This commit is contained in:
yanjunpu
2026-09-08 13:49:31 +08:00
parent e84418ceb3
commit 981be2935e
3 changed files with 18 additions and 20 deletions

View File

@@ -32,7 +32,7 @@ def _recognize_manual_media(
episode_group: Optional[str],
music_release_regions: Optional[list[str]],
music_release_scripts: Optional[list[str]],
) -> tuple[Optional[Union[MediaInfo, MusicInfo]], Optional[MusicAlbumInfo]]:
) -> Optional[Union[MediaInfo, MusicInfo, MusicAlbumInfo]]:
"""识别手动指定的媒体,并为音乐专辑保留完整曲目表。"""
if mtype == MediaType.MUSIC and music_type == MUSIC_ENTITY_ALBUM:
album = MediaChain().get_music_album(
@@ -41,14 +41,14 @@ def _recognize_manual_media(
music_release_regions=music_release_regions,
music_release_scripts=music_release_scripts,
)
return (album.to_music_info() if album else None), album
return album
return MediaChain().recognize_media(
media_source=media_source,
media_id=media_id,
music_type=music_type,
mtype=mtype,
episode_group=episode_group,
), None
)
class TransferHistoryOwner(_TransferOwnerBase):
@@ -202,12 +202,11 @@ class TransferHistoryOwner(_TransferOwnerBase):
"""
logger.info(f"手动整理:{fileitem.path} ...")
explicit_identity = media_source is not None or media_id is not None
selected_music_album: Optional[MusicAlbumInfo] = None
if explicit_identity and (not media_source or not media_id):
return False, "手动整理需要同时提供 media_source 和 media_id"
if media_source and media_id:
# 有输入媒体ID时预先识别,音乐与影视统一走 recognize_media 按类型分发
mediainfo, selected_music_album = _recognize_manual_media(
mediainfo = _recognize_manual_media(
media_source=media_source,
media_id=media_id,
mtype=mtype,
@@ -221,9 +220,9 @@ class TransferHistoryOwner(_TransferOwnerBase):
False,
"未识别到媒体信息,请检查媒体来源和媒体 ID 后重试",
)
if media_source and not isinstance(mediainfo, MusicInfo):
if media_source and not isinstance(mediainfo, (MusicInfo, MusicAlbumInfo)):
mediainfo.scrape_source = media_source
if not isinstance(mediainfo, MusicInfo):
if not isinstance(mediainfo, (MusicInfo, MusicAlbumInfo)):
self.obtain_images(mediainfo=mediainfo)
# 开始整理
@@ -253,7 +252,6 @@ class TransferHistoryOwner(_TransferOwnerBase):
cleanup_dest_fileitem=cleanup_dest_fileitem,
music_release_regions=music_release_regions,
music_release_scripts=music_release_scripts,
selected_music_album=selected_music_album,
)
if not state:
return False, errmsg

View File

@@ -338,7 +338,7 @@ class TransferWorkflowOwner(_TransferOwnerBase):
self,
fileitem: FileItem,
meta: MetaBase = None,
mediainfo: Optional[Union[MediaInfo, MusicInfo]] = None,
mediainfo: Optional[Union[MediaInfo, MusicInfo, MusicAlbumInfo]] = None,
mtype: Optional[MediaType] = None,
media_source: Optional[MediaSource] = None,
media_id: Optional[str] = None,
@@ -364,7 +364,6 @@ class TransferWorkflowOwner(_TransferOwnerBase):
reorganize: Optional[bool] = False,
music_release_regions: Optional[list[str]] = None,
music_release_scripts: Optional[list[str]] = None,
selected_music_album: Optional[MusicAlbumInfo] = None,
) -> Tuple[bool, Union[str, dict]]:
"""
兼容公开整理入口,委托给内部批次执行阶段。
@@ -401,7 +400,6 @@ class TransferWorkflowOwner(_TransferOwnerBase):
reorganize=reorganize,
music_release_regions=music_release_regions,
music_release_scripts=music_release_scripts,
selected_music_album=selected_music_album,
)
def _execute_transfer(self, *args: Any, **kwargs: Any) -> Tuple[bool, Union[str, dict]]:
@@ -412,7 +410,7 @@ class TransferWorkflowOwner(_TransferOwnerBase):
self,
fileitem: FileItem,
meta: MetaBase = None,
mediainfo: Optional[Union[MediaInfo, MusicInfo]] = None,
mediainfo: Optional[Union[MediaInfo, MusicInfo, MusicAlbumInfo]] = None,
mtype: Optional[MediaType] = None,
media_source: Optional[MediaSource] = None,
media_id: Optional[str] = None,
@@ -439,7 +437,6 @@ class TransferWorkflowOwner(_TransferOwnerBase):
recovery_admission: Optional[TransferAdmission] = None,
music_release_regions: Optional[list[str]] = None,
music_release_scripts: Optional[list[str]] = None,
selected_music_album: Optional[MusicAlbumInfo] = None,
) -> Tuple[bool, Union[str, dict]]:
"""
执行一个复杂目录的整理操作
@@ -472,9 +469,14 @@ class TransferWorkflowOwner(_TransferOwnerBase):
:param recovery_admission: 内部恢复调用绑定的既有 durable 记录
:param music_release_regions: 本次音乐整理的发行地区优先级
:param music_release_scripts: 本次音乐整理的文字字形优先级
:param selected_music_album: 手动指定的音乐专辑,用于按已选发行版逐曲对齐
返回:成功标识,错误信息
"""
selected_music_album: Optional[MusicAlbumInfo]
if isinstance(mediainfo, MusicAlbumInfo):
selected_music_album = mediainfo
mediainfo = mediainfo.to_music_info()
else:
selected_music_album = None
mediainfo, media_source, media_id, identity_error = _normalize_transfer_identity(
mediainfo=mediainfo,
mtype=mtype,

View File

@@ -134,11 +134,10 @@ def test_selected_album_tracks_override_source_tag_names(tmp_path, monkeypatch):
state, message = TransferChain.do_transfer(
chain,
fileitem=_directory_item(album_dir),
mediainfo=album.to_music_info(),
mediainfo=album,
mtype=MediaType.MUSIC,
media_source=MediaSource.MusicBrainz,
media_id=album.media_id,
selected_music_album=album,
background=False,
)
@@ -179,9 +178,9 @@ def test_manual_album_identity_forwards_full_selected_album(monkeypatch):
assert state is True
assert message == ""
assert captured["selected_music_album"] is album
assert captured["mediainfo"] is album
assert captured["mediainfo"].title == "七里香"
assert [track.title for track in captured["selected_music_album"].tracks] == [
assert [track.title for track in captured["mediainfo"].tracks] == [
"我的地盘",
"借口",
]
@@ -214,11 +213,10 @@ def test_selected_album_rejects_duplicate_local_editions(tmp_path, monkeypatch):
state, message = TransferChain.do_transfer(
chain,
fileitem=_directory_item(album_dir),
mediainfo=album.to_music_info(),
mediainfo=album,
mtype=MediaType.MUSIC,
media_source=MediaSource.MusicBrainz,
media_id=album.media_id,
selected_music_album=album,
background=False,
preview=True,
)