Spotify

来自 ArchWiki

Spotify 是一个数字音乐流媒体服务,采用免费增值商业模式。本文主要介绍半官方的、专有的 Linux 版 Spotify 客户端,该客户端由 Spotify 工程师在业余时间开发,Spotify 不提供积极支持。[1] 此外,还有一个 在线播放器 和许多开源的 第三方客户端

安装

安装 spotify-launcher。此软件包管理您主目录中的每个用户安装,允许 Spotify 独立于 pacman 自行更新(类似于 Spotify 在其他操作系统上的自更新方式)。

如果您希望使用 pacman 管理 Spotify 更新,请改用 spotifyAUR,它重新打包了 Linux 版 Spotify。如果您需要添加和播放本地文件,您还需要额外安装 zenityffmpeg4.4

第三方客户端

本文或本节的事实准确性 存疑。

原因: 基于 librespot 的第三方客户端可能无法正常工作,原因是 Spotify 身份验证 API 发生了更改。请参阅 该工单。(在 Talk:Spotify#Spotify 身份验证 api 中讨论)

高级订阅

注意: 除非另有说明,否则此处列出的所有客户端都要求拥有高级帐户才能从 Spotify 流式传输。
  • Librespot — 一个用于 Spotify 的开源客户端库,它使应用程序能够使用 Spotify 的服务(流式传输),而无需官方闭源的 libspotify
https://github.com/librespot-org/librespot || librespotAUR
  • MopidyMusic Player Daemon 的另一种基于插件的实现,能够通过扩展从 Spotify 流式传输。
https://mopidy.com/ || mopidy + mopidy-spotifyAUR
  • ncspot — 用 Rust 编写的跨平台 ncurses Spotify 客户端,灵感来自 ncmpc 等。
https://github.com/hrkfdn/ncspot || ncspot
  • Psst — 快速且多平台的 Spotify 客户端,用 Rust 编写,带有原生 GUI。
https://github.com/jpochyla/psst || psst-gitAUR
  • Spicetify — 一个强大的命令行工具,用于使用主题、扩展等自定义您的 Spotify 客户端。
https://spicetify.app/ || spicetify-cliAUR
  • Spot — 用于 GNOME 桌面的 Gtk/Rust 原生 Spotify 客户端。
https://github.com/xou816/spot || spot-clientAUR
  • Spotifyd — 一个作为 UNIX 守护程序运行的开源 Spotify 客户端,它支持 Spotify Connect 协议,这使其显示为可以从官方客户端控制的设备。
https://github.com/Spotifyd/spotifyd || spotifyd
  • spotify-qt — 轻量级 Spotify 客户端,使用 C++ 中的 Qt 编写。
https://github.com/kraxarn/spotify-qt || spotify-qtAUR
  • spotify-player — spotify-tui 的更新且功能更丰富的替代品。
https://github.com/aome510/spotify-player || spotify-player
  • spotify-tui — 一个用 Rust 编写的终端 Spotify 客户端,自 2021-11-17 以来未见更新。
https://github.com/Rigellute/spotify-tui || spotify-tuiAUR
  • Tizonia — 用于 Linux 的命令行云音乐播放器,支持 Spotify、Google Play 音乐、YouTube、SoundCloud、Plex 服务器和 Chromecast 设备。
https://tizonia.org/docs/spotify/ || tizonia-all-gitAUR

免费订阅

  • Spotube — 开源 Spotify-YouTube 客户端,不需要高级版,也不使用 Electron:它从 Spotify 获取数据,并从 YouTube 播放音频。
https://spotube.krtirtho.dev/ || spotubeAUR

技巧与窍门

限制存储大小

Spotify 会自动管理缓存的存储大小,但是,人们可能希望强制限制大小,以防止 文件系统 被填满。

追加 storage.size (以 MB 为单位测量)到 /home/user/.config/spotify/prefs,例如 3072 MB 的存储大小

~/.config/spotify/prefs
storage.size=3072

全局媒体热键

提示: 许多桌面环境都带有键盘快捷键,这些快捷键可以与 Spotify 客户端开箱即用,例如在 Cinnamon 下(首选项 -> 键盘 -> 快捷键 -> 声音和媒体),已设置多个默认绑定来控制播放器,并且可以通过按首选键轻松更改这些绑定。

对于键盘无法自动控制 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

或者,您可以通过客户端的设置禁用音轨通知:禁用歌曲更改时显示桌面通知

显示音轨通知

本文或本节是与 MPRIS#Playerctl 合并的候选对象。

注意: 不特定于 Spotify。(在 Talk:Spotify 中讨论)

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

跳过播放过多的电台曲目

本文或本节是与 MPRIS#Playerctl 合并的候选对象。

注意: 不特定于 Spotify。(在 Talk:Spotify 中讨论)

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

静音广告

警告: Spotify 不支持使广告静音,并且可能会导致临时封禁 [2]

spotblock

spotblock-gitAUR 是一个资源高效的广告拦截器,作为 systemd 守护程序运行。

Spotify-AdKiller

spotify-adkiller-gitAUR 是阻止 Spotify 广告的另一种替代方案。

spotblock-rs

spotblock-rsAUR 是一个快速轻便的程序,用于使 Spotify 广告静音。它也适用于 PipeWire

Hosts 文件

本文或本节是与 Pi-hole 合并的候选对象。

注意: 不特定于 Spotify。(在 Talk:Spotify 中讨论)

您也可以将以下行添加到您的 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
注意: spclient.wg.spotify.com 现在似乎阻止了电台和每日混合,以及最近播放的歌曲。

远程控制

通过 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 中观察到。

注意: 从 Spotify 1.0.17.75-2 开始,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

请参阅原始论坛帖子 此处

注意: 从 1.0.17 开始,看起来将 HTTPS 替换为上面建议的 HTTP 可能会导致完全没有连接。如果发生这种情况,另一种解决方案是在 GUI 中设置“无代理”,并使用 proxychains-ng 强制所有来自 Spotify 的 TCP 连接通过代理。即使使用拒绝端口 80 上连接(并且仅适用于端口 443)的 HTTP 代理,这也能可靠地工作。

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

参见