在 Emacs 中控制 Spotify 应用
Smudge 允许您从您喜爱的文本编辑器中控制 Spotify 应用。如果您使用的是 Mac OS X 或 Linux,可以控制本地运行的实例。如果您在任何具有网络连接的平台上运行(包括 Windows - 甚至是无头设备!)并拥有 Spotify 高级订阅,您可以通过 Spotify Connect 功能控制 Spotify 实例。
Smudge 需要 Emacs 27.1+。
package.el 是 Emacs 内置的包管理器。
Smudge 可在两个主要的社区维护的 package.el 仓库 MELPA Stable 和 MELPA 中获得。
您可以使用以下命令安装 Smudge:
<kbd>M-x</kbd> package-install <kbd>[RET]</kbd> smudge <kbd>[RET]</kbd>
或将以下代码片段添加到您的 Emacs 配置中:
(use-package smudge :bind-keymap ("C-c ." . smudge-command-map) :config (setq smudge-oauth2-client-secret "..." smudge-oauth2-client-id "..."))
将以下内容添加到 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)
<kbd>C-c .</kbd> 键映射前缀只是一个建议,遵循 Emacs 手册中为次要模式定义的约定键绑定约定。此包的早期版本使用 <kbd>M-p</kbd>。
可以启用临时映射以允许重复常用命令(在 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)
转到 创建应用程序 并为您的应用程序命名和描述:

创建新应用后,点击 编辑设置,向下滚动一点,将 http://localhost:8080/smudge-api-callback 输入为应用程序的重定向 URI,然后点击 添加。最后,点击 保存。

此时,客户端 ID 和客户端密钥可用,因此将这些值分别设置为 smudge-oauth2-client-id 和 smudge-oauth2-client-secret。

当您启用 global-smudge-remote-mode 次要模式时,您将获得以下键绑定:
| 按键 | 功能 | 描述 |
|---|---|---|
| <kbd>[前缀键] M-s</kbd> | smudge-controller-toggle-shuffle | 开启/关闭随机播放 [1] |
| <kbd>[前缀键] M-r</kbd> | smudge-controller-toggle-repeat | 开启/关闭重复播放 [1] |
| <kbd>[前缀键] M-p</kbd> | smudge-controller-toggle-play | 播放/暂停 |
| <kbd>[前缀键] M-f</kbd> | smudge-controller-next-track | 下一曲 |
| <kbd>[前缀键] M-b</kbd> | smudge-controller-previous-track | 上一曲 |
| <kbd>[前缀键] p m</kbd> | smudge-my-playlists | 显示你的播放列表 |
| <kbd>[前缀键] p f</kbd> | smudge-featured-playlists | 显示精选播放列表 |
| <kbd>[前缀键] p s</kbd> | smudge-playlist-search | 搜索播放列表 |
| <kbd>[前缀键] p u</kbd> | smudge-user-playlists | 显示指定用户的播放列表 |
| <kbd>[前缀键] p c</kbd> | smudge-create-playlist | 创建新的播放列表 |
| <kbd>[前缀键] t r</kbd> | smudge-recently-played | 最近播放的曲目列表 |
| <kbd>[前缀键] t s</kbd> | smudge-track-search | 搜索曲目 |
| <kbd>[前缀键] v u</kbd> | smudge-controller-volume-up | 增加音量 [2] |
| <kbd>[前缀键] v d</kbd> | smudge-controller-volume-down | 降低音量 [2] |
| <kbd>[前缀键] v m</kbd> | smudge-controller-volume-mute-unmute | 在 0 和 100 之间切换音量 [2] |
| <kbd>[前缀键] d</kbd> | 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 | "-" |
可以通过运行 <kbd>M-x global-smudge-remote-mode</kbd> 在全局范围内启用此模式。
要搜索曲目,运行 <kbd>M-x smudge-track-search</kbd> 并输入你的查询。结果将显示在一个单独的缓冲区中,带有以下键绑定:
| 按键 | 描述 |
|---|---|
| <kbd>a</kbd> | 将歌曲添加到播放列表 |
| <kbd>l</kbd> | 加载下一页结果(分页) |
| <kbd>g</kbd> | 清除结果并重新加载第一页结果 |
| <kbd>k</kbd> | 将光标下(或选中区域内)的歌曲添加到队列 |
| <kbd>M-RET</kbd> | 在专辑上下文中播放光标下的歌曲 [1] |
[1] GNU/Linux 的 D-Bus 实现不支持传递上下文,所以只会播放光标下的歌曲
结果缓冲区默认加载 global-smudge-remote-mode。
提示: 要自定义每页获取的项目数,只需更改变量 smudge-api-search-limit:
;; 为了更好地兼容各个端点,不要使用大于 50 的值 (setq smudge-api-search-limit 50)
要让 Smudge 通过 URI 播放资源,运行 <kbd>M-x smudge-play-uri</kbd> 并输入资源 URI。
要创建新的播放列表,运行 <kbd>M-x smudge-create-playlist</kbd> 并按照提示操作。
目前无法向你拥有的播放列表添加歌曲,或从中删除歌曲。
要返回当前用户的播放列表,运行 <kbd>M-x smudge-my-playlists</kbd>,或运行 <kbd>M-x smudge-user-playlists</kbd> 列出指定用户的公开播放列表。要搜索匹配给定搜索条件的播放列表,运行 <kbd>M-x smudge-playlist-search 条件</kbd>。此外,运行 <kbd>M-x smudge-featured-playlists</kbd> 可以浏览 Spotify en_US 的精选播放列表。
更改以下变量以自定义精选播放列表端点的区域设置和地区:
;; 西班牙语(墨西哥) (setq smudge-api-locale "es_MX") (setq smudge-api-country "MX")
所有这些命令都会在单独的缓冲区中显示结果,并具有以下按键绑定:
| 按键 | 描述 |
|---|---|
| <kbd>l</kbd> | 加载下一页结果(分页) |
| <kbd>g</kbd> | 清除结果并重新加载第一页结果 |
| <kbd>f</kbd> | 关注光标下的播放列表 |
| <kbd>u</kbd> | 取消关注光标下的播放列表 |
| <kbd>t</kbd> | 列出光标下播放列表的歌曲 |
| <kbd>M-RET</kbd> | 播放光标下的播放列表 |
打开播放列表的歌曲列表后,结果缓冲区中会有以下按键绑定:
| 按键 | 描述 |
|---|---|
| <kbd>a</kbd> | 将歌曲添加到播放列表 |
| <kbd>r</kbd> | 从当前播放列表中删除歌曲 |
| <kbd>l</kbd> | 加载下一页结果(分页) |
| <kbd>g</kbd> | 清除结果并重新加载第一页结果 |
| <kbd>f</kbd> | 关注当前播放列表 |
| <kbd>u</kbd> | 取消关注当前播放列表 |
| <kbd>k</kbd> | 将光标下(或选中区域内)的歌曲添加到队列 |
| <kbd>M-RET</kbd> | 在播放列表上下文中播放光标下的歌曲 [1] |
两个缓冲区默认加载 global-smudge-remote-mode。
[1] GNU/Linux 的 D-Bus 实现不支持传递上下文,所以只会播放光标下的歌曲
<kbd>M-x smudge-select-device</kbd> 将在单独的缓冲区中显示可用于播放的设备列表。
注意:使用此功能需要 Spotify 高级订阅。
打开设备列表后,结果缓冲区中会有以下按键绑定:
| 按键 | 描述 |
|---|---|
| <kbd>RET</kbd> | 将播放转移到光标下的设备 |
| <kbd>g</kbd> | 重新加载设备列 表 |
默认情况下,播放器状态(播放、暂停、歌曲名称、时间、随机播放、重复等)显示在模式行中。如果你想在图形显示时将状态显示在标题栏中,可以设置以下内容:
(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 文件。


最适合小白的AI自动化工作流平台
无需编码,轻松生成可复用、可变现的AI自动化工作流

大模型驱动的Excel数据处理工具
基于大模型交互的表格处理系统,允许用户通过对话方式完成数据整理和可视化分析。系统采用机器学习算法解析用户指令,自动执行排序、公式计算和数据透视等操作,支持多种文件格式导入导出。数据处理响应速度保持在0.8秒以内,支持超过100万行数据的即时分析。


AI辅助编程,代码自动修复
Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。


AI论文写作指导平台
AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题 、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。


AI一键生成PPT,就用博思AIPPT!
博思AIPPT,新一代的AI生成PPT平台,支持智能生成PPT、AI美化PPT、文本&链接生成PPT、导入Word/PDF/Markdown文档生成PPT等,内置海量精美PPT模板,涵盖商务、教育、科技等不同风格,同时针对每个页面提供多种版式,一键自适应切换,完美适配各种办公场景。


AI赋能电商视觉革命,一站式智能商拍平台
潮际好麦深耕服装行业,是国内AI试衣效果最好的软件。使用先进AIGC能力为电商卖家批量提供优质的、低成本的商拍图。合作品牌有Shein、Lazada、安踏、百丽等65个国内外头部品牌,以及国内10万+淘宝、天猫、京东等主流平台的品牌商家,为卖家节省将近85%的出图成本,提升约3倍出图效率,让品牌能够快速上架。


企业专属的AI法律顾问
iTerms是法大大集团旗下法律子品牌,基于最先进的大语言模型(LLM)、专业的法律知识库和强大的智能体架构,帮助企业扫清合规障碍,筑牢风控防线,成为您企业专属的AI法律顾问。


稳定高效的流量提升解决方案,助力品牌曝光
稳定高效的流量提升解决方案,助力品牌曝光


最新版Sora2模型免费使用,一键生成无水印视频
最新版Sora2模型免费使用,一键生成无水印视频


实时语音翻译/同声传译工具
Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。
最新AI工具、AI资讯
独家AI资源、AI项目落地

微信扫一扫关注公众号