diff --git a/app/templates/index.html b/app/templates/index.html
index af07954..c1df197 100644
--- a/app/templates/index.html
+++ b/app/templates/index.html
@@ -372,7 +372,7 @@
-
+
diff --git a/quark_auto_save.py b/quark_auto_save.py
index 59da089..d81c2fe 100644
--- a/quark_auto_save.py
+++ b/quark_auto_save.py
@@ -1404,8 +1404,24 @@ class Quark:
if share_file["dir"] and task.get("update_subdir", False):
if re.search(task["update_subdir"], share_file["file_name"]):
print(f"检查子文件夹: {savepath}/{share_file['file_name']}")
+
+ # 创建一个子任务对象,保留原任务的属性,但专门用于子目录处理
+ subdir_task = task.copy()
+ # 确保子目录也可以使用忽略后缀功能
+
+ # 将子目录任务设置为正则命名模式
+ # 如果原任务没有设置pattern,或者使用的是顺序/剧集命名,确保有基本的pattern
+ if (not subdir_task.get("pattern") or
+ subdir_task.get("use_sequence_naming") or
+ subdir_task.get("use_episode_naming")):
+ subdir_task["pattern"] = ".*"
+ subdir_task["replace"] = ""
+ # 取消顺序命名和剧集命名模式,强制使用正则模式
+ subdir_task["use_sequence_naming"] = False
+ subdir_task["use_episode_naming"] = False
+
subdir_tree = self.dir_check_and_save(
- task,
+ subdir_task,
pwd_id,
stoken,
share_file["fid"],
@@ -1474,30 +1490,58 @@ class Quark:
# 检查文件是否已存在(通过大小和扩展名)- 新增的文件查重逻辑
is_duplicate = False
if not share_file["dir"]: # 文件夹不进行内容查重
- file_size = share_file.get("size", 0)
- file_ext = os.path.splitext(share_file["file_name"])[1].lower()
- share_update_time = share_file.get("last_update_at", 0) or share_file.get("updated_at", 0)
+ # 新的查重逻辑:优先使用文件名查重,支持忽略后缀
+ original_file_name = share_file["file_name"]
+ original_name_base = os.path.splitext(original_file_name)[0]
- # 检查是否已存在相同大小和扩展名的文件
- key = f"{file_size}_{file_ext}"
- if key in dir_files_map:
- for existing_file in dir_files_map[key]:
- existing_update_time = existing_file.get("updated_at", 0)
+ # 判断是否用正则替换后的文件名
+ if task.get("pattern") and task.get("replace") is not None:
+ pattern, replace = self.magic_regex_func(
+ task.get("pattern", ""), task.get("replace", ""), task.get("taskname", "")
+ )
+ # 确保pattern不为空,避免正则表达式错误
+ if pattern:
+ try:
+ # 尝试应用正则替换
+ if re.search(pattern, original_file_name):
+ renamed_file = re.sub(pattern, replace, original_file_name)
+ renamed_base = os.path.splitext(renamed_file)[0]
+ else:
+ renamed_file = None
+ renamed_base = None
+ except Exception:
+ # 正则出错时使用原文件名
+ renamed_file = None
+ renamed_base = None
+ else:
+ renamed_file = None
+ renamed_base = None
+ else:
+ renamed_file = None
+ renamed_base = None
+
+ # 查重逻辑,同时考虑原文件名和重命名后的文件名
+ for dir_file in dir_file_list:
+ if dir_file["dir"]:
+ continue
+
+ if task.get("ignore_extension", False):
+ # 忽略后缀:只比较文件名部分,不管扩展名
+ existing_name_base = os.path.splitext(dir_file["file_name"])[0]
- # 防止除零错误
- if existing_update_time == 0:
- continue
-
- # 如果修改时间相近(30天内)或者差距不大(10%以内),认为是同一个文件
- time_diff = abs(share_update_time - existing_update_time)
- time_ratio = abs(1 - (share_update_time / existing_update_time)) if existing_update_time else 1
-
- if time_diff < 2592000 or time_ratio < 0.1:
- # 文件已存在,跳过处理
+ # 如果原文件名或重命名后文件名与目标目录中文件名相同(忽略后缀),则视为已存在
+ if (existing_name_base == original_name_base or
+ (renamed_file and existing_name_base == renamed_base)):
is_duplicate = True
- # print(f"跳过已存在的文件: {share_file['file_name']} (size={file_size}, time_diff={time_diff}s, ratio={time_ratio:.2f})")
break
-
+ else:
+ # 不忽略后缀:文件名和扩展名都要一致才视为同一个文件
+ if (dir_file["file_name"] == original_file_name or
+ (renamed_file and dir_file["file_name"] == renamed_file)):
+ is_duplicate = True
+ break
+
+
# 如果文件已经存在并且不是目录,跳过后续处理
if is_duplicate and not share_file["dir"]:
continue
@@ -1584,8 +1628,18 @@ class Quark:
if task.get("update_subdir", False):
if re.search(task["update_subdir"], share_file["file_name"]):
print(f"检查子文件夹: {savepath}/{share_file['file_name']}")
+
+ # 创建一个子任务对象,保留原任务的属性,但专门用于子目录处理
+ subdir_task = task.copy()
+ # 确保子目录也可以使用忽略后缀功能
+
+ # 如果原任务没有设置pattern,确保有基本的pattern
+ if not subdir_task.get("pattern"):
+ subdir_task["pattern"] = ".*"
+ subdir_task["replace"] = ""
+
subdir_tree = self.dir_check_and_save(
- task,
+ subdir_task,
pwd_id,
stoken,
share_file["fid"],
@@ -1600,7 +1654,7 @@ class Quark:
if node.data and not node.data.get("is_dir", False):
has_files = True
break
-
+
# 只有当子目录包含文件时才将其合并到主树中
if has_files:
# 获取保存路径的最后一部分目录名
@@ -2580,7 +2634,7 @@ def do_save(account, tasklist=[]):
if task.get("replace") is not None: # 显示替换规则,即使为空字符串
print(f"正则替换: {task['replace']}")
if task.get("update_subdir"):
- print(f"更子目录: {task['update_subdir']}")
+ print(f"更新目录: {task['update_subdir']}")
if task.get("runweek") or task.get("enddate"):
print(
f"运行周期: WK{task.get('runweek',[])} ~ {task.get('enddate','forever')}"