diff --git a/app/chain/storage.py b/app/chain/storage.py index 164e3ffa..f2ef5c8d 100644 --- a/app/chain/storage.py +++ b/app/chain/storage.py @@ -4,6 +4,7 @@ from typing import Optional, Tuple, List, Dict from app import schemas from app.chain import ChainBase from app.core.config import settings +from app.helper.directory import DirectoryHelper from app.log import logger from app.schemas import MediaType @@ -13,6 +14,10 @@ class StorageChain(ChainBase): 存储处理链 """ + def __init__(self): + super().__init__() + self.directoryhelper = DirectoryHelper() + def save_config(self, storage: str, conf: dict) -> None: """ 保存存储配置 @@ -109,32 +114,44 @@ class StorageChain(ChainBase): """ return self.run_module("support_transtype", storage=storage) - def delete_media_file(self, fileitem: schemas.FileItem, mtype: MediaType = None) -> bool: + def delete_media_file(self, fileitem: schemas.FileItem, + mtype: MediaType = None, delete_self: bool = True) -> bool: """ 删除媒体文件,以及不含媒体文件的目录 """ + media_exts = settings.RMT_MEDIAEXT + settings.DOWNLOAD_TMPEXT if fileitem.path == "/" or len(Path(fileitem.path).parts) <= 2: logger.warn(f"【{fileitem.storage}】{fileitem.path} 根目录或一级目录不允许删除") return False - logger.warn(f"正在删除【{fileitem.storage}】{fileitem.path}") - state = self.delete_file(fileitem) - if not state: - logger.warn(f"【{fileitem.storage}】{fileitem.path} 删除失败") - return False if fileitem.type == "dir": - # 本身是目录不处理父目录 - return True - # 上级目录 + # 本身是目录 + if self.any_files(fileitem, extensions=media_exts) is False: + logger.warn(f"【{fileitem.storage}】{fileitem.path} 不存在其它媒体文件,删除空目录") + return self.delete_file(fileitem) + return False + elif delete_self: + # 本身是文件 + logger.warn(f"正在删除【{fileitem.storage}】{fileitem.path}") + if not self.delete_file(fileitem): + logger.warn(f"【{fileitem.storage}】{fileitem.path} 删除失败") + return False + # 处理上级目录 if mtype and mtype == MediaType.TV: dir_item = self.get_file_item(storage=fileitem.storage, path=Path(fileitem.path).parent.parent) else: dir_item = self.get_parent_item(fileitem) if dir_item and len(Path(dir_item.path).parts) > 2: + # 如何目录是所有下载目录、媒体库目录的上级,则不处理 + for d in self.directoryhelper.get_dirs(): + if d.download_path and Path(d.download_path).is_relative_to(Path(dir_item.path)): + logger.debug(f"【{dir_item.storage}】{dir_item.path} 是下载目录本级或上级目录,不删除") + return True + if d.library_path and Path(d.library_path).is_relative_to(Path(dir_item.path)): + logger.debug(f"【{dir_item.storage}】{dir_item.path} 是媒体库目录本级或上级目录,不删除") + return True # 不存在其他媒体文件,删除空目录 - exts = settings.RMT_MEDIAEXT + settings.DOWNLOAD_TMPEXT - if self.any_files(dir_item, extensions=exts) is False: + if self.any_files(dir_item, extensions=media_exts) is False: logger.warn(f"【{dir_item.storage}】{dir_item.path} 不存在其它媒体文件,删除空目录") return self.delete_file(dir_item) - # 存在媒体文件,返回文件删除状态 - return state + return True diff --git a/app/chain/transfer.py b/app/chain/transfer.py index 741a3768..c26f90c6 100644 --- a/app/chain/transfer.py +++ b/app/chain/transfer.py @@ -514,14 +514,7 @@ class TransferChain(ChainBase): logger.info(f"移动模式删除种子成功:{download_hash} ") # 删除残留目录 if fileitem: - if fileitem.type == "dir": - folder_item = fileitem - else: - folder_item = self.storagechain.get_parent_item(fileitem) - exts = settings.RMT_MEDIAEXT + settings.DOWNLOAD_TMPEXT - if folder_item and self.storagechain.any_files(folder_item, extensions=exts) is False: - logger.warn(f"删除残留空文件夹:【{folder_item.storage}】{folder_item.path}") - self.storagechain.delete_file(folder_item) + self.storagechain.delete_media_file(fileitem, delete_self=False) # 结束进度 logger.info(f"{fileitem.path} 整理完成,共 {total_num} 个文件," diff --git a/app/monitor.py b/app/monitor.py index e22dddcc..ce3733dd 100644 --- a/app/monitor.py +++ b/app/monitor.py @@ -478,14 +478,7 @@ class Monitor(metaclass=Singleton): # 移动模式删除空目录 if transferinfo.transfer_type in ["move"]: - if file_item.type == "dir": - folder_item = file_item - else: - folder_item = self.storagechain.get_parent_item(file_item) - exts = settings.RMT_MEDIAEXT + settings.DOWNLOAD_TMPEXT - if folder_item and self.storagechain.any_files(folder_item, extensions=exts) is False: - logger.warn(f"删除残留空文件夹:【{folder_item.storage}】{folder_item.path}") - self.storagechain.delete_file(folder_item) + self.storagechain.delete_media_file(file_item, delete_self=False) except Exception as e: logger.error("目录监控发生错误:%s - %s" % (str(e), traceback.format_exc()))