From 68402aadd738699c049ae4ec6612742c342442f7 Mon Sep 17 00:00:00 2001 From: jxxghp Date: Wed, 21 Jan 2026 08:31:51 +0800 Subject: [PATCH] =?UTF-8?q?fix=EF=BC=9A=E5=8E=BB=E9=99=A4=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E6=93=8D=E4=BD=9C=E5=85=A8=E5=B1=80=E9=94=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/chain/transfer.py | 7 +- app/modules/filemanager/storages/local.py | 2 +- app/modules/filemanager/storages/rclone.py | 2 +- app/modules/filemanager/transhandler.py | 200 ++++++++++----------- 4 files changed, 106 insertions(+), 105 deletions(-) diff --git a/app/chain/transfer.py b/app/chain/transfer.py index 43619d04..6dec22ff 100755 --- a/app/chain/transfer.py +++ b/app/chain/transfer.py @@ -580,6 +580,11 @@ class TransferChain(ChainBase, metaclass=Singleton): fileitem = task.fileitem with task_lock: + # 获取当前最新总数 + current_total = self.jobview.total() + # 更新总数,取当前总数和当前已处理+运行中+队列中的最大值 + self._total_num = max(self._total_num, current_total) + # 如果当前没有在运行的任务且处理数为0,说明是一个新序列的开始 if self._active_tasks == 0 and self._processed_num == 0: logger.info("开始整理队列处理...") @@ -588,7 +593,6 @@ class TransferChain(ChainBase, metaclass=Singleton): # 重置计数 self._processed_num = 0 self._fail_num = 0 - self._total_num = self.jobview.total() __process_msg = f"开始整理队列处理,当前共 {self._total_num} 个文件 ..." logger.info(__process_msg) self._progress.update(value=0, @@ -605,6 +609,7 @@ class TransferChain(ChainBase, metaclass=Singleton): text=__process_msg) # 整理 state, err_msg = self.__handle_transfer(task=task, callback=item.callback) + with task_lock: if not state: # 任务失败 diff --git a/app/modules/filemanager/storages/local.py b/app/modules/filemanager/storages/local.py index d4d381c0..2a346444 100644 --- a/app/modules/filemanager/storages/local.py +++ b/app/modules/filemanager/storages/local.py @@ -126,7 +126,7 @@ class LocalStorage(StorageBase): return None path_obj = Path(fileitem.path) / name if not path_obj.exists(): - path_obj.mkdir(parents=True) + path_obj.mkdir(parents=True, exist_ok=True) return self.__get_diritem(path_obj) def get_folder(self, path: Path) -> Optional[schemas.FileItem]: diff --git a/app/modules/filemanager/storages/rclone.py b/app/modules/filemanager/storages/rclone.py index e9f8457a..3d3c8232 100644 --- a/app/modules/filemanager/storages/rclone.py +++ b/app/modules/filemanager/storages/rclone.py @@ -45,7 +45,7 @@ class Rclone(StorageBase): logger.info(f"【rclone】配置写入文件:{filepath}") path = Path(filepath) if not path.parent.exists(): - path.parent.mkdir(parents=True) + path.parent.mkdir(parents=True, exist_ok=True) path.write_text(conf.get('content'), encoding='utf-8') @staticmethod diff --git a/app/modules/filemanager/transhandler.py b/app/modules/filemanager/transhandler.py index 51509cab..e0a52b83 100644 --- a/app/modules/filemanager/transhandler.py +++ b/app/modules/filemanager/transhandler.py @@ -19,8 +19,6 @@ from app.schemas import TransferInfo, TmdbEpisode, TransferDirectoryConf, FileIt from app.schemas.types import MediaType, ChainEventType from app.utils.system import SystemUtils -lock = Lock() - class TransHandler: """ @@ -383,113 +381,111 @@ class TransHandler: and fileitem.storage != "local" and target_storage != "local"): return None, f"不支持 {fileitem.storage} 到 {target_storage} 的文件整理" - # 加锁 - with lock: - if fileitem.storage == "local" and target_storage == "local": - # 创建目录 - if not target_file.parent.exists(): - target_file.parent.mkdir(parents=True) - # 本地到本地 - if transfer_type == "copy": - state = source_oper.copy(fileitem, target_file.parent, target_file.name) - elif transfer_type == "move": - state = source_oper.move(fileitem, target_file.parent, target_file.name) - elif transfer_type == "link": - state = source_oper.link(fileitem, target_file) - elif transfer_type == "softlink": - state = source_oper.softlink(fileitem, target_file) + if fileitem.storage == "local" and target_storage == "local": + # 创建目录 + if not target_file.parent.exists(): + target_file.parent.mkdir(parents=True, exist_ok=True) + # 本地到本地 + if transfer_type == "copy": + state = source_oper.copy(fileitem, target_file.parent, target_file.name) + elif transfer_type == "move": + state = source_oper.move(fileitem, target_file.parent, target_file.name) + elif transfer_type == "link": + state = source_oper.link(fileitem, target_file) + elif transfer_type == "softlink": + state = source_oper.softlink(fileitem, target_file) + else: + return None, f"不支持的整理方式:{transfer_type}" + if state: + return __get_targetitem(target_file), "" + else: + return None, f"{fileitem.path} {transfer_type} 失败" + elif fileitem.storage == "local" and target_storage != "local": + # 本地到网盘 + filepath = Path(fileitem.path) + if not filepath.exists(): + return None, f"文件 {filepath} 不存在" + if transfer_type == "copy": + # 复制 + # 根据目的路径创建文件夹 + target_fileitem = target_oper.get_folder(target_file.parent) + if target_fileitem: + # 上传文件 + new_item = target_oper.upload(target_fileitem, filepath, target_file.name) + if new_item: + return new_item, "" + else: + return None, f"{fileitem.path} 上传 {target_storage} 失败" else: - return None, f"不支持的整理方式:{transfer_type}" - if state: + return None, f"【{target_storage}】{target_file.parent} 目录获取失败" + elif transfer_type == "move": + # 移动 + # 根据目的路径获取文件夹 + target_fileitem = target_oper.get_folder(target_file.parent) + if target_fileitem: + # 上传文件 + new_item = target_oper.upload(target_fileitem, filepath, target_file.name) + if new_item: + # 删除源文件 + source_oper.delete(fileitem) + return new_item, "" + else: + return None, f"{fileitem.path} 上传 {target_storage} 失败" + else: + return None, f"【{target_storage}】{target_file.parent} 目录获取失败" + elif fileitem.storage != "local" and target_storage == "local": + # 网盘到本地 + if target_file.exists(): + logger.warn(f"文件已存在:{target_file}") + return __get_targetitem(target_file), "" + # 网盘到本地 + if transfer_type in ["copy", "move"]: + # 下载 + tmp_file = source_oper.download(fileitem=fileitem, path=target_file.parent) + if tmp_file: + # 创建目录 + if not target_file.parent.exists(): + target_file.parent.mkdir(parents=True, exist_ok=True) + # 将tmp_file移动后target_file + SystemUtils.move(tmp_file, target_file) + if transfer_type == "move": + # 删除源文件 + source_oper.delete(fileitem) return __get_targetitem(target_file), "" else: - return None, f"{fileitem.path} {transfer_type} 失败" - elif fileitem.storage == "local" and target_storage != "local": - # 本地到网盘 - filepath = Path(fileitem.path) - if not filepath.exists(): - return None, f"文件 {filepath} 不存在" - if transfer_type == "copy": - # 复制 - # 根据目的路径创建文件夹 - target_fileitem = target_oper.get_folder(target_file.parent) - if target_fileitem: - # 上传文件 - new_item = target_oper.upload(target_fileitem, filepath, target_file.name) - if new_item: - return new_item, "" - else: - return None, f"{fileitem.path} 上传 {target_storage} 失败" - else: - return None, f"【{target_storage}】{target_file.parent} 目录获取失败" - elif transfer_type == "move": - # 移动 - # 根据目的路径获取文件夹 - target_fileitem = target_oper.get_folder(target_file.parent) - if target_fileitem: - # 上传文件 - new_item = target_oper.upload(target_fileitem, filepath, target_file.name) - if new_item: - # 删除源文件 - source_oper.delete(fileitem) - return new_item, "" - else: - return None, f"{fileitem.path} 上传 {target_storage} 失败" - else: - return None, f"【{target_storage}】{target_file.parent} 目录获取失败" - elif fileitem.storage != "local" and target_storage == "local": - # 网盘到本地 - if target_file.exists(): - logger.warn(f"文件已存在:{target_file}") - return __get_targetitem(target_file), "" - # 网盘到本地 - if transfer_type in ["copy", "move"]: - # 下载 - tmp_file = source_oper.download(fileitem=fileitem, path=target_file.parent) - if tmp_file: - # 创建目录 - if not target_file.parent.exists(): - target_file.parent.mkdir(parents=True) - # 将tmp_file移动后target_file - SystemUtils.move(tmp_file, target_file) - if transfer_type == "move": - # 删除源文件 - source_oper.delete(fileitem) - return __get_targetitem(target_file), "" - else: - return None, f"{fileitem.path} {fileitem.storage} 下载失败" - elif fileitem.storage == target_storage: - # 同一网盘 - if not source_oper.is_support_transtype(transfer_type): - return None, f"存储 {fileitem.storage} 不支持 {transfer_type} 整理方式" + return None, f"{fileitem.path} {fileitem.storage} 下载失败" + elif fileitem.storage == target_storage: + # 同一网盘 + if not source_oper.is_support_transtype(transfer_type): + return None, f"存储 {fileitem.storage} 不支持 {transfer_type} 整理方式" - if transfer_type == "copy": - # 复制文件到新目录 - target_fileitem = target_oper.get_folder(target_file.parent) - if target_fileitem: - if source_oper.copy(fileitem, Path(target_fileitem.path), target_file.name): - return target_oper.get_item(target_file), "" - else: - return None, f"【{target_storage}】{fileitem.path} 复制文件失败" - else: - return None, f"【{target_storage}】{target_file.parent} 目录获取失败" - elif transfer_type == "move": - # 移动文件到新目录 - target_fileitem = target_oper.get_folder(target_file.parent) - if target_fileitem: - if source_oper.move(fileitem, Path(target_fileitem.path), target_file.name): - return target_oper.get_item(target_file), "" - else: - return None, f"【{target_storage}】{fileitem.path} 移动文件失败" - else: - return None, f"【{target_storage}】{target_file.parent} 目录获取失败" - elif transfer_type == "link": - if source_oper.link(fileitem, target_file): + if transfer_type == "copy": + # 复制文件到新目录 + target_fileitem = target_oper.get_folder(target_file.parent) + if target_fileitem: + if source_oper.copy(fileitem, Path(target_fileitem.path), target_file.name): return target_oper.get_item(target_file), "" else: - return None, f"【{target_storage}】{fileitem.path} 创建硬链接失败" + return None, f"【{target_storage}】{fileitem.path} 复制文件失败" else: - return None, f"不支持的整理方式:{transfer_type}" + return None, f"【{target_storage}】{target_file.parent} 目录获取失败" + elif transfer_type == "move": + # 移动文件到新目录 + target_fileitem = target_oper.get_folder(target_file.parent) + if target_fileitem: + if source_oper.move(fileitem, Path(target_fileitem.path), target_file.name): + return target_oper.get_item(target_file), "" + else: + return None, f"【{target_storage}】{fileitem.path} 移动文件失败" + else: + return None, f"【{target_storage}】{target_file.parent} 目录获取失败" + elif transfer_type == "link": + if source_oper.link(fileitem, target_file): + return target_oper.get_item(target_file), "" + else: + return None, f"【{target_storage}】{fileitem.path} 创建硬链接失败" + else: + return None, f"不支持的整理方式:{transfer_type}" return None, "未知错误"