使用Spotify时“dbussend”和Python的“dbus”之间的差异

2024-06-01 01:57:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我无法在Python中重新创建dbus-send命令dbus-send执行预期的、正在运行的操作:

#!/bin/bash
dbus-send \
    --type=method_call \
    --dest=org.mpris.MediaPlayer2.spotify \
    /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.OpenUri \
    string:spotify:playlist:74sUjcvpGfdOvCHvgzNEDO
  1. 将Spotify播放器切换为查看请求的播放列表
  2. 开始播放播放列表中的第一首歌曲

在Python中重新创建时,最奇怪的事情发生了——它工作了一半。它会将Spotify播放器更改为播放列表,但不会播放第一首歌曲(并且会破坏播放器)。从QDbusViewer调试应用程序手动运行调用时也会发生这种情况

在一个简单的python示例中,这看起来像:

#!/usr/bin/python3

import dbus

session_bus = dbus.SessionBus()
spotify = session_bus.get_object("org.mpris.MediaPlayer2.spotify", "/org/mpris/MediaPlayer2")
spotify_iface = dbus.Interface(spotify, dbus_interface='org.mpris.MediaPlayer2.Player')
spotify_iface.OpenUri("string:spotify:playlist:74sUjcvpGfdOvCHvgzNEDO")
  1. 将Spotify播放器切换为查看播放列表
  2. 播放歌曲的音频停止,但显示器仍显示正在播放
  3. 无法通过播放器中的播放/暂停/下一步按钮控制当前歌曲
  4. 未引发任何异常,退出0
  5. PlayPause()这样的其他方法调用似乎如预期的那样工作

这对我来说非常奇怪,因为我本以为发送到DBus的消息是相同的。有人知道差异可能来自哪里吗


Tags: orgsendstringbin播放器播放列表playlistspotify
2条回答

解决了

问题归结为一个小的语法错误:

dbus-send [...] string:spotify:playlist:74sUjcvpGfdOvCHvgzNEDO

dbussend中需要前缀string,以便它知道参数的数据类型

然而,在Python中,它添加了对dbus提供程序的一些反射,为我们解决这一问题:

spotify.OpenUri('spotify:playlist:74sUjcvpGfdOvCHvgzNEDO')

我们可以去掉前面的string:。该死

我通过使用https://github.com/LEW21/pydbus/blob/master/doc/tutorial.rst#exporting-own-objects检查返回的数据来设置自己的侦听器

https://www.freedesktop.org/wiki/Software/DBusBindings/的底部,它建议dbus python不应用于新项目

对于pydbus,您的示例如下所示:

import pydbus
bus = pydbus.SessionBus()
spotify = bus.get('org.mpris.MediaPlayer2.spotify', '/org/mpris/MediaPlayer2')
spotify.OpenUri('spotify:playlist:74sUjcvpGfdOvCHvgzNEDO')

pydbus还有一些更好的内省功能,因此您可以通过print(dir(spotify))查看所有可用的方法和属性

相关问题 更多 >