Appearance
实现 danmu 扩展
弹幕服务由播放器独立调用,不应写入 widget / search / detail。播放器会调用每个已启用的 danmu 扩展,不检查 accepts,也不依赖条目的来源 widget。媒体库文件可能不包含 ref,此时应根据 title、季集信息和文件指纹进行匹配。
js
{
type: "danmu",
id: "main",
title: "Demo Danmu",
match: async function (ctx, input) {
var title = (input.title || input.fileName || "").toLowerCase();
if (title.indexOf("demo") === -1) {
return [];
}
return [{ id: "demo-1", title: input.title || "Demo", kind: "movie" }];
},
search: async function (ctx, input) {
var query = (input.query || "").toLowerCase();
if (query.indexOf("demo") === -1) {
return [];
}
return [{ id: "demo-1", title: input.query, kind: "movie" }];
},
comments: async function (ctx, input) {
return [
{ time: 1, text: "这条弹幕来自 danmu 扩展。", mode: "rtl" },
];
},
}match 用于播放开始时的自动匹配。输入包含标题、季集、文件名、文件大小和时长;用户启用本地 Hash 后,还会包含 fileHash。存在 TMDB ID 时,输入还会包含 ref。如果已确定具体剧集,应在匹配结果中提供 episode,宿主将不再调用 episodes。
search 仅在用户手动输入关键词时调用。如果剧集匹配结果不包含 episode,宿主会调用 episodes 供用户选择具体剧集,随后再调用 comments。电影类扩展可以省略 episodes。
请勿将弹幕服务与 widget 绑定。弹幕源账号等包级共享配置应通过 ctx.settings 提供,详见设置。
| 情况 | 做法 |
|---|---|
| 当前条目没有可用弹幕 | match、search 或 comments 返回 [];null 也会被统一转换为空数组 |
| 上游不可用 | throw ExtensionError |