1 from Plugins.Plugin import PluginDescriptor
4 from enigma import gFont, eTimer, eConsoleAppContainer, ePicLoad, getDesktop, eServiceReference, iPlayableService, RT_HALIGN_LEFT, RT_HALIGN_RIGHT, RT_HALIGN_CENTER, RT_VALIGN_CENTER
6 from Screens.Screen import Screen
7 from Screens.ChoiceBox import ChoiceBox
8 from Screens.MessageBox import MessageBox
9 from Screens.InfoBarGenerics import InfoBarNotifications
11 from Components.Button import Button
12 from Components.Label import Label
13 from Components.ConfigList import ConfigListScreen
14 from Components.Sources.StaticText import StaticText
15 from Components.ActionMap import NumberActionMap, ActionMap
16 from Components.config import config, ConfigSelection, getConfigListEntry, ConfigText, ConfigDirectory, ConfigYesNo, ConfigSelection
17 from Components.FileList import FileList, FileEntryComponent
18 from Components.MenuList import MenuList
19 from Components.Pixmap import Pixmap, MovingPixmap
20 from Components.AVSwitch import AVSwitch
21 from Components.ServiceEventTracker import ServiceEventTracker
22 from Components.MultiContent import MultiContentEntryText
24 from Tools.Directories import fileExists, resolveFilename, SCOPE_PLUGINS
52 DLNA_CONFIG_SLIDESHOW = 10000
53 DLNA_CONFIG_DEVICE_REFRESH = 10000
54 DLNA_CONFIG_ROOT_DIR = '/media/upnp/'
55 DLNA_CONFIG_CLIENT_CONFNAME = "/etc/djmount.conf"
58 class DLNAFileList(FileList):
59 def __init__(self, directory):
60 self.rootDir = directory
61 inhibitDirs = ["/bin", "/boot", "/dev", "/etc", "/lib", "/proc", "/sbin", "/sys", "/usr", "/var"]
62 matchingPattern = "(?i)^.*\.(m4a|mp2|mp3|wav|ogg|flac|ts|avi|divx|m4v|mpg|mpeg|mkv|mp4|mov|m2ts|jpg|jpeg|png|bmp)"
63 FileList.__init__(self, directory=directory, matchingPattern=matchingPattern, showDirectories=True, showFiles=True, inhibitMounts=[], inhibitDirs=inhibitDirs, isTop=True)
67 directoryItem = self.rootDir[:-1].split('/')
69 for di in directoryItem:
71 self.changeDir(self.rootDir, select=parent)
73 def changeParent(self):
74 i, parent, grandParent = 0, "", ""
75 currentDir = self.getCurrentDirectory()
76 if currentDir == self.rootDir:
78 directoryItem = currentDir[:-1].split('/')
80 for di in directoryItem:
82 if len(directoryItem) > 0:
84 for di in directoryItem:
86 if parent == grandParent:
88 self.changeDir(parent, select=grandParent)
91 def getFileType(self):
93 selectedFileName = self.getSelection()[0]
94 splitedFileName = os.path.splitext(selectedFileName)
95 return EXTENSIONS[splitedFileName[1]]
99 class DLNAFileBrowser(Screen):
101 <screen name="DLNAFileBrowser" position="center,center" size="600,350" title="File Browser">
102 <ePixmap pixmap="skin_default/buttons/red.png" position="5,0" size="140,40" alphatest="on" />
103 <ePixmap pixmap="skin_default/buttons/green.png" position="155,0" size="140,40" alphatest="on" />
104 <ePixmap pixmap="skin_default/buttons/yellow.png" position="305,0" size="140,40" alphatest="on" />
105 <ePixmap pixmap="skin_default/buttons/blue.png" position="455,0" size="140,40" alphatest="on" />
107 <widget source="key_red" render="Label" position="5,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" foregroundColor="#ffffff" transparent="1" />
108 <widget source="key_green" render="Label" position="155,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" foregroundColor="#ffffff" transparent="1" />
109 <widget source="key_yellow" render="Label" position="305,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" foregroundColor="#ffffff" transparent="1" />
110 <widget source="key_blue" render="Label" position="455,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" foregroundColor="#ffffff" transparent="1" />
112 <widget name="directory" position="10,45" size="600,40" valign="center" font="Regular;20" />
113 <widget name="filelist" position="0,100" zPosition="1" size="560,250" scrollbarMode="showOnDemand"/>
116 <screen name="DLNAFileBrowser" position="center,90" size="1000,580" title="File Browser">
117 <ePixmap pixmap="skin_default/buttons/red.png" position="55,0" size="140,40" alphatest="on" />
118 <ePixmap pixmap="skin_default/buttons/green.png" position="305,0" size="140,40" alphatest="on" />
119 <ePixmap pixmap="skin_default/buttons/yellow.png" position="555,0" size="140,40" alphatest="on" />
120 <ePixmap pixmap="skin_default/buttons/blue.png" position="805,0" size="140,40" alphatest="on" />
122 <widget source="key_red" render="Label" position="55,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" foregroundColor="#ffffff" transparent="1" />
123 <widget source="key_green" render="Label" position="305,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" foregroundColor="#ffffff" transparent="1" />
124 <widget source="key_yellow" render="Label" position="555,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" foregroundColor="#ffffff" transparent="1" />
125 <widget source="key_blue" render="Label" position="805,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" foregroundColor="#ffffff" transparent="1" />
127 <widget name="directory" position="10,60" size="980,22" valign="center" font="Regular;22" />
128 <widget name="filelist" position="0,100" zPosition="1" size="1000,480" scrollbarMode="showOnDemand"/>
132 def __init__(self, session, directory):
133 self.session = session
134 Screen.__init__(self, session)
136 self["actions"] = ActionMap(["WizardActions", "DirectionActions", "ColorActions", "EPGSelectActions"], {
137 "back" : self.keyCancel,
138 "left" : self.keyLeft,
139 "right" : self.keyRight,
141 "down" : self.keyDown,
143 "green" : self.keyGreen,
144 "red" : self.keyCancel,
145 "yellow": self.keyYellow,
146 "blue" : self.keyBlue
149 self["directory"] = Label()
150 self["key_red"] = StaticText(_("Show Device"))
151 self["key_green"] = StaticText(_(" "))
152 self["key_yellow"] = StaticText(_("Up"))
153 self["key_blue"] = StaticText(_("Top"))
154 self["filelist"] = DLNAFileList(directory)
156 self.onLayoutFinish.append(self.layoutFinished)
159 'movie' : self.showMovie,
160 'music' : self.showMusic,
161 'picture' : self.showPicture,
162 'stream' : self.showStream,
163 'unknown' : self.showUnknown,
166 def layoutFinished(self):
167 self.updateDirectory()
173 self["filelist"].changeTop()
174 self.updateDirectory()
177 print "not implements!!"
180 self["filelist"].changeParent()
181 self.updateDirectory()
184 self["filelist"].up()
185 self.updateDirectory()
188 self["filelist"].down()
189 self.updateDirectory()
192 self["filelist"].pageUp()
193 self.updateDirectory()
196 self["filelist"].pageDown()
197 self.updateDirectory()
201 if self["filelist"].canDescent():
202 self["filelist"].descent()
203 self.updateDirectory()
206 fileType = self["filelist"].getFileType()
207 self.showCB[fileType]()
209 def updateDirectory(self):
210 directory = self["filelist"].getSelection()[0]
211 if directory is None or directory.strip() == '':
212 directory = "Empty Directory!!"
213 self["directory"].setText(directory)
216 from Plugins.Extensions.MediaPlayer.plugin import MediaPlayer
217 self.beforeService = self.session.nav.getCurrentlyPlayingServiceReference()
218 path = self["filelist"].getCurrentDirectory() + self["filelist"].getFilename()
219 mp = self.session.open(MediaPlayer)
220 mp.callback = self.cbShowMovie
222 mp.savePlaylistOnExit = False
223 mp.playlist.addFile(eServiceReference(4097, 0, path))
225 mp.switchToPlayList()
227 def showPicture(self):
228 self.session.openWithCallback(self.cbShowPicture,
230 self["filelist"].getFileList(),
231 self["filelist"].getSelectionIndex(),
232 self["filelist"].getCurrentDirectory())
237 def showStream(self):
238 path = self["filelist"].getCurrentDirectory() + self["filelist"].getFilename()
239 self.beforeService = self.session.nav.getCurrentlyPlayingServiceReference()
240 self.session.openWithCallback(self.cbShowMovie,
242 eServiceReference(4097, 0, path),
245 def showUnknown(self):
246 message = "Can't play selected file. It is unknown file extension."
247 self.session.open(MessageBox, message, type=MessageBox.TYPE_INFO)
249 def cbShowMovie(self, data=None):
250 if self.beforeService is not None:
251 self.session.nav.playService(self.beforeService)
252 self.beforeService = None
254 def cbShowPicture(self, idx=0):
255 if idx > 0: self["filelist"].moveToIndex(idx)
257 class DLNAStreamPlayer(Screen, InfoBarNotifications):
259 <screen name="DLNAStreamPlayer" flags="wfNoBorder" position="center,620" size="455,53" title="DLNAStreamPlayer" backgroundColor="transparent">
260 <ePixmap pixmap="Vu_HD/mp_wb_background.png" position="0,0" zPosition="-1" size="455,53" />
261 <ePixmap pixmap="Vu_HD/icons/mp_wb_buttons.png" position="40,23" size="30,13" alphatest="on" />
263 <widget source="session.CurrentService" render="PositionGauge" position="80,25" size="220,10" zPosition="2" pointer="skin_default/position_pointer.png:540,0" transparent="1" foregroundColor="#20224f">
264 <convert type="ServicePosition">Gauge</convert>
267 <widget source="session.CurrentService" render="Label" position="310,20" size="50,20" font="Regular;18" halign="center" valign="center" backgroundColor="#4e5a74" transparent="1" >
268 <convert type="ServicePosition">Position</convert>
270 <widget name="sidebar" position="362,20" size="10,20" font="Regular;18" halign="center" valign="center" backgroundColor="#4e5a74" transparent="1" />
271 <widget source="session.CurrentService" render="Label" position="374,20" size="50,20" font="Regular;18" halign="center" valign="center" backgroundColor="#4e5a74" transparent="1" >
272 <convert type="ServicePosition">Length</convert>
280 def __init__(self, session, service, lastservice):
281 Screen.__init__(self, session)
282 InfoBarNotifications.__init__(self)
284 self.session = session
285 self.service = service
286 self.lastservice = lastservice
287 self["actions"] = ActionMap(["OkCancelActions", "InfobarSeekActions", "MediaPlayerActions", "MovieSelectionActions"], {
288 "ok": self.doInfoAction,
289 "cancel": self.doExit,
291 "playpauseService": self.playpauseService,
293 self["sidebar"] = Label(_("/"))
295 self.__event_tracker = ServiceEventTracker(screen = self, eventmap = {
296 iPlayableService.evSeekableStatusChanged: self.__seekableStatusChanged,
297 iPlayableService.evStart: self.__serviceStarted,
298 iPlayableService.evEOF: self.__evEOF,
301 self.hidetimer = eTimer()
302 self.hidetimer.timeout.get().append(self.doInfoAction)
304 self.state = self.PLAYER_PLAYING
305 self.lastseekstate = self.PLAYER_PLAYING
306 self.__seekableStatusChanged()
308 self.onClose.append(self.__onClose)
312 self.session.nav.stopService()
314 def __seekableStatusChanged(self):
315 service = self.session.nav.getCurrentService()
316 if service is not None:
317 seek = service.seek()
318 if seek is None or not seek.isCurrentlySeekable():
319 self.setSeekState(self.PLAYER_PLAYING)
321 def __serviceStarted(self):
322 self.state = self.PLAYER_PLAYING
323 self.__seekableStatusChanged()
328 def __setHideTimer(self):
329 self.hidetimer.start(5000)
332 list = ((_("Yes"), "y"), (_("No"), "n"),)
333 self.session.openWithCallback(self.cbDoExit, ChoiceBox, title=_("Stop playing this movie?"), list = list)
335 def cbDoExit(self, answer):
336 answer = answer and answer[1]
340 def setSeekState(self, wantstate):
341 service = self.session.nav.getCurrentService()
343 print "No Service found"
346 pauseable = service.pause()
347 if pauseable is not None:
348 if wantstate == self.PLAYER_PAUSED:
350 self.state = self.PLAYER_PAUSED
352 self.hidetimer.stop()
354 elif wantstate == self.PLAYER_PLAYING:
356 self.state = self.PLAYER_PLAYING
358 self.__setHideTimer()
360 self.state = self.PLAYER_PLAYING
362 def doInfoAction(self):
364 self.hidetimer.stop()
368 if self.state == self.PLAYER_PLAYING:
369 self.__setHideTimer()
372 if self.state == self.PLAYER_PAUSED:
374 self.__setHideTimer()
375 self.state = self.PLAYER_PLAYING
376 self.session.nav.playService(self.service)
378 self.__setHideTimer()
380 def playpauseService(self):
381 if self.state == self.PLAYER_PLAYING:
382 self.setSeekState(self.PLAYER_PAUSED)
383 elif self.state == self.PLAYER_PAUSED:
384 self.setSeekState(self.PLAYER_PLAYING)
386 class DLNAImageViewer(Screen):
387 s, w, h = 30, getDesktop(0).size().width(), getDesktop(0).size().height()
389 <screen position="0,0" size="%d,%d" flags="wfNoBorder">
390 <eLabel position="0,0" zPosition="0" size="%d,%d" backgroundColor="#00000000" />
391 <widget name="image" position="%d,%d" size="%d,%d" zPosition="1" alphatest="on" />
392 <widget name="status" position="%d,%d" size="20,20" zPosition="2" pixmap="skin_default/icons/record.png" alphatest="on" />
393 <widget name="icon" position="%d,%d" size="20,20" zPosition="2" pixmap="skin_default/icons/ico_mp_play.png" alphatest="on" />
394 <widget source="message" render="Label" position="%d,%d" size="%d,25" font="Regular;20" halign="left" foregroundColor="#0038FF48" zPosition="2" noWrap="1" transparent="1" />
396 """ % (w, h, w, h, s, s, w-(s*2), h-(s*2), s+5, s+2, s+25, s+2, s+45, s, w-(s*2)-50)
398 def __init__(self, session, fileList, index, path):
399 Screen.__init__(self, session)
400 self["actions"] = ActionMap(["OkCancelActions", "ColorActions", "DirectionActions", "MovieSelectionActions"], {
401 "cancel": self.keyCancel,
402 "left" : self.keyLeft,
403 "right" : self.keyRight,
404 "blue" : self.keyBlue,
405 "yellow": self.keyYellow,
408 self["icon"] = Pixmap()
409 self["image"] = Pixmap()
410 self["status"] = Pixmap()
411 self["message"] = StaticText(_("Please wait, Loading image."))
414 self.currentImage = []
416 self.lsatIndex = index
418 self.currentIndex = 0
419 self.directoryCount = 0
421 self.displayNow = True
423 self.makeFileList(fileList, path)
425 self.pictureLoad = ePicLoad()
426 self.pictureLoad.PictureData.get().append(self.finishDecode)
428 self.slideShowTimer = eTimer()
429 self.slideShowTimer.callback.append(self.cbSlideShow)
431 self.onLayoutFinish.append(self.layoutFinished)
433 def layoutFinished(self):
434 if self.fileListLen >= 0:
435 self.setPictureLoadPara()
438 self.currentImage = []
439 self.currentIndex = self.lsatIndex
440 self.currentIndex -= 1
441 if self.currentIndex < 0:
442 self.currentIndex = self.fileListLen
444 self.displayNow = True
447 self.displayNow = True
451 if self.fileListLen < 0:
453 from Plugins.Extensions.PicturePlayer.plugin import Pic_Exif
454 self.session.open(Pic_Exif, self.pictureLoad.getInfo(self.fileList[self.lsatIndex]))
457 if self.slideShowTimer.isActive():
458 self.slideShowTimer.stop()
461 global DLNA_CONFIG_SLIDESHOW
462 self.slideShowTimer.start(DLNA_CONFIG_SLIDESHOW)
468 self.close(self.lsatIndex + self.directoryCount)
470 def setPictureLoadPara(self):
471 sc = AVSwitch().getFramebufferScale()
472 self.pictureLoad.setPara([self["image"].instance.size().width(),
473 self["image"].instance.size().height(),
477 int(config.pic.resize.value),
480 if config.pic.infoline.value == False:
481 self["message"].setText("")
484 def makeFileList(self, fileList, path):
489 self.fileList.append(path + x[0][0])
490 else: self.directoryCount += 1
493 self.fileList.append(x[0][0])
494 else: self.directoryCount += 1
495 else: self.fileList.append(x[4])
497 self.currentIndex = self.lsatIndex - self.directoryCount
498 if self.currentIndex < 0:
499 self.currentIndex = 0
500 self.fileListLen = len(self.fileList) - 1
502 def showPicture(self):
503 if self.displayNow and len(self.currentImage):
504 self.displayNow = False
505 self["message"].setText(self.currentImage[0])
506 self.lsatIndex = self.currentImage[1]
507 self["image"].instance.setPixmap(self.currentImage[2].__deref__())
508 self.currentImage = []
510 self.currentIndex += 1
511 if self.currentIndex > self.fileListLen:
512 self.currentIndex = 0
515 def finishDecode(self, picInfo=""):
516 self["status"].hide()
517 ptr = self.pictureLoad.getData()
521 text = picInfo.split('\n',1)
522 text = "(" + str(self.currentIndex+1) + "/" + str(self.fileListLen+1) + ") " + text[0].split('/')[-1]
525 self.currentImage = []
526 self.currentImage.append(text)
527 self.currentImage.append(self.currentIndex)
528 self.currentImage.append(ptr)
531 def startDecode(self):
532 self.pictureLoad.startDecode(self.fileList[self.currentIndex])
533 self["status"].show()
535 def cbSlideShow(self):
536 print "slide to next Picture index=" + str(self.lsatIndex)
537 if config.pic.loop.value==False and self.lsatIndex == self.fileListLen:
539 self.displayNow = True
546 self.gTaskInstance = None
547 self.occurError = False
548 self.cbSetStatusCB = None
550 def append(self, command, cbDataFunc, cbCloseFunc):
551 self.taskList.append([command+'\n', cbDataFunc, cbCloseFunc])
554 print "############### TASK ###############"
555 print "Current Task Index :", self.taskIdx
556 print "Current Task Instance :", self.gTaskInstance
557 print "Occur Error :", self.occurError
558 print "Task List:\n", self.taskList
559 print "####################################"
562 print "[DLNAClient Plugin] Info >> set task error!!"
563 self.occurError = True
567 self.gTaskInstance = None
568 self.occurError = False
573 self.cbSetStatusCB = None
579 def setStatusCB(self, cbfunc):
580 self.cbSetStatusCB = cbfunc
583 if self.taskIdx >= len(self.taskList) or self.occurError:
584 print "[DLNAClient Plugin] Info >> can't run task!!"
586 command = self.taskList[self.taskIdx][0]
587 cbDataFunc = self.taskList[self.taskIdx][1]
588 cbCloseFunc = self.taskList[self.taskIdx][2]
590 self.gTaskInstance = eConsoleAppContainer()
591 if cbDataFunc is not None:
592 self.gTaskInstance.dataAvail.append(cbDataFunc)
593 if cbCloseFunc is not None:
594 self.gTaskInstance.appClosed.append(cbCloseFunc)
595 if self.cbSetStatusCB is not None:
596 self.cbSetStatusCB(self.taskIdx)
598 print "[DLNAClient Plugin] Info >> prepared command : %s"%(command)
599 self.gTaskInstance.execute(command)
603 class DLNAClientConfig(ConfigListScreen, Screen):
605 <screen position="center,center" size="600,350" title="Mini DLNA Runcher">
606 <ePixmap pixmap="skin_default/buttons/red.png" position="5,0" size="140,40" alphatest="on" />
607 <ePixmap pixmap="skin_default/buttons/green.png" position="155,0" size="140,40" alphatest="on" />
608 <ePixmap pixmap="skin_default/buttons/yellow.png" position="305,0" size="140,40" alphatest="on" />
609 <ePixmap pixmap="skin_default/buttons/blue.png" position="455,0" size="140,40" alphatest="on" />
611 <widget source="key_red" render="Label" position="5,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" foregroundColor="#ffffff" transparent="1" />
612 <widget source="key_green" render="Label" position="155,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" foregroundColor="#ffffff" transparent="1" />
613 <widget source="key_yellow" render="Label" position="305,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" foregroundColor="#ffffff" transparent="1" />
614 <widget source="key_blue" render="Label" position="455,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" foregroundColor="#ffffff" transparent="1" />
616 <widget name="config" position="0,50" size="600,200" scrollbarMode="showOnDemand" />
619 def __init__(self, session):
620 self.session = session
621 Screen.__init__(self, session)
625 ConfigListScreen.__init__(self, self.menulist)
627 global DLNA_CONFIG_CLIENT_CONFNAME
628 self.configFileName = DLNA_CONFIG_CLIENT_CONFNAME
629 self["actions"] = ActionMap(["OkCancelActions", "ShortcutActions", "WizardActions", "ColorActions", "SetupActions", ], {
630 "red" : self.keyExit,
631 "green" : self.keyOK,
632 "cancel" : self.keyExit,
635 self["key_red"] = StaticText(_("Exit"))
636 self["key_green"] = StaticText(_("Save"))
637 self["key_yellow"] = StaticText(_(" "))
638 self["key_blue"] = StaticText(_(" "))
643 self.close(None, None, None)
646 self.writeConfigFile()
647 #self.close(self.menuItemRefresh.value, self.menuItemRootDir.value)
648 self.close(self.menuItemRefresh.value, None, self.menuItemSlideshow.value)
650 def makeMenuList(self):
651 self.readConfigFile()
652 #self.menuItemRootDir = ConfigText(default=self.oldConfig.get('rootdir'))
653 self.menuItemRefresh = ConfigSelection(default=self.oldConfig.get('refresh'), choices = [("5", _("5")), ("10", _("10")), ("15", _("15"))])
654 self.menuItemSlideshow = ConfigSelection(default=self.oldConfig.get('slideshow'), choices = [("5", _("5")), ("10", _("10")), ("15", _("15")), ("20", _("20"))])
656 #self.menuEntryRootDir = getConfigListEntry(_("Mount Point"), self.menuItemRootDir)
657 self.menuEntryRefresh = getConfigListEntry(_("DeviceList Refresh Interval"), self.menuItemRefresh)
658 self.menuEntrySlideshow = getConfigListEntry(_("Slideshow Interval"), self.menuItemSlideshow)
661 def resetMenuList(self):
663 #self.menulist.append(self.menuEntryRootDir)
664 self.menulist.append(self.menuEntryRefresh)
665 self.menulist.append(self.menuEntrySlideshow)
666 self["config"].list = self.menulist
667 self["config"].l.setList(self.menulist)
669 def writeConfigFile(self):
670 def configDataAppend(origin, key, value):
671 if key.strip() != '' and value.strip() != '':
672 origin += "%s=%s\n" % (key,value)
675 #configString = configDataAppend(configString, "rootdir", self.menuItemRootDir.value)
676 configString = configDataAppend(configString, "refresh", self.menuItemRefresh.value)
677 configString = configDataAppend(configString, "slideshow", self.menuItemSlideshow.value)
679 confFile = file(self.configFileName, 'w')
680 confFile.write(configString)
683 def readConfigFile(self):
684 def setDefault(key, default):
686 value = self.oldConfig.get(key)
687 if value == None or value.strip() == '':
688 self.oldConfig[key] = default
689 except: self.oldConfig[key] = default
692 if not os.path.exists(self.configFileName):
693 #setDefault('rootdir', '/media/upnp/')
694 setDefault('refresh', '10')
695 setDefault('slideshow', '10')
697 for line in file(self.configFileName).readlines():
699 if line == '' or line[0] == '#':
703 k,v = line[:i],line[i+1:]
704 self.oldConfig[k] = v
707 #setDefault('rootdir', '/media/upnp/')
708 setDefault('refresh', '10')
709 setDefault('slideshow', '10')
710 print "Current Config : ", self.oldConfig
713 class DLNADeviceBrowser(Screen):
715 <screen name="DLNADeviceBrowser" position="center,center" size="600,350" title="Device Browser">
716 <ePixmap pixmap="skin_default/buttons/red.png" position="5,0" size="140,40" alphatest="on" />
717 <ePixmap pixmap="skin_default/buttons/green.png" position="155,0" size="140,40" alphatest="on" />
718 <ePixmap pixmap="skin_default/buttons/yellow.png" position="305,0" size="140,40" alphatest="on" />
719 <ePixmap pixmap="skin_default/buttons/blue.png" position="455,0" size="140,40" alphatest="on" />
721 <widget source="key_red" render="Label" position="5,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" foregroundColor="#ffffff" transparent="1" />
722 <widget source="key_green" render="Label" position="155,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" foregroundColor="#ffffff" transparent="1" />
723 <widget source="key_yellow" render="Label" position="305,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" foregroundColor="#ffffff" transparent="1" />
724 <widget source="key_blue" render="Label" position="455,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" foregroundColor="#ffffff" transparent="1" />
726 <widget name="devicelist" position="0,50" size="600,300" backgroundColor="#000000" zPosition="10" scrollbarMode="showOnDemand" />
729 def __init__(self, session):
730 Screen.__init__(self, session)
731 self["actions"] = ActionMap(["OkCancelActions", "ShortcutActions", "WizardActions", "ColorActions", "SetupActions", "NumberActions", "MenuActions"], {
733 "cancel": self.keyCancel,
734 "red" : self.keyCancel,
735 "green" : self.keyGreen,
736 "yellow": self.keyYellow,
737 "blue" : self.keyBlue,
740 global DLNA_CONFIG_CLIENT_CONFNAME
741 self.configFileName = DLNA_CONFIG_CLIENT_CONFNAME
742 self["key_red"] = StaticText(_("Exit"))
743 self["key_green"] = StaticText(_("Start"))
744 self["key_yellow"] = StaticText(_("Setting"))
745 self["key_blue"] = StaticText(_("Reload Device"))
747 #self["devicelist"] = MenuList(self.setListOnView())
748 self["devicelist"] = MenuList([])
749 self.onLayoutFinish.append(self.layoutFinished)
752 self.taskManager = TaskManager()
754 self.toggleGreenButtonTimer = eTimer()
755 self.toggleGreenButtonTimer.timeout.get().append(self.cbToggleGreenButton)
757 self.deviceListRefreshTimer = eTimer()
758 self.deviceListRefreshTimer.timeout.get().append(self.cbDeviceListRefresh)
759 global DLNA_CONFIG_DEVICE_REFRESH
760 self.deviceListRefreshTimer.start(DLNA_CONFIG_DEVICE_REFRESH)
762 def layoutFinished(self):
763 if not os.path.exists('/media/upnp'):
764 os.system('mkdir -p /media/upnp')
766 if self["key_green"].getText() == 'Start':
767 global DLNA_CONFIG_DEVICE_REFRESH
768 self.deviceListRefreshTimer.start(DLNA_CONFIG_DEVICE_REFRESH)
771 self.deviceListRefreshTimer.stop()
772 self.session.openWithCallback(self.cbConfigClose, DLNAClientConfig)
775 global DLNA_CONFIG_ROOT_DIR
776 if self["key_green"].getText() == 'Stop':
777 cmd = 'fusermount -u %s'%(DLNA_CONFIG_ROOT_DIR)
778 self.taskManager.append(cmd, self.cbPrintAvail, self.cbPrintClose)
779 cmd = 'modprobe -r fuse'
780 self.taskManager.append(cmd, self.cbPrintAvail, self.cbStopDone)
781 #cmd = 'killall -9 djmount'
782 #self.taskManager.append(cmd, self.cbPrintAvail, self.cbTasksDone)
783 self["devicelist"].setList([])
785 cmd = 'modprobe fuse'
786 self.taskManager.append(cmd, self.cbPrintAvail, self.cbPrintClose)
787 cmd = 'djmount -o allow_other -o iocharset=utf8 %s'%(DLNA_CONFIG_ROOT_DIR)
788 self.taskManager.append(cmd, self.cbPrintAvail, self.cbStartDone)
789 self.taskManager.next()
795 global DLNA_CONFIG_ROOT_DIR
796 selectedItem = self["devicelist"].getCurrent()
797 if selectedItem is None:
799 selectedFullPaht = '%s%s/'%(DLNA_CONFIG_ROOT_DIR, selectedItem[1])
800 self.session.openWithCallback(self.cbDeviceListRefresh, DLNAFileBrowser, selectedFullPaht)
801 self.deviceListRefreshTimer.stop()
804 print "updated device list!!"
805 self["devicelist"].setList(self.setListOnView())
807 def initConfig(self):
808 global DLNA_CONFIG_ROOT_DIR
809 global DLNA_CONFIG_SLIDESHOW
810 global DLNA_CONFIG_DEVICE_REFRESH
811 if not os.path.exists(self.configFileName):
812 DLNA_CONFIG_ROOT_DIR = '/media/upnp/'
813 DLNA_CONFIG_DEVICE_REFRESH = 10000
814 DLNA_CONFIG_SLIDESHOW = 10000
815 print "config : [%s][%d][%d]"%(DLNA_CONFIG_ROOT_DIR, DLNA_CONFIG_SLIDESHOW, DLNA_CONFIG_DEVICE_REFRESH)
817 for line in file(self.configFileName).readlines():
819 if line == '' or line[0] == '#':
823 k,v = line[:i],line[i+1:]
824 if k == 'rootdir': DLNA_CONFIG_ROOT_DIR = v
825 elif k == 'refresh': DLNA_CONFIG_DEVICE_REFRESH = int(v)*1000
826 elif k == 'slideshow': DLNA_CONFIG_SLIDESHOW = int(v)*1000
828 print "config : [%s][%d][%d]"%(DLNA_CONFIG_ROOT_DIR, DLNA_CONFIG_SLIDESHOW, DLNA_CONFIG_DEVICE_REFRESH)
831 ps_str = os.popen('cat /etc/mtab | grep djmount').read()
832 if ps_str.strip() != '':
837 green_btm_str = 'Start'
839 green_btm_str = 'Stop'
840 self["key_green"].setText(green_btm_str)
843 def cbConfigClose(self, refresh, rootdir, slideshow):
844 global DLNA_CONFIG_ROOT_DIR
845 global DLNA_CONFIG_SLIDESHOW
846 global DLNA_CONFIG_DEVICE_REFRESH
848 if refresh is not None:
849 newRefresh = int(refresh)*1000
850 if DLNA_CONFIG_DEVICE_REFRESH != newRefresh:
851 DLNA_CONFIG_DEVICE_REFRESH = newRefresh
854 if rootdir is not None:
855 if DLNA_CONFIG_ROOT_DIR != rootdir:
856 DLNA_CONFIG_ROOT_DIR = rootdir
857 print "need restart!!!"
860 if slideshow is not None:
861 newSlideshow = int(slideshow)*1000
862 if DLNA_CONFIG_SLIDESHOW != newSlideshow:
863 DLNA_CONFIG_SLIDESHOW = newSlideshow
865 self.deviceListRefreshTimer.start(DLNA_CONFIG_DEVICE_REFRESH)
866 print "config : [%s][%d][%d]"%(DLNA_CONFIG_ROOT_DIR, DLNA_CONFIG_SLIDESHOW, DLNA_CONFIG_DEVICE_REFRESH)
868 def cbPrintAvail(self, data):
871 def cbPrintClose(self, ret):
872 self.taskManager.next()
874 def cbStopDone(self, ret):
875 self.taskManager.clean()
876 self.toggleGreenButtonTimer.start(1000)
877 self.deviceListRefreshTimer.stop()
879 def cbStartDone(self, ret):
880 global DLNA_CONFIG_DEVICE_REFRESH
881 self.taskManager.clean()
882 self.toggleGreenButtonTimer.start(1000)
883 self.deviceListRefreshTimer.start(DLNA_CONFIG_DEVICE_REFRESH)
885 def cbToggleGreenButton(self):
886 self.toggleGreenButtonTimer.stop()
889 def cbDeviceListRefresh(self):
890 global DLNA_CONFIG_DEVICE_REFRESH
891 self.deviceListRefreshTimer.start(DLNA_CONFIG_DEVICE_REFRESH)
894 def setListOnView(slelf):
895 global DLNA_CONFIG_ROOT_DIR
896 items,rootdir = [],DLNA_CONFIG_ROOT_DIR
897 deviceList = [ name for name in os.listdir(rootdir) if os.path.isdir(os.path.join(rootdir, name)) ]
900 if d[0] in ('.', '_'): continue
904 def main(session, **kwargs):
905 session.open(DLNADeviceBrowser)
907 def Plugins(**kwargs):
908 return PluginDescriptor(name=_("DLNA/uPnP Browser"), description="This is dlna/upnp client using djmount.", where = PluginDescriptor.WHERE_PLUGINMENU, fnc=main)