feat(transfer): 增加手动整理预览模式(preview mode)

- ManualTransferItem/TransferTask 增加 preview 字段,支持同一接口双模式
- /api/v1/transfer/manual 透传 preview,预览时返回结构化结果不落盘
- ChainBase.transfer 增加 preview 参数并透传到 run_module
- TransferChain.do_transfer 预览分支复用完整命名/覆盖判定逻辑(dry-run)
- TransferChain.do_transfer 预览结束后显式 finish_task/fail_task,避免任务残留 running 状态导致重复预览失败
- TransHandler.transfer_media 预览分支跳过实际 copy/move/link/delete,仅返回目标路径
- FileManagerModule.transfer 透传 preview 参数
- 修复 /manual 失败分支 dict 类型导致 Response.message 校验错误
- 兼容性:preview 字段有默认值,旧客户端不传参时行为不变
This commit is contained in:
album
2026-05-12 00:10:55 +08:00
committed by jxxghp
parent 99fbeecfa1
commit 05b34b9c26
6 changed files with 198 additions and 45 deletions

View File

@@ -113,7 +113,7 @@ def manual_transfer(transer_item: ManualTransferItem,
# 源路径
src_fileitem = FileItem(**history.src_fileitem)
# 目的路径
if history.dest_fileitem:
if history.dest_fileitem and not transer_item.preview:
# 删除旧的已整理文件
dest_fileitem = FileItem(**history.dest_fileitem)
state = StorageChain().delete_media_file(dest_fileitem)
@@ -181,14 +181,23 @@ def manual_transfer(transer_item: ManualTransferItem,
force=force,
background=background,
downloader=downloader,
download_hash=download_hash
download_hash=download_hash,
preview=transer_item.preview,
)
# 失败
if not state:
if isinstance(errormsg, list):
errormsg = f"整理完成,{len(errormsg)} 个文件转移失败!"
if isinstance(errormsg, dict):
return schemas.Response(
success=True,
message=errormsg.get("message"),
data=errormsg,
)
return schemas.Response(success=False, message=errormsg)
# 成功
if transer_item.preview:
return schemas.Response(success=True, data=errormsg or {})
return schemas.Response(success=True)