Ivan's Blog
返回项目索引效率工具

SpotiBind

SpotiBind 把播放、下一首和上一首按键交给指定播放器,同时提供自动路由、固定目标和启动位置配置。目标不可用时,按键会继续交给 macOS 的默认行为。

macOSSwiftMenu BarMedia Keys
SpotiBind 项目海报
SpotiBind 项目界面与功能概览

媒体按键路由

SpotiBind 处理的是 macOS 媒体按键进入应用之后的那一小段路由边界。它读取播放/暂停、下一首和上一首事件,在目标播放器、转发模式和辅助功能权限都准备好时,才把按键交给选中的播放器。

条件不满足时,原始事件留在 macOS 默认路径。播放器不可用、转发关闭或权限撤销时,系统媒体键仍按默认方式工作。

事件与交付状态

SpotiBind 区分 Tap 接收、目标选择和播放器交付三个状态。权限、目标状态和模式满足时,媒体键才会被消费;启动中、不可用或超时结果回到菜单状态。

自动模式在发送失败后保持原目标。菜单显示选择规则、交付方式和失败原因,用户可以切换固定目标、关闭转发或恢复权限。

菜单栏集成

Core Swift 包只处理媒体事件解码、播放器选择和交付意图,不直接管理菜单栏生命周期、应用发现或 macOS 权限。App 层负责观察进程、检查安装位置、启动目标和更新菜单状态,再把结果交回核心策略。

播放器适配可以独立覆盖快捷键和 CLI 行为,核心策略测试不依赖真实桌面环境。系统集成失败时,错误以普通状态返回到 UI。

播放器选择模式

自动模式按固定顺序判断目标:先看正在运行且可用的 Spotify、Fastpotify、Sonora 和 Spotifly,再从已安装且可启动的播放器中选择第一个目标。需要稳定指向某个播放器时,也可以直接选择固定目标;选择 Off 则完全恢复 macOS 的默认行为。

自动模式按固定顺序选择目标,固定模式直接指向指定播放器。发送失败保持原路由,菜单保留本次结果。

播放器适配

SpotiBind 用同一个媒体键模型连接不同的播放器适配器,但不强行抹平它们的输入差异。Spotify 和 Sonora 使用按进程定向的键盘快捷键,Spotifly 使用其公开快捷键,Fastpotify 则通过公开的 CLI 动词发送 play-pausenextprevious

核心 Swift 包只负责解码媒体事件、计算路由策略和描述交付意图。菜单栏应用负责发现播放器、验证位置、启动应用以及把意图交给对应的系统交付面。

权限与失败处理

SpotiBind 只在具备辅助功能权限且目标已经就绪时安装事件 Tap。权限被撤销或 macOS 禁用事件 Tap 后,应用移除或隔离当前 Tap,等待权限恢复;后台不进行无限重试,也不保存原始输入内容。

Fastpotify 的进程调用使用 URL 和参数数组,不经过 shell 展开。启动超时、CLI 超时和播放器不可用都会转化为菜单状态,已消费的按键不在之后重放。