Appearance
实现 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 |