mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-09-05 23:47:41 +08:00
fix: build complete transfer result at source
This commit is contained in:
+2
-30
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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):
|
||||
"""
|
||||
返回字典
|
||||
|
||||
Reference in New Issue
Block a user