Xchat announce Script | Player = Minirok

Du hast eine Idee für ein Projekt?
Antworten
hypnotoad
User
Beiträge: 5
Registriert: Dienstag 28. September 2010, 18:23

hi,
ich hätte gern ein Xchat announce script für Minirok.
Ich hab das hier gefunden http://dev.jmoiron.net/xchat/#mp3 und würde das gern zusammen mit Minirok nutzen.
Minirok nutzt die dbus bindings, ich hab das Script entsprechend erweitert http://www.python-forum.de/pastebin.php?mode=view&s=72 (Zeile 686).
Die Steuerung (also Pause, Play, Next etc.) von Minirok aus Xchat heraus funktioniert, das Anzeigen der aktuell gespielten Traks leider nicht.
Ich bekomme folgende Fehlermeldung:
detected minirok is running
Traceback (most recent call last):
File "/home/hypno/.xchat2/pymp_with_minirok.py", line 881, in dispatch
try: announce()
File "/home/hypno/.xchat2/pymp_with_minirok.py", line 836, in announce
xchat.command('me is listening to: %s' % (current_player()))
File "/home/hypno/.xchat2/pymp_with_minirok.py", line 294, in __str__
info = self.get_info()
File "/home/hypno/.xchat2/pymp_with_minirok.py", line 727, in get_info
'Artist' : unicode(info_dict['artist']).encode('utf-8'),
TypeError: string indices must be integers
Falls jemand n Blick in das dbus Modul von Minirok werfen will >http://www.python-forum.de/pastebin.php?mode=view&s=73
oder hier die Homepage von Minirok > http://chistera.yi.org/~dato/code/minirok/

Vielleicht hat ja jemand von euch n Tipp für mich.
BlackJack

Die Ausnahme bekommt man, wenn man versucht etwas anderes als ganze Zahlen als Indizes in Zeichenketten zu verwenden:

Code: Alles auswählen

In [10]: 'spam'['eggs']
---------------------------------------------------------------------------
<type 'exceptions.TypeError'>             Traceback (most recent call last)

/home/bj/<ipython console> in <module>()

<type 'exceptions.TypeError'>: string indices must be integers
Dein `info_dict` ist anscheinend nicht das was Du denkst.
hypnotoad
User
Beiträge: 5
Registriert: Dienstag 28. September 2010, 18:23

Ich hab jetzt vermutet das der das Dictionary erst gar nicht erstellen kann anhand der dbus Abfrage, aber durch ausprobieren anderer Player klassen die dbus verwenden komm ich leider auch nicht weiter.
Ich hatte gehofft das hier jemand vielleicht n Blick in den Code werfen könnte, weil total aufm Holzweg kann ich ja auch nicht sein, die Player Steuerung aus Xchat heraus funktioniert zumindest.
Mit den Python Tutorials bzw pdf's die ich die letzten Wochen durchgeackert habe hoffte ich eigentlich so n "triviales" announce script wäre schonmal nicht schlecht um n paar praktische Erfahrungen zu machen.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

wie BlackJack schon geschrieben hat, ist `info_dict` kein Dictionary sondern eine Liste, Tuple, String... Schau mal was die dbus liefern soll und was es dir liefert.
the more they change the more they stay the same
hypnotoad
User
Beiträge: 5
Registriert: Dienstag 28. September 2010, 18:23

Hi,
also wenn ich in der shell die Dbus abfrage mache bekomme ich genau das was ich gern hätte, sprich Artist - Title

Code: Alles auswählen

qdbus org.kde.minirok /Player org.kde.minirok.NowPlaying
Aber wie ihr sehen könnt funktioniert das so in dem Script ja nicht.

Code: Alles auswählen

....
        self.Root = bus.get_object("org.kde.minirok", "/")
        self.Player = bus.get_object("org.kde.minirok", "/Player")
.....
    def get_info(self):
        info_dict = self.Player.NowPlaying()
        return {
            'Artist'   : unicode(info_dict['artist']).encode('utf-8'),
            'Title'    : unicode(info_dict['title']).encode('utf-8'), 
.....
Also mit info_dict frage ich die Dbus Schnittstelle ab, mit return und den anschließenden geschwungenene Klammern sage ich das die Ausgabe in ein Dictionary gespeichert werden soll.
Aber wenn ich euch richtig verstehe will mein script gar keine Zeichen sondern Zahlen von dbus empfangen, und abgesehen davon stehen die geschwungenen Klammern gar nicht für ein Dictionary (was ich wirklich überall so gelesen hab | und Listen würde man mit einer eckigen Klammer erstellen).
Wie dann die Zahlen wieder in Buchstaben verwandelt werden ist mir ein Rätsel, letzlich hab ich ja nur die Amarok2 Klasse kopiert und die Pfade entsprechend angepasst, und Amarok2 bekommt mit Sicherheit auch keine Zahlen zurück bei der Dbus Abfrage.
Also vielleicht kann doch noch jemand mal n Blick in den Code werfen und mir sagen was ich denn falsch bzw gar nicht verstanden habe.
BlackJack

@hypnotoad: Dein Skript bindet den Rückgabewert von der Schnittstelle an den Namen `info_dict` und Du versuchst das Objekt dann im folgenden auch wie ein Dictionary zu verwenden. Das geht aber nur wenn es sich wirklich um ein Dictionary handelt, oder zumindest um ein Objekt bei dem man einen Elementzugriff mit Zeichenketten machen kann. Das ist aber laut Fehlermeldung eine Zeichenkette und da geht das nun einmal nicht.

Die geschwungenen Klammern erstellen ein Dictionary, wo hast Du jetzt gelesen das wäre nicht so? Und mit eckigen Klammern kann man Listen erstellen. Aber nur wenn sie Teil eines Listenliterals sind.

Was Du nicht verstanden hast, sind anscheinend verschiedene Datentypen und das es vom Datentyp abhängt was man damit machen kann. Bei Zeichenketten kann man halt keinen Elementzugriff mit Zeichenketten als Argumenten machen. Was sollte dabei auch herauskommen!?

Du musst halt herausfinden was `info_dict` für einen Wert hat. Und dann den Namen und das Programm entsprechend anpassen.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Du hast aber schon in den Code des von dir verlinkten Moduls geschaut? Dort ist doch offensichtlich, was "NowPlaying" zurückliefert.

Sebastian
Das Leben ist wie ein Tennisball.
Antworten