Skip to content

实现 subtitle 扩展 ​

协议见 subtitle。用户侧行为见用户指南 · 字幕。

字幕服务由播放器独立调用,不应写入 widget / search / detail。播放器会调用每个已启用的字幕扩展,不检查 accepts,也不依赖条目的来源 widget。媒体库文件可能不包含 ref,此时应根据 title、季集信息和文件指纹进行匹配。

js
{
  type: "subtitle",
  id: "main",
  title: "Demo Subtitle",
  match: async function (ctx, input) {
    var title = (input.title || input.fileName || "").toLowerCase();
    if (title.indexOf("demo") === -1) {
      return [];
    }
    return [{ id: "en", title: "English", language: "en" }];
  },
  search: async function (ctx, input) {
    var query = (input.query || "").toLowerCase();
    if (query.indexOf("demo") === -1) {
      return [];
    }
    return [{ id: "en", title: "English", language: "en" }];
  },
  file: async function (ctx, input) {
    if (!input.hit || input.hit.id !== "en") {
      return null;
    }
    return { url: "bundle://demo.vtt", fileName: "demo.vtt" };
  },
}

match 用于播放开始时的自动匹配。输入包含标题、季集、文件名、文件大小和时长;用户启用本地 Hash 后,还会包含 fileHash。存在 TMDB ID 时,输入还会包含 ref。

search 仅在用户手动输入关键词时调用。用户选择结果后,宿主才会调用 file。url 必须指向单个字幕文件,支持 srt、ass、ssa、vtt、sub 和 sup。对于压缩包,扩展应在 file 中完成解压,不应将 ZIP 地址返回给宿主。

宿主会完整保存 hit。下次播放时,宿主可能直接使用该 hit 调用 file,而不再预先调用 match。

字幕服务账号等包级共享配置应通过 ctx.settings 提供,详见设置。

情况做法
当前条目没有可用字幕返回 [];null 也会被统一转换为空数组
该文件无法获取file 返回 null
上游不可用throw ExtensionError