我實際上想通過一個視窗顯示有關當前正在播放的媒體或歌曲的資訊,作為包含藝術品和歌曲名稱等的彈出視窗。我讀到了
PlaybackStatus
每當媒體播放或停止時都會發出信號。我將如何連接到該信號,我閱讀了有關 dbus 的資訊并知道可以使用該org.freedesktop.DBus.Properties介面訪問它。我最近開始使用 PyGtk 進行開發,所以我不知道該怎么做?
謝謝。
uj5u.com熱心網友回復:
在使用 Python 執行此操作之前,我發現在命令列上進行試驗以查看預期值是很有用的。這可以通過該busctl工具來完成。
媒體播放器位于會話(或用戶)總線上。
$ busctl --user list | grep -i MediaPlayer2
org.mpris.MediaPlayer2.firefox.instance62995 62995 GeckoMain usera :1.99 user@1000.service - -
我可以使用服務的名稱來查找 D-Bus 樹中的物件:
$ busctl --user tree org.mpris.MediaPlayer2.firefox.instance62995
└─/org
└─/org/mpris
└─/org/mpris/MediaPlayer2
與物件name可以object path自省
$ busctl --user introspect org.mpris.MediaPlayer2.firefox.instance62995 /org/mpris/MediaPlayer2
NAME TYPE SIGNATURE RESULT/VALUE >
org.freedesktop.DBus.Introspectable interface - - >
.Introspect method - s >
org.freedesktop.DBus.Peer interface - - >
.GetMachineId method - s >
.Ping method - - >
org.freedesktop.DBus.Properties interface - - >
.Get method ss v >
.GetAll method s a{sv} >
.Set method ssv - >
.PropertiesChanged signal sa{sv}as - >
org.mpris.MediaPlayer2 interface - - >
.Quit method - - >
.Raise method - - >
.CanQuit property b false >
.CanRaise property b true >
.DesktopEntry property s "firefox" >
.HasTrackList property b false >
.Identity property s "Mozilla Firefox" >
.SupportedMimeTypes property as 0 >
.SupportedUriSchemes property as 0 >
org.mpris.MediaPlayer2.Player interface - - >
.Next method - - >
.OpenUri method s - >
.Pause method - - >
.Play method - - >
.PlayPause method - - >
.Previous method - - >
.Seek method x - >
.SetPosition method ox - >
.Stop method - - >
.CanControl property b true >
.CanGoNext property b false >
.CanGoPrevious property b false >
.CanPause property b true >
.CanPlay property b true >
.CanSeek property b false >
.MaximumRate property d - >
.Metadata property a{sv} 5 "mpris:trackid" o "/org/>
.MinimumRate property d - >
.PlaybackStatus property s "Paused" >
.Position property x - >
.Rate property d - >
.Volume property d - >
.Seeked signal x - >
當您想使用 Gtk 時,使用https://pygobject.readthedocs.io/en/latest/中的 D-Bus 系結似乎是明智的
它主要是需要的DBusProxy。
帶有幾個用于播放狀態和藝術家資訊標簽的視窗示例可能如下所示:
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gio, Gtk
PLAYER_IFACE = 'org.mpris.MediaPlayer2.Player'
class MainApp(Gtk.Window):
def __init__(self):
super().__init__(title="Player Status")
self.box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)
self.add(self.box)
self.lbl_status = Gtk.Label(label='Status Here')
self.box.pack_start(self.lbl_status, True, True, 0)
self.lbl_artist = Gtk.Label(label='Artist Here')
self.box.pack_start(self.lbl_artist, True, True, 0)
def update_label(self, proxy, changed_props, invalidated_props):
props = changed_props.unpack()
print(props)
status = props.get('PlaybackStatus')
artist = props.get('Metadata', {}).get('xesam:title')
if status:
self.lbl_status.set_text(status)
if artist:
self.lbl_artist.set_text(artist)
def find_player():
"""
Find the first `org.mpris.MediaPlayer2` name in list
"""
names = Gio.DBusProxy.new_for_bus_sync(
bus_type=Gio.BusType.SESSION,
flags=Gio.DBusProxyFlags.NONE,
info=None,
name='org.freedesktop.DBus',
object_path='/org/freedesktop/DBus',
interface_name='org.freedesktop.DBus',
cancellable=None).ListNames()
for name in names:
if name.startswith('org.mpris.MediaPlayer2'):
return name
def player_proxy(media_name):
"""
Provide proxy for comfortable and pythonic method calls
"""
return Gio.DBusProxy.new_for_bus_sync(
bus_type=Gio.BusType.SESSION,
flags=Gio.DBusProxyFlags.NONE,
info=None,
name=media_name,
object_path='/org/mpris/MediaPlayer2',
interface_name=PLAYER_IFACE,
cancellable=None)
if __name__ == "__main__":
print("running application")
app = MainApp()
player_name = find_player()
player = player_proxy(player_name)
# Connect signal to callback
player.connect('g-properties-changed', app.update_label)
app.show_all()
Gtk.main()
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/414778.html
標籤:
