D-Bus Abfrage von Player Metadaten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
synapsenstau
User
Beiträge: 11
Registriert: Freitag 6. März 2015, 18:39
Wohnort: Südharz

Moin,

ich bin absoluter Python neuling und verzweifele gerade an einer D-Bus Abfrage. Ich lese gerade ein Python Buch und brauche praktische erfahrungen. Zu diesem zwecken will ich ein vorhandenes Shell Script nach Python portieren.
Dafür will ich die Metadaten vom Vlc Player abfragen. In der Shell mache ich das mit

Code: Alles auswählen

qdbus org.mpris.MediaPlayer2.vlc /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Metadata
language: English
mpris:length: 481753425
mpris:trackid: 
vlc:length: 481753
vlc:publisher: 9
vlc:time: 481
xesam:album: Darksiders
xesam:artist: Lupin
...
Egal was ich gerade verusche, habe ich gerade den Eindruck als wenn Fehlermeldungen exponentiell ansteigen könnten.

Vielleicht kann mir ja jemand einen Tipp geben zum Einstieg in die Python Welt. Ich wäre euch sehr dankbar.
BlackJack

@synapsenstau: Mit welcher Anbindung versuchst Du das denn von Python aus? Das `dbus`-Modul und die Dokumentation von Freedesktop.org zu D-Bus allgemein und dem Modul im besonderen sollten da doch eigentlich weiterhelfen. Und ein Monitor/Debugger wie ``d-feet`` ist ganz nützlich.
synapsenstau
User
Beiträge: 11
Registriert: Freitag 6. März 2015, 18:39
Wohnort: Südharz

Jep, mit d-feet habe ich die tage schon mir die qdbus Zeile zusammengebastelt.
Zusammengesucht habe ich mir die infos dort: http://dbus.freedesktop.org/doc/dbus-py ... orial.html.

Code: Alles auswählen

import dbus

bus = dbus.SessionBus()
vlc_data = bus.get_object('org.mpris.MediaPlayer2.vlc','/org/mpris/MediaPlayer2')
metadata = vlc_data.get.Metadata(dbus_interface='org.mpris.MediaPlayer2.Player.Metadata')
print(metadata)
gibt als Fehler aus:

Code: Alles auswählen

metadata = vlc_data.get.Metadata(dbus_interface='org.mpris.MediaPlayer2.Player.Metadata')
AttributeError: '_DeferredMethod' object has no attribute 'Metadata'
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Mal so ins Blaue gerate: Ich würde vermuten, dass es wohl eher ``getMetadata`` und nicht ``get.Metadata`` heißen sollte.
Das Leben ist wie ein Tennisball.
BlackJack

Ich denke das ins Blaue raten ist das Problem hier. Es gibt weder `get` noch `getMetadata`. Es gibt eine `Get`-Methode. Es gibt kein Interface das 'org.mpris.MediaPlayer2.Player.Metadata' heisst. Die Interfaces werden in ``d-feet`` doch aufgelistet. Und die `Get`-Methode ist in der D-Bus-Dokumentation dokumentiert das sie als erstes Argument einen Interfacenamen und als zweites Argument den Namen des Properties haben möchte: http://dbus.freedesktop.org/doc/dbus-sp ... properties
synapsenstau
User
Beiträge: 11
Registriert: Freitag 6. März 2015, 18:39
Wohnort: Südharz

Irgendwie verwirrt mich das alles ein weing. Ein solches interface habe ich doch oder bin ich da auf dem Holzweg? Das Blaue ist doch die Metadaten.

Bild
BlackJack

@synapsenstau: Ja das ausgewählte sind die Metadaten, aber wo siehst Du ein Interface 'org.mpris.MediaPlayer2.Player.Metadata'? Ich sehe da nur eines das 'org.mpris.MediaPlayer2.Player' heisst und ein Property mit dem Namen 'Metadata' hat. Und durch das Interface 'org.freedesktop.DBus.Properties' hat das '/org/mpris/MediaPlayer2'-Objekt eine 'Get'-Methode mit der man dieses Property abfragen kann.
synapsenstau
User
Beiträge: 11
Registriert: Freitag 6. März 2015, 18:39
Wohnort: Südharz

Ich danke dir für deine hilfe. Leider ist das wohl noch zu kompliziert für mich als Anfänger (verstehe leider nur Bahnhof). Ich habe eine andere Lösung für das problem gefunden (os.popen("qdbus.....")), welche funktioniert und mir das liefert was ich haben will.

Vielleicht zu einem späteren Zeitpunkt werde ich es noch mal mit einer direkten dbus Abfrage probieren.
BlackJack

@synapsenstau: In der Dokumentation zu `os.popen()` steht eine rote Textbox mit dem Hinweis das diese Funktion nicht mehr benutzt werden sollte und dafür das `subprocess`-Modul eingeführt wurde.
synapsenstau
User
Beiträge: 11
Registriert: Freitag 6. März 2015, 18:39
Wohnort: Südharz

Danke für den Hinweis. Lese gerade hier[1] und werde es wohl umstricken.

[1] https://docs.python.org/3/library/subprocess.html
Antworten