mirror of
https://github.com/Cp0204/quark-auto-save.git
synced 2026-01-13 15:50:45 +08:00
commit
ed8d90bb5c
@ -6,7 +6,7 @@
|
||||
- **剧集命名**:通过使用包含 `[]` 的表达式(如 `黑镜 - S06E[]`)自动切换为 `剧集命名` 模式,该模式将从原始文件名中提取剧集编号,然后把提取的编号代入对应文件名的 `[]` 中,实现自动按剧集编号命名。
|
||||
- **自动切换命名模式**:默认的命名模式依然为 `正则命名` 模式,现在会通过用户输入的 `匹配表达式` 自动实时判断和切换对应的模式。
|
||||
|
||||
本项目修改后的版本为个人需求定制版,代码是通过 AI 完成的,未经过充分测试(能发现的 BUG 我基本解决了,但可能存在未发现的 BUG),我会在后续的使用中继续完善功能。若你要使用本项目,请知晓本人不是程序员,我无法保证本项目的稳定性,如果你在使用过程中发现了 BUG,可以在 Issues 中提交,但不保证每个 BUG 都能被修复,请谨慎使用。
|
||||
本项目修改后的版本为个人需求定制版,代码是通过 AI 完成的,未经过充分测试(能发现的 BUG 我基本解决了,但可能存在未发现的 BUG),我会在后续的使用中继续完善功能。若你要使用本项目,请知晓本人不是程序员,我无法保证本项目的稳定性,如果你在使用过程中发现了 BUG,可以在 Issues 中提交,但不保证每个 BUG 都能被修复,请谨慎使用,风险自担。
|
||||
|
||||
夸克网盘签到、自动转存、命名整理、发推送提醒和刷新媒体库一条龙。
|
||||
对于一些持续更新的资源,隔段时间去转存十分麻烦。
|
||||
@ -28,8 +28,8 @@
|
||||
- 文件管理
|
||||
- [x] 目标目录不存在时自动新建
|
||||
- [x] 跳过已转存过的文件
|
||||
- [x] 正则过滤要转存的文件名
|
||||
- [x] 转存后文件名整理(正则替换)
|
||||
- [x] **过滤不需要转存的文件或文件夹**
|
||||
- [x] 转存后文件名整理(正则命名、**顺序命名**、**剧集命名**)
|
||||
- [x] 可选忽略文件后缀
|
||||
|
||||
- 任务管理
|
||||
@ -40,7 +40,7 @@
|
||||
- 媒体库整合
|
||||
- [x] 根据任务名搜索 Emby 媒体库
|
||||
- [x] 追更或整理后自动刷新 Emby 媒体库
|
||||
- [x] **媒体库模块化,用户可很方便地[开发自己的媒体库hook模块](./plugins)**
|
||||
- [x] 媒体库模块化,用户可很方便地[开发自己的媒体库hook模块](./plugins)
|
||||
|
||||
- 其它
|
||||
- [x] 每日签到领空间 <sup>[?](https://github.com/x1ao4/quark-auto-save-x/wiki/使用技巧集锦#每日签到领空间)</sup>
|
||||
|
||||
339
app/run.py
339
app/run.py
@ -31,6 +31,10 @@ sys.path.insert(0, parent_dir)
|
||||
from quark_auto_save import Quark
|
||||
from quark_auto_save import Config
|
||||
|
||||
# 添加导入全局extract_episode_number函数
|
||||
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
from quark_auto_save import extract_episode_number
|
||||
|
||||
|
||||
def get_app_ver():
|
||||
BUILD_SHA = os.environ.get("BUILD_SHA", "")
|
||||
@ -322,6 +326,140 @@ def get_share_detail():
|
||||
else:
|
||||
regex_pattern = re.escape(sequence_pattern).replace('\\{\\}', '(\\d+)')
|
||||
|
||||
# 实现与实际重命名相同的排序算法
|
||||
def extract_sort_value(file):
|
||||
if file["dir"]: # 跳过文件夹
|
||||
return float('inf')
|
||||
|
||||
file_name = file["file_name"]
|
||||
|
||||
# 1. 首先尝试提取SxxExx格式(如S01E01)
|
||||
match_s_e = re.search(r'[Ss](\d+)[Ee](\d+)', file_name)
|
||||
if match_s_e:
|
||||
season = int(match_s_e.group(1))
|
||||
episode = int(match_s_e.group(2))
|
||||
return season * 1000 + episode
|
||||
|
||||
# 2. 尝试提取E01/EP01格式
|
||||
match_e = re.search(r'[Ee][Pp]?(\d+)', file_name)
|
||||
if match_e:
|
||||
return int(match_e.group(1))
|
||||
|
||||
# 3. 首先尝试提取期数(第X期)
|
||||
period_match = re.search(r'第(\d+)期[上中下]', file_name)
|
||||
if period_match:
|
||||
period_num = int(period_match.group(1))
|
||||
# 根据上中下调整排序
|
||||
if '上' in file_name:
|
||||
return period_num * 3 - 2
|
||||
elif '中' in file_name:
|
||||
return period_num * 3 - 1
|
||||
elif '下' in file_name:
|
||||
return period_num * 3
|
||||
return period_num * 3
|
||||
|
||||
# 4. 尝试提取日期格式(YYYY-MM-DD)
|
||||
date_match = re.search(r'(\d{4})-(\d{2})-(\d{2})', file_name)
|
||||
if date_match:
|
||||
year = int(date_match.group(1))
|
||||
month = int(date_match.group(2))
|
||||
day = int(date_match.group(3))
|
||||
base_value = year * 10000 + month * 100 + day
|
||||
# 如果同一天有多个文件,根据"上中下"或其他标识符进行排序
|
||||
if '上' in file_name:
|
||||
return base_value * 10 + 1
|
||||
elif '中' in file_name:
|
||||
return base_value * 10 + 2
|
||||
elif '下' in file_name:
|
||||
return base_value * 10 + 3
|
||||
return base_value * 10
|
||||
|
||||
# 5. 尝试提取任何数字
|
||||
number_match = re.search(r'(\d+)', file_name)
|
||||
if number_match:
|
||||
return int(number_match.group(1))
|
||||
|
||||
# 6. 默认使用原文件名
|
||||
return float('inf')
|
||||
|
||||
# 过滤出非目录文件,并且排除已经符合命名规则的文件
|
||||
files_to_process = []
|
||||
for f in share_detail["list"]:
|
||||
if f["dir"]:
|
||||
continue # 跳过目录
|
||||
|
||||
# 检查文件是否已符合命名规则
|
||||
if sequence_pattern == "{}":
|
||||
# 对于单独的{},检查文件名是否为纯数字
|
||||
file_name_without_ext = os.path.splitext(f["file_name"])[0]
|
||||
if file_name_without_ext.isdigit():
|
||||
# 增加判断:如果是日期格式的纯数字,不视为已命名
|
||||
if not is_date_format(file_name_without_ext):
|
||||
continue # 跳过已符合命名规则的文件
|
||||
elif re.match(regex_pattern, f["file_name"]):
|
||||
continue # 跳过已符合命名规则的文件
|
||||
|
||||
# 添加到待处理文件列表
|
||||
files_to_process.append(f)
|
||||
|
||||
# 根据提取的排序值进行排序
|
||||
sorted_files = sorted(files_to_process, key=extract_sort_value)
|
||||
|
||||
# 应用过滤词过滤
|
||||
filterwords = regex.get("filterwords", "")
|
||||
if filterwords:
|
||||
# 同时支持中英文逗号分隔
|
||||
filterwords = filterwords.replace(",", ",")
|
||||
filterwords_list = [word.strip() for word in filterwords.split(',')]
|
||||
for item in sorted_files:
|
||||
# 被过滤的文件不会有file_name_re,与不匹配正则的文件显示一致
|
||||
if any(word in item['file_name'] for word in filterwords_list):
|
||||
item["filtered"] = True
|
||||
|
||||
# 为每个文件分配序号
|
||||
for file in sorted_files:
|
||||
if not file.get("filtered"):
|
||||
# 获取文件扩展名
|
||||
file_ext = os.path.splitext(file["file_name"])[1]
|
||||
# 生成预览文件名
|
||||
if sequence_pattern == "{}":
|
||||
# 对于单独的{},直接使用数字序号作为文件名
|
||||
file["file_name_re"] = f"{current_sequence:02d}{file_ext}"
|
||||
else:
|
||||
# 替换所有的{}为当前序号
|
||||
file["file_name_re"] = sequence_pattern.replace("{}", f"{current_sequence:02d}") + file_ext
|
||||
current_sequence += 1
|
||||
|
||||
return share_detail
|
||||
elif regex.get("use_episode_naming") and regex.get("episode_naming"):
|
||||
# 剧集命名模式预览
|
||||
episode_pattern = regex.get("episode_naming")
|
||||
episode_patterns = regex.get("episode_patterns", [])
|
||||
|
||||
# 调用全局的集编号提取函数
|
||||
def extract_episode_number_local(filename):
|
||||
return extract_episode_number(filename, episode_patterns=episode_patterns)
|
||||
|
||||
# 构建剧集命名的正则表达式 (主要用于检测已命名文件)
|
||||
if episode_pattern == "[]":
|
||||
# 对于单独的[],使用特殊匹配
|
||||
regex_pattern = "^(\\d+)$" # 匹配纯数字文件名
|
||||
elif "[]" in episode_pattern:
|
||||
# 特殊处理E[]、EP[]等常见格式,使用更宽松的匹配方式
|
||||
if episode_pattern == "E[]":
|
||||
# 对于E[]格式,只检查文件名中是否包含形如E01的部分
|
||||
regex_pattern = "^E(\\d+)$" # 只匹配纯E+数字的文件名格式
|
||||
elif episode_pattern == "EP[]":
|
||||
# 对于EP[]格式,只检查文件名中是否包含形如EP01的部分
|
||||
regex_pattern = "^EP(\\d+)$" # 只匹配纯EP+数字的文件名格式
|
||||
else:
|
||||
# 对于其他带[]的格式,使用常规转义和替换
|
||||
regex_pattern = re.escape(episode_pattern).replace('\\[\\]', '(\\d+)')
|
||||
else:
|
||||
# 如果输入模式不包含[],则使用简单匹配模式,避免正则表达式错误
|
||||
print(f"⚠️ 剧集命名模式中没有找到 [] 占位符,将使用简单匹配")
|
||||
regex_pattern = "^" + re.escape(episode_pattern) + "(\\d+)$"
|
||||
|
||||
# 实现高级排序算法
|
||||
def extract_sorting_value(file):
|
||||
if file["dir"]: # 跳过文件夹
|
||||
@ -329,107 +467,12 @@ def get_share_detail():
|
||||
|
||||
filename = file["file_name"]
|
||||
|
||||
# 提取文件名,不含扩展名
|
||||
file_name_without_ext = os.path.splitext(filename)[0]
|
||||
# 尝试获取剧集序号
|
||||
episode_num = extract_episode_number_local(filename)
|
||||
if episode_num is not None:
|
||||
return episode_num
|
||||
|
||||
# 1. "第X期/集/话" 格式
|
||||
match_chinese = re.search(r'第(\d+)[期集话]', filename)
|
||||
episode_num = int(match_chinese.group(1)) if match_chinese else 0
|
||||
|
||||
# 5. 文件名含"上中下"(优先处理,因为可能与其他格式同时存在)
|
||||
if match_chinese:
|
||||
# 如果同时存在集数和上中下,则按照集数*10+位置排序
|
||||
if '上' in filename:
|
||||
return episode_num * 10 + 1
|
||||
elif '中' in filename:
|
||||
return episode_num * 10 + 2
|
||||
elif '下' in filename:
|
||||
return episode_num * 10 + 3
|
||||
elif '上' in filename:
|
||||
return 1
|
||||
elif '中' in filename:
|
||||
return 2
|
||||
elif '下' in filename:
|
||||
return 3
|
||||
|
||||
# 如果已经匹配到"第X期/集/话"格式,直接返回
|
||||
if episode_num > 0:
|
||||
return episode_num * 10
|
||||
|
||||
# 2.1 S01E01 格式,提取季数和集数
|
||||
match_s_e = re.search(r'[Ss](\d+)[Ee](\d+)', filename)
|
||||
if match_s_e:
|
||||
season = int(match_s_e.group(1))
|
||||
episode = int(match_s_e.group(2))
|
||||
return season * 1000 + episode
|
||||
|
||||
# 2.2 E01 格式,仅提取集数
|
||||
match_e = re.search(r'[Ee][Pp]?(\d+)', filename)
|
||||
if match_e:
|
||||
return int(match_e.group(1))
|
||||
|
||||
# 2.3 1x01 格式,提取季数和集数
|
||||
match_x = re.search(r'(\d+)[Xx](\d+)', filename)
|
||||
if match_x:
|
||||
season = int(match_x.group(1))
|
||||
episode = int(match_x.group(2))
|
||||
return season * 1000 + episode
|
||||
|
||||
# 3. 日期格式识别(支持多种格式)
|
||||
|
||||
# 3.1 完整的YYYYMMDD格式
|
||||
match_date_compact = re.search(r'(20\d{2})(\d{2})(\d{2})', filename)
|
||||
if match_date_compact:
|
||||
year = int(match_date_compact.group(1))
|
||||
month = int(match_date_compact.group(2))
|
||||
day = int(match_date_compact.group(3))
|
||||
return year * 10000 + month * 100 + day
|
||||
|
||||
# 3.2 YYYY-MM-DD 或 YYYY.MM.DD 或 YYYY/MM/DD 格式
|
||||
match_date_full = re.search(r'(20\d{2})[-./](\d{1,2})[-./](\d{1,2})', filename)
|
||||
if match_date_full:
|
||||
year = int(match_date_full.group(1))
|
||||
month = int(match_date_full.group(2))
|
||||
day = int(match_date_full.group(3))
|
||||
return year * 10000 + month * 100 + day
|
||||
|
||||
# 3.3 MM/DD/YYYY 或 DD/MM/YYYY 格式
|
||||
match_date_alt = re.search(r'(\d{1,2})[-./](\d{1,2})[-./](20\d{2})', filename)
|
||||
if match_date_alt:
|
||||
# 假设第一个是月,第二个是日(美式日期)
|
||||
month = int(match_date_alt.group(1))
|
||||
day = int(match_date_alt.group(2))
|
||||
year = int(match_date_alt.group(3))
|
||||
# 检查月份值,如果大于12可能是欧式日期格式(DD/MM/YYYY)
|
||||
if month > 12:
|
||||
month, day = day, month
|
||||
return year * 10000 + month * 100 + day
|
||||
|
||||
# 3.4 MM/DD 格式(无年份),假设为当前年
|
||||
match_date_short = re.search(r'(\d{1,2})[-./](\d{1,2})', filename)
|
||||
if match_date_short:
|
||||
# 假设第一个是月,第二个是日
|
||||
month = int(match_date_short.group(1))
|
||||
day = int(match_date_short.group(2))
|
||||
# 检查月份值,如果大于12可能是欧式日期格式(DD/MM)
|
||||
if month > 12:
|
||||
month, day = day, month
|
||||
# 由于没有年份,使用一个较低的基数,确保任何有年份的日期都排在后面
|
||||
return month * 100 + day
|
||||
|
||||
# 3.5 年期格式,如"2025年14期"
|
||||
match_year_issue = re.search(r'(20\d{2})[年].*?(\d+)[期]', filename)
|
||||
if match_year_issue:
|
||||
year = int(match_year_issue.group(1))
|
||||
issue = int(match_year_issue.group(2))
|
||||
return year * 1000 + issue
|
||||
|
||||
# 4. 纯数字格式(文件名开头是纯数字)
|
||||
match_num = re.match(r'^(\d+)', file_name_without_ext)
|
||||
if match_num:
|
||||
return int(match_num.group(1))
|
||||
|
||||
# 6. 默认使用更新时间
|
||||
# 如果无法提取序号,则使用更新时间
|
||||
try:
|
||||
return file.get("last_update_at", 0)
|
||||
except:
|
||||
@ -439,11 +482,11 @@ def get_share_detail():
|
||||
files_to_process = []
|
||||
for f in share_detail["list"]:
|
||||
if f["dir"]:
|
||||
continue # 跳过文件夹
|
||||
continue # 跳过目录
|
||||
|
||||
# 检查文件是否已符合命名规则
|
||||
if sequence_pattern == "{}":
|
||||
# 对于单独的{},检查文件名是否为纯数字
|
||||
if episode_pattern == "[]":
|
||||
# 对于单独的[],检查文件名是否为纯数字
|
||||
file_name_without_ext = os.path.splitext(f["file_name"])[0]
|
||||
if file_name_without_ext.isdigit():
|
||||
# 增加判断:如果是日期格式的纯数字,不视为已命名
|
||||
@ -458,94 +501,6 @@ def get_share_detail():
|
||||
# 根据提取的排序值进行排序
|
||||
sorted_files = sorted(files_to_process, key=extract_sorting_value)
|
||||
|
||||
# 应用过滤词过滤
|
||||
filterwords = regex.get("filterwords", "")
|
||||
if filterwords:
|
||||
# 同时支持中英文逗号分隔
|
||||
filterwords = filterwords.replace(",", ",")
|
||||
filterwords_list = [word.strip() for word in filterwords.split(',')]
|
||||
for item in sorted_files:
|
||||
# 被过滤的文件不会有file_name_re,与不匹配正则的文件显示一致
|
||||
if any(word in item['file_name'] for word in filterwords_list):
|
||||
item["filtered"] = True
|
||||
|
||||
# 为每个文件分配序号
|
||||
for file in sorted_files:
|
||||
if not file.get("filtered"):
|
||||
# 获取文件扩展名
|
||||
file_ext = os.path.splitext(file["file_name"])[1]
|
||||
# 生成预览文件名
|
||||
if sequence_pattern == "{}":
|
||||
# 对于单独的{},直接使用数字序号作为文件名
|
||||
file["file_name_re"] = f"{current_sequence:02d}{file_ext}"
|
||||
else:
|
||||
file["file_name_re"] = sequence_pattern.replace("{}", f"{current_sequence:02d}") + file_ext
|
||||
current_sequence += 1
|
||||
|
||||
return share_detail
|
||||
elif regex.get("use_episode_naming") and regex.get("episode_naming"):
|
||||
# 剧集命名模式预览
|
||||
episode_pattern = regex.get("episode_naming")
|
||||
episode_patterns = regex.get("episode_patterns", [])
|
||||
|
||||
# 实现序号提取函数
|
||||
def extract_episode_number(filename):
|
||||
# 优先匹配SxxExx格式
|
||||
match_s_e = re.search(r'[Ss](\d+)[Ee](\d+)', filename)
|
||||
if match_s_e:
|
||||
# 直接返回E后面的集数
|
||||
return int(match_s_e.group(2))
|
||||
|
||||
# 尝试使用每个配置的正则表达式匹配文件名
|
||||
for pattern in episode_patterns:
|
||||
try:
|
||||
pattern_regex = pattern.get("regex", "(\\d+)")
|
||||
match = re.search(pattern_regex, filename)
|
||||
if match:
|
||||
return int(match.group(1))
|
||||
except Exception as e:
|
||||
print(f"Error matching pattern {pattern}: {str(e)}")
|
||||
continue
|
||||
return None
|
||||
|
||||
# 构建剧集命名的正则表达式 (主要用于检测已命名文件)
|
||||
if episode_pattern == "[]":
|
||||
# 对于单独的[],使用特殊匹配
|
||||
regex_pattern = "^(\\d+)$" # 匹配纯数字文件名
|
||||
elif "[]" in episode_pattern:
|
||||
regex_pattern = re.escape(episode_pattern).replace('\\[\\]', '(\\d+)')
|
||||
else:
|
||||
# 如果输入模式不包含[],则使用简单匹配模式,避免正则表达式错误
|
||||
print(f"⚠️ 剧集命名模式中没有找到 [] 占位符,将使用简单匹配")
|
||||
regex_pattern = "^" + re.escape(episode_pattern) + "(\\d+)$"
|
||||
|
||||
# 实现高级排序算法
|
||||
def extract_sorting_value(file):
|
||||
if file["dir"]: # 跳过文件夹
|
||||
return float('inf')
|
||||
|
||||
filename = file["file_name"]
|
||||
|
||||
# 尝试获取剧集序号
|
||||
episode_num = extract_episode_number(filename)
|
||||
if episode_num is not None:
|
||||
return episode_num
|
||||
|
||||
# 如果无法提取序号,则使用更新时间
|
||||
try:
|
||||
return file.get("last_update_at", 0)
|
||||
except:
|
||||
return 0
|
||||
|
||||
# 过滤出非目录文件,并且排除已经符合命名规则的文件
|
||||
files_to_process = [
|
||||
f for f in share_detail["list"]
|
||||
if not f["dir"] and not re.match(regex_pattern, f["file_name"])
|
||||
]
|
||||
|
||||
# 根据提取的排序值进行排序
|
||||
sorted_files = sorted(files_to_process, key=extract_sorting_value)
|
||||
|
||||
# 应用过滤词过滤
|
||||
filterwords = regex.get("filterwords", "")
|
||||
if filterwords:
|
||||
@ -563,7 +518,7 @@ def get_share_detail():
|
||||
# 获取文件扩展名
|
||||
file_ext = os.path.splitext(file["file_name"])[1]
|
||||
# 尝试提取剧集号
|
||||
episode_num = extract_episode_number(file["file_name"])
|
||||
episode_num = extract_episode_number_local(file["file_name"])
|
||||
if episode_num is not None:
|
||||
# 生成预览文件名
|
||||
if episode_pattern == "[]":
|
||||
|
||||
@ -185,7 +185,7 @@
|
||||
<div class="input-group-prepend">
|
||||
<span class="input-group-text">集编号识别规则</span>
|
||||
</div>
|
||||
<input type="text" class="form-control" v-model="episodePatternsText" placeholder="输入用于识别集编号的正则表达式,多个表达式用竖线「|」分隔,如:第(\d+)集|[Ee][Pp]?(\d+)|(\d+)[-_\\s]*4[Kk]">
|
||||
<input type="text" class="form-control" v-model="episodePatternsText" placeholder="输入用于识别集编号的正则表达式,支持符号如|(竖线)等正则特殊字符">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -479,14 +479,18 @@
|
||||
<!-- 文件列表 -->
|
||||
<div class="mb-3" v-if="fileSelect.previewRegex">
|
||||
<div v-if="formData.tasklist[fileSelect.index].use_sequence_naming">
|
||||
<b>顺序命名格式:</b><span class="badge badge-info" v-html="formData.tasklist[fileSelect.index].pattern"></span>
|
||||
<b>顺序命名表达式:</b><span class="badge badge-info" v-html="formData.tasklist[fileSelect.index].pattern"></span>
|
||||
</div>
|
||||
<div v-else-if="formData.tasklist[fileSelect.index].use_episode_naming">
|
||||
<b>剧集命名格式:</b><span class="badge badge-info" v-html="formData.tasklist[fileSelect.index].pattern"></span>
|
||||
<b>剧集命名表达式:</b><span class="badge badge-info" v-html="formData.tasklist[fileSelect.index].pattern"></span>
|
||||
</div>
|
||||
<div v-else>
|
||||
<b>匹配表达式:</b><span class="badge badge-info" v-html="formData.tasklist[fileSelect.index].pattern"></span>
|
||||
<b>替换表达式:</b><span class="badge badge-info" v-html="formData.tasklist[fileSelect.index].replace"></span>
|
||||
<div style="margin-bottom: 0;">
|
||||
<b>匹配表达式:</b><span class="badge badge-info" v-html="formData.tasklist[fileSelect.index].pattern"></span>
|
||||
</div>
|
||||
<div>
|
||||
<b>替换表达式:</b><span class="badge badge-info" v-html="formData.tasklist[fileSelect.index].replace"></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<table class="table table-hover table-sm">
|
||||
@ -603,11 +607,11 @@
|
||||
return this.formData.episode_patterns.map(p => p.regex || '').join('|');
|
||||
},
|
||||
set(value) {
|
||||
// 将文本拆分为竖线分隔的表达式,每个创建一个正则对象
|
||||
const patterns = value.split('|').filter(pattern => pattern.trim() !== '');
|
||||
this.formData.episode_patterns = patterns.map(pattern => ({
|
||||
regex: pattern.trim()
|
||||
}));
|
||||
// 允许直接输入正则表达式,当用户按下Enter键或失焦时再处理
|
||||
// 这里我们创建一个单一的正则表达式对象,而不是拆分
|
||||
this.formData.episode_patterns = [{
|
||||
regex: value.trim()
|
||||
}];
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -677,17 +681,7 @@
|
||||
// 如果没有剧集识别模式,添加默认模式
|
||||
if (!this.formData.episode_patterns || this.formData.episode_patterns.length === 0) {
|
||||
this.formData.episode_patterns = [
|
||||
{ name: 'EP_DIJI', description: '第[]集', regex: '第(\\d+)集' },
|
||||
{ name: 'EP_DIQI', description: '第[]期', regex: '第(\\d+)期' },
|
||||
{ name: 'EP_DIHUA', description: '第[]话', regex: '第(\\d+)话' },
|
||||
{ name: 'EP_JI', description: '[]集', regex: '(\\d+)集' },
|
||||
{ name: 'EP_QI', description: '[]期', regex: '(\\d+)期' },
|
||||
{ name: 'EP_HUA', description: '[]话', regex: '(\\d+)话' },
|
||||
{ name: 'EP_E_EP', description: 'E/EP[]', regex: '[Ee][Pp]?(\\d+)' },
|
||||
{ name: 'EP_4K', description: '[]-4K', regex: '(\\d+)[-_\\s]*4[Kk]' },
|
||||
{ name: 'EP_SQUAREBRACKET', description: '方括号数字', regex: '\\[(\\d+)\\]' },
|
||||
{ name: 'EP_BRACKET', description: '【[]】', regex: '【(\\d+)】' },
|
||||
{ name: 'EP_UNDERSCORE', description: '_[]_', regex: '_?(\\d+)_?' }
|
||||
{ regex: '第(\\d+)集|第(\\d+)期|第(\\d+)话|(\\d+)集|(\\d+)期|(\\d+)话|[Ee][Pp]?(\\d+)|(\\d+)[-_\\s]*4[Kk]|\\[(\\d+)\\]|【(\\d+)】|_?(\\d+)_?' }
|
||||
];
|
||||
}
|
||||
}, 500);
|
||||
|
||||
1007
quark_auto_save.py
1007
quark_auto_save.py
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user