1 # -*- coding: ISO-8859-1 -*-
2 #===============================================================================
3 # VLC Player Plugin by A. Lätsch 2007
4 # modified by Volker Christian 2008
6 # This is free software; you can redistribute it and/or modify it under
7 # the terms of the GNU General Public License as published by the Free
8 # Software Foundation; either version 2, or (at your option) any later
10 #===============================================================================
13 from Components.ActionMap import ActionMap
14 from Components.Button import Button
15 from Components.ConfigList import ConfigListScreen
16 from Components.config import ConfigElement
17 from Components.config import ConfigIP
18 from Components.config import ConfigInteger
19 from Components.config import ConfigSelection
20 from Components.config import ConfigSubList
21 from Components.config import ConfigSubsection
22 from Components.config import ConfigSlider
23 from Components.config import ConfigText
24 from Components.config import ConfigYesNo
25 from Components.config import config
26 from Components.config import getConfigListEntry
27 from Screens.Screen import Screen
28 from VlcServer import VlcServer
31 class ConfigMutable(ConfigElement):
32 def __init__(self, configElementDict, defaultKey):
33 ConfigElement.__init__(self)
34 self.configElementDict = configElementDict
35 if self.configElementDict.has_key(defaultKey):
36 self.currentConfig = self.configElementDict[defaultKey]
37 self.currentKey = defaultKey
38 self.defaultKey = self.currentKey
40 def addConfigElement(self, key, configElement):
41 self.elements[key] = configElement
43 def setAsCurrent(self, key):
44 if self.configElementDict.has_key(key):
45 self.currentConfig = self.configElementDict[key]
47 self.saved_value = self.currentConfig.saved_value
49 def setValue(self, val):
50 self.currentConfig.value = val
53 def set_Value(self, val):
54 self.currentConfig._value = val
58 return self.currentConfig.value
61 return self.currentConfig._value
63 _value = property(get_Value, set_Value)
65 def fromstring(self, value):
66 return self.currentConfig.fromstring(value)
69 self.currentConfig.saved_value = self.saved_value
70 self.currentConfig.load()
72 def tostring(self, value):
73 return self.currentConfig.tostring(value)
76 self.currentConfig.save()
77 self.defaultKey = self.currentKey
78 self.saved_value = self.currentConfig.saved_value
81 self.setAsCurrent(self.defaultKey)
85 return self.currentConfig.isChanged()
88 for x in self.notifiers:
91 def addNotifier(self, notifier, initial_call = True):
92 assert callable(notifier), "notifiers must be callable"
93 self.notifiers.append(notifier)
97 def disableSave(self):
98 self.currentConfig.disableSave()
100 def __call__(self, selected):
101 return self.currentConfig(selected)
103 def onSelect(self, session):
104 self.currentConfig.onSelect(session)
106 def onDeselect(self, session):
107 self.currentConfig.onDeselect(session)
109 def handleKey(self, key):
110 self.currentConfig.handleKey(key)
112 def getHTML(self, id):
113 return self.currentConfig.getHTML(id)
116 return self.currentConfig.genText()
119 return self.currentConfig.getText()
121 def getMulti(self, selected):
122 return self.currentConfig.getMulti(selected)
125 class ConfigSelectionExtended(ConfigSelection):
126 def __init__(self, choices, default = None):
127 ConfigSelection.__init__(self, choices, default)
129 def deleteNotifier(self, notifier):
130 self.notifiers.remove(notifier)
133 class __VlcServerConfig():
136 config.plugins.vlcplayer = ConfigSubsection()
137 config.plugins.vlcplayer.servercount = ConfigInteger(0)
138 config.plugins.vlcplayer.servers = ConfigSubList()
139 config.plugins.vlcplayer.defaultserver = ConfigText("", False)
140 for servernum in range(0, config.plugins.vlcplayer.servercount.value):
143 # Add a new server or load a configsection if existing
145 newServerConfigSubsection = ConfigSubsection()
146 config.plugins.vlcplayer.servers.append(newServerConfigSubsection)
147 newServerConfigSubsection.name = ConfigText("Server " + str(self.__getServerCount()), False)
148 if newServerConfigSubsection.name.value == newServerConfigSubsection.name.default:
149 newServerConfigSubsection.name.default = ""
150 newServerConfigSubsection.addressType = ConfigSelectionExtended(
154 newServerConfigSubsection.hostip = ConfigMutable(
155 {"IP": ConfigIP([192,168,1,1]),
156 "FQDN": ConfigText("fqdname", False)
157 }, newServerConfigSubsection.addressType.value)
158 newServerConfigSubsection.httpport = ConfigInteger(8080, (0,65535))
159 newServerConfigSubsection.basedir = ConfigText("/", False)
160 newServerConfigSubsection.dvdPath = ConfigText("", False)
161 newServerConfigSubsection.transcodeVideo = ConfigYesNo()
162 newServerConfigSubsection.transcodeAudio = ConfigYesNo(True)
163 newServerConfigSubsection.videocodec = ConfigSelection(
167 newServerConfigSubsection.videobitrate = ConfigInteger(2000, (100, 9999))
168 newServerConfigSubsection.audiocodec = ConfigSelection(
169 [("mpga", "MPEG Layer 1 (mpga)"),
170 ("mp2a", "MPEG Layer 2 (mp2a)"),
171 ("mp3", "MPEG Layer 3 (mp3)")
173 newServerConfigSubsection.audiobitrate = ConfigInteger(128, (64, 320))
174 newServerConfigSubsection.samplerate = ConfigSelection(
179 newServerConfigSubsection.audiochannels = ConfigInteger(2, (1, 9))
180 newServerConfigSubsection.videonorm = ConfigSelection(
181 [("720,576,4:3,25,i", "720 x 576 (4:3) @ 25fps (PAL)"),
182 ("720,576,16:9,25,i", "720 x 576 (16:9) @ 25fps (PAL)"),
183 ("704,576,4:3,25,i", "704 x 576 (4:3) @ 25fps (PAL)"),
184 ("704,576,16:9,25,i", "704 x 576 (16:9) @ 25fps (PAL)"),
185 ("544,576,4:3,25,i", "544 x 576 (4:3) @ 25fps (PAL)"),
186 ("544,576,16:9,25,i", "544 x 576 (16:9) @ 25fps (PAL)"),
187 ("480,576,4:3,25,i", "480 x 576 (4:3) @ 25fps (PAL)"),
188 ("480,576,16:9,25,i", "480 x 576 (16:9) @ 25fps (PAL)"),
189 ("480,288,4:3,25,i", "480 x 288 (4:3) @ 25fps (PAL)"),
190 ("480,288,16:9,25,i", "480 x 288 (16:9) @ 25fps (PAL)"),
191 ("352,576,4:3,25,i", "352 x 576 (4:3) @ 25fps (PAL)"),
192 ("352,576,16:9,25,i", "352 x 576 (16:9) @ 25fps (PAL)"),
193 ("352,288,4:3,25,i", "352 x 288 (4:3) @ 25fps (PAL)"),
194 ("352,288,16:9,25,i", "352 x 288 (16:9) @ 25fps (PAL)"),
195 ("720,480,4:3,30,i", "720 x 480 (4:3) @ 30fps (NTSC)"),
196 ("720,480,16:9,30,i", "720 x 480 (16:9) @ 30fps (NTSC)"),
197 ("640,480,4:3,30,i", "640 x 480 (4:3) @ 30fps (NTSC)"),
198 ("640,480,16:9,30,i", "640 x 480 (16:9) @ 30fps (NTSC)"),
199 ("544,480,4:3,30,i", "544 x 480 (4:3) @ 30fps (NTSC)"),
200 ("544,480,16:9,30,i", "544 x 480 (16:9) @ 30fps (NTSC)"),
201 ("480,480,4:3,30,i", "480 x 480 (4:3) @ 30fps (NTSC)"),
202 ("480,480,16:9,30,i", "480 x 480 (16:9) @ 30fps (NTSC)"),
203 ("480,240,4:3,30,i", "480 x 240 (4:3) @ 30fps (NTSC)"),
204 ("480,240,16:9,30,i", "480 x 240 (16:9) @ 30fps (NTSC)"),
205 ("353,480,4:3,30,i", "353 x 480 (4:3) @ 30fps (NTSC)"),
206 ("353,480,16:9,30,i", "353 x 480 (16:9) @ 30fps (NTSC)"),
207 ("352,240,4:3,30,i", "352 x 240 (4:3) @ 30fps (NTSC)"),
208 ("352,240,16:9,30,i", "352 x 240 (16:9) @ 30fps (NTSC)"),
209 ("1920,1080,16:9,50,p", "1920 x 1080 (16:9) @ 50p (HTDV)"),
210 ("1920,1080,16:9,25,p", "1920 x 1080 (16:9) @ 25p (HTDV)"),
211 ("1920,1080,16:9,25,i", "1920 x 1080 (16:9) @ 25i (HTDV)"),
212 ("1440,1080,16:9,25,p", "1440 x 1080 (16:9) @ 25p (HTDV)"),
213 ("1440,1080,16:9,25,i", "1440 x 1080 (16:9) @ 25i (HTDV)"),
214 ("1280,720,16:9,50,p", "1280 x 720 (16:9) @ 50p (HDTV)"),
215 ("1280,720,16:9,25,p", "1280 x 720 (16:9) @ 25p (HDTV)"),
216 ("720,576,16:9,50,p", "720 x 576 (16:9) @ 50p (HDTV)")
217 ], "352,288,4:3,25,i")
218 newServerConfigSubsection.overscancorrection = ConfigInteger(0, (0, 100))
219 newServerConfigSubsection.soverlay = ConfigYesNo()
220 newServer = VlcServer(newServerConfigSubsection)
222 self.serverlist.append(newServer)
226 # Add was canceled or existing server should be removed
227 def delete(self, server):
228 config.plugins.vlcplayer.servers.remove(server.getCfg())
229 self.serverlist.remove(server)
232 # Edit or Add should complete
233 def save(self, server):
234 server.getCfg().save()
237 # Edit has been canceled
238 def cancel(self, server):
239 for element in server.getCfg().dict().values():
242 def getServerlist(self):
243 return self.serverlist
245 def getServerByName(self, name):
246 for server in self.serverlist:
247 if server.getName() == name:
251 def getDefaultServer(self):
252 return self.getServerByName(config.plugins.vlcplayer.defaultserver.value)
254 def setAsDefault(self, defaultServer):
255 if defaultServer is not None:
256 config.plugins.vlcplayer.defaultserver.value = defaultServer.getName()
257 config.plugins.vlcplayer.defaultserver.save()
260 config.plugins.vlcplayer.servercount.value = self.__getServerCount()
261 config.plugins.vlcplayer.servercount.save()
263 def __getServerCount(self):
264 return len(config.plugins.vlcplayer.servers)
267 vlcServerConfig = __VlcServerConfig()
270 class VlcServerConfigScreen(Screen, ConfigListScreen):
272 <screen name="VlcServerConfigScreen" position="80,100" size="560,320" title="Edit VLC Server">
273 <widget name="config" position="10,10" size="540,250" scrollbarMode="showOnDemand" />
274 <ePixmap name="red" position="0,280" zPosition="4" size="140,40" pixmap="skin_default/buttons/red.png" transparent="1" alphatest="on" />
275 <ePixmap name="green" position="140,280" zPosition="4" size="140,40" pixmap="skin_default/buttons/green.png" transparent="1" alphatest="on" />
276 <ePixmap name="yellow" position="280,280" zPosition="4" size="140,40" pixmap="skin_default/buttons/yellow.png" transparent="1" alphatest="on" />
277 <ePixmap name="blue" position="420,280" zPosition="4" size="140,40" pixmap="skin_default/buttons/blue.png" transparent="1" alphatest="on" />
278 <widget name="key_red" position="0,280" zPosition="5" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
279 <widget name="key_green" position="140,280" zPosition="5" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
280 <widget name="key_yellow" position="280,280" zPosition="5" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
281 <widget name="key_blue" position="420,280" zPosition="5" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
284 def __init__(self, session, server):
285 Screen.__init__(self, session)
287 self["actions"] = ActionMap(["SetupActions", "ColorActions"],
289 "green": self.keySave,
290 "red": self.keyCancel,
291 "cancel": self.keyCancel
294 self["key_red"] = Button(_("Cancel"))
295 self["key_green"] = Button(_("OK"))
296 self["key_yellow"] = Button("")
297 self["key_blue"] = Button("")
300 cfglist.append(getConfigListEntry(_("Server Profile Name"), server.name()))
301 cfglist.append(getConfigListEntry(_("Enter VLC-Server as FQDN or IP-Address"), server.addressType()))
302 self.hostConfigListEntry = getConfigListEntry(_("Server Address"), server.host())
303 cfglist.append(self.hostConfigListEntry)
304 cfglist.append(getConfigListEntry(_("HTTP Port"), server.httpPort()))
305 cfglist.append(getConfigListEntry(_("Movie Directory"), server.basedir()))
306 cfglist.append(getConfigListEntry(_("DVD Device (leave empty for default)"), server.dvdPath()))
308 cfglist.append(getConfigListEntry(_("Transcode MPEG/DVD Video"), server.transcodeVideo()))
309 cfglist.append(getConfigListEntry(_("Video Codec"), server.videoCodec()))
310 cfglist.append(getConfigListEntry(_("Video Bitrate"), server.videoBitrate()))
311 cfglist.append(getConfigListEntry(_("Video Norm"), server.videoNorm()))
312 cfglist.append(getConfigListEntry(_("Overscan Correction [in %(percentsign)s of Video width]") % { "percentsign" : "%"}, server.overscanCorrection()))
314 cfglist.append(getConfigListEntry(_("Subtitle overlay"), server.sOverlay()))
316 cfglist.append(getConfigListEntry(_("Transcode MPEG/DVD Audio"), server.transcodeAudio()))
317 cfglist.append(getConfigListEntry(_("Audio Codec"), server.audioCodec()))
318 cfglist.append(getConfigListEntry(_("Audio Bitrate"), server.audioBitrate()))
319 cfglist.append(getConfigListEntry(_("Audio Samplerate"), server.samplerate()))
320 cfglist.append(getConfigListEntry(_("Audio Channels"), server.audioChannels()))
322 ConfigListScreen.__init__(self, cfglist, session)
324 server.addressType().addNotifier(self.switchAddressType, False)
326 self.onClose.append(self.__onClose)
329 self.server.addressType().deleteNotifier(self.switchAddressType)
331 def switchAddressType(self, configElement):
332 self.server.host().setAsCurrent(configElement.value)
333 self["config"].invalidate(self.hostConfigListEntry)
336 self.close(True, self.server)
339 self.close(False, self.server)