Spotify
Spotify 是一个数字音乐流媒体服务,采用免费增值商业模式。本文主要介绍半官方的、专有的 Linux 版 Spotify 客户端,该客户端由 Spotify 工程师在业余时间开发,Spotify 不提供积极支持。[1] 此外,还有一个 在线播放器 和许多开源的 第三方客户端。
安装
安装 spotify-launcher。此软件包管理您主目录中的每个用户安装,允许 Spotify 独立于 pacman 自行更新(类似于 Spotify 在其他操作系统上的自更新方式)。
如果您希望使用 pacman 管理 Spotify 更新,请改用 spotifyAUR,它重新打包了 Linux 版 Spotify。如果您需要添加和播放本地文件,您还需要额外安装 zenity 和 ffmpeg4.4。
第三方客户端
高级订阅
- Librespot — 一个用于 Spotify 的开源客户端库,它使应用程序能够使用 Spotify 的服务(流式传输),而无需官方闭源的 libspotify。
- Mopidy — Music Player Daemon 的另一种基于插件的实现,能够通过扩展从 Spotify 流式传输。
- https://mopidy.com/ || mopidy + mopidy-spotifyAUR
- ncspot — 用 Rust 编写的跨平台 ncurses Spotify 客户端,灵感来自 ncmpc 等。
- Psst — 快速且多平台的 Spotify 客户端,用 Rust 编写,带有原生 GUI。
- Spicetify — 一个强大的命令行工具,用于使用主题、扩展等自定义您的 Spotify 客户端。
- Spot — 用于 GNOME 桌面的 Gtk/Rust 原生 Spotify 客户端。
- Spotifyd — 一个作为 UNIX 守护程序运行的开源 Spotify 客户端,它支持 Spotify Connect 协议,这使其显示为可以从官方客户端控制的设备。
- spotify-qt — 轻量级 Spotify 客户端,使用 C++ 中的 Qt 编写。
- spotify-player — spotify-tui 的更新且功能更丰富的替代品。
- spotify-tui — 一个用 Rust 编写的终端 Spotify 客户端,自 2021-11-17 以来未见更新。
- Tizonia — 用于 Linux 的命令行云音乐播放器,支持 Spotify、Google Play 音乐、YouTube、SoundCloud、Plex 服务器和 Chromecast 设备。
免费订阅
- Spotube — 开源 Spotify-YouTube 客户端,不需要高级版,也不使用 Electron:它从 Spotify 获取数据,并从 YouTube 播放音频。
技巧与窍门
限制存储大小
Spotify 会自动管理缓存的存储大小,但是,人们可能希望强制限制大小,以防止 文件系统 被填满。
追加 storage.size
(以 MB 为单位测量)到 /home/user/.config/spotify/prefs
,例如 3072 MB 的存储大小
~/.config/spotify/prefs
storage.size=3072
全局媒体热键
对于键盘无法自动控制 Spotify 的环境,官方 Linux 客户端支持媒体键,如 XF86AudioPlay
。例如,我们可以使用 xbindkeys 来捕获全局媒体按键,然后使用以下方法之一将其转发到 Spotify。如果您使用 xbindkeys,请确保在安装和密钥配置后重新启动 Spotify,否则密钥事件将无法正确捕获。
MPRIS
Spotify 客户端实现了 MPRIS D-Bus 接口,该接口允许外部控制。
禁用音轨通知
在 0.9.10 版本之后,默认情况下启用了音轨更改通知。它们可能非常具有侵入性。要禁用它们,请使用 --ui.track_notifications_enabled=false
选项启动 Spotify,或添加
~/.config/spotify/Users/spotify login-user/prefs
ui.track_notifications_enabled=false
或者,您可以通过客户端的设置禁用音轨通知:禁用歌曲更改时显示桌面通知。
显示音轨通知
playerctl 提供了一个库,您可以将其与 python-gobject 和通知守护程序(如 dunst)一起使用,以在音轨更改时在通知中显示艺术家和标题。
#!/usr/bin/env python3 import gi gi.require_version('Playerctl', '2.0') from gi.repository import Playerctl, GLib from subprocess import Popen player = Playerctl.Player() def on_track_change(player, e): track_info = '{artist} - {title}'.format(artist=player.get_artist(), title=player.get_title()) Popen(['notify-send', track_info]) player.connect('metadata', on_track_change) GLib.MainLoop().run()
跳过播放过多的电台曲目
playerctl
库的另一个用途是跳过在电台中播放过多的曲目,当您不一定想对这些曲目进行差评时,因为您可能希望稍后在该电台中再次听到它们。
#!/usr/bin/env python3 from gi.repository import Playerctl, GLib player = Playerctl.Player() played_out = ['Zu Fuss', 'Walk And Talk', 'Neuland'] def on_track_change(player, e): if player.get_title() in played_out: player.next() player.on('metadata', on_track_change) GLib.MainLoop().run()
静音广告
spotblock
spotblock-gitAUR 是一个资源高效的广告拦截器,作为 systemd 守护程序运行。
Spotify-AdKiller
spotify-adkiller-gitAUR 是阻止 Spotify 广告的另一种替代方案。
spotblock-rs
spotblock-rsAUR 是一个快速轻便的程序,用于使 Spotify 广告静音。它也适用于 PipeWire。
Hosts 文件
您也可以将以下行添加到您的 hosts 文件中以阻止 Spotify 中的广告
/etc/hosts
# Block spotify ads 127.0.0.1 media-match.com 127.0.0.1 adclick.g.doublecklick.net 127.0.0.1 www.googleadservices.com 127.0.0.1 open.spotify.com 127.0.0.1 pagead2.googlesyndication.com 127.0.0.1 desktop.spotify.com 127.0.0.1 googleads.g.doubleclick.net 127.0.0.1 pubads.g.doubleclick.net 127.0.0.1 audio2.spotify.com 127.0.0.1 www.omaze.com 127.0.0.1 omaze.com 127.0.0.1 bounceexchange.com # 127.0.0.1 spclient.wg.spotify.com 127.0.0.1 securepubads.g.doubleclick.net 127.0.0.1 8.126.154.104.bc.googleusercontent.com 127.0.0.1 104.154.126.8
远程控制
通过 SSH 发送命令
如果您在服务器上设置了 ssh,则可以使用以下命令从客户端向远程 Spotify 实例发送控件
$ ssh user@host yourcommand
其中 yourcommand 可以是您在服务器上安装的 spotifycmd,也可以是用于 Linux 版本的 dbus 脚本,如上所述。
通过 SSH 抓取 Spotify 窗口
除了使用 TeamViewer 或 VNC 抓取整个桌面以远程控制您的服务器之外,您还可以仅从服务器抓取 Spotify 窗口到您的客户端。
为此,您需要在服务器上配置 sshd,并在服务器和客户端上安装 x11vnc,并在客户端上安装 tigervnc。然后,您可以使用这些脚本来抓取完整的桌面或仅抓取 Spotify 窗口,这实际上使您获得类似于 MPD 的 GUI 客户端行为。
#!/bin/bash # vncget.sh if [[ $1 == all ]];then ssh -f -t -L 5900:localhost:5900 user@host "x11vnc -q -display :0 -auth .Xauthority" else ssh -f -t -L 5900:localhost:5900 user@host ".bin/vncgetspotify.sh" fi for i in {1..4}; do sleep 2 if vncviewer localhost:0; then break; fi done
#!/bin/bash # vncgetspotify.sh export DISPLAY=:0 id=$(wmctrl -lx | awk '/spotify.exe.Wine/ {print $1}') [[ -z $id ]] && id=$(wmctrl -lx | awk '/spotify.Spotify/ {print $1}') x11vnc -sid $id -display :0 -auth .Xauthority
您需要将第二个脚本复制到服务器上的 ~/.bin/vncgetspotify.sh,并将第一个脚本复制到客户端上的任何位置。
最后,要抓取 spotify 窗口,请在客户端上运行
$ sh vncget.sh
或者,对于整个桌面
$ sh vncget.sh all
HiDPI 模式
由于当前的 Spotify 版本不感知 DPI,因此可以使用终端命令指定界面缩放量
$ spotify --force-device-scale-factor=X
其中 X 是界面缩放量,例如 2。
可以将此更改添加到 spotify.desktop
文件中,以便在从桌面启动时应用缩放。
- 如果您使用 spotify-launcher,您可以使用配置文件
/etc/spotify-launcher.conf
或~/.config/spotify-launcher.conf
来设置标志。有关更多信息,请参阅 GitHub 页面。 - 如果您使用 spotifyAUR,您也可以将标志放在
~/.config/spotify-flags.conf
中。
为了确保文件在软件包更新时不会被覆盖,请将其复制到您的本地应用程序文件夹
$ cp /usr/share/applications/spotify.desktop ~/.local/share/applications/
现在编辑 ~/.local/share/applications/spotify.desktop
并添加 --force-device-scale-factor
选项
spotify.desktop
[Desktop Entry] Type=Application Name=Spotify GenericName=Music Player Icon=spotify-client TryExec=spotify Exec=spotify --force-device-scale-factor=2 --uri=%U Terminal=false MimeType=x-scheme-handler/spotify; Categories=Audio;Music;Player;AudioVideo; StartupWMClass=spotify
您可能需要重新启动桌面管理器,这些覆盖更改才会生效。
在 Wayland 下运行
在 Xwayland 下运行 Spotify 可能会导致一些怪癖,尤其是在混合屏幕尺寸和方向的情况下。我们可以传递一些标志以使 Spotify 在 Wayland 模式下运行:--enable-features=UseOzonePlatform --ozone-platform=wayland
可以将这些更改添加到 spotify.desktop
文件中,以便在从桌面启动时以 Wayland 模式启动。
- 如果您使用 spotify-launcher,您可以使用配置文件
/etc/spotify-launcher.conf
或~/.config/spotify-launcher.conf
来设置标志。有关更多信息,请参阅 GitHub 页面。 - 如果您使用 spotifyAUR,您可以将标志放在
~/.config/spotify-flags.conf
中。每行一个标志。
请参阅上一节 #HiDPI 模式 了解详细信息。
禁用 GPU
为了防止 Spotify 使用您的 GPU 进行硬件视频加速并减少 VRAM 使用率,请使用 --disable-gpu
标志启动 Spotify。
故障排除
桌面环境警报(哔哔声)使 Spotify 静音
注释掉 PulseAudio 配置文件中的 "module-role-cork",使其不再加载。
或使用以下命令临时卸载它
$ pactl unload-module module-role-cork
使用 DWM 的 Spotify Linux 时图像闪烁和渲染不当
将 spotify 作为浮动窗口启动。
您可以将此规则添加到 config.h
中的规则数组中
{ "Spotify", NULL, NULL, 2, True, -1 },
这将告诉 dwm 将 spotify 作为与标签 "2" 关联的浮动窗口启动,无论您处于何种窗口模式。重新编译并安装 dwm 以应用您的新设置。
搜索、浏览或电台损坏
- Spotify 错误报告,关于非英语语言环境
如果浏览等各种选项卡仅显示空白屏幕,则搜索字段似乎没有任何作用,或者电台页面已损坏(启动时卡住且对输入无响应),则您可能正在使用自定义语言环境。
尝试在启动 Spotify 之前将环境变量 LC_NUMERIC
设置为 en_US.utf8
。
死锁 GUI 线程
在平铺窗口管理器(例如 Awesome)下,双击新歌曲或播放列表时可能会发生。编辑文件 ~/.config/spotify/Users/spotify login-user/prefs
以添加或更改以下内容
ui.track_notifications_enabled=false
重新启动 Spotify。这将尝试禁用歌曲通知,这似乎是问题的原因(缺少接收它们的通知守护程序会导致 UI 线程挂起)。请注意,此问题似乎存在多种原因,并且此特定修复仅适用于 Spotify 客户端、i3 和 Awesome 的选定版本,并且可能是 Debian 和 Ubuntu 用户报告此问题的其他根本原因。在 Spotify 0.9.17.1.g9b85d436 和 Awesome 3.4.15 以及 i3-gaps 4.13-2 和 Spotify 1.0.64.407.g9bd02c2d 中观察到。
ui.track_notifications_enabled=false
似乎被忽略了。另一方面,一些用户报告说,从 Awesome 3.5.6 开始,不再遇到死锁。死锁可能是由 Awesome 调用的脚本引起的,这些脚本依赖于有缺陷的 spotify dbus 属性。请参阅 https://github.com/acrisci/playerctl/issues/20。注意: 此问题有多种原因,因此在研究此问题时,请跟踪您更改的内容。使用其他方案和修复程序更新此部分。
专辑封面和图像丢失,显示为正方形
退出 Spotify,然后打开 Spotify 首选项 ~/.config/spotify/prefs
将 @https 更改为 @http
network.proxy.addr="your-proxy.com:80@http" network.proxy.mode=2
请参阅原始论坛帖子 此处。
Spotify 未检测到本地网络上的其他设备
如果有防火墙,请打开 UDP 和 TCP 的端口 57621。如果您使用 iptables 简单有状态防火墙的变体,则以下操作应该可以
iptables -A TCP -p tcp --dport 57621 -j ACCEPT -m comment --comment spotify iptables -A UDP -p udp --dport 57621 -j ACCEPT -m comment --comment spotify
也可以将源和目标限制为本地网络。
如果您使用 Spotify Connect 在无线扬声器或 AVR 上播放音乐,则需要为 Spotify 的 mDNS 查找配置防火墙。遗憾的是,它使用随机的非特权端口 [3],这使得这些防火墙规则相当糟糕。幸运的是,您可以将规则限制为源端口 1900 或 5353。
iptables -A UDP -p udp --sport 1900 --dport 1025:65535 -j ACCEPT -m comment --comment spotify iptables -A UDP -p udp --sport 5353 --dport 1025:65535 -j ACCEPT -m comment --comment spotify
如果使用 MusicCast 进行流式传输,您还需要确保所有防火墙(包括路由器防火墙)都允许来自 MusicCast 扬声器/AVR 的 IGMP 组播数据包发送到 224.0.0.22(允许使用 IP 选项)。
如果您无法检测到其他 Linux 客户端,这可能是由于 Spotify 中与启动实例的用户名相关的错误。即使在不同的机器上,Spotify 也不会检测到具有相同 $HOME
环境变量的其他实例。要规避此问题,请创建专用用户,或使用不同的 $HOME
启动 Spotify。以下是使用您的主目录并且仍然能够检测到其他设备的解决方法
$ ln -s $HOME ~/.spotify_fakehome_$HOSTNAME $ HOME=$HOME/.spotify_fakehome_$HOSTNAME spotify &
使用深色主题时搜索栏文本不可见
搜索栏中的文本似乎被硬编码为白色,这使得在使用深色 Qt 主题时不可见。要解决此问题,您需要进行覆盖。
首先在您的帐户有权读取/写入的位置(例如您的主文件夹)创建一个 css 文件。将其命名为您喜欢的任何名称(例如 spotify-override.css)。
打开新创建的 css 文件并添加以下内容
QLineEdit { color: #000 }
保存文件并退出。接下来,您需要将以下内容添加到 Spotify 启动器的末尾(将路径替换为您的 css 文件的实际路径)
-stylesheet=/home/user/spotify-override.css
因此,您的完整启动路径应如下所示
/usr/share/spotify/spotify-client/spotify -stylesheet=/home/user/spotify-override.css
不遵守窗口管理器规则
尝试应用特定规则(例如在确定的工作区中启动或在启动时最大化)的窗口管理器无效,因为 Spotify 在创建窗口之前未设置 WM_CLASS 属性,这违反了 ICCCM 规范。一种解决方案是使用 spotifywm-gitAUR。
GUI 在音乐播放时挂起
此外,上一个和下一个音轨按钮的操作延迟为 10-40 秒。Spotify 默认尝试发送有关下一个音轨的通知,如果您没有安装通知守护程序,Spotify 的 GUI 将挂起。
解决方案是在设置中禁用通知,或从 桌面通知 安装通知守护程序。
Spotify 占据系统面板上的整个屏幕,并且其边框消失
如果您遇到窗口边框消失且 GUI 进入全屏但您无法拖动窗口或更改其大小的问题,请编辑默认情况下位于以下位置的首选项
/home/yourusername/.config/Spotify/Users/yourusername-user/prefs
app.window.position.width=1366 app.window.position.height=768
关闭 Spotify,删除上面显示的两行,保存并再次运行 Spotify。
无法在 Wayland 中打开设置
使用 Wayland 时,单击“设置”按钮没有任何反应。改用键盘即可(箭头键和 Enter 键)。请参阅 [4]
启动时崩溃
如果您在启动时遇到崩溃并出现以下错误消息
[NNN:FATAL:gpu_data_manager_impl_private.cc(439)] GPU process isn't usable. Goodbye
尝试使用 -no-zygote
标志运行 spotify
。
使用 VPN 时 Spotify 的互联网连接受限或没有互联网连接
较新版本的 Spotify(在版本 ~1.1.10 之后注意到)使用 NetworkManager 的互联网连接检测来确定 Spotify 是否能够播放歌曲甚至登录。当使用 VPN 服务时,Network Manager 可能无法正确识别互联网连接,并显示“连接受限”。请参阅 NetworkManager#检查连接 以获取可能的解决方案。
客户端缓慢或卡顿
如果 Spotify 异常缓慢,常见的罪魁祸首通常是缓存文件已损坏。关闭 Spotify 客户端后,运行以下命令
$ rm -rf ~/.cache/spotify/Browser/* ~/.cache/spotify/Data/* ~/.cache/spotify/Storage/*
- 确保仅删除文件夹内的文件,而不删除文件夹本身。
- 如果这不能解决问题,请尝试删除
~/.config/spotify
并重新安装。
/usr/lib/libcurl-gnutls.so.4 错误
如果您遇到错误
spotify: /usr/lib/libcurl-gnutls.so.4: no version information available (required by spotify)
删除 ~/.cache/spotify
。
参见
- Linux 版 Spotify — Spotify 的 Linux 客户端主页