繁体   English   中英

`dbus-send` 和 Python 的 `dbus` 使用 Spotify 之间的差异

[英]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
  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 的消息会是相同的。 有谁知道差异可能来自哪里?

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设置我自己的监听器来检查哪些数据被发回。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM