mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-08-27 11:11:07 +08:00
fix #3126 目录删除加固
This commit is contained in:
@@ -4,6 +4,7 @@ from typing import Optional, Tuple, List, Dict
|
|||||||
from app import schemas
|
from app import schemas
|
||||||
from app.chain import ChainBase
|
from app.chain import ChainBase
|
||||||
from app.core.config import settings
|
from app.core.config import settings
|
||||||
|
from app.helper.directory import DirectoryHelper
|
||||||
from app.log import logger
|
from app.log import logger
|
||||||
from app.schemas import MediaType
|
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:
|
def save_config(self, storage: str, conf: dict) -> None:
|
||||||
"""
|
"""
|
||||||
保存存储配置
|
保存存储配置
|
||||||
@@ -109,32 +114,44 @@ class StorageChain(ChainBase):
|
|||||||
"""
|
"""
|
||||||
return self.run_module("support_transtype", storage=storage)
|
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:
|
if fileitem.path == "/" or len(Path(fileitem.path).parts) <= 2:
|
||||||
logger.warn(f"【{fileitem.storage}】{fileitem.path} 根目录或一级目录不允许删除")
|
logger.warn(f"【{fileitem.storage}】{fileitem.path} 根目录或一级目录不允许删除")
|
||||||
return False
|
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":
|
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:
|
if mtype and mtype == MediaType.TV:
|
||||||
dir_item = self.get_file_item(storage=fileitem.storage, path=Path(fileitem.path).parent.parent)
|
dir_item = self.get_file_item(storage=fileitem.storage, path=Path(fileitem.path).parent.parent)
|
||||||
else:
|
else:
|
||||||
dir_item = self.get_parent_item(fileitem)
|
dir_item = self.get_parent_item(fileitem)
|
||||||
if dir_item and len(Path(dir_item.path).parts) > 2:
|
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=media_exts) is False:
|
||||||
if self.any_files(dir_item, extensions=exts) is False:
|
|
||||||
logger.warn(f"【{dir_item.storage}】{dir_item.path} 不存在其它媒体文件,删除空目录")
|
logger.warn(f"【{dir_item.storage}】{dir_item.path} 不存在其它媒体文件,删除空目录")
|
||||||
return self.delete_file(dir_item)
|
return self.delete_file(dir_item)
|
||||||
|
|
||||||
# 存在媒体文件,返回文件删除状态
|
return True
|
||||||
return state
|
|
||||||
|
|||||||
@@ -514,14 +514,7 @@ class TransferChain(ChainBase):
|
|||||||
logger.info(f"移动模式删除种子成功:{download_hash} ")
|
logger.info(f"移动模式删除种子成功:{download_hash} ")
|
||||||
# 删除残留目录
|
# 删除残留目录
|
||||||
if fileitem:
|
if fileitem:
|
||||||
if fileitem.type == "dir":
|
self.storagechain.delete_media_file(fileitem, delete_self=False)
|
||||||
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)
|
|
||||||
|
|
||||||
# 结束进度
|
# 结束进度
|
||||||
logger.info(f"{fileitem.path} 整理完成,共 {total_num} 个文件,"
|
logger.info(f"{fileitem.path} 整理完成,共 {total_num} 个文件,"
|
||||||
|
|||||||
@@ -478,14 +478,7 @@ class Monitor(metaclass=Singleton):
|
|||||||
|
|
||||||
# 移动模式删除空目录
|
# 移动模式删除空目录
|
||||||
if transferinfo.transfer_type in ["move"]:
|
if transferinfo.transfer_type in ["move"]:
|
||||||
if file_item.type == "dir":
|
self.storagechain.delete_media_file(file_item, delete_self=False)
|
||||||
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)
|
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error("目录监控发生错误:%s - %s" % (str(e), traceback.format_exc()))
|
logger.error("目录监控发生错误:%s - %s" % (str(e), traceback.format_exc()))
|
||||||
|
|||||||
Reference in New Issue
Block a user