caption_extractor — 视频站字幕提取
给浏览器扩展加一个新视频站的字幕支持。宿主把已启用的提取器脚本发给扩展, 扩展在所有网页上运行,只有
match(url)命中的页面才抓字幕。
声明
json
{
"id": "example.caption.extractor",
"name": "示例:自定义视频站字幕提取",
"version": "1.0.0",
"target_app_version": "0.2",
"type": "caption_extractor",
"entrypoint": "extractor.js",
"enabled": false,
"tags": ["字幕", "示例"]
}entrypoint 指向一个 extractor.js。默认 enabled: false。
脚本骨架
javascript
// 复制本文件,改 id 和 match,即可为新的视频站提供字幕。
TransBoxExtractors.register({
id: "my_site",
match(url) { return /example\.com/.test(String(url || "")); },
videoId(url) { return new URL(url).pathname; },
// 方案 A:网站有整段时间轴文件时用
async fetchManifest(videoId, ctx) {
return {
src_lang: ctx.preferredLang || "en",
cues: [{ start: 0, end: 1.2, text: "Hello" }],
trackName: "my site",
};
},
// 方案 B:只有画面上的字幕、没有时间轴文件时用
collectLines(doc) {
return TransBoxCaptionHost.linesFromSelector(".player-caption");
},
});(fetchManifest 与 collectLines 二选一,或都提供。)
接口
| 成员 | 说明 |
|---|---|
id | 提取器标识(必填) |
match(url) | 命中该站才启用;返回 falsy 就不介入 |
videoId(url) | 从 URL 提取视频 ID(用于去重/切换检测) |
fetchManifest(videoId, ctx) | 返回 {src_lang, cues: [{start, end, text}], trackName};没有时间轴就返回 null |
collectLines(doc) | 返回当前画面可见的每一行;不写就继续用内置 YouTube / B站 选择器 |
ctx.preferredLang 是用户当前偏好的源语言。
可用全局对象
脚本在浏览器扩展的隔离世界执行,只能依赖这两个参数(不要依赖页面里的全局变量):
| 对象 | 方法 |
|---|---|
TransBoxExtractors | register({...}) |
TransBoxCaptionHost | cleanCaptionText(raw)、parseRawTimedText(raw, lang)、preferredLang()、linesFromSelector(css) |
生效方式
启用提取器后,刷新正在播放的页面;桌面端在握手时把脚本发给扩展。
字幕送到桌面端之后走的链路见 字幕与翻译。 终端用户侧的浏览器扩展说明见 浏览器原生字幕。
caption_bridge是网页字幕桥本体(插件community_web_caption_bridge, 插件 IDcommunity.caption.browser),走创意工坊、不打进官方安装包。 第三方不要再写第二个桥——要加网站就用本页的caption_extractor。
