Spotify

Hermes 可以直接控制 Spotify——播放、队列、搜索、播放列表、已保存的曲目/专辑以及收听历史——使用 Spotify 官方 Web API 和 PKCE OAuth。Token 存储在 ~/.hermes/auth.json 中,遇到 401 时自动刷新;每台机器只需登录一次。

与 Hermes 内置的 OAuth 集成(Google、GitHub Copilot、Codex)不同,Spotify 要求每个用户注册自己的轻量级开发者应用。Spotify 不允许第三方发布任何人都可以使用的公共 OAuth 应用。大约需要两分钟,hermes auth spotify 会引导您完成。

先决条件

  • 一个 Spotify 账户。免费账户适用于搜索、播放列表、库和活动工具。Premium 用于播放控制(播放、暂停、跳过、seek、音量、队列添加、转移)。
  • Hermes Agent 已安装并运行。
  • 对于播放工具:一个活跃的 Spotify Connect 设备——Spotify 应用必须在至少一台设备上打开(手机、桌面、网页播放器、音箱),以便 Web API 有可控制的对象。如果没有任何设备活跃,您将收到 403 Forbidden 并提示”no active device”;在任何设备上打开 Spotify 并重试。

设置

一键设置:hermes tools 或首次运行设置

最快的路径。运行:

hermes tools

滚动到 🎵 Spotify,按空格键开启,然后按 s 保存。在首次运行 hermes setup / hermes setup tools 流程中也有相同的开关。Spotify 保持选择加入,因此在此处启用会运行与 hermes tools 相同的提供商感知配置。

Hermes 直接将您带入 OAuth 流程——如果您还没有 Spotify 应用,它会引导您内联创建一个。完成后,工具集会在一次操作中启用并认证。

如果您更愿意分开执行步骤(或稍后重新认证),请使用下面的两步流程。

两步流程

1. 启用工具集

hermes tools

开启 🎵 Spotify,保存,当内联向导打开时,退出它(Ctrl+C)。工具集保持开启状态;仅推迟了认证步骤。

2. 运行登录向导

hermes auth spotify

7 个 Spotify 工具仅在步骤 1 之后出现在代理的工具集中——它们默认关闭,以便不需要它们的用户不会在每次 API 调用中携带额外的工具模式。

如果没有设置 HERMES_SPOTIFY_CLIENT_ID,Hermes 会内联引导您完成应用注册:

  1. 在浏览器中打开 https://developer.spotify.com/dashboard
  2. 打印需要粘贴到 Spotify”创建应用”表单中的确切值
  3. 提示您输入收到的 Client ID
  4. 保存到 ~/.hermes/.env,以便未来运行跳过此步骤
  5. 直接进入 OAuth 同意流程

您批准后,token 写入 ~/.hermes/auth.jsonproviders.spotify 下。活跃的推理提供商不会改变——Spotify 认证独立于您的 LLM 提供商。

创建 Spotify 应用(向导需要的信息)

当仪表板打开时,点击 Create app 并填写:

字段
App name任意(例如 hermes-agent
App description任意(例如 personal Hermes integration
Website留空
Redirect URIhttp://127.0.0.1:43827/spotify/callback
Which API/SDKs?勾选 Web API

同意条款并点击 Save。在下一页点击 Settings → 复制 Client ID 并粘贴到 Hermes 提示中。这是 Hermes 需要的唯一值——PKCE 不使用 client secret。

通过 SSH / 在无头环境中运行

如果设置了 SSH_CLIENTSSH_TTY,Hermes 在向导和 OAuth 步骤中都跳过自动浏览器打开。复制 Hermes 打印的仪表板 URL 和授权 URL,在本地机器的浏览器中打开它们,正常进行——本地 HTTP 监听器仍在远程主机的端口 43827 上运行。您笔记本电脑的浏览器无法访问远程回环地址,除非使用 SSH 本地转发:

ssh -N -L 43827:127.0.0.1:43827 user@remote-host

有关跳板机/堡垒机设置和其他注意事项(mosh、tmux、端口冲突),请参阅 远程主机的 OAuth

验证

hermes auth status spotify

显示 token 是否存在以及访问 token 何时过期。刷新是自动的:当任何 Spotify API 调用返回 401 时,客户端交换刷新 token 并重试一次。刷新 token 在 Hermes 重启后持久保存,因此只有在您从 Spotify 账户设置中撤销应用或运行 hermes auth logout spotify 时才需要重新认证。

使用

登录后,代理可以访问 7 个 Spotify 工具。您自然地与代理对话——它会选择正确的工具和动作。为了获得最佳行为,代理会加载一个配套技能,教授规范的使用模式(单次搜索然后播放、何时无需预检 get_state 等)。

> 播放一些 miles davis
> 我在听什么
> 将这首曲目添加到我的 Late Night Jazz 播放列表
> 跳到下一首歌
> 创建一个名为"Focus 2026"的新播放列表,并添加我最后播放的三首歌
> 我保存的专辑中哪些是 Radiohead 的
> 搜索 Blackbird 的民谣翻唱
> 将播放转移到我的厨房音箱

工具参考

所有修改播放状态的操作都接受一个可选的 device_id 来定位特定设备。如果省略,Spotify 使用当前活跃设备。

spotify_playback

控制并检查播放状态,以及获取最近播放的历史记录。

操作目的Premium?
get_state完整播放状态(曲目、设备、进度、随机播放/重复)
get_currently_playing仅当前曲目(204 时返回空——见下文)
play开始/恢复播放。可选:context_uriurisoffsetposition_ms
pause暂停播放
next / previous跳过曲目
seek跳转到 position_ms
set_repeatstate = track / context / off
set_shufflestate = true / false
set_volumevolume_percent = 0-100
recently_played最近播放的曲目。可选 limitbeforeafter(Unix ms)

spotify_devices

操作目的
list您的账户可见的每个 Spotify Connect 设备
transfer将播放移动到 device_id。可选 play: true 在转移时开始播放

Home Assistant 管理的音箱

如果 Home Assistant 管理已支持 Spotify Connect 的音箱(例如 Sonos、Echo、Nest 或其他支持 Connect 的音箱),只要 Spotify 能看到它们,它们就会自动出现在 spotify_devices list 中。Hermes 在此路径上不需要 Home Assistant ↔ Spotify 桥接——Spotify 原生处理设备路由。

让 Hermes 通过音箱的显示名称转移播放(例如”将 Spotify 转移到厨房音箱”),或在编写脚本时调用 spotify_devices list 并将确切的 device_id 传递给 spotify_devices transfer。如果音箱缺失,在 Spotify 应用或音箱的 Spotify 集成中打开一次,以便 Spotify 将其注册为活跃的 Connect 目标。

spotify_queue

操作目的Premium?
get当前队列中的曲目
adduri 追加到队列

搜索目录。query 是必需的。可选:typestrack / album / artist / playlist / show / episode 数组)、limitoffsetmarket

spotify_playlists

操作目的必需参数
list用户的播放列表
get一个播放列表 + 曲目playlist_id
create新播放列表name(+ 可选 descriptionpubliccollaborative
add_items添加曲目playlist_iduris(可选 position
remove_items移除曲目playlist_iduris(+ 可选 snapshot_id
update_details重命名/编辑playlist_id + namedescriptionpubliccollaborative 中的任意

spotify_albums

操作目的必需参数
get专辑元数据album_id
tracks专辑曲目列表album_id

spotify_library

统一访问已保存的曲目和已保存的专辑。通过 kind 参数选择集合。

操作目的
list分页的库列表
saveids / uris 添加到库
remove从库中移除 ids / uris

必需:kind = tracksalbums,加上 action

功能矩阵:免费版 vs Premium

只读工具在免费账户上可用。任何修改播放或队列的操作都需要 Premium。

免费可用需要 Premium
spotify_search(全部)spotify_playback — play、pause、next、previous、seek、set_repeat、set_shuffle、set_volume
spotify_playback — get_state、get_currently_playing、recently_playedspotify_queue — add
spotify_devices — listspotify_devices — transfer
spotify_queue — get
spotify_playlists(全部)
spotify_albums(全部)
spotify_library(全部)

定时任务:Spotify + cron

由于 Spotify 工具是常规的 Hermes 工具,在 Hermes 会话中运行的 cron 作业可以按任何计划触发播放。无需新代码。

早上唤醒播放列表

hermes cron add \
  --name "morning-commute" \
  "0 7 * * 1-5" \
  "将播放转移到我的厨房音箱,开始播放我的'Morning Commute'播放列表。音量设为 40。开启随机播放。"

每个工作日早上 7 点发生的情况:

  1. Cron 启动一个无头 Hermes 会话。
  2. 代理读取提示,调用 spotify_devices list 按名称找到”kitchen speaker”,然后 spotify_devices transferspotify_playback set_volumespotify_playback set_shufflespotify_search + spotify_playback play
  3. 音乐在目标音箱上开始播放。总成本:一个会话,几次工具调用,无需人工输入。

晚间放松

hermes cron add \
  --name "wind-down" \
  "30 22 * * *" \
  "暂停 Spotify。然后将音量设为 20,以便我明天重新启动时保持安静。"

注意事项

  • 当 cron 触发时必须存在活跃设备。 如果没有 Spotify 客户端在运行(手机/桌面/Connect 音箱),播放操作会返回 403 no active device。对于早上播放列表,技巧是定位始终在线的设备(Sonos、Echo、智能音箱)而非您的手机。
  • 任何修改播放的操作都需要 Premium — play、pause、skip、volume、transfer。只读 cron 作业(定时”邮件发送我的最近播放曲目”)在免费版上可以正常工作。
  • cron 代理继承您的活跃工具集。 必须在 hermes tools 中启用 Spotify,cron 会话才能看到 Spotify 工具。
  • Cron 作业使用 skip_memory=True 运行,因此它们不会写入您的记忆存储。

完整 cron 参考:Cron 作业

登出

hermes auth logout spotify

~/.hermes/auth.json 中移除 token。要同时清除应用配置,从 ~/.hermes/.env 中删除 HERMES_SPOTIFY_CLIENT_ID(以及如果设置了 HERMES_SPOTIFY_REDIRECT_URI),或重新运行向导。

要在 Spotify 侧撤销应用,请访问已连接到您账户的应用,然后点击 REMOVE ACCESS

故障排除

403 Forbidden — Player command failed: No active device found — 您需要 Spotify 至少在一台设备上运行。在您的手机、桌面或网页播放器上打开 Spotify 应用,播放任何曲目一秒钟以注册设备,然后重试。spotify_devices list 显示当前可见的设备。

403 Forbidden — Premium required — 您使用的是免费账户,尝试使用修改播放状态的操作。请参阅上面的功能矩阵。

204 No Content on get_currently_playing — 当前没有任何设备在播放。这是 Spotify 的正常响应,而非错误;Hermes 将其显示为带有说明的空结果(is_playing: false)。

INVALID_CLIENT: Invalid redirect URI — Spotify 应用设置中的重定向 URI 与 Hermes 使用的不匹配。默认为 http://127.0.0.1:43827/spotify/callback。要么将其添加到应用允许的重定向 URI 中,要么在 ~/.hermes/.env 中将 HERMES_SPOTIFY_REDIRECT_URI 设置为您注册的任何 URI。

429 Too Many Requests — Spotify 的速率限制。Hermes 返回一个友好的错误;等待一分钟然后重试。如果持续出现,您可能在脚本中运行了紧密循环——Spotify 的配额大约每 30 秒重置一次。

401 Unauthorized 不断返回 — 您的刷新 token 已被撤销(通常是因为您从账户中移除了应用,或应用已被删除)。重新运行 hermes auth spotify

向导未打开浏览器 — 如果您通过 SSH 或在没有显示器的容器中,Hermes 会检测到并跳过自动打开。复制它打印的仪表板 URL 并手动打开。

高级:自定义作用域

默认情况下,Hermes 请求每个附带工具所需的作用域。如果您想限制访问,可以覆盖:

hermes auth spotify --scope "user-read-playback-state user-modify-playback-state playlist-read-private"

作用域参考:Spotify Web API 作用域。如果您请求的作用域少于工具所需的,该工具的调用将失败并返回 403。

高级:自定义客户端 ID / 重定向 URI

hermes auth spotify --client-id <id> --redirect-uri http://localhost:3000/callback

或者永久设置在 ~/.hermes/.env 中:

HERMES_SPOTIFY_CLIENT_ID=<your_id>
HERMES_SPOTIFY_REDIRECT_URI=http://localhost:3000/callback

重定向 URI 必须在您的 Spotify 应用设置中列入允许列表。默认值几乎适用于所有人——仅在端口 43827 已被占用时才更改。

文件位置

文件内容
~/.hermes/auth.jsonproviders.spotify访问 token、刷新 token、过期时间、作用域、重定向 URI
~/.hermes/.envHERMES_SPOTIFY_CLIENT_ID,可选的 HERMES_SPOTIFY_REDIRECT_URI
Spotify 应用您在 developer.spotify.com/dashboard 拥有;包含 Client ID 和重定向 URI 允许列表