feat:清理硬链接 支持配置不删除目录

This commit is contained in:
jxxghp
2024-02-28 18:52:36 +08:00
parent aaa1704ab6
commit 172fb30b99
2 changed files with 39 additions and 4 deletions

View File

@@ -346,7 +346,7 @@
"RemoveLink": {
"name": "清理硬链接",
"description": "监控目录内文件被删除时,同步删除监控目录内所有和它硬链接的文件",
"version": "1.4",
"version": "1.5",
"icon": "Ombi_A.png",
"author": "DzAvril",
"level": 1

View File

@@ -85,7 +85,7 @@ class RemoveLink(_PluginBase):
# 插件图标
plugin_icon = "Ombi_A.png"
# 插件版本
plugin_version = "1.4"
plugin_version = "1.5"
# 插件作者
plugin_author = "DzAvril"
# 作者主页
@@ -99,6 +99,7 @@ class RemoveLink(_PluginBase):
# preivate property
monitor_dirs = ""
exclude_dirs = ""
exclude_keywords = ".!qB"
_enabled = False
_notify = False
@@ -112,10 +113,12 @@ class RemoveLink(_PluginBase):
self._enabled = config.get("enabled")
self._notify = config.get("notify")
self.monitor_dirs = config.get("monitor_dirs")
self.exclude_dirs = config.get("exclude_dirs") or ""
self.exclude_keywords = config.get("exclude_keywords") or ""
# 停止现有任务
self.stop_service()
if self._enabled:
# 读取目录配置
monitor_dirs = self.monitor_dirs.split("\n")
@@ -215,7 +218,27 @@ class RemoveLink(_PluginBase):
"model": "monitor_dirs",
"label": "监控目录",
"rows": 5,
"placeholder": "每一行一个目录",
"placeholder": "源目录及硬链接目录均需加入监控,每一行一个目录",
},
}
],
}
],
},
{
"component": "VRow",
"content": [
{
"component": "VCol",
"props": {"cols": 12},
"content": [
{
"component": "VTextarea",
"props": {
"model": "exclude_dirs",
"label": "不删除目录",
"rows": 5,
"placeholder": "该目录下的文件不会被动删除,一行一个目录",
},
}
],
@@ -258,7 +281,7 @@ class RemoveLink(_PluginBase):
'props': {
'type': 'info',
'variant': 'tonal',
'text': '监控目录如有多个换行,源目录和硬链接目录都需要添加到监控目录中。'
'text': '监控目录如有多个换行,源目录和硬链接目录都需要添加到监控目录中;如需实现删除硬链接时不删除源文件,可把源文件目录配置到不删除目录中'
}
}
]
@@ -292,6 +315,15 @@ class RemoveLink(_PluginBase):
logger.error(f"停止目录监控失败:{str(e)}")
self._observer = []
def __is_excluded(self, file_path: Path) -> bool:
"""
是否排除目录
"""
for exclude_dir in self.exclude_dirs.split("\n"):
if exclude_dir and exclude_dir in str(file_path):
return True
return False
def handle_deleted(self, file_path: Path):
"""
处理删除事件
@@ -310,6 +342,9 @@ class RemoveLink(_PluginBase):
for path, inode in self.state_set.copy().items():
if inode == deleted_inode:
file = Path(path)
if self.__is_excluded(file):
logger.info(f"文件 {file} 在不删除目录中,不处理")
continue
# 删除硬链接文件
logger.info(f"删除硬链接文件:{path} inode: {inode}")
file.unlink()