插件更新
SPlayer-Next 的插件更新走「宿主检查版本 + 用户一键应用」:插件在脚本头声明 @updateUrl(指向新版 raw .js),宿主拉取它读出 @version 与本地比对,发现新版就在卡片上提示;用户点「更新」后宿主原地覆盖旧脚本,并保留启用状态、设置与数据。
是否有新版由宿主判断,脚本不需要自己写版本比较逻辑。
工作流程
脚本声明 @updateUrl + @version (+ @changelog)
→ 宿主拉 @updateUrl 的新版脚本,读其 @version
→ 比本地新 → 卡片显示「有更新 v1.1.0」+ @changelog
→ 用户点「更新」 → 宿主拉同一地址原地覆盖 → 重启- 何时检查:应用启动时静默查一遍;用户也可在 设置 → 插件管理 的每张卡片上点「检查更新」手动查。
- 应用是手动的:宿主只提示,不会自动替换脚本,由用户决定何时更新。
- 没声明
@updateUrl的插件不会被检查,卡片上也不显示「检查更新」。
声明更新信息
在脚本头部加三个字段(其中只有 @updateUrl 是检查更新的前提):
/**
* @name ClassIsland 联动
* @id imsyy.classisland
* @version 1.1.0
* @updateUrl https://raw.githubusercontent.com/you/repo/main/ClassIsland.js
* @changelog 修复端口占用导致的崩溃\n新增显示专辑名
*/| 字段 | 说明 |
|---|---|
@updateUrl | 新版 raw .js 地址(仅 https://,本地调试放行 http://localhost)。宿主拉它读 @version 比对,也用它作一键更新的下载源 |
@version | 版本号,宿主按 主.次.修 逐段数字比较;发新版只需把它往上 bump |
@changelog | 更新说明,显示在卡片提示里;单行头里用字面 \n 断行 |
把 @updateUrl 指向稳定地址
@updateUrl 应指向一个长期不变的 raw 地址(如 GitHub raw 的 main 分支文件),里面始终放最新版脚本。宿主每次都拉这个地址读最新 @version。
changelog 取的是新版那份
卡片上显示的 @changelog 来自 @updateUrl 拉回来的新版脚本,不是你本地已装的那份。所以发版时把更新说明写进新版脚本头即可。
lx 脚本:updateAlert(兼容)
lx 音源脚本没有 @updateUrl 这套,沿用其原生事件在运行时自报,宿主识别为同一套更新提示:
lx.send(lx.EVENT_NAMES.updateAlert, {
log: "修复了若干问题",
updateUrl: "https://example.com/lx-source.js",
});lx 的 updateAlert 只有 log 与 updateUrl、没有版本号,因此卡片上只显示「有更新」而不带具体版本。其 updateUrl 多指向介绍页而非 raw .js,这种情况下一键更新会回退为打开该地址,需用户手动下载并重新导入。
一键更新
用户点「更新」后,宿主会:
- 拉取
@updateUrl(要求是可访问的 raw.js); - 解析校验后原地覆盖该插件,并保留启用状态、用户设置、插件私有存储(
splayer.storage)与优先级; - 重启插件进程,清除更新提示。
身份与类型不可变
一键更新要求新版的身份(@id,未声明时由名称推导)与类型(@type)保持不变——若新版换了身份或从 source 变成 control,更新会被拒绝,需用户手动重新导入。发布新版时只改 @version / @changelog / 脚本内容,别动 @id(未声明 ID 时也别动 @name)。
若一键更新失败(网络问题、@updateUrl 不是合法脚本、身份/类型变更等),插件保持旧版可用;卡片上的「查看更新」外链按钮仍可手动打开 @updateUrl。
与「重新导入」的关系
插件身份只取决于 @id(未声明时由名称推导)、与源码内容无关,所以手动重新导入同一身份的脚本也会原地替换旧版,不会产生重复条目。@updateUrl 检查只是把「有新版」这件事主动提示给用户,省去自己去比对版本。