diff --git a/app/api/endpoints/transfer.py b/app/api/endpoints/transfer.py index de178da2..fa5403cc 100644 --- a/app/api/endpoints/transfer.py +++ b/app/api/endpoints/transfer.py @@ -222,6 +222,9 @@ def manual_transfer( explicit_selected_files = bool(transer_item.fileitems) def _build_failure_preview_item(file_item: FileItem, message: str) -> dict: + """ + 构造手动整理预览失败项。 + """ return { "source": file_item.path if file_item else None, "target": None, @@ -234,9 +237,16 @@ def manual_transfer( "episode": None, "episode_end": None, "part": None, + "org_string": None, + "apply_words": [], + "resource_team": None, + "customization": None, } def _merge_messages(messages: List[str]) -> str: + """ + 合并手动整理批量预览提示信息。 + """ valid_messages = [msg for msg in messages if msg] if not valid_messages: return "" diff --git a/app/chain/transfer.py b/app/chain/transfer.py index b11e1740..0a619520 100755 --- a/app/chain/transfer.py +++ b/app/chain/transfer.py @@ -2792,6 +2792,10 @@ class TransferChain(ChainBase, ConfigReloadMixin, metaclass=Singleton): "episode": item_meta.begin_episode if item_meta else None, "episode_end": item_meta.end_episode if item_meta else None, "part": item_meta.part if item_meta else None, + "org_string": item_meta.org_string if item_meta else None, + "apply_words": item_meta.apply_words if item_meta else [], + "resource_team": item_meta.resource_team if item_meta else None, + "customization": item_meta.customization if item_meta else None, } ) return transferinfo.success, transferinfo.message @@ -2867,6 +2871,10 @@ class TransferChain(ChainBase, ConfigReloadMixin, metaclass=Singleton): "episode": transfer_task.meta.begin_episode if transfer_task.meta else None, "episode_end": transfer_task.meta.end_episode if transfer_task.meta else None, "part": transfer_task.meta.part if transfer_task.meta else None, + "org_string": transfer_task.meta.org_string if transfer_task.meta else None, + "apply_words": transfer_task.meta.apply_words if transfer_task.meta else [], + "resource_team": transfer_task.meta.resource_team if transfer_task.meta else None, + "customization": transfer_task.meta.customization if transfer_task.meta else None, } ) fail_num += 1 diff --git a/requirements.in b/requirements.in index dc54d677..b6ffabf0 100644 --- a/requirements.in +++ b/requirements.in @@ -1,5 +1,5 @@ Cython~=3.1.2 -moviepilot-rust~=0.1.5 +moviepilot-rust~=0.1.6 pydantic>=2.0.0,<3.0.0 pydantic-settings>=2.0.0,<3.0.0 SQLAlchemy~=2.0.41 diff --git a/tests/test_release_group.py b/tests/test_release_group.py index f8308881..ace8f4a9 100644 --- a/tests/test_release_group.py +++ b/tests/test_release_group.py @@ -1,4 +1,6 @@ from unittest import TestCase +from unittest.mock import patch + from tests.cases.groups import release_group_cases from app.core.meta.releasegroup import ReleaseGroupsMatcher @@ -12,3 +14,18 @@ class MetaInfoTest(TestCase): print(f"\tmatch release group {release_group}, should be: {item.get('group')}") self.assertEqual(item.get("group"), release_group) print(f"完成 {info.get('domain')}") + + def test_custom_release_group_matches_multiple_adjacent_groups(self): + """自定义制作组共用分隔符时,应完整保留所有命中项。""" + matcher = ReleaseGroupsMatcher() + + with patch.object( + matcher.systemconfig, + "get", + return_value=["VCB-Studio|hyakuhuyu|DMG|GM-Team"], + ): + release_group = matcher.match( + "[DMG&VCB-Studio] Youkoso Jitsuryoku Shijou Shugi no Kyoushitsu e" + ) + + self.assertEqual("DMG@VCB-Studio", release_group)