smudge

smudge

Emacs插件实现Spotify音乐播放控制

Smudge是一款Emacs插件,可在Emacs环境中直接控制Spotify应用。支持Mac OS X和Linux本地Spotify控制,以及通过Spotify Connect API进行远程播放控制。功能包括显示当前曲目、创建播放列表、浏览搜索音乐和控制播放等。Smudge提供便捷的远程控制模式,简化Spotify播放管理。适用于希望在Emacs中集成音乐控制的用户。

SmudgeEmacsSpotify控制插件Github开源项目

Smudge

MELPA

在 Emacs 中控制 Spotify 应用

asciicast

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:

<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 "..."))

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)

<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)

创建 Spotify 应用

转到 创建应用程序 并为您的应用程序命名和描述:

创建 Spotify 应用 1/3

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

创建 Spotify 应用 2/3

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

创建 Spotify 应用 3/3

使用

Remote 次要模式

当您启用 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曲目 URIspotify: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)

播放 Spotify URI

要让 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'modelinenil,其中 nil 完全关闭播放器状态显示。如果值设置为 title-bar 但你没有使用图形显示,播放器状态将显示在模式行中。

如果你想自定义现有标题栏文本和播放器状态之间的分隔符,可以设置以下内容,例如:

(setq smudge-title-bar-separator "----")

否则,默认为 4 个空格。

许可证

版权所有 (C) Daniel Fernandes Martins

根据 GPL v3 许可证分发。有关更多详细信息,请参阅 COPYING 文件。

编辑推荐精选

蛙蛙写作

蛙蛙写作

AI小说写作助手,一站式润色、改写、扩写

蛙蛙写作—国内先进的AI写作平台,涵盖小说、学术、社交媒体等多场景。提供续写、改写、润色等功能,助力创作者高效优化写作流程。界面简洁,功能全面,适合各类写作者提升内容品质和工作效率。

AI助手AI工具AI写作工具AI辅助写作蛙蛙写作学术助手办公助手营销助手
Trae

Trae

字节跳动发布的AI编程神器IDE

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

热门AI工具生产力协作转型TraeAI IDE
问小白

问小白

全能AI智能助手,随时解答生活与工作的多样问题

问小白,由元石科技研发的AI智能助手,快速准确地解答各种生活和工作问题,包括但不限于搜索、规划和社交互动,帮助用户在日常生活中提高效率,轻松管理个人事务。

聊天机器人AI助手热门AI工具AI对话
Transly

Transly

实时语音翻译/同声传译工具

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

讯飞智文

讯飞智文

一键生成PPT和Word,让学习生活更轻松

讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。

热门AI工具AI办公办公工具讯飞智文AI在线生成PPTAI撰写助手多语种文档生成AI自动配图
讯飞星火

讯飞星火

深度推理能力全新升级,全面对标OpenAI o1

科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。

模型训练热门AI工具内容创作智能问答AI开发讯飞星火大模型多语种支持智慧生活
Spark-TTS

Spark-TTS

一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型

Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。

咔片PPT

咔片PPT

AI助力,做PPT更简单!

咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。

讯飞�绘文

讯飞绘文

选题、配图、成文,一站式创作,让内容运营更高效

讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。

AI助手热门AI工具AI创作AI辅助写作讯飞绘文内容运营个性化文章多平台分发
材料星

材料星

专业的AI公文写作平台,公文写作神器

AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。

下拉加载更多