✨feat(mac/tray/lyric): 新增 macOS 状态栏歌词与托盘图标适配 by Pissofdvpe · Pull Request #843 · imsyy/SPlayer

and others added 2 commits

February 7, 2026 22:30
- 新增 macOS 状态栏歌词功能:在 macOS 平台,歌词将显示在系统状态栏区域,并根据播放进度实时更新,同时通过 IPC 消息进>行控制和同步。
- 实现 macOS 风格托盘图标适配:引入 `getTrayIcon()` 和 `getMenuIcon()` 方法,支持 macOS 模板图像,实现托盘和菜单图标
随系统亮/暗模式自动切换,提供更好的视觉集成。
- 维护跨平台兼容性:通过 `isMac` 判断进行逻辑隔离,确保 Windows 及其他平台原有的任务栏歌词窗口功能不受影响。
~

gemini-code-assist[bot]

@Pissofdvpe

@Pissofdvpe

- 将 macOS 状态栏歌词功能从  模块完全迁移至新增的  独立模块,显著提升模块化和可维护性。
-  现已专用于处理 Windows/Linux 平台的任务栏歌词逻辑,消除了平台间的耦合。
-  更新为根据操作系统平台动态加载  或 。
- 调整了  对  事件的响应逻辑,并移除了冗余的  监听器,确保托盘标题管理与歌词功能的独立控制。
- 歌词和播放状态数据(如  等)的底层 IPC 事件保持共享,无需修改渲染进程的数据发送逻辑。
- 引入 macOS 专属状态栏歌词开关,并将其集成到 Electron Store 和 Pinia Store 中,实现独立配置。
- 在设置界面中为 macOS 平台添加了专属开关,以直观控制状态栏歌词的启用与禁用。
- 更新了主进程 IPC 逻辑 (),使其响应新的 macOS 状态栏歌词设置。
- 优化了托盘菜单歌词切换逻辑 (),使其根据平台智能路由 IPC 事件,并统一了切换提示文本。
- 实现了托盘菜单与设置界面开关状态的双向同步,确保用户操作的一致性。

apoint123

@Pissofdvpe

- 统一了 macOS 歌词相关 IPC 的类型定义,将  移至  并导入 IPC payload 类型。
- 优化了 macOS 状态栏歌词更新逻辑:
    - 移除了歌词更新的 200ms 防抖延迟。
    - 实现了下一行歌词提前 300ms 预显示,以提高流畅度。
    - 引入了 50ms 间隔的歌词插值,以实现更平滑的进度更新,尤其是在主进程接收到渲染器防抖更新时。
- 为 macOS 状态栏歌词数据请求创建了专用的 IPC 通道 ,增强了关注点分离。
- 恢复了  中缺失的注释,以提高代码可读性和可维护性。

apoint123

- 修复了开启macOS状态栏歌词时,先快速闪烁logo和错误歌词文本的问题
  - 移除了在启用歌词时立即清空歌词列表的逻辑
  - 确保在新歌词数据到达后立即更新状态栏显示
- 优化了 setInterval 的使用方式:
  - 彻底废弃了 setInterval 内部的时间推移逻辑
  - 转而完全依赖渲染进程通过 IPC 同步的精确时间来更新歌词进度
- 解决了 IPC 延迟导致的歌词抢跑问题
  - 在主进程的 mac-statusbar:update-progress 处理器中引入了进度同步阈值 (100ms)
  - 只有当 IPC 传递的 currentTime 与主进程本地 macCurrentTime 差异超出阈值时才进行同步,以平滑歌词显示,避免微小跳动
- 修正了注释以提高代码可读性
  - 更新了 ipcMain.on(taskbar:update-state) 处理器中的注释,使其更准确、清晰,并反映了当前逻辑

@Pissofdvpe

apoint123

- 引入 Date.now() 驱动的内部时间推进机制,减少 CPU 空转并提高同步健壮性:
  - 新增 macLastUpdateTime 变量,记录 macCurrentTime 上次更新时间戳。
  - 修改 startInterpolation 函数的 setInterval 回调,通过计算 elapsedTime 累加到 macCurrentTime。
- 优化 IPC 进度同步为校准机制:
  - 在 mac-statusbar:update-progress IPC 事件处理器中,当 currentTime 与 macCurrentTime 差异超过阈值或非播放状态时,才进行时间校准。
  - 确保 PROGRESS_SYNC_THRESHOLD_MS 阈值正常发挥作用,避免不必要的微小同步。
- 清理冗余调试日志,提升代码整洁度。

@Pissofdvpe

@Pissofdvpe

@Pissofdvpe

apoint123