Skip to content

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 是用户当前偏好的源语言。


可用全局对象 ​

脚本在浏览器扩展的隔离世界执行,只能依赖这两个参数(不要依赖页面里的全局变量):

对象方法
TransBoxExtractorsregister({...})
TransBoxCaptionHostcleanCaptionText(raw)、parseRawTimedText(raw, lang)、preferredLang()、linesFromSelector(css)

生效方式 ​

启用提取器后,刷新正在播放的页面;桌面端在握手时把脚本发给扩展。

字幕送到桌面端之后走的链路见 字幕与翻译。 终端用户侧的浏览器扩展说明见 浏览器原生字幕。

caption_bridge 是网页字幕桥本体(插件 community_web_caption_bridge, 插件 ID community.caption.browser),走创意工坊、不打进官方安装包。 第三方不要再写第二个桥——要加网站就用本页的 caption_extractor。


相关 ​

TransBox - 赋能全人类无界限跨语言交流