编写插件
插件让杨桃能读取某一种网站或服务器。 杨桃自带的 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.gitcd yonto-pluginsnpm ci --prefix tools/plugin-clinpm 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 不会覆盖已有的目录。
先要知道的一件事
Section titled “先要知道的一件事”插件既不在 Node.js 里运行,也不在浏览器里运行。
它跑在 QuickJS 上。
这是一个小型 JavaScript 引擎,电视上的杨桃和你电脑上的 yonto-plugin 用的是同一个。
所以在电脑上通过检查的插件,放到电视上也能正常运行。
运行环境里没有 URL、URLSearchParams、TextDecoder、Buffer、console、setTimeout 和 Intl。
需要和插件之外打交道的事,都通过全局对象 yonto 来做:yonto.fetch 发请求,yonto.log 写日志,yonto.store 做小型缓存,另外还有几个解析器。
完整的列表见插件参考。
接下来看哪里
Section titled “接下来看哪里”- 把你的视频博客搬上电视:从头到尾用一个 RSS 订阅源做出可用的插件,想弄清各部分怎么配合,这是最快的路。
- 插件参考讲清单、各个函数、
yonto全局对象、错误和限制。 - 测试和调试讲
lint、run、doctor和录制的测试数据。 - 发布和安全讲怎么分享插件、建仓库,以及观众安装时会看到什么。