Appearance
实现 playback 扩展
协议见 playback。播放按钮的显示条件见用户指南 · 播放。
同包导出
widget / search 仅生成 ListItem,不应返回播放 URL。应在同一包中提供 playback 扩展,并通过 accepts 声明支持的条目 source:
js
{
type: "playback",
id: "main",
title: "Demo Playback",
accepts: { sources: ["url"] },
sources: async function (ctx, input) {
if (!input.ref || input.ref.id !== "demo-1") {
return [];
}
return [
{
id: "bipbop",
name: "BipBop",
url: "https://devstreaming-cdn.apple.com/videos/streaming/examples/img_bipbop_adv_example_fmp4/master.m3u8",
},
];
},
}sources 的输入为 { ref, instanceId?, params?, season?, episode? }。从 widget 实例进入时,App 会传入该实例的 instanceId 和 params。用户在详情页选择季、集后播放剧集时,输入中还会包含 season / episode。
空数组和抛错
| 情况 | 做法 |
|---|---|
| 当前条目没有可用线路 | 返回 [];null 也会被统一转换为空数组 |
| 上游服务不可用或参数无效 | 抛出 ExtensionError |
请勿将播放地址写入 ListItem 或 DetailItem。sources 默认不缓存。服务器配置应存放在来源实例的 input.params 中,而不是 ctx.settings 中。详见参数。