增强文件排序逻辑支持上中下后的序号排序

- 支持中文数字序号:上(一)、上(二) 按 1、2 排序
- 支持阿拉伯数字序号:上1、上2 按数字排序
This commit is contained in:
x1ao4 2025-07-13 23:25:48 +08:00
parent 2fbfd393c1
commit e45a57aed1
2 changed files with 56 additions and 7 deletions

View File

@ -166,10 +166,38 @@ function sortFileByName(file) {
}
}
// 3. 上中下
if (/[上][集期话部篇]?|[集期话部篇]上/.test(filename)) segment_value = 1;
else if (/[中][集期话部篇]?|[集期话部篇]中/.test(filename)) segment_value = 2;
else if (/[下][集期话部篇]?|[集期话部篇]下/.test(filename)) segment_value = 3;
// 3. 上中下标记或其他细分 - 第三级排序键
let segment_base = 0; // 基础值:上=1, 中=2, 下=3
let sequence_number = 0; // 序号值:用于处理上中下后的数字或中文数字序号
if (/[上][集期话部篇]?|[集期话部篇]上/.test(filename)) {
segment_base = 1;
} else if (/[中][集期话部篇]?|[集期话部篇]中/.test(filename)) {
segment_base = 2;
} else if (/[下][集期话部篇]?|[集期话部篇]下/.test(filename)) {
segment_base = 3;
}
// 当有上中下标记时,进一步提取后续的序号
if (segment_base > 0) {
// 提取上中下后的中文数字序号,如:上(一)、上(二)
let chinese_seq_match = filename.match(/[上中下][集期话部篇]?[(]([一二三四五六七八九十百千万零两]+)[)]/);
if (chinese_seq_match) {
let arabic_num = chineseToArabic(chinese_seq_match[1]);
if (arabic_num !== null) {
sequence_number = arabic_num;
}
} else {
// 提取上中下后的阿拉伯数字序号上1、上2
let arabic_seq_match = filename.match(/[上中下][集期话部篇]?(\d+)/);
if (arabic_seq_match) {
sequence_number = parseInt(arabic_seq_match[1]);
}
}
}
// 组合segment_value基础值*1000 + 序号值,确保排序正确
segment_value = segment_base * 1000 + sequence_number;
return [date_value, episode_value, segment_value, update_time, pinyin_sort_key];
}

View File

@ -227,12 +227,33 @@ def sort_file_by_name(file):
episode_value = int(any_num_match.group(1))
# 3. 提取上中下标记或其他细分 - 第三级排序键
segment_base = 0 # 基础值:上=1, 中=2, 下=3
sequence_number = 0 # 序号值:用于处理上中下后的数字或中文数字序号
if re.search(r'上[集期话部篇]?|[集期话部篇]上', filename):
segment_value = 1
segment_base = 1
elif re.search(r'中[集期话部篇]?|[集期话部篇]中', filename):
segment_value = 2
segment_base = 2
elif re.search(r'下[集期话部篇]?|[集期话部篇]下', filename):
segment_value = 3
segment_base = 3
# 当有上中下标记时,进一步提取后续的序号
if segment_base > 0:
# 提取上中下后的中文数字序号,如:上(一)、上(二)
chinese_seq_match = re.search(r'[上中下][集期话部篇]?[(]([一二三四五六七八九十百千万零两]+)[)]', filename)
if chinese_seq_match:
chinese_num = chinese_seq_match.group(1)
arabic_num = chinese_to_arabic(chinese_num)
if arabic_num is not None:
sequence_number = arabic_num
else:
# 提取上中下后的阿拉伯数字序号上1、上2
arabic_seq_match = re.search(r'[上中下][集期话部篇]?(\d+)', filename)
if arabic_seq_match:
sequence_number = int(arabic_seq_match.group(1))
# 组合segment_value基础值*1000 + 序号值,确保排序正确
segment_value = segment_base * 1000 + sequence_number
# 返回多级排序元组,加入更新时间作为第四级排序键,拼音排序作为第五级排序键
return (date_value, episode_value, segment_value, update_time, pinyin_sort_key)