跳转到内容

编写插件

插件让杨桃能读取某一种网站或服务器。 杨桃自带的 Jellyfin、Plex 和 Emby 插件,写法和你要写的这个完全一样。

一个插件就是一个 JavaScript 文件。 清单(manifest)写在文件开头的一段注释里,说明插件是谁、能访问哪些地方。 文件的其余部分导出几个函数:列出分类、列出分类下的标题、返回某个标题的详情,以及搜索。 杨桃调用这些函数,把返回的内容展示出来。

/* yonto-plugin
{ "kind": "content-source", "id": "video-blog", "name": "Video blog", "version": "1.0.0",
"contractVersion": 21, "provides": "source-type", "allowedHosts": [],
"configSchema": [{ "id": "feedUrl", "label": "Feed URL", "type": "url", "required": true }] }
*/
export default {
async getCategories() { /* … */ },
async getMediaList(categoryId, { page }) { /* … */ },
async getMediaDetail(id) { /* … */ },
async search(query) { /* … */ },
};
  • Node.js 20 或更高版本和 git,用来运行命令行工具 yonto-plugin。 它在你的电脑上检查、运行和诊断插件,不需要电视、模拟器或 Android SDK。
  • 一个文本编辑器。
  • 一个要读取的网站或服务器,并且你有权读取它。

这个工具在 GitHub 上的 kangzj/yonto-plugins 里,同一个仓库里还有插件接口,以及杨桃自己的 Jellyfin、Plex、Emby、苹果CMS 和 XPTV 插件,都采用 MIT 许可证。 从那里安装:

终端窗口
git clone https://github.com/kangzj/yonto-plugins.git
cd yonto-plugins
npm ci --prefix tools/plugin-cli
npm install -g ./tools/plugin-cli

之后用 yonto-plugin <command> 运行它。 大多数命令可以传入插件所在的目录,不传就用当前目录。 那个仓库里杨桃自己的插件就是现成的例子,大多数还带着录制数据,所以 yonto-plugin doctor plugins/jellyfin --replay 不需要服务器就能跑起来。

终端窗口
yonto-plugin init my-site

这会创建 my-site/。 里面的插件一开始就能通过 lint 和 doctor,不用改任何东西,就能先把整个流程走一遍。 用 --template 换一个模板,用 --name 给插件命名。

模板 它是什么
blank 默认模板。包含四个必需的函数,返回一个虚构的片名,不访问网络。
video-blog 教程里做的插件:读取博客的 RSS 订阅源,附带录制好的订阅源数据,doctor --replay 可以离线运行。

id 由 2 到 32 个小写字母、数字和连字符组成。 init 不会覆盖已有的目录。

插件既不在 Node.js 里运行,也不在浏览器里运行。 它跑在 QuickJS 上。 这是一个小型 JavaScript 引擎,电视上的杨桃和你电脑上的 yonto-plugin 用的是同一个。 所以在电脑上通过检查的插件,放到电视上也能正常运行。

运行环境里没有 URL、URLSearchParams、TextDecoder、Buffer、console、setTimeout 和 Intl。 需要和插件之外打交道的事,都通过全局对象 yonto 来做:yonto.fetch 发请求,yonto.log 写日志,yonto.store 做小型缓存,另外还有几个解析器。 完整的列表见插件参考。

  1. 把你的视频博客搬上电视:从头到尾用一个 RSS 订阅源做出可用的插件,想弄清各部分怎么配合,这是最快的路。
  2. 插件参考讲清单、各个函数、yonto 全局对象、错误和限制。
  3. 测试和调试讲 lint、run、doctor 和录制的测试数据。
  4. 发布和安全讲怎么分享插件、建仓库,以及观众安装时会看到什么。