Skip to content

插件更新

SPlayer-Next 的插件更新走「宿主检查版本 + 用户一键应用」:插件在脚本头声明 @updateUrl(指向新版 raw .js),宿主拉取它读出 @version 与本地比对,发现新版就在卡片上提示;用户点「更新」后宿主原地覆盖旧脚本,并保留启用状态、设置与数据。

是否有新版由宿主判断,脚本不需要自己写版本比较逻辑。

工作流程

脚本声明 @updateUrl + @version (+ @changelog)
  → 宿主拉 @updateUrl 的新版脚本,读其 @version
  → 比本地新 → 卡片显示「有更新 v1.1.0」+ @changelog
  → 用户点「更新」 → 宿主拉同一地址原地覆盖 → 重启
  • 何时检查:应用启动时静默查一遍;用户也可在 设置 → 插件管理 的每张卡片上点「检查更新」手动查。
  • 应用是手动的:宿主只提示,不会自动替换脚本,由用户决定何时更新。
  • 没声明 @updateUrl 的插件不会被检查,卡片上也不显示「检查更新」。

声明更新信息

在脚本头部加三个字段(其中只有 @updateUrl 是检查更新的前提):

js
/**
 * @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 这套,沿用其原生事件在运行时自报,宿主识别为同一套更新提示:

js
lx.send(lx.EVENT_NAMES.updateAlert, {
  log: "修复了若干问题",
  updateUrl: "https://example.com/lx-source.js",
});

lx 的 updateAlert 只有 logupdateUrl、没有版本号,因此卡片上只显示「有更新」而不带具体版本。其 updateUrl 多指向介绍页而非 raw .js,这种情况下一键更新会回退为打开该地址,需用户手动下载并重新导入。

一键更新

用户点「更新」后,宿主会:

  1. 拉取 @updateUrl(要求是可访问的 raw .js);
  2. 解析校验后原地覆盖该插件,并保留启用状态、用户设置、插件私有存储(splayer.storage)与优先级;
  3. 重启插件进程,清除更新提示。

身份与类型不可变

一键更新要求新版的身份(@id,未声明时由名称推导)与类型(@type)保持不变——若新版换了身份或从 source 变成 control,更新会被拒绝,需用户手动重新导入。发布新版时只改 @version / @changelog / 脚本内容,别动 @id(未声明 ID 时也别动 @name)。

若一键更新失败(网络问题、@updateUrl 不是合法脚本、身份/类型变更等),插件保持旧版可用;卡片上的「查看更新」外链按钮仍可手动打开 @updateUrl

与「重新导入」的关系

插件身份只取决于 @id(未声明时由名称推导)、与源码内容无关,所以手动重新导入同一身份的脚本也会原地替换旧版,不会产生重复条目。@updateUrl 检查只是把「有新版」这件事主动提示给用户,省去自己去比对版本。