Seite 1 von 1
Xchat announce Script | Player = Minirok
Verfasst: Dienstag 28. September 2010, 18:43
von hypnotoad
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.
Re: Xchat announce Script | Player = Minirok
Verfasst: Dienstag 28. September 2010, 19:05
von 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.
Re: Xchat announce Script | Player = Minirok
Verfasst: Mittwoch 29. September 2010, 18:38
von hypnotoad
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.
Re: Xchat announce Script | Player = Minirok
Verfasst: Mittwoch 29. September 2010, 18:56
von Dav1d
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.
Re: Xchat announce Script | Player = Minirok
Verfasst: Dienstag 5. Oktober 2010, 17:39
von hypnotoad
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.
Re: Xchat announce Script | Player = Minirok
Verfasst: Dienstag 5. Oktober 2010, 18:09
von 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.
Re: Xchat announce Script | Player = Minirok
Verfasst: Dienstag 5. Oktober 2010, 18:19
von EyDu
Hallo.
Du hast aber schon in den Code des von dir verlinkten Moduls geschaut? Dort ist doch offensichtlich, was "NowPlaying" zurückliefert.
Sebastian