fix: build complete transfer result at source

This commit is contained in:
jxxghp
2026-05-20 22:09:57 +08:00
parent 014dc2884c
commit 617692616c
5 changed files with 190 additions and 259 deletions
+2 -30
View File
@@ -871,9 +871,6 @@ class TransferChain(ChainBase, ConfigReloadMixin, metaclass=Singleton):
"""
整理完成后处理
"""
if transferinfo:
transferinfo.ensure_target_items()
# 状态
ret_status = True
# 错误信息
@@ -1162,7 +1159,6 @@ class TransferChain(ChainBase, ConfigReloadMixin, metaclass=Singleton):
"""
if not transferinfo:
return None
transferinfo.ensure_target_items()
if transferinfo.target_diritem and transferinfo.target_diritem.path:
return transferinfo.target_diritem.path
if transferinfo.target_item and transferinfo.target_item.path:
@@ -1171,30 +1167,6 @@ class TransferChain(ChainBase, ConfigReloadMixin, metaclass=Singleton):
return Path(transferinfo.file_list_new[0]).parent.as_posix()
return None
def __build_transfer_target_diritem(
self, transferinfo: Optional[TransferInfo]
) -> Optional[FileItem]:
"""
构建整理目标目录项,避免成功结果缺少 target_diritem 时阻断后续流程。
"""
if not transferinfo:
return None
transferinfo.ensure_target_items()
if transferinfo.target_diritem:
return transferinfo.target_diritem
target_dir_path = self.__get_transfer_target_dir_path(transferinfo)
if not target_dir_path:
return None
target_path = Path(target_dir_path)
storage = transferinfo.target_item.storage if transferinfo.target_item else "local"
return FileItem(
storage=storage,
path=target_dir_path,
type="dir",
name=target_path.name,
basename=target_path.stem,
)
def put_to_queue(self, task: TransferTask) -> bool:
"""
添加到待整理队列
@@ -1248,7 +1220,7 @@ class TransferChain(ChainBase, ConfigReloadMixin, metaclass=Singleton):
):
return
target_diritem = self.__build_transfer_target_diritem(transferinfo)
target_diritem = transferinfo.target_diritem
if not target_diritem:
return
@@ -1311,7 +1283,7 @@ class TransferChain(ChainBase, ConfigReloadMixin, metaclass=Singleton):
):
return
target_diritem = self.__build_transfer_target_diritem(transferinfo)
target_diritem = transferinfo.target_diritem
if not target_diritem:
return
+44
View File
@@ -127,6 +127,41 @@ class TransHandler:
size=size if item_type == "file" else None,
)
@staticmethod
def __build_transfer_target_diritem(
target_storage: str, target_path: Path
) -> FileItem:
"""
按已确认的目标目录路径构造整理结果目录项。
"""
return FileItem(
storage=target_storage,
path=TransHandler.__format_dir_path(target_path),
name=target_path.name,
basename=target_path.stem,
type="dir",
)
@staticmethod
def __format_dir_path(path: Path) -> str:
"""
按 FileItem 目录路径约定返回以斜杠结尾的路径。
"""
path_str = path.as_posix()
if path_str != "/" and not path_str.endswith("/"):
return f"{path_str}/"
return path_str
@staticmethod
def __normalize_dir_path(path: Optional[str]) -> str:
"""
比较目录路径时忽略尾部斜杠,兼容不同存储返回的目录项格式。
"""
if not path:
return ""
path_str = Path(str(path)).as_posix().rstrip("/")
return path_str or "/"
def transfer_media(
self,
fileitem: FileItem,
@@ -281,6 +316,10 @@ class TransHandler:
return result
logger.info(f"文件夹 {fileitem.path} 整理成功")
if self.__normalize_dir_path(new_diritem.path) != self.__normalize_dir_path(new_path.as_posix()):
new_diritem = self.__build_transfer_target_diritem(
target_storage=target_storage, target_path=new_path
)
# 返回整理后的路径
self.__update_result(
result=result,
@@ -401,6 +440,11 @@ class TransHandler:
need_notify=need_notify,
)
return result
# 目标目录已创建成功但元数据可能短暂缺字段,整理结果直接按目标路径补全。
if self.__normalize_dir_path(target_diritem.path) != self.__normalize_dir_path(folder_path.as_posix()):
target_diritem = self.__build_transfer_target_diritem(
target_storage=target_storage, target_path=folder_path
)
# 判断是否要覆盖,附加文件强制覆盖
overflag = False
-81
View File
@@ -134,87 +134,6 @@ class TransferInfo(BaseModel):
# 是否需要通知
need_notify: Optional[bool] = False
def ensure_target_items(self):
"""
补齐整理目标文件项和目录项,兼容 OpenList 等成功后元数据延迟可见的存储。
"""
if not self.target_item or not self.target_item.path:
self.target_item = self.__build_target_item()
if not self.target_diritem or not self.target_diritem.path:
self.target_diritem = self.__build_target_diritem()
return self
def __build_target_item(self) -> Optional[FileItem]:
"""
根据目标文件清单构造整理目标文件项。
"""
if self.target_item and self.target_item.path:
return self.target_item
if not self.file_list_new:
return self.target_item
target_path = self.file_list_new[0]
if not target_path:
return self.target_item
path = Path(str(target_path))
source_item = self.fileitem
return FileItem(
storage=self.__get_target_storage(),
path=path.as_posix(),
type=source_item.type if source_item and source_item.type else "file",
name=path.name,
basename=path.stem,
extension=path.suffix.lstrip("."),
size=source_item.size if source_item else None,
modify_time=source_item.modify_time if source_item else None,
thumbnail=source_item.thumbnail if source_item else None,
)
def __build_target_diritem(self) -> Optional[FileItem]:
"""
根据目标文件项或目标文件清单构造整理目标目录项。
"""
if self.target_diritem and self.target_diritem.path:
return self.target_diritem
target_dir_path = self.__get_target_dir_path()
if not target_dir_path:
return self.target_diritem
path = Path(str(target_dir_path))
return FileItem(
storage=self.__get_target_storage(),
path=path.as_posix(),
type="dir",
name=path.name,
basename=path.stem,
)
def __get_target_dir_path(self) -> Optional[str]:
"""
从已知整理结果中推导媒体目标目录路径。
"""
if self.target_item and self.target_item.path:
if self.target_item.type == "dir":
return self.target_item.path
return Path(str(self.target_item.path)).parent.as_posix()
if self.file_list_new:
return Path(str(self.file_list_new[0])).parent.as_posix()
return None
def __get_target_storage(self) -> str:
"""
从目标项、目标目录项或源文件项中推导目标存储标识。
"""
if self.target_item and self.target_item.storage:
return self.target_item.storage
if self.target_diritem and self.target_diritem.storage:
return self.target_diritem.storage
if self.fileitem and self.fileitem.storage:
return self.fileitem.storage
return "local"
def to_dict(self):
"""
返回字典