Skip to main content

Module subtitle

Module subtitle 

Source
Expand description

字幕解析:srt / vtt / ass / ssa(零第三方依赖,语义对齐 Python plugins/subtitle.py)。

字幕不是纯文本:序号、--> 时间码、{\pos(..)} 覆盖块、VTT 内联标签都会污染下游 (TTS 会念出时间码),所以单独一个后端,而不是落到 txt。

约定(两载体逐字一致,见 FORMAT_TODO P3):

  • 一条字幕条目 = 一页:Page.name = 规范化时间轴 HH:MM:SS,mmm --> HH:MM:SS,mmm (VTT 的 .、ASS 的厘秒都归一到这里),文本是该页唯一的 Paragraph 块, 条目内换行保留为 \n。
  • 文本清理:先剥 <...> 标签,再解 6 个实体(&amp; &lt; &gt; &quot; &apos; &nbsp;), 两者顺序不能反,否则 &lt;b&gt; 会被当成标签吞掉。
  • ASS/SSA 额外:删 {...} 覆盖块,\N / \n → 换行,\h → 空格。
  • 清理后为空的条目跳过;一条不剩则 corrupt。
  • 严格 UTF-8(可带 BOM):猜编码会把中文念成乱码,宁可报错让调用方先转码。

Structs§

SubtitleParseCapability
字幕解析后端(一个实现覆盖 srt/vtt/ass/ssa,靠 kind 分派)。
SubtitlePlugin
字幕插件:每条一页,页内一个 Paragraph 块(与 Python SubtitlePlugin 同构)。

Constants§

FORMATS
支持的扩展名(ssa 与 ass 共用同一套事件表解析)。

Functions§

ass_text
ASS 文本:去覆盖块 → \N / \n 转换行 → \h 转空格。
clean_text
标签 → 实体 → 逐行去空白;保留条目内换行。
decode_entities
只解 6 个常见实体;& 后 10 个字符内找不到 ; 就按普通字符处理。
format_clock
毫秒 → HH:MM:SS,mmm(小时不截断,不足两位补零)。
parse_ass
ASS/SSA:只吃 [Events] 段的 Format: + Dialogue:(Comment: 跳过)。
parse_clock
[H:]MM:SS[.,]fff → 毫秒;无法解析返回 None。
parse_cues
解析成 [(规范化时间轴, 已清理文本)],空白条目丢弃;一条不剩 → corrupt。
parse_srt
SRT:组内首个含 --> 的行是时间轴,其后全是文本;无时间轴的组跳过。
parse_timeline
start --> end [settings] → (start_ms, end_ms);非法返回 None。
parse_vtt
VTT:首行必须 WEBVTT;NOTE / STYLE / REGION 块跳过;时间轴后可带设置。
read_subtitle
严格 UTF-8(可带 BOM)读取并归一换行;非法字节 → corrupt。
register_defaults
注册字幕后端与插件(无第三方依赖,始终编译)。
split_blocks
按空行分组;组内保留原始行(行尾空白去掉,组尾空行丢弃)。
strip_ass_overrides
删除 ASS 覆盖块 {...}({\pos(..)} / {\i1} 等)。
strip_tags
剥离 <...> 标签;< 后没有 > 时按普通字符保留(不吞掉半个文本)。