From 93e053d06a8f3f643375bcf1ea1c7e040c9cf2cb Mon Sep 17 00:00:00 2001 From: jxxghp Date: Wed, 25 Sep 2024 20:16:31 +0800 Subject: [PATCH] =?UTF-8?q?fix=20=E8=B7=A8=E5=AD=98=E5=82=A8=E6=95=B4?= =?UTF-8?q?=E7=90=86=EF=BC=88115=E4=B8=8B=E8=BD=BD=E9=99=A4=E5=A4=96?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/chain/transfer.py | 2 +- app/db/models/transferhistory.py | 8 +++-- app/db/transferhistory_oper.py | 5 +-- app/modules/filemanager/__init__.py | 2 +- app/modules/filemanager/storages/alipan.py | 8 ++++- app/modules/filemanager/storages/rclone.py | 42 ++++++++++++++-------- app/modules/filemanager/storages/u115.py | 27 +++++++------- app/monitor.py | 2 +- 8 files changed, 60 insertions(+), 36 deletions(-) diff --git a/app/chain/transfer.py b/app/chain/transfer.py index c24ed26f..7ef26f23 100644 --- a/app/chain/transfer.py +++ b/app/chain/transfer.py @@ -272,7 +272,7 @@ class TransferChain(ChainBase): # 整理成功的不再处理 if not force: - transferd = self.transferhis.get_by_src(file_item.path) + transferd = self.transferhis.get_by_src(file_item.path, storage=file_item.storage) if transferd and transferd.status: logger.info(f"{file_item.path} 已成功整理过,如需重新处理,请删除历史记录。") # 计数 diff --git a/app/db/models/transferhistory.py b/app/db/models/transferhistory.py index 62e76f6a..2ad8eba4 100644 --- a/app/db/models/transferhistory.py +++ b/app/db/models/transferhistory.py @@ -95,8 +95,12 @@ class TransferHistory(Base): @staticmethod @db_query - def get_by_src(db: Session, src: str): - return db.query(TransferHistory).filter(TransferHistory.src == src).first() + def get_by_src(db: Session, src: str, storage: str = None): + if storage: + return db.query(TransferHistory).filter(TransferHistory.src == src, + TransferHistory.src_storage == storage).first() + else: + return db.query(TransferHistory).filter(TransferHistory.src == src).first() @staticmethod @db_query diff --git a/app/db/transferhistory_oper.py b/app/db/transferhistory_oper.py index c31cb4e9..4f0a757b 100644 --- a/app/db/transferhistory_oper.py +++ b/app/db/transferhistory_oper.py @@ -28,12 +28,13 @@ class TransferHistoryOper(DbOper): """ return TransferHistory.list_by_title(self._db, title) - def get_by_src(self, src: str) -> TransferHistory: + def get_by_src(self, src: str, storage: str = None) -> TransferHistory: """ 按源查询转移记录 :param src: 数据key + :param storage: 存储类型 """ - return TransferHistory.get_by_src(self._db, src) + return TransferHistory.get_by_src(self._db, src, storage) def get_by_dest(self, dest: str) -> TransferHistory: """ diff --git a/app/modules/filemanager/__init__.py b/app/modules/filemanager/__init__.py index 24e43086..f754518f 100644 --- a/app/modules/filemanager/__init__.py +++ b/app/modules/filemanager/__init__.py @@ -750,7 +750,7 @@ class FileManagerModule(_ModuleBase): target_file=target_file, transfer_type=transfer_type) if new_item: - logger.info(f"文件 {fileitem.path} {transfer_type}完成") + logger.debug(f"文件 {fileitem.path} {transfer_type}完成") # 处理其他相关文件 self.__transfer_other_files(fileitem=fileitem, target_storage=target_storage, diff --git a/app/modules/filemanager/storages/alipan.py b/app/modules/filemanager/storages/alipan.py index 40bcefcf..62d2ee5f 100644 --- a/app/modules/filemanager/storages/alipan.py +++ b/app/modules/filemanager/storages/alipan.py @@ -6,6 +6,8 @@ import time from pathlib import Path from typing import Optional, Tuple, List +from aligo.response import CreateFileResponse + from app import schemas from app.core.config import settings from app.log import logger @@ -267,6 +269,8 @@ class AliPan(StorageBase): return None item = self.aligo.create_folder(name=name, parent_file_id=fileitem.fileid, drive_id=fileitem.drive_id) if item: + if isinstance(item, CreateFileResponse): + item = self.aligo.get_file(file_id=item.file_id, drive_id=item.drive_id) return self.__get_fileitem(item) return None @@ -276,8 +280,10 @@ class AliPan(StorageBase): """ if not self.aligo: return None - item = self.aligo.get_folder_by_path(path=str(Path), create_folder=True) + item = self.aligo.get_folder_by_path(path=str(path), create_folder=True) if item: + if isinstance(item, CreateFileResponse): + item = self.aligo.get_file(file_id=item.file_id, drive_id=item.drive_id) return self.__get_fileitem(item) return None diff --git a/app/modules/filemanager/storages/rclone.py b/app/modules/filemanager/storages/rclone.py index 64d1365a..c9fc2fb2 100644 --- a/app/modules/filemanager/storages/rclone.py +++ b/app/modules/filemanager/storages/rclone.py @@ -66,20 +66,32 @@ class Rclone(StorageBase): modify_time=path.stat().st_mtime, ) - def __get_rcloneitem(self, item: dict): + def __get_rcloneitem(self, item: dict, parent: str = "/") -> schemas.FileItem: """ 获取rclone文件项 """ - return schemas.FileItem( - storage=self.schema.value, - type="dir" if item.get("IsDir") else "file", - path=item.get("Path"), - name=item.get("Name"), - basename=Path(item.get("Name")).stem, - extension=Path(item.get("Name")).suffix[1:], - size=item.get("Size"), - modify_time=StringUtils.str_to_timestamp(item.get("ModTime")) - ) + if not item: + return schemas.FileItem() + if item.get("IsDir"): + return schemas.FileItem( + storage=self.schema.value, + type="dir", + path=f"{parent}{item.get('Name')}", + name=item.get("Name"), + basename=item.get("Name"), + modify_time=StringUtils.str_to_timestamp(item.get("ModTime")) + ) + else: + return schemas.FileItem( + storage=self.schema.value, + type="file", + path=f"{parent}{item.get('Name')}", + name=item.get("Name"), + basename=Path(item.get("Name")).stem, + extension=Path(item.get("Name")).suffix[1:], + size=item.get("Size"), + modify_time=StringUtils.str_to_timestamp(item.get("ModTime")) + ) def check(self) -> bool: """ @@ -113,7 +125,7 @@ class Rclone(StorageBase): ) if ret.returncode == 0: items = json.loads(ret.stdout) - return [self.__get_rcloneitem(item) for item in items] + return [self.__get_rcloneitem(item, parent=fileitem.path) for item in items] except Exception as err: logger.error(f"rclone浏览文件失败:{err}") return [] @@ -164,7 +176,7 @@ class Rclone(StorageBase): if dir_file: fileitem = dir_file else: - dir_file = self.create_folder(dir_file, part) + dir_file = self.create_folder(fileitem, part) if not dir_file: logger.warn(f"rclone创建目录 {fileitem.path}{part} 失败!") return None @@ -256,8 +268,8 @@ class Rclone(StorageBase): retcode = subprocess.run( [ 'rclone', 'copyto', - fileitem.path, - f'MP:{path}' + str(path), + f'MP:{Path(fileitem.path) / path.name}' ], startupinfo=self.__get_hidden_shell() ).returncode diff --git a/app/modules/filemanager/storages/u115.py b/app/modules/filemanager/storages/u115.py index f5fbd76d..750d6f0b 100644 --- a/app/modules/filemanager/storages/u115.py +++ b/app/modules/filemanager/storages/u115.py @@ -202,17 +202,18 @@ class U115Pan(StorageBase, metaclass=Singleton): if not self.__init_cloud(): return None try: - result = self.cloud.storage().make_dir(fileitem.parent_fileid, name) - return schemas.FileItem( - storage=self.schema.value, - fileid=result.file_id, - parent_fileid=result.parent_id, - type="dir", - path=f"{fileitem.path}{name}/", - name=name, - modify_time=result.modified_time.timestamp() if result.modified_time else 0, - pickcode=result.pickcode - ) + result = self.cloud.storage().make_dir(fileitem.fileid, name) + if result: + return schemas.FileItem( + storage=self.schema.value, + fileid=result.file_id, + parent_fileid=result.parent_id, + type="dir", + path=f"{fileitem.path}{name}/", + name=name, + modify_time=result.modified_time.timestamp() if result.modified_time else 0, + pickcode=result.pickcode + ) except Exception as e: logger.error(f"115创建目录失败:{str(e)}") return None @@ -242,12 +243,12 @@ class U115Pan(StorageBase, metaclass=Singleton): if dir_file: fileitem = dir_file else: - dir_file = self.create_folder(dir_file, part) + dir_file = self.create_folder(fileitem, part) if not dir_file: logger.warn(f"115创建目录 {fileitem.path}{part} 失败!") return None fileitem = dir_file - return fileitem + return fileitem if fileitem.fileid != "0" else None def get_item(self, path: Path) -> Optional[schemas.FileItem]: """ diff --git a/app/monitor.py b/app/monitor.py index e70d15ec..00763e1b 100644 --- a/app/monitor.py +++ b/app/monitor.py @@ -299,7 +299,7 @@ class Monitor(metaclass=Singleton): logger.info(f"{event_path} 是蓝光原盘目录,更正文件路径为:{event_path}") # 查询历史记录,已转移的不处理 - if self.transferhis.get_by_src(str(event_path)): + if self.transferhis.get_by_src(str(event_path), storage=storage): logger.info(f"{event_path} 已经整理过了") return