You are not logged in.

Dear visitor, welcome to Dreamboard. If this is your first visit here, please read the Help. It explains in detail how this page works. To use all features of this page, you should consider registering. Please use the registration form, to register here or read more information about the registration process. If you are already registered, please login here.

1

Wednesday, April 18th 2012, 1:45pm

mpd - Ausgabe von Titel und Cover-Art auf dem LCD

Hallo,

mpd ist ein Musik-Player-Daemon, der inzwischen recht stabil auf der Dreambox läuft. Dazu gibt es viele Clients für die Steuerung (u.a. iOS, Android). Damit kann man sich eine schöne Musik-Streaming Lösung bauen.
Ein Problem bei mpd war, dass der laufende Service unterbrochen werden musste, da sonst die Audio-Spuren überlagert wurden. Das ist mit einem Skript von Dr.Best gelöst, das beim Start der Musikwiedergabe über einen http-request gestartet wird. Ich möchte gerne dieses Skript aufbohren, damit beim Start der Musikwiedergabe der Titel und Cover-Art im LCD angezeigt werden.
Die Grundidee ist folgende:
  • Aufbohren des WebStartStopServices von Dr. Best
  • Abgreifen der mpd-Infos mittels dem mpd python paket (muss erst eingespielt werden). Quasi als leichtgewichtiger Client, der am localhost horcht.
  • Ausgabe auf dem LCD

Angefangen habe ich mit der Ausgabe, und da komme ich schon nicht weiter (bin Python-Neuling & über 10 Jahre aus der Programmierung raus ....). Ich erhalte die Fehlermeldung "skin is missing Element Title". Im widget Title will ich probeweise was reinschreiben. Der Fernseher (Haupt-Screen) und das LCD werden Schwarz. Es erfolgt keine Ausgabe. Eine Eingabe per FB ist nicht mehr möglich (klar, da noch kein Action-Handling drin). Immerhin schmiert es nicht ab.

Bin mir auch mit dem Handling des Fensters in der WebSession nicht so sicher, vielleicht kann mir jemand mit Erfahrung einen Tipp geben.

Hier ist der Code:

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#
#  Coded by Dr.Best (c) 2010
#  www.dreambox-tools.info
#
#  Mod by MKempes 

#from Plugins.mpd import mpd   
from Plugins.Plugin import PluginDescriptor
from Plugins.Extensions.WebInterface.WebChilds.Toplevel import addExternalChild
from twisted.web import http, resource                            
from Screens.Screen import Screen
from Components.Label import Label

class mySessionClass():
	def __init__(self):
		self.session = None
		self.CurrentService = None
		self.CurrentDisplay = None

	def stopService(self):
		self.CurrentService = self.session.nav.getCurrentlyPlayingServiceReference()
		self.session.nav.stopService()
		self.CurrentDisplay = self.session.open(mySessionOSD)

	def playService(self):
		if self.CurrentService:
			self.CurrentDisplay.close()
			self.session.nav.playService(self.CurrentService)

WebSessionClass = mySessionClass()

## init mpd client kommt spaeter
#client = mpd.MPDClient()                            
#client.connect("localhost", 6600)

class mySessionOSD(Screen):
	ALLOW_SUSPEND = True
	def __init__(self, session, args = None):
		Screen.__init__(self, session)
		self.summary = None
		self.oldService = self.session.nav.getCurrentlyPlayingServiceReference()

	def createSummary(self):
		return mySessionLCD

	def changeText(self, text):
		self.child.updateTitle(text)

	def doNothing(self):
		pass

	def __onClose(self):
		self.session.nav.playService(self.oldService)

class mySessionLCD(Screen):
	skin = """
		<screen position="0,0" size="132,64" title="LCD Text" >
			<widget name="Title" position="0,0" size="132,64" font="Regular;14" halign="center"/>
		</screen>"""
		
	def __init__(self, session, parent):
		self.skin = mySessionLCD.skin
		Screen.__init__(self, session)
		self["Title"] = Label("MPD")
		parent.child = self 

        def updateTitle(self, text):
		self["Title"].setText(text)

class myStopService(resource.Resource):
	def render(self, req):
		req.setResponseCode(http.OK)
		req.setHeader('Content-type', 'application; xhtml+xml')
		req.setHeader('charset', 'UTF-8')
		dd = "Stop+"
		WebSessionClass.stopService()
# hier Routine und Schleife einbauen - kommt spaeter
#		cs = client.currentsong()  
#		songtitle = "Kein Titel" 
#		if 'title' in cs:
#			dict
#			songtitle = cs['title']                  
#		elif 'file' in cs:                          
#			songtitle = cs['file'] 
		WebSessionClass.CurrentDisplay.changeText("Kein Titel")
# ende Routine
		return dd

class myPlayOldService(resource.Resource):
	def render(self, req):
		req.setResponseCode(http.OK)
		req.setHeader('Content-type', 'application; xhtml+xml')
		req.setHeader('charset', 'UTF-8')
		WebSessionClass.playService()
		dd = "Play+"
		return dd

root1 = myStopService()
addExternalChild( ("stopService", root1) )
root2 = myPlayOldService()
addExternalChild( ("playService", root2) )

def autostart(reason, **kwargs):
	if reason == 0 and kwargs.has_key("session"):
		session = kwargs["session"]
		WebSessionClass.session = session

def Plugins(**kwargs):
	list = [PluginDescriptor(name="WebStartStopService", where = [PluginDescriptor.WHERE_AUTOSTART, PluginDescriptor.WHERE_SESSIONSTART], fnc=autostart)]
	return list

2

Saturday, April 21st 2012, 11:12am

ich habe inzwischen weitere Versuche mit einem Test-Plugin unternommen, um das Summary zu meinem Haupt-Screen in den Griff zu bekommen. Funktioniert leider immer noch nicht:

- Wenn ich KEIN eigenes Summary einfüge, dann wird automatisch das SimpleSummary verwendet und dort der Titel des Haupt-Screens angezeigt. Das hat gutemine mal beim FantasticLCD benutzt, um eine Ausgabe auf dem LCD zu bekommen. Für Cover-Art reicht das leider nicht.

- Sobald ich versuche das Summary selbst anzulegen, bleibt der OLED schwarz. Ich habe die Klasse SimpleSummary fast 1:1 in das Test-Plugin kopiert, oder mich am MediaPlayer orientiert. Nichts zu machen.

In SimpleSummary gibt es einen Code-Schnipsel, der vielleicht hilft, dem SimpleSummary einen anderen Skin unterzujubeln, um damit eine eigene Ausgabe zu steuern

Source code

1
2
# if parent has a "skin_summary" defined, use that as default
self.skin = parent.__dict__.get("skin_summary", self.skin)


Leider habe ich es nicht geschafft ein eigenes "skin_summary" zu definieren. Die Suche nach Beispielen (find . -exec ...) war leider erfolglos. Hätte jemand einen Tipp?

Ich kann mir nicht vorstellen, dass sich noch keiner an der Ausgabe von Cover-Art auf dem LCD/OLED versucht hat. Es gibt ja einen Markt für Musik-Streamer (Squeezebox u.a.).