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 selectedFullPaht = '%s%s/'%(DLNA_CONFIG_ROOT_DIR, self["devicelist"].getCurrent()[1])
797 self.session.openWithCallback(self.cbDeviceListRefresh, DLNAFileBrowser, selectedFullPaht)
798 self.deviceListRefreshTimer.stop()
801 print "updated device list!!"
802 self["devicelist"].setList(self.setListOnView())
804 def initConfig(self):
805 global DLNA_CONFIG_ROOT_DIR
806 global DLNA_CONFIG_SLIDESHOW
807 global DLNA_CONFIG_DEVICE_REFRESH
808 if not os.path.exists(self.configFileName):
809 DLNA_CONFIG_ROOT_DIR = '/media/upnp/'
810 DLNA_CONFIG_DEVICE_REFRESH = 10000
811 DLNA_CONFIG_SLIDESHOW = 10000
812 print "config : [%s][%d][%d]"%(DLNA_CONFIG_ROOT_DIR, DLNA_CONFIG_SLIDESHOW, DLNA_CONFIG_DEVICE_REFRESH)
814 for line in file(self.configFileName).readlines():
816 if line == '' or line[0] == '#':
820 k,v = line[:i],line[i+1:]
821 if k == 'rootdir': DLNA_CONFIG_ROOT_DIR = v
822 elif k == 'refresh': DLNA_CONFIG_DEVICE_REFRESH = int(v)*1000
823 elif k == 'slideshow': DLNA_CONFIG_SLIDESHOW = int(v)*1000
825 print "config : [%s][%d][%d]"%(DLNA_CONFIG_ROOT_DIR, DLNA_CONFIG_SLIDESHOW, DLNA_CONFIG_DEVICE_REFRESH)
828 ps_str = os.popen('cat /etc/mtab | grep djmount').read()
829 if ps_str.strip() != '':
834 green_btm_str = 'Start'
836 green_btm_str = 'Stop'
837 self["key_green"].setText(green_btm_str)
840 def cbConfigClose(self, refresh, rootdir, slideshow):
841 global DLNA_CONFIG_ROOT_DIR
842 global DLNA_CONFIG_SLIDESHOW
843 global DLNA_CONFIG_DEVICE_REFRESH
845 if refresh is not None:
846 newRefresh = int(refresh)*1000
847 if DLNA_CONFIG_DEVICE_REFRESH != newRefresh:
848 DLNA_CONFIG_DEVICE_REFRESH = newRefresh
851 if rootdir is not None:
852 if DLNA_CONFIG_ROOT_DIR != rootdir:
853 DLNA_CONFIG_ROOT_DIR = rootdir
854 print "need restart!!!"
857 if slideshow is not None:
858 newSlideshow = int(slideshow)*1000
859 if DLNA_CONFIG_SLIDESHOW != newSlideshow:
860 DLNA_CONFIG_SLIDESHOW = newSlideshow
862 self.deviceListRefreshTimer.start(DLNA_CONFIG_DEVICE_REFRESH)
863 print "config : [%s][%d][%d]"%(DLNA_CONFIG_ROOT_DIR, DLNA_CONFIG_SLIDESHOW, DLNA_CONFIG_DEVICE_REFRESH)
865 def cbPrintAvail(self, data):
868 def cbPrintClose(self, ret):
869 self.taskManager.next()
871 def cbStopDone(self, ret):
872 self.taskManager.clean()
873 self.toggleGreenButtonTimer.start(1000)
874 self.deviceListRefreshTimer.stop()
876 def cbStartDone(self, ret):
877 global DLNA_CONFIG_DEVICE_REFRESH
878 self.taskManager.clean()
879 self.toggleGreenButtonTimer.start(1000)
880 self.deviceListRefreshTimer.start(DLNA_CONFIG_DEVICE_REFRESH)
882 def cbToggleGreenButton(self):
883 self.toggleGreenButtonTimer.stop()
886 def cbDeviceListRefresh(self):
887 global DLNA_CONFIG_DEVICE_REFRESH
888 self.deviceListRefreshTimer.start(DLNA_CONFIG_DEVICE_REFRESH)
891 def setListOnView(slelf):
892 global DLNA_CONFIG_ROOT_DIR
893 items,rootdir = [],DLNA_CONFIG_ROOT_DIR
894 deviceList = [ name for name in os.listdir(rootdir) if os.path.isdir(os.path.join(rootdir, name)) ]
897 if d[0] in ('.', '_'): continue
901 def main(session, **kwargs):
902 session.open(DLNADeviceBrowser)
904 def Plugins(**kwargs):
905 return PluginDescriptor(name=_("DLNA/uPnP Browser"), description="This is dlna/upnp client using djmount.", where = PluginDescriptor.WHERE_PLUGINMENU, fnc=main)