获取Spotify当前播放的曲目

7 投票
2 回答
11902 浏览
提问于 2025-05-10 23:12

编辑:让我们来澄清一下这一切。

我正在写一个Python脚本,想让它告诉我Spotify当前正在播放的歌曲。

我试着找一些可以帮忙的库,但没有找到任何还在维护并且能用的库。我也查看了Spotify的网页API,但它没有提供获取这些信息的方法。

我找到的唯一可能的解决办法是获取我Spotify(桌面应用)窗口的标题。但到目前为止,我还没能做到这一点。

所以基本上,我想问的是有没有人知道:

  • 如何使用我已经尝试的方法(从程序中获取窗口标题),无论是用纯Python还是通过中间的shell脚本。

    或者

  • 有没有其他方法可以从Spotify的桌面应用或网页客户端提取这些信息。


原始帖子:

我在考虑为Linux环境制作一个Python状态栏,没什么花哨的,就是一个适合我自己使用的脚本。我现在想做的是显示Spotify当前播放的曲目(也就是艺术家和标题)。

在他们的官方网页API中似乎没有这样的功能。我也没有找到任何第三方库可以做到这一点。我找到的大多数库自从Spotify发布了他们当前的API后就不再维护,或者是基于那个API,但不能满足我的需求。

我还在这里读了一堆类似的问题,大多数都没有答案,或者是过时的解决方案。

我考虑过获取窗口标题,因为它确实显示了我需要的信息。但这似乎非常复杂,我也很难实现。我试着在我的脚本中运行Linux命令xdotools和xprop的组合来获取它。

值得一提的是,由于我已经在使用psutil库获取其他信息,我已经可以访问Spotify的进程ID(PID)。

有没有什么主意可以让我做到这一点?

如果我的方法是你能想到的唯一方法,有没有什么建议可以让我实际实现它?

非常感谢你的帮助。

相关文章:

  • 暂无相关问题
暂无标签

2 个回答

3

对于Windows用户:

这个库可以在GitHub上找到,链接是:https://github.com/XanderMJ/spotilib。请注意,这个项目还在不断完善中。

只需要把文件复制到你的Python/Lib目录下就可以了。

import spotilib
spotilib.artist() #returns the artist of the current playing song
spotilib.song() #returns the song title of the current playing song

spotilib.artist()这个函数只会返回第一个艺术家。我开始着手开发另一个库spotimeta.py来解决这个问题。不过,目前这个库还没有完全做好。

import spotimeta
spotimeta.artists() #returns a list of all the collaborating artists of the track

如果出现错误,spotimeta.artists()这个函数也只会返回第一个艺术家(这个艺术家是通过spotilib.artist()找到的)。

24

在Linux上,Spotify客户端使用了一种叫做MPRIS的接口,这个接口的全名是媒体播放器远程接口规范。

http://specifications.freedesktop.org/mpris-spec/latest/index.html

你可以通过Python来获取歌曲标题(以及其他一些信息),方法如下:

import dbus
session_bus = dbus.SessionBus()
spotify_bus = session_bus.get_object("org.mpris.MediaPlayer2.spotify",
                                     "/org/mpris/MediaPlayer2")
spotify_properties = dbus.Interface(spotify_bus,
                                    "org.freedesktop.DBus.Properties")
metadata = spotify_properties.Get("org.mpris.MediaPlayer2.Player", "Metadata")

# The property Metadata behaves like a python dict
for key, value in metadata.items():
    print(key, value)

# To just print the title
print(metadata['xesam:title'])

撰写回答