升级到 1.2.0 后,之前一直正常的 Subsonic/OpenSubsonic 媒体源变成“未连接”,点测试只提示“用户名或密码错误”。但同一组凭据在升级前后用 curl 请求 `/rest/ping.view` 都是 200,服务端没有动过。 排查后发现,1.1.0 保存的 `encryptedPassword` 是不带 `safe:v1:` 前缀的 base64 文本,1.2.0 直接按新的 safeStorage 格式去解密,结果解出来是乱码,最后就变成了“密码错误”。这里如果解密失败,最好直接提示需要重新填写凭据,而不是报认证失败,不然很容易误判。 另一个问题是 Linux 下没法重新保存。Electron 的 `safeStorage.getSelectedStorageBackend()` 返回 `basic_text` 时,`encryptPassword()` 会抛“请启用系统密钥环后保存流媒体密码”,但 `isAsyncEncryptionAvailable()` 仍然是 true。于是旧凭据读不了,新凭据也存不进去,只能手动改 `streaming.json`。 环境: - SPlayer Next 1.1.0 -> 1.2.0 - Linux / Hyprland (Wayland) - Electron 44.9.0 - gnome-keyring-daemon 在运行,但 Electron 仍选了 basic_text - 服务端 Lightweight Music Server (LMS),OpenSubsonic API 复现: 1. 在 1.1.0 添加可用的 Subsonic 媒体源,确认能连接。 2. 升级到 1.2.0 并重启。 3. 媒体源显示未连接,测试连接报“用户名或密码错误”。 4. 查看 `streaming.json`,`encryptedPassword` 是旧格式,没有 `safe:v1:` 前缀。 5. 在界面重新输入同一个 token,仍然无法保存或连接。 期望: - 读取到旧格式时自动迁移,或者明确提示“需要重新输入凭据”。 - 解密失败时给出清楚的错误,不要显示成用户名密码错误。 - `basic_text` 模式下不要一边说可用、一边又拒绝保存。 - 要么支持 `basic_text`(加安全提示),要么自动使用系统密钥环。 临时办法: 用主进程的 `safeStorage.encryptStringAsync()` 把 token 重新加密,写成 `safe:v1:<base64>`,重启后恢复。 服务端没有做任何改动,问题只在客户端的凭据迁移和 Linux 存储后端处理。
Activity
github-actions commentedon Oct 25, 2026
👋 @Vedaru
感谢提交 Issue!我们已经收到您的反馈,会尽快确认您的问题。
Thanks for opening this issue! We have received your report and will review it as soon as possible.