diff --git a/app/chain/transfer/history.py b/app/chain/transfer/history.py index 46c8e6503..96691ac0d 100644 --- a/app/chain/transfer/history.py +++ b/app/chain/transfer/history.py @@ -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 diff --git a/app/chain/transfer/workflow.py b/app/chain/transfer/workflow.py index 9a215efa4..950ed4e55 100644 --- a/app/chain/transfer/workflow.py +++ b/app/chain/transfer/workflow.py @@ -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, diff --git a/tests/test_transfer_music_album_selection.py b/tests/test_transfer_music_album_selection.py index 3c6263ca2..b573e6b21 100644 --- a/tests/test_transfer_music_album_selection.py +++ b/tests/test_transfer_music_album_selection.py @@ -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, )