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 个实体(& < > " ' ), 两者顺序不能反,否则<b>会被当成标签吞掉。 - ASS/SSA 额外:删
{...}覆盖块,\N/\n→ 换行,\h→ 空格。 - 清理后为空的条目跳过;一条不剩则
corrupt。 - 严格 UTF-8(可带 BOM):猜编码会把中文念成乱码,宁可报错让调用方先转码。
Structs§
- Subtitle
Parse Capability - 字幕解析后端(一个实现覆盖 srt/vtt/ass/ssa,靠
kind分派)。 - Subtitle
Plugin - 字幕插件:每条一页,页内一个 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 - 剥离
<...>标签;<后没有>时按普通字符保留(不吞掉半个文本)。