diff --git a/README.md b/README.md index 87efe3a..f644469 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,7 @@ - **任务视图**:支持在任务列表页面使用列表视图和海报视图两种视图浏览和管理任务,海报视图将通过 TMDB 与任务对应的电视节目进行匹配,并显示对应的节目海报。 - **任务匹配**:在配置了 TMDB API 密钥后,所有任务将自动通过 TMDB 进行元数据匹配,匹配后将获取电视节目的海报和元数据,丰富任务相关信息的展示,包括集数信息统计、当前任务进度和电视节目状态等。 - **追剧日历**:支持在追剧日历页面查看和浏览任务对应电视节目的信息和播出时间表,追踪电视节目的播出情况,了解任务的完成进度。追剧日历支持海报视图和日历视图两种视图,可方便快捷的了解订阅内容的实时状态。 +- **字幕命名规则**:支持在全局设置字幕文件的语言代码后缀,在重命名字幕文件时自动添加语言代码后缀,如 `.zh.srt`、`.zh.ass` 等。 本项目修改后的版本为个人需求定制版,目的是满足我自己的使用需求,某些(我不用的)功能可能会因为修改而出现 BUG,不一定会被修复。若你要使用本项目,请知晓本人不是程序员,我无法保证本项目的稳定性,如果你在使用过程中发现了 BUG,可以在 Issues 中提交,但不保证每个 BUG 都能被修复,请谨慎使用,风险自担。 diff --git a/app/run.py b/app/run.py index d46dd9a..dca39f0 100644 --- a/app/run.py +++ b/app/run.py @@ -44,7 +44,7 @@ from quark_auto_save import Config, format_bytes # 添加导入全局extract_episode_number和sort_file_by_name函数 sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) -from quark_auto_save import extract_episode_number, sort_file_by_name, chinese_to_arabic, is_date_format +from quark_auto_save import extract_episode_number, sort_file_by_name, chinese_to_arabic, is_date_format, apply_subtitle_naming_rule # 导入豆瓣服务 from sdk.douban_service import douban_service @@ -2105,6 +2105,9 @@ def get_share_detail(): else: # 替换所有的{}为当前序号 file["file_name_re"] = sequence_pattern.replace("{}", f"{current_sequence:02d}") + file_ext + + # 应用字幕命名规则 + file["file_name_re"] = apply_subtitle_naming_rule(file["file_name_re"], config_data["task_settings"]) current_sequence += 1 return share_detail @@ -2143,6 +2146,8 @@ def get_share_detail(): if episode_num is not None: file["file_name_re"] = episode_pattern.replace("[]", f"{episode_num:02d}") + extension + # 应用字幕命名规则 + file["file_name_re"] = apply_subtitle_naming_rule(file["file_name_re"], config_data["task_settings"]) # 添加episode_number字段用于前端排序 file["episode_number"] = episode_num else: @@ -2177,6 +2182,8 @@ def get_share_detail(): item["file_name_re"] = ( re.sub(pattern, replace, file_name) if replace != "" else file_name ) + # 应用字幕命名规则 + item["file_name_re"] = apply_subtitle_naming_rule(item["file_name_re"], config_data["task_settings"]) return share_detail share_detail = preview_regex(share_detail) @@ -3383,6 +3390,8 @@ def preview_rename(): for file in filtered_files: extension = os.path.splitext(file["file_name"])[1] if not file["dir"] else "" new_name = pattern.replace("{}", f"{sequence:02d}") + extension + # 应用字幕命名规则 + new_name = apply_subtitle_naming_rule(new_name, config_data["task_settings"]) preview_results.append({ "original_name": file["file_name"], "new_name": new_name, @@ -3420,6 +3429,8 @@ def preview_rename(): if episode_num is not None: new_name = pattern.replace("[]", f"{episode_num:02d}") + extension + # 应用字幕命名规则 + new_name = apply_subtitle_naming_rule(new_name, config_data["task_settings"]) preview_results.append({ "original_name": file["file_name"], "new_name": new_name, @@ -3439,10 +3450,14 @@ def preview_rename(): # 应用正则表达式 if replace: new_name = re.sub(pattern, replace, file["file_name"]) + # 应用字幕命名规则 + new_name = apply_subtitle_naming_rule(new_name, config_data["task_settings"]) else: # 如果没有提供替换表达式,则检查是否匹配 if re.search(pattern, file["file_name"]): new_name = file["file_name"] # 匹配但不替换 + # 应用字幕命名规则 + new_name = apply_subtitle_naming_rule(new_name, config_data["task_settings"]) else: new_name = "" # 表示不匹配 diff --git a/app/static/js/sort_file_by_name.js b/app/static/js/sort_file_by_name.js index f91ad94..5aeb666 100644 --- a/app/static/js/sort_file_by_name.js +++ b/app/static/js/sort_file_by_name.js @@ -35,7 +35,7 @@ function sortFileByName(file) { try { const techSpecs = [ // 分辨率相关(限定常见p档) - /\b(?:240|360|480|540|720|900|960|1080|1440|2160|4320)[pP]\b/g, + /(?:240|360|480|540|720|900|960|1080|1440|2160|4320)[pP]/g, // 常见分辨率 WxH(白名单) /\b(?:640x360|640x480|720x480|720x576|854x480|960x540|1024x576|1280x720|1280x800|1280x960|1366x768|1440x900|1600x900|1920x1080|2560x1080|2560x1440|3440x1440|3840x1600|3840x2160|4096x2160|7680x4320)\b/g, /(? +
+
+
+ 字幕命名规则 +
+ +
+
+  添加语言代码 +
+
+
+
+
@@ -2831,7 +2845,9 @@ movie_naming_pattern: "^(.*)\\.([^.]+)", movie_naming_replace: "片名 (年份).\\2", tv_naming_rule: "剧名 - S季数E[]", - tv_ignore_extension: true + tv_ignore_extension: true, + subtitle_naming_rule: "zh", + subtitle_add_language_code: false }, source: { cloudsaver: { @@ -6935,6 +6951,8 @@ movie_naming_replace: "片名 (年份).\\2", tv_naming_rule: "剧名 - S季数E[]", tv_ignore_extension: true, + subtitle_naming_rule: "zh", + subtitle_add_language_code: false, auto_search_resources: "enabled" }; } @@ -6949,6 +6967,13 @@ if (config_data.task_settings.tv_ignore_extension === undefined) { config_data.task_settings.tv_ignore_extension = true; } + // 为字幕命名规则添加默认值(向后兼容) + if (config_data.task_settings.subtitle_naming_rule === undefined) { + config_data.task_settings.subtitle_naming_rule = "zh"; + } + if (config_data.task_settings.subtitle_add_language_code === undefined) { + config_data.task_settings.subtitle_add_language_code = false; + } // 确保自动搜索资源设置存在 if (!config_data.task_settings.auto_search_resources) { config_data.task_settings.auto_search_resources = "enabled"; diff --git a/quark_auto_save.py b/quark_auto_save.py index 84ba758..ea5203d 100644 --- a/quark_auto_save.py +++ b/quark_auto_save.py @@ -507,7 +507,7 @@ def extract_episode_number(filename, episode_patterns=None, config_data=None): filename_without_dates = file_name_without_ext tech_spec_patterns = [ # 分辨率相关(限定常见p档) - r'\b(?:240|360|480|540|720|900|960|1080|1440|2160|4320)[pP]\b', + r'(?:240|360|480|540|720|900|960|1080|1440|2160|4320)[pP]', # 常见分辨率 WxH(白名单) r'\b(?:640x360|640x480|720x480|720x576|854x480|960x540|1024x576|1280x720|1280x800|1280x960|1366x768|1440x900|1600x900|1920x1080|2560x1080|2560x1440|3440x1440|3840x1600|3840x2160|4096x2160|7680x4320)\b', r'(?