Files
UHD_Media_Tool/docs/plan/subtitles.md
T

3.8 KiB
Raw Blame History

补字幕(2026-10-03 定)

参考 MoviePilot 插件「海拉鲁字幕大师」(ifsherlock/MoviePilot-Plugins plugins.v3/subtitlemanualupload 1.2.6)。本项目只取手动上传和在线搜索;调轴、AI 翻译联动、入库后自动补字幕不做。自动补字幕以后接进我们自己的工作流(整理完成、订阅缺字幕、智能体调用),复用本模块的能力,不照插件的事件队列做。

拆分

层面 放在哪
字幕站的登记、代理、限流、健康、浏览器会话 复用站点体系:新站点类型「字幕站」(site.kind = subtitle),站点页单列一组,添加站点时选「字幕站」
解析、配对、写入、历史、在线搜索与下载 新模块 subtitles(server)+ packages/domain/src/subtitles(纯函数)+ packages/adapters/src/subtitles(SubHD / 字幕库)
入口 作品页「补字幕」:上传 / 在线搜索 → 预览配对 → 写入;同页看历史、撤销

写入规则(用户确认)

  • 写在视频同目录,视频主干名 + 语言后缀 + 扩展名;语言后缀沿用整理规则 sidecarLanguageSuffix(.chi.zh-cn / .zh-tw / .eng / .ja / .ko)。
  • 同名字幕已存在:先备份到数据目录(不在媒体库里留 .bak),再临时文件 + 改名原子写入。
  • 写入后登记为字幕资产(media_asset.kind = subtitle,位置 sidecar_of_location_id 指向视频),记一条历史;撤销 = 删掉写入的文件,有备份就还原。
  • 只写进作品在媒体库里的视频所在目录(媒体库根目录已启用);字幕和压缩包内容走 JSON(base64),服务端不留临时文件。

解析与配对(对照插件 matching/subtitle_language.py、upload/upload_session.py)

  • 支持 .srt .ass .ssa .vtt .sub .sbv 和 .zip(rar / 7z 先不做,插件也要依赖容器里的 unar)。
  • 语言:先看文件名标签(chs / cht / 简体 / 繁體 / eng / 双语 …),再看内容(CJK、假名、谚文、繁体常用字比例);中英双语按简中处理(与整理规则一致)。
  • 季集:用文件名解析(复用资源名解析器);电影只有一个目标。对不上的留空让人选;同一集多个字幕按语言区分,同语言重复的提示。

在线(SubHD、字幕库)

  • 搜索词:作品中文名、原名、年份,剧集带季号;结果按标题与季集匹配度排序,对不上的不列。
  • 验证码三层兜底:① 代码识别(SubHD SVG 路径长度表、字幕库 BMP 采样模板,插件里各 80 行左右);② 浏览器服务打开页面(与 PT 站过人机验证同一流程,可人工接管);③ 智能体视觉处理页面挑战。
  • 下载结果走与上传相同的解析 → 预览 → 写入。

分步

  1. 手动上传:解析、配对预览、写入、历史与撤销、作品页入口。(v0.3.22 完成)
  2. 字幕站类型 + SubHD / 字幕库搜索下载(第 ① 层验证码),站点页与添加站点;rar / 7z。(v0.3.24 完成;解压、页面解析、验证码都在沙箱里,见 ADR-005)
  3. 验证码第 ② ③ 层兜底:Cloudflare 挑战已由站点出口自动走浏览器;站点自己的验证码(云锁 / SubHD)识别失败时,目前提示去原站视图手动处理,智能体视觉处理待接。

实测记录(2026-10-03):字幕库搜索、验证码、下载、解压、配对全链路通;SubHD 搜索通,下载流程与单独实测一致,但当晚测试请求较多后 SubHD 对本机限流(直连与代理都超时),需要隔天复测。

复测(2026-10-03 晚):SubHD 按豆瓣 ID 搜索、prepare-download、下载全通,连续下载 7 个未触发验证码。验证码第 ② ③ 层先不做:第 ① 层失败时已提示去原站视图手动下载再上传,等实际出现识别失败再接。