Skip to content

fix: 修复 nightly 通道无法获取更新 - #299

Merged
imsyy merged 2 commits into
SPlayer-Dev:devfrom
Yueby:dev
Sep 21, 2026
Merged

imsyy merged 2 commits into
SPlayer-Dev:devfrom
Yueby:dev

Conversation

@Yueby

@Yueby Yueby commented Sep 20, 2026

Copy link
Copy Markdown
Contributor

改动类型

  • 新功能(feat)
  • 缺陷修复(fix)
  • 重构 / 优化(不改变对外行为)
  • 文档(docs)
  • 其他(请在「改动说明」中注明)

是否包含破坏性变更

  • 是(请在「改动说明」中详细描述)
  • 否

改动说明

修复 nightly 通道完全无法获取更新的问题,共两个独立缺陷。

1. config:set 拒绝写入 nightly 通道

electron/main/ipc/config.ts 中 update.channel 的校验白名单只有 stable / beta / alpha,漏了 nightly,导致任何用户都无法把通道切换到 nightly:UI 能选、能弹确认,但保存时主进程抛 无效的更新通道: nightly,settings.json 保持原值。

同时 shared/types/settings.ts、src/settings/categories/general.ts(UI 选项)都包含 nightly,三处名单各写一份是这次漏洞的直接原因。改为共享同一份运行时常量:

export const UPDATE_CHANNELS = ["stable", "beta", "alpha", "nightly"] as const;
export type UpdateChannel = (typeof UPDATE_CHANNELS)[number];

校验与 UI 选项均由它派生,类型与运行时名单不会再分叉。

2. nightly 走到检查阶段后必然失败

nightly 发布在固定滚动 tag nightly 上,而 electron-updater 的 GitHubProvider.getLatestVersion() 要求 release tag 是合法 semver:

if (!semver.valid(hrefTag)) continue;   // "nightly" 不是 semver → 整个 release 被跳过

循环结束后 tag == null,抛出 ERR_UPDATER_NO_PUBLISHED_VERSIONS;该错误被 runCheck() 的 .catch(() => {}) 吞掉,界面上表现为「点了检查更新毫无反应」。

改法是让 nightly 通道使用 generic provider 直达固定资源目录,其余通道不变:

autoUpdater.setFeedURL(
  channel === "nightly"
    ? { provider: "generic", url: NIGHTLY_FEED_URL }
    : { provider: "github", ...GITHUB_REPO },
);

GenericProvider.getLatestVersion() 只请求 <channel>.yml,不遍历 release tag;平台后缀(-mac / -linux / -linux-arm64)由 getChannelName() 自动拼接,nightly release 中这四个清单均已存在。发布流程与工作流无需改动。

顺带修正 openDownloadPage():nightly 发布在固定 tag 上,无法用版本号拼出 /tag/v<version> 形式的链接。

验证

类型与测试:pnpm typecheck 通过;pnpm test:node 35/35 通过;改动文件 prettier 无差异。

四通道实测(Windows 11 / x64 / dev 模式,dev 实例走 .bashrc 注入,逐一切换通道):

通道 结果
stable latest version: 1.1.0
beta latest version: 1.1.0(beta.yml 是 stable 的别名)
alpha latest version: 1.2.0-alpha.1
nightly Found version 1.2.0-nightly.872

全程无 error 级日志;通道切换前 nightly 稳定复现 No published versions on GitHub,修复后消失。

下载全流程实测:

Found version 1.2.0-nightly.872 (url: ...arm64-setup.exe, ...x64-setup.exe)
Downloading update from ...
Cached update sha512 checksum doesn't match the latest available update. ... will be cleaned
Download block maps (old: ...beta.1-x64-setup.exe.blockmap, new: ...nightly.872-x64-setup.exe.blockmap)
File has 551 changed blocks
Full: 99,461.08 KB, To download: 11,063.43 KB (11%)
[error] Cannot download differentially, fallback to full download: HttpError: 501
New version 1.2.0-nightly.872 has been downloaded to
  C:\Users\...\splayer-next-updater\pending\SPlayer-Next-1.2.0-nightly.872-x64-setup.exe
  • 清单里的相对地址被正确解析为 GitHub release 下载地址
  • 架构选择正确:清单 path 指向 x64,本机 x64,实际下载的即 x64 包
  • 多 Range 请求不可用(Fastly 返回 501),electron-updater 自动回退全量下载 —— 这是既有行为,与本次改动无关(此前 nightly 根本走不到下载这一步),不影响功能

未覆盖:安装全流程(quitAndInstall())未实测以避免覆盖本机环境;macOS / Linux 与打包版本未实测。

已覆盖的验证边界:通道识别、清单获取、URL 解析、架构选择、差分回退、下载完成。

关联

修复 #298

@imsyy imsyy left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, 经排查验证该问题真实存在,PR 修复方案严谨有效。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants