簡體   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