使用 Spotify 时,`dbus-send` 和 Python 的 `dbus` 之间存在差异
Discrepancy between `dbus-send` and Python's `dbus` using Spotify
我无法在 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
- 将 Spotify 播放器切换为查看请求的播放列表
- 开始播放播放列表中的第一首歌曲
在 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")
- 将 Spotify 播放器改为查看播放列表
- 播放歌曲的声音停止,但显示仍然显示正在播放
- 无法通过播放器中的 play/pause/next 按钮控制当前歌曲
- 没有抛出异常,退出0
- 其他方法调用如
PlayPause()
似乎按预期工作
这对我来说非常奇怪,因为我原以为发送到 DBus 的消息应该是相同的。有谁知道差异可能来自哪里?
在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))
查看所有可用的方法和属性。
已解决!
问题归结为一个小的语法错误:
dbus-send [...] string:spotify:playlist:74sUjcvpGfdOvCHvgzNEDO
dbus-send 中需要前缀 string
,因此它知道参数的数据类型。
然而,在 Python 中,它通过对 dbus 提供程序的一些反射来为我们添加照顾:
spotify.OpenUri('spotify:playlist:74sUjcvpGfdOvCHvgzNEDO')
我们可以删除前导 string:
。该死的!
我通过使用 https://github.com/LEW21/pydbus/blob/master/doc/tutorial.rst#exporting-own-objects 设置自己的侦听器来检查发回的数据。
我无法在 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
- 将 Spotify 播放器切换为查看请求的播放列表
- 开始播放播放列表中的第一首歌曲
在 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")
- 将 Spotify 播放器改为查看播放列表
- 播放歌曲的声音停止,但显示仍然显示正在播放
- 无法通过播放器中的 play/pause/next 按钮控制当前歌曲
- 没有抛出异常,退出0
- 其他方法调用如
PlayPause()
似乎按预期工作
这对我来说非常奇怪,因为我原以为发送到 DBus 的消息应该是相同的。有谁知道差异可能来自哪里?
在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))
查看所有可用的方法和属性。
已解决!
问题归结为一个小的语法错误:
dbus-send [...] string:spotify:playlist:74sUjcvpGfdOvCHvgzNEDO
dbus-send 中需要前缀 string
,因此它知道参数的数据类型。
然而,在 Python 中,它通过对 dbus 提供程序的一些反射来为我们添加照顾:
spotify.OpenUri('spotify:playlist:74sUjcvpGfdOvCHvgzNEDO')
我们可以删除前导 string:
。该死的!
我通过使用 https://github.com/LEW21/pydbus/blob/master/doc/tutorial.rst#exporting-own-objects 设置自己的侦听器来检查发回的数据。