改进起始文件过滤逻辑,从修改日期判断升级为基于智能排序判断

- 将起始文件过滤从简单的"修改日期大于"改为基于文件名的智能排序判断
- 统一三种命名模式的文件排序逻辑,确保起始文件过滤的一致性和准确性
- 智能排序支持日期、期数、集数等多种格式的提取和排序
- 解决相同修改时间文件的排序问题,提高起始文件功能的可靠性
- 更新功能描述文案,从"修改日期大于"改为"比此文件更新"
- 保持向后兼容,仅影响设置了起始文件的任务
This commit is contained in:
x1ao4 2025-07-01 19:12:09 +08:00
parent 2e90f9fbac
commit 09d99a052d
2 changed files with 65 additions and 33 deletions

View File

@ -802,11 +802,11 @@
</div>
</div>
<div class="form-group row" title="只转存修改日期大于选中文件的文件,请在符合筛选条件的文件中进行选择,在更换分享链接时非常有用">
<div class="form-group row" title="只转存比选中文件更新的文件,请在符合筛选条件的文件中进行选择,在更换分享链接时非常有用">
<label class="col-sm-2 col-form-label">起始文件</label>
<div class="col-sm-10">
<div class="input-group">
<input type="text" class="form-control" placeholder="可选,只转存修改日期大于此文件的文件,请在符合筛选条件的文件中进行选择" name="startfid[]" v-model="task.startfid">
<input type="text" class="form-control" placeholder="可选,只转存比此文件更新的文件,请在符合筛选条件的文件中进行选择" name="startfid[]" v-model="task.startfid">
<div class="input-group-append" v-if="task.shareurl">
<button class="btn btn-outline-secondary" type="button" @click="fileSelect.selectDir=false;fileSelect.previewRegex=false;showShareSelect(index)" title="选择文件"><i class="bi bi-folder"></i></button>
</div>
@ -3249,8 +3249,8 @@
this.fileSelect.sortBy = "file_name_re";
this.fileSelect.sortOrder = "desc";
} else {
// 其他情况使用修改日期倒序排序
this.fileSelect.sortBy = "updated_at";
// 其他情况使用文件名倒序排序(使用全局文件排序函数)
this.fileSelect.sortBy = "file_name";
this.fileSelect.sortOrder = "desc";
}
if (this.getShareurl(this.fileSelect.shareurl) != this.getShareurl(this.formData.tasklist[index].shareurl)) {
@ -3969,14 +3969,12 @@
if (field === 'file_name') {
if (a.dir && !b.dir) return -1;
if (!a.dir && b.dir) return 1;
// 使用拼音排序
let aValue = pinyinPro.pinyin(a.file_name, { toneType: 'none', type: 'string' }).toLowerCase();
let bValue = pinyinPro.pinyin(b.file_name, { toneType: 'none', type: 'string' }).toLowerCase();
if (order === 'asc') {
return aValue > bValue ? 1 : -1;
} else {
return aValue < bValue ? 1 : -1;
// 使用智能排序函数
const ka = sortFileByName(a), kb = sortFileByName(b);
for (let i = 0; i < ka.length; ++i) {
if (ka[i] !== kb[i]) return order === 'asc' ? (ka[i] > kb[i] ? 1 : -1) : (ka[i] < kb[i] ? 1 : -1);
}
return 0;
}
if (field === 'file_name_re') {
const aHasValidRename = a.file_name_re && a.file_name_re !== '×' && !a.file_name_re.startsWith('×');

View File

@ -1686,26 +1686,30 @@ class Quark:
"dir_path": [] # 保存目录路径
}
# 对文件列表进行排序,使用全局文件排序函数的倒序排序
# 这样可以确保起始文件过滤逻辑正确工作
share_file_list.sort(key=sort_file_by_name, reverse=True)
# 应用过滤词过滤
if task.get("filterwords"):
# 记录过滤前的文件总数(包括文件夹)
original_total_count = len(share_file_list)
# 同时支持中英文逗号分隔
filterwords = task["filterwords"].replace("", ",")
filterwords_list = [word.strip().lower() for word in filterwords.split(',')]
# 改进过滤逻辑,同时检查文件名和扩展名
filtered_files = []
for file in share_file_list:
file_name = file['file_name'].lower()
# 提取文件扩展名(不带点)
file_ext = os.path.splitext(file_name)[1].lower().lstrip('.')
# 检查过滤词是否存在于文件名中,或者过滤词等于扩展名
if not any(word in file_name for word in filterwords_list) and not any(word == file_ext for word in filterwords_list):
filtered_files.append(file)
share_file_list = filtered_files
# 打印过滤信息(格式保持不变)
@ -1835,6 +1839,9 @@ class Quark:
# 预先过滤掉已经存在的文件(按大小和扩展名比对)
# 只保留文件,不保留文件夹
filtered_share_files = []
start_fid = task.get("startfid", "")
start_file_found = False
for share_file in share_file_list:
if share_file["dir"]:
# 顺序命名模式下未设置update_subdir时不处理文件夹
@ -1846,9 +1853,15 @@ class Quark:
# 文件ID已存在于记录中跳过处理
continue
# 指定文件开始订阅/到达指定文件(含)结束历遍
if share_file["fid"] == task.get("startfid", ""):
break
# 改进的起始文件过滤逻辑
if start_fid:
if share_file["fid"] == start_fid:
start_file_found = True
break # 找到起始文件,停止遍历
# 如果还没找到起始文件,继续添加到转存列表
else:
# 没有设置起始文件,处理所有文件
pass
file_size = share_file.get("size", 0)
file_ext = os.path.splitext(share_file["file_name"])[1].lower()
@ -1920,9 +1933,7 @@ class Quark:
# print(f"跳过已存在的文件: {save_name}")
pass
# 指定文件开始订阅/到达指定文件(含)结束历遍
if share_file["fid"] == task.get("startfid", ""):
break
# 这里不需要再次检查起始文件,因为在前面的过滤中已经处理了
# 处理子文件夹
for share_file in share_file_list:
@ -2030,7 +2041,7 @@ class Quark:
else:
# 正则命名模式
need_save_list = []
# 构建目标目录中所有文件的查重索引(按大小和修改时间)- 加入文件查重机制
dir_files_map = {}
for dir_file in dir_file_list:
@ -2038,7 +2049,7 @@ class Quark:
file_size = dir_file.get("size", 0)
file_ext = os.path.splitext(dir_file["file_name"])[1].lower()
update_time = dir_file.get("updated_at", 0)
# 创建大小+扩展名的索引,用于快速查重
key = f"{file_size}_{file_ext}"
if key not in dir_files_map:
@ -2047,7 +2058,21 @@ class Quark:
"file_name": dir_file["file_name"],
"updated_at": update_time,
})
# 应用起始文件过滤逻辑
start_fid = task.get("startfid", "")
if start_fid:
# 找到起始文件的索引
start_index = -1
for i, share_file in enumerate(share_file_list):
if share_file["fid"] == start_fid:
start_index = i
break
if start_index >= 0:
# 只处理起始文件之前的文件(不包括起始文件本身)
share_file_list = share_file_list[:start_index]
# 添加符合的
for share_file in share_file_list:
# 检查文件ID是否存在于转存记录中
@ -2055,10 +2080,6 @@ class Quark:
if file_id and self.check_file_exists_in_records(file_id, task):
# 文件ID已存在于记录中跳过处理
continue
# 指定文件开始订阅/到达指定文件(含)结束历遍
if share_file["fid"] == task.get("startfid", ""):
break
# 检查文件是否已存在(通过大小和扩展名)- 新增的文件查重逻辑
is_duplicate = False
@ -2746,25 +2767,38 @@ class Quark:
if not share_file_list:
print("分享为空,文件已被分享者删除")
return False, []
# 在剧集命名模式中,需要先对文件列表进行排序,然后再应用起始文件过滤
# 使用全局排序函数进行排序(倒序,最新的在前)
share_file_list = sorted(share_file_list, key=sort_file_by_name, reverse=True)
# 预先过滤分享文件列表,去除已存在的文件
filtered_share_files = []
start_fid = task.get("startfid", "")
start_file_found = False
for share_file in share_file_list:
if share_file["dir"]:
# 处理子目录
if task.get("update_subdir") and re.search(task["update_subdir"], share_file["file_name"]):
filtered_share_files.append(share_file)
continue
# 检查文件ID是否存在于转存记录中
file_id = share_file.get("fid", "")
if file_id and self.check_file_exists_in_records(file_id, task):
# 文件ID已存在于记录中跳过处理
continue
# 指定文件开始订阅/到达指定文件(含)结束历遍
if share_file["fid"] == task.get("startfid", ""):
break
# 改进的起始文件过滤逻辑
if start_fid:
if share_file["fid"] == start_fid:
start_file_found = True
break # 找到起始文件,停止遍历
# 如果还没找到起始文件,继续添加到转存列表
else:
# 没有设置起始文件,处理所有文件
pass
# 从共享文件中提取剧集号
episode_num = extract_episode_number_local(share_file["file_name"])