Skip to content

实现 danmu 扩展 ​

协议见 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