Smudge
在 Emacs 中控制 Spotify 应用
Smudge 允许您从您喜爱的文本编辑器中控制 Spotify 应用。如果您使用的是 Mac OS X 或 Linux,可以控制本地运行的实例。如果您在任何具有网络连接的平台上运行(包括 Windows - 甚至是无头设备!)并拥有 Spotify 高级订阅,您可以通过 Spotify Connect 功能控制 Spotify 实例。
功能
- 适用于 GNU/Linux(通过 D-Bus)和 OS X(通过 AppleScript)的 Spotify 客户端集成
- 使用 Spotify Connect API 显示和选择设备播放(需要高级订阅)
- 通过 Oauth2 与 Spotify API 通信
- 在模式行或标题栏中显示当前曲目
- 创建播放列表(公开或私密)
- 浏览 Spotify 精选播放列表、您自己的播放列表及其曲目
- 搜索匹配给定关键词的曲目和播放列表
- 使用 Smudge Remote 次要模式轻松控制基本的 Spotify 播放器功能,如播放/暂停、上一首、下一首、随机播放和重复
安装
Smudge 需要 Emacs 27.1+。
原生 Emacs
package.el
是 Emacs 内置的包管理器。
Smudge 可在两个主要的社区维护的 package.el 仓库 MELPA Stable 和 MELPA 中获得。
您可以使用以下命令安装 Smudge:
M-x package-install [RET] smudge [RET]
或将以下代码片段添加到您的 Emacs 配置中:
(use-package smudge
:bind-keymap ("C-c ." . smudge-command-map)
:config
(setq smudge-oauth2-client-secret "..."
smudge-oauth2-client-id "..."))
Doom Emacs
将以下内容添加到 packages.el
文件中:
;; 从 MELPA 获取
(package! smudge)
;; 从 GitHub 获取
(package! smudge
:recipe (:host github :repo "danielfm/smudge"))
将以下内容添加到 config.el
文件中:
(use-package! smudge
:bind-keymap ("C-c ." . smudge-command-map)
:custom
(smudge-oauth2-client-secret "...")
(smudge-oauth2-client-id "...")
;; 可选:为常用命令启用临时映射
(smudge-player-use-transient-map t))
配置
(setq smudge-oauth2-client-secret "<spotify-app-client-secret>")
(setq smudge-oauth2-client-id "<spotify-app-client-id>")
(define-key smudge-mode-map (kbd "C-c .") 'smudge-command-map)
C-c . 键映射前缀只是一个建议,遵循 Emacs 手册中为次要模式定义的约定键绑定约定。此包的早期版本使用 M-p。
可以启用临时映射以允许重复常用命令(在 smudge-transient-command-map
中定义),而无需重复 smudge-command-map
的前缀键。
(setq smudge-player-use-transient-map t)
要获取客户端 ID 和客户端密钥,您需要创建一个 Spotify 应用,将 http://localhost:8080/smudge-api-callback 指定为重定向 URI(或通过自定义指定的任何端口)。OAuth2 交换由 simple-httpd
处理。如果您没有将此包用于其他用途,则无需自定义此端口。否则,您需要将其设置为您正在运行的端口。
要使用 "Spotify Connect" 传输(而不是仅控制本地实例 - 尽管您也可以控制本地实例),请按如下方式将 smudge-transport
设置为 'connect
。此功能需要 Spotify 高级订阅。
(setq smudge-transport 'connect)
创建 Spotify 应用
转到 创建应用程序 并为您的应用程序命名和描述:
创建新应用后,点击 编辑设置,向下滚动一点,将 http://localhost:8080/smudge-api-callback 输入为应用程序的重定向 URI,然后点击 添加。最后,点击 保存。
此时,客户端 ID 和客户端密钥可用,因此将这些值分别设置为 smudge-oauth2-client-id
和 smudge-oauth2-client-secret
。
使用
Remote 次要模式
当您启用 global-smudge-remote-mode
次要模式时,您将获得以下键绑定:
按键 | 功能 | 描述 |
---|---|---|
[前缀键] M-s | smudge-controller-toggle-shuffle | 开启/关闭随机播放 [1] |
[前缀键] M-r | smudge-controller-toggle-repeat | 开启/关闭重复播放 [1] |
[前缀键] M-p | smudge-controller-toggle-play | 播放/暂停 |
[前缀键] M-f | smudge-controller-next-track | 下一曲 |
[前缀键] M-b | smudge-controller-previous-track | 上一曲 |
[前缀键] p m | smudge-my-playlists | 显示你的播放列表 |
[前缀键] p f | smudge-featured-playlists | 显示精选播放列表 |
[前缀键] p s | smudge-playlist-search | 搜索播放列表 |
[前缀键] p u | smudge-user-playlists | 显示指定用户的播放列表 |
[前缀键] p c | smudge-create-playlist | 创建新的播放列表 |
[前缀键] t r | smudge-recently-played | 最近播放的曲目列表 |
[前缀键] t s | smudge-track-search | 搜索曲目 |
[前缀键] v u | smudge-controller-volume-up | 增加音量 [2] |
[前缀键] v d | smudge-controller-volume-down | 降低音量 [2] |
[前缀键] v m | smudge-controller-volume-mute-unmute | 在 0 和 100 之间切换音量 [2] |
[前缀键] d | smudge-select-device | 选择播放设备 [2] |
Smudge 当前正在播放的歌曲会在模式行中显示,包括播放器状态(播放中、暂停)。可以通过 smudge-player-status-refresh-interval
变量配置播放器状态更新的时间间隔:
;; 每 10 秒更新一次播放器状态(默认为 5 秒)
;; 注意:设置为 0 可禁用此功能,使用 'connect transport 时避免将值设为 1 到 4 之间
(setq smudge-player-status-refresh-interval 10)
[1] GNU/Linux 的 D-Bus 实现中没有对此提供适当的支持
[2] 此功能使用 Spotify Connect,需要高级会员订阅
使用 hydra 包的用户可能会发现以下代码更方便管理 Spotify:
;; 用于控制 Spotify 的 hydra
(defhydra hydra-spotify (:hint nil)
"
^搜索^ ^控制^ ^管理^
^^^^^^^^-----------------------------------------------------------------
_t_: 曲目 _SPC_: 播放/暂停 _+_: 增加音量
_m_: 我的播放列表 _n_ : 下一曲 _-_: 降低音量
_f_: 精选播放列表 _p_ : 上一曲 _x_: 静音
_u_: 用户播放列表 _r_ : 重复 _d_: 设备
^^ _s_ : 随机 _q_: 退出
"
("t" smudge-track-search :exit t)
("m" smudge-my-playlists :exit t)
("f" smudge-featured-playlists :exit t)
("u" smudge-user-playlists :exit t)
("SPC" smudge-controller-toggle-play :exit nil)
("n" smudge-controller-next-track :exit nil)
("p" smudge-controller-previous-track :exit nil)
("r" smudge-controller-toggle-repeat :exit nil)
("s" smudge-controller-toggle-shuffle :exit nil)
("+" smudge-controller-volume-up :exit nil)
("-" smudge-controller-volume-down :exit nil)
("x" smudge-controller-volume-mute-unmute :exit nil)
("d" smudge-select-device :exit nil)
("q" quit-window "退出" :color blue))
(bind-key "a" #'hydra-spotify/body some-map)
自定义播放器状态
可以通过设置 smudge-player-status-format
中的所需格式来自定义播放器状态中显示的信息。支持以下占位符:
符号 | 描述 | 示例 |
---|---|---|
%u | 曲目 URI | spotify:track:<id> |
%a | 艺术家名称(截断) | Pink Floyd |
%t | 曲目名称(截断) | Us and Them |
%n | 曲目编号 | 7 |
%l | 曲目时长(分钟) | 7:49 |
%r | 播放器重复状态 | R , - |
%s | 播放器随机状态 | S , - |
%p | 播放器播放状态 | Playing , Paused , Stopped |
默认格式为 "[%p: %a - %t ◷ %l %r%s]"
。
可以通过 smudge-player-status-truncate-length
变量配置截断字段显示的字符数。
(setq smudge-player-status-truncate-length 10) ; 默认值:15
以下播放器状态的文本指示符可以通过相应的变量进行配置:
播放器状态 | 变量 | 默认值 |
---|---|---|
播放中 | smudge-player-status-playing-text | "Playing" |
已暂停 | smudge-player-status-paused-text | "Paused" |
已停止 | smudge-player-status-stopped-text | "Stopped" |
重复开启 | smudge-player-status-repeating-text | "R" |
重复关闭 | smudge-player-status-not-repeating-text | "-" |
随机开启 | smudge-player-status-shuffling-text | "S" |
随机关闭 | smudge-player-status-not-shuffling-text | "-" |
全局远程模式
可以通过运行 M-x global-smudge-remote-mode 在全局范围内启用此模式。
搜索曲目
要搜索曲目,运行 M-x smudge-track-search 并输入你的查询。结果将显示在一个单独的缓冲区中,带有以下键绑定:
按键 | 描述 |
---|---|
a | 将歌曲添加到播放列表 |
l | 加载下一页结果(分页) |
g | 清除结果并重新加载第一页结果 |
k | 将光标下(或选中区域内)的歌曲添加到队列 |
M-RET | 在专辑上下文中播放光标下的歌曲 [1] |
[1] GNU/Linux 的 D-Bus 实现不支持传递上下文,所以只会播放光标下的歌曲
结果缓冲区默认加载 global-smudge-remote-mode
。
提示: 要自定义每页获取的项目数,只需更改变量 smudge-api-search-limit
:
;; 为了更好地兼容各个端点,不要使用大于 50 的值
(setq smudge-api-search-limit 50)
播放 Spotify URI
要让 Smudge 通过 URI 播放资源,运行 M-x smudge-play-uri 并输入资源 URI。
创建播放列表
要创建新的播放列表,运行 M-x smudge-create-playlist 并按照提示操作。
目前无法向你拥有的播放列表添加歌曲,或从中删除歌曲。
搜索播放列表
要返回当前用户的播放列表,运行 M-x smudge-my-playlists,或运行 M-x smudge-user-playlists 列出指定用户的公开播放列表。要搜索匹配给定搜索条件的播放列表,运行 M-x smudge-playlist-search 条件。此外,运行 M-x smudge-featured-playlists 可以浏览 Spotify en_US 的精选播放列表。
更改以下变量以自定义精选播放列表端点的区域设置和地区:
;; 西班牙语(墨西哥)
(setq smudge-api-locale "es_MX")
(setq smudge-api-country "MX")
所有这些命令都会在单独的缓冲区中显示结果,并具有以下按键绑定:
按键 | 描述 |
---|---|
l | 加载下一页结果(分页) |
g | 清除结果并重新加载第一页结果 |
f | 关注光标下的播放列表 |
u | 取消关注光标下的播放列表 |
t | 列出光标下播放列表的歌曲 |
M-RET | 播放光标下的播放列表 |
打开播放列表的歌曲列表后,结果缓冲区中会有以下按键绑定:
按键 | 描述 |
---|---|
a | 将歌曲添加到播放列表 |
r | 从当前播放列表中删除歌曲 |
l | 加载下一页结果(分页) |
g | 清除结果并重新加载第一页结果 |
f | 关注当前播放列表 |
u | 取消关注当前播放列表 |
k | 将光标下(或选中区域内)的歌曲添加到队列 |
M-RET | 在播放列表上下文中播放光标下的歌曲 [1] |
两个缓冲区默认加载 global-smudge-remote-mode
。
[1] GNU/Linux 的 D-Bus 实现不支持传递上下文,所以只会播放光标下的歌曲
选择播放设备
M-x smudge-select-device 将在单独的缓冲区中显示可用于播放的设备列表。
注意:使用此功能需要 Spotify 高级订阅。
打开设备列表后,结果缓冲区中会有以下按键绑定:
按键 | 描述 |
---|---|
RET | 将播放转移到光标下的设备 |
g | 重新加载设备列表 |
指定播放器状态显示位置
默认情况下,播放器状态(播放、暂停、歌曲名称、时间、随机播放、重复等)显示在模式行中。如果你想在图形显示时将状态显示在标题栏中,可以设置以下内容:
(setq smudge-status-location 'title-bar)
有效值包括 'title-bar
、'modeline
和 nil
,其中 nil 完全关闭播放器状态显示。如果值设置为 title-bar
但你没有使用图形显示,播放器状态将显示在模式行中。
如果你想自定义现有标题栏文本和播放器状态之间的分隔符,可以设置以下内容,例如:
(setq smudge-title-bar-separator "----")
否则,默认为 4 个空格。
许可证
版权所有 (C) Daniel Fernandes Martins
根据 GPL v3 许可证分发。有关更多详细信息,请参阅 COPYING 文件。