-from enigma import eListbox\r
-from enigma import eListboxPythonMultiContent\r
-from enigma import loadPic\r
-from enigma import loadPNG\r
-from enigma import gFont\r
-### Picturelist\r
-from Screens.Screen import Screen\r
-from Screens.MessageBox import MessageBox\r
-from Screens.InputBox import InputBox\r
-from Screens.ChoiceBox import ChoiceBox\r
-from Components.ActionMap import ActionMap\r
-from Components.Label import Label\r
-from Components.MenuList import MenuList\r
-from Components.FileList import EXTENSIONS\r
-## configmenu\r
-from Components.config import config, ConfigSubsection,ConfigSelection,ConfigText\r
-####\r
-from Components.Input import Input\r
-from Components.Pixmap import Pixmap\r
-from Plugins.Plugin import PluginDescriptor\r
-### System\r
-import os\r
-from re import compile\r
-## XML\r
-from pyexpat import ExpatError\r
-import xml.dom.minidom\r
-from Tools.XMLTools import elementsWithTag\r
-\r
-### my\r
-from WebcamViewConfig import WebcamViewerMenu\r
-from PictureScreen import PictureScreen\r
-###\r
-myname = "Webcam/Picture Viewer" \r
-myversion = "1.1"\r
-\r
-\r
-\r
-config.plugins.pictureviewer = ConfigSubsection()\r
-config.plugins.pictureviewer.slideshowtime = ConfigSelection(default="5000", choices = [("5000", _("5 Sekunden")), ("10000", _("10 Sekunden")), ("20000", _("20 Sekunden")), ("60000", _("1 Minute"))])\r
-config.plugins.pictureviewer.slideshowmode = ConfigSelection(default="0", choices = [("0", _("normal")), ("1", _("endlos"))])\r
-#not editable configs\r
-config.plugins.pictureviewer.slideshowext = ConfigText(default=".3ssl")\r
-config.plugins.pictureviewer.matchingPattern = ConfigText(default="(?i)^.*\.(jpeg|jpg|jpe|png|bmp|gif)")\r
-config.plugins.pictureviewer.slideshowdir = ConfigText(default="/media/hdd/slideshows/")\r
-config.plugins.pictureviewer.rootdir = ConfigText(default="/media/")\r
-SLIDESHOWMODE_NORMAL = 0\r
-SLIDESHOWMODE_REPEAT = 1\r
-\r
- \r
-def main1(session,**kwargs):\r
- session.open(PictureViewer)\r
-\r
-def main2(session,**kwargs):\r
- xmlfile = "/usr/lib/enigma2/python/Plugins/Extensions/WebcamViewer/webcam.xml"\r
- if os.path.isfile(xmlfile):\r
- try:\r
- xmlnode = xml.dom.minidom.parse( open(xmlfile) )\r
- session.open(WebcamViewer,xmlnode.childNodes[1])\r
- except ExpatError,e:\r
- session.open(MessageBox,_("Loading config file failed!\n\n%s"%e), MessageBox.TYPE_WARNING)\r
- else:\r
- session.open(MessageBox,_("Loading config file failed!\n\nconfigfile not found!"), MessageBox.TYPE_WARNING)\r
- \r
- \r
-def Plugins(path,**kwargs):\r
- p = [\r
- PluginDescriptor(\r
- name="PictureViewer", \r
- description="browse your local pictures", \r
- where = PluginDescriptor.WHERE_PLUGINMENU,\r
- fnc = main1,\r
- icon="pictureviewer.png"\r
- )\r
- ,\r
- PluginDescriptor(\r
- name="WebcamViewer", \r
- description="view webcams around the world", \r
- where = PluginDescriptor.WHERE_PLUGINMENU,\r
- fnc = main2,\r
- icon="webcamviewer.png"\r
- )\r
- ]\r
- return p \r
-\r
-\r
- \r
-\r
-###################\r
-class Slideshow:\r
- filelist=[]\r
- currentslideshowitem =0\r
- wbviewer = False\r
- def __init__(self,session,callback):\r
- self.session = session\r
- self.callback = callback\r
- def setfiles(self,filelist):\r
- self.filelist = filelist \r
-\r
- def start(self):\r
- if len(self.filelist)>0: \r
- self.currentslideshowitem = -1\r
- self.nextSlideshowItem()\r
- \r
- def nextSlideshowItem(self):\r
- if self.currentslideshowitem is not (len(self.filelist)-1):\r
- self.currentslideshowitem = self.currentslideshowitem+1\r
- filetoshow = self.filelist[self.currentslideshowitem][1]\r
- if self.wbviewer is False:\r
- self.wbviewer = self.session.openWithCallback(self.cb,PictureScreen,filetoshow.split("/")[-1],filetoshow,slideshowcallback=self.nextSlideshowItem) \r
- else:\r
- self.wbviewer.filename = filetoshow\r
- self.wbviewer.do() \r
- elif self.currentslideshowitem is (len(self.filelist)-1) and int(config.plugins.pictureviewer.slideshowmode.value) is SLIDESHOWMODE_REPEAT:\r
- print "["+myname+"] restarting slideshow"\r
- self.start()\r
- else:\r
- print "["+myname+"] slideshow finished"\r
- self.wbviewer.exit()\r
- self.cb()\r
- def cb(self):\r
- self.callback()\r
-###################\r
-class PictureViewer(Screen):\r
- skin = ""\r
- filelist = []\r
- currList = "slideshowlist"\r
- wbviewer = False\r
- loadedslideshowlistlistname = False\r
- def __init__(self, session, args = 0):\r
- self.session = session\r
- s = "<screen position=\"93,70\" size=\"550,450\" title=\"%s\">\n" %config.plugins.pictureviewer.rootdir.value\r
- s = s+"<widget name=\"menu\" position=\"1,1\" size=\"275,400\" scrollbarMode=\"showOnDemand\" />\n"\r
- s = s+"<widget name=\"pixmap\" position=\"550,450\" size=\"275,200\" backgroundColor=\"red\"/>\n" \r
- s = s+"<widget name=\"slist\" position=\"275,200\" size=\"275,200\" scrollbarMode=\"showOnDemand\"/>\n" \r
- s = s+"<widget name=\"buttonred\" position=\"6,405\" size=\"130,40\" backgroundColor=\"red\" valign=\"center\" halign=\"center\" zPosition=\"2\" foregroundColor=\"white\" font=\"Regular;18\"/>\n" \r
- s = s+"<widget name=\"buttongreen\" position=\"142,405\" size=\"130,40\" backgroundColor=\"green\" valign=\"center\" halign=\"center\" zPosition=\"2\" foregroundColor=\"white\" font=\"Regular;18\"/>\n" \r
- s = s+"<widget name=\"buttonyellow\" position=\"278,405\" size=\"130,40\" backgroundColor=\"yellow\" valign=\"center\" halign=\"center\" zPosition=\"2\" foregroundColor=\"white\" font=\"Regular;18\"/>\n" \r
- s = s+"<widget name=\"buttonblue\" position=\"414,405\" size=\"130,40\" backgroundColor=\"blue\" valign=\"center\" halign=\"center\" zPosition=\"2\" foregroundColor=\"white\" font=\"Regular;18\"/>\n" \r
- self.skin = s+"</screen>"\r
- Screen.__init__(self, session)\r
- self.filelist = PictureList(config.plugins.pictureviewer.rootdir.value, matchingPattern = config.plugins.pictureviewer.matchingPattern.value)\r
- self["menu"] = self.filelist\r
- self.preview = Pixmap()\r
- self["pixmap"] = self.preview\r
- self.slideshowfiles = []\r
- self.slideshowlist =MenuList(self.slideshowfiles)\r
- self["slist"] = self.slideshowlist\r
- self["buttonred"] = Label("")\r
- self["buttongreen"] = Label("")\r
- self["buttonyellow"] = Label("")\r
- self["buttonblue"] = Label("")\r
- self["actions"] = ActionMap(["WizardActions","MenuActions", "DirectionActions","ShortcutActions"], \r
- {\r
- "ok": self.go,\r
- "back": self.close,\r
- "menu": self.openMenu,\r
- "up": self.up,\r
- "down": self.down,\r
- "left": self.leftUp,\r
- "right": self.rightUp,\r
- "red": self.KeyRed,\r
- "green": self.KeyGreen,\r
- "yellow": self.KeyYellow,\r
- "blue": self.switchList,\r
- }, -1)\r
- self.onLayoutFinish.append(self.switchList)\r
- self.onLayoutFinish.append(self.updateInfoPanel)\r
- def KeyGreen(self):\r
- if self.currList is "filelist" :\r
- ## adding all files in current dir to slideshowlist\r
- dirname = self["menu"].getCurrentDir()\r
- if os.path.isdir(dirname):\r
- s = os.listdir(dirname)\r
- s.sort()\r
- for file in s:\r
- if compile(config.plugins.pictureviewer.matchingPattern.value).search(dirname+file):\r
- self.slideshowfiles.append((_(file),dirname+file))\r
- self["slist"].l.setList(self.slideshowfiles)\r
- \r
- else:\r
- #loading list\r
- list = []\r
- try:\r
- for file in os.listdir(config.plugins.pictureviewer.slideshowdir.value):\r
- if file.endswith(config.plugins.pictureviewer.slideshowext.value):\r
- list.append((_(file.split("/")[-1]),file))\r
- self.session.openWithCallback(self.fileToLoadFilelistEntered,ChoiceBox,_("select List to load"),list)\r
- except IOError,e:\r
- print "["+myname+"] IOError:",e\r
- except OSError,e:\r
- print "["+myname+"] OSError:",e\r
- \r
- def KeyRed(self):\r
- if self.currList is "filelist" :\r
- #do slideshow\r
- self.hide()\r
- x = Slideshow(self.session,self.show)\r
- x.setfiles(self.slideshowfiles)\r
- x.start()\r
- else:\r
- # save filelist\r
- if self.loadedslideshowlistlistname is False:\r
- newname = "slideshowlist"\r
- else:\r
- newname = self.loadedslideshowlistlistname\r
- self.session.openWithCallback(self.fileToSaveFilelistEntered,InputBox, title=_("Enter filename to save the List:"), text=newname, maxSize=False, type=Input.TEXT)\r
-\r
- def fileToLoadFilelistEntered(self,fileselection):\r
- if fileselection is not None: \r
- try:\r
- filename = fileselection[1]\r
- fp = open(config.plugins.pictureviewer.slideshowdir.value+filename)\r
- list = []\r
- for x in fp.readlines():\r
- file = x.replace("\n","")\r
- if x.startswith("#"):\r
- pass\r
- elif os.path.exists(file) is not True:\r
- print "["+myname+"] loaded file from filelist isnt avaible! ignoreing ->",file\r
- else:\r
- list.append((_(file.split("/")[-1]),file))\r
- self.slideshowfiles =list\r
- self["slist"].l.setList(self.slideshowfiles)\r
- self.loadedslideshowlistlistname = filename.replace(config.plugins.pictureviewer.slideshowext.value,"")\r
- except IOError,e:\r
- print "["+myname+"] error:",e\r
- \r
- def fileToSaveFilelistEntered(self,filename):\r
- if filename is not None: \r
- print "["+myname+"] saving list to ",config.plugins.pictureviewer.slideshowdir.value+filename+config.plugins.pictureviewer.slideshowext.value\r
- try:\r
- if os.path.exists(config.plugins.pictureviewer.slideshowdir.value) is not True:\r
- print "+"*10,os.path.basename(filename)\r
- os.mkdir(config.plugins.pictureviewer.slideshowdir.value)\r
- fp = open(config.plugins.pictureviewer.slideshowdir.value+filename+config.plugins.pictureviewer.slideshowext.value,"w")\r
- fp.write("# this is a slideshow file for "+myname+" made by V"+myversion+"\n")\r
- fp.write("# you can make your own... each line with full path of the imagefile\n")\r
- fp.write("# by importing this file,we will ignoring a file if is doesnt exist\n")\r
- for x in self.slideshowfiles:\r
- fp.write(x[1]+"\n")\r
- fp.close()\r
- except IOError,e:\r
- print "["+myname+"] error:",e\r
- def KeyYellow(self):\r
- if self.currList is "filelist" :\r
- # add picture to list\r
- fullfile = self["menu"].getSelection()[0]\r
- if os.path.isfile(fullfile):\r
- self.slideshowfiles.append((_(fullfile.split("/")[-1]),fullfile))\r
- self["slist"].l.setList(self.slideshowfiles)\r
- else:\r
- # deleting an Picture\r
- if len(self.slideshowfiles) >=1:\r
- indexinlist = self["slist"].l.getCurrentSelectionIndex()\r
- self.slideshowfiles.pop(indexinlist)\r
- self["slist"].l.setList(self.slideshowfiles)\r
-\r
- def switchList(self):\r
- if self.currList is "filelist" :\r
- # Slideshow activieren\r
- self.filelist.selectionEnabled(0)\r
- self.slideshowlist.selectionEnabled(1)\r
- self["buttonred"].setText("speichern")\r
- self["buttongreen"].setText("laden")\r
- self["buttonyellow"].setText("loeschen") \r
- self["buttonblue"].setText("Dateien")\r
- self.currList = "slideshowlist"\r
- else:\r
- # filelist activieren\r
- self.filelist.selectionEnabled(1)\r
- self.slideshowlist.selectionEnabled(0)\r
- self["buttonred"].setText("starte Slideshow")\r
- self["buttongreen"].setText("alle hinzufuegen")\r
- self["buttonyellow"].setText("hinzufuegen") \r
- self["buttonblue"].setText("Slideshow bearbeiten")\r
- self.currList = "filelist"\r
- \r
- def go(self):\r
- if self.currList is "filelist" :\r
- selection = self["menu"].getSelection()\r
- if self.filelist.canDescent():\r
- self.setTitle(selection[0])\r
- self.filelist.descent()\r
- else:\r
- if selection[1] == True: # isDir\r
- pass\r
- else:\r
- print "["+myname+"] file selected ",selection[0]\r
- if os.path.isfile(selection[0]):\r
- self.session.open(PictureScreen,selection[0].split("/")[-1],selection[0])\r
- else:\r
- print "["+myname+"] file not found " + selection[0]+""\r
- else:\r
- self.updateInfoPanel()\r
- def up(self):\r
- if self.currList is "filelist" :\r
- self.filelist.up()\r
- self.updateInfoPanel()\r
- else:\r
- self.slideshowlist.up()\r
- def leftUp(self):\r
- if self.currList is "filelist" :\r
- self.filelist.pageUp() \r
- self.updateInfoPanel()\r
- else:\r
-\r
- self.slideshowlist.pageUp()\r
- def rightUp(self):\r
- if self.currList is "filelist" :\r
- self.filelist.pageDown()\r
- self.updateInfoPanel()\r
- else:\r
- self.slideshowlist.pageDown()\r
- def down(self):\r
- if self.currList is "filelist" :\r
- self.filelist.down()\r
- self.updateInfoPanel()\r
- else:\r
- self.slideshowlist.down()\r
- \r
- def updateInfoPanel(self):\r
- if self.currList is "filelist" :\r
- selectedfile = self["menu"].getSelection()[0]\r
- else:\r
- selectedfile = self["slist"].l.getCurrentSelection()[1]\r
- pixmap = loadPic(selectedfile, 275,200, 1,1, 0,1)\r
- if pixmap is not None:\r
- self["pixmap"].instance.setPixmap(pixmap.__deref__())\r
- self["pixmap"].move(275,0)\r
- else:\r
- pass\r
- \r
- def output(self,str):\r
- print "+"*10,str \r
- def openMenu(self):\r
- self.session.open(WebcamViewerMenu)\r
-###################\r
-class WebcamViewer(Screen):\r
- skin = ""\r
- filelist = []\r
- def __init__(self, session,xmlnode, args = 0):\r
- self.xmlnode = xmlnode\r
- screen_x = 736\r
- screen_y = 576\r
- size_x = 350\r
- size_y = 250\r
- pos_x = (screen_x/2)-(size_x/2)\r
- pos_y = (screen_y/2)-(size_y/2)\r
- self.session = session\r
- self.skin = """\r
- <screen position="%i,%i" size="%i,%i" title="%s">\r
- <widget name="menu" position="1,1" size="%i,%i" scrollbarMode="showOnDemand"/>\r
- </screen>""" % (pos_x,pos_y,size_x,size_y,myname,size_x,size_y) \r
- Screen.__init__(self, session)\r
- self.filelist = MenuList(self.getMenuData())\r
- self["menu"] = self.filelist\r
- self["actions"] = ActionMap(["WizardActions", "DirectionActions"], \r
- {\r
- "ok": self.go,\r
- "back": self.close,\r
- }, -1)\r
- self.onLayoutFinish.append(self.settingTitle)\r
- \r
- def settingTitle(self):\r
- self.setTitle(myname+": "+self.menutitle)\r
- \r
- def go(self):\r
- selected = self["menu"].l.getCurrentSelection()[1]\r
- menuitemtitle = self["menu"].l.getCurrentSelection()[0]\r
- type = selected[0]\r
- data = selected[1]\r
- if type.startswith("cam"):\r
- self.session.open(PictureScreen,menuitemtitle,data)\r
- else:\r
- self.hide()\r
- self.session.openWithCallback(self.cb,WebcamViewer,data)\r
-\r
- def cb(self):\r
- self.show() \r
- \r
- def getMenuData(self):\r
- xloader = XMLloader()\r
- self.menutitle = xloader.getScreenXMLTitle(self.xmlnode)\r
- data =[] \r
- for node in elementsWithTag(self.xmlnode._get_childNodes(), 'menu'):\r
- nodex={}\r
- nodex['name'] = xloader.get_txt( node, "name", "no name" )\r
- data.append((_("*"+nodex['name']),["node",node]))\r
- \r
- for node2 in elementsWithTag(self.xmlnode._get_childNodes(), 'cam'):\r
- nodex={}\r
- nodex['name'] = xloader.get_txt( node2, "name", "no name" )\r
- nodex['url'] = xloader.get_txt( node2, "url", "no url" )\r
- data.append((_(nodex['name']),["cam",nodex['url']]))\r
- return data\r
-###################\r
-\r
-##################\r
-class PictureList(MenuList):\r
- def __init__(self, directory, matchingPattern = None, enableWrapAround = False):\r
- MenuList.__init__(self, None, enableWrapAround, eListboxPythonMultiContent)\r
- self.showDirectories = True\r
- self.showFiles = True\r
- self.isTop = False\r
- self.matchingPattern = matchingPattern\r
- self.changeDir(directory)\r
- self.l.setFont(0, gFont("Regular", 18))\r
- self.currentDir = directory\r
-\r
- def getCurrentDir(self):\r
- return self.currentDir\r
- \r
- def getSelection(self):\r
- return self.l.getCurrentSelection()[0]\r
- \r
- def getFileList(self):\r
- return self.list\r
- \r
- def changeDir(self, directory):\r
- self.currentDir = directory\r
- self.list = []\r
- \r
- directories = []\r
- files = []\r
- files = os.listdir(directory)\r
- files.sort()\r
- tmpfiles = files[:]\r
- for x in tmpfiles:\r
- if os.path.isdir(directory +"/"+ x):\r
- directories.append(x)\r
- files.remove(x)\r
- directories.sort()\r
- files.sort()\r
- if directory != "/" and self.showDirectories and not self.isTop:\r
- self.list.append(self.getPictureEntryComponent("..",'/'.join(directory.split('/')[:-2]) + '/',True))\r
-\r
- if self.showDirectories:\r
- for x in directories:\r
- name = (directory+x).split('/')[-1]\r
- self.list.append(self.getPictureEntryComponent(name,'/'.join(directory.split('/')[:-1]) + '/'+x+'/',True))\r
-\r
- if self.showFiles:\r
- for x in files:\r
- path = directory + x\r
- name = x\r
- if self.matchingPattern is not None:\r
- if compile(self.matchingPattern).search(path):\r
- self.list.append(self.getPictureEntryComponent(name,path ,False))\r
- else:\r
- pass \r
- \r
- self.l.setList(self.list)\r
- \r
- def canDescent(self):\r
- return self.getSelection()[1]\r
- \r
- def descent(self):\r
- self.changeDir(self.getSelection()[0])\r
- \r
- def getFilename(self):\r
- return self.getSelection()[0].getPath()\r
-\r
- def getServiceRef(self):\r
- return self.getSelection()[0]\r
-\r
- def postWidgetCreate(self, instance):\r
- MenuList.postWidgetCreate(self, instance)\r
- instance.setItemHeight(23)\r
- \r
- def getPictureEntryComponent(self,name, absolute, isDir):\r
- """ name={angezeigter Name}, absolute={vollstaendiger Pfad}, isDir={True,False} """\r
- res = [ (absolute, isDir) ]\r
- res.append((eListboxPythonMultiContent.TYPE_TEXT, 35, 1, 200, 20, 0, 0, name))\r
- if isDir:\r
- png = loadPNG("/usr/share/enigma2/extensions/directory.png")\r
- else: \r
- extension = name.split('.')\r
- extension = extension[-1].lower()\r
- if EXTENSIONS.has_key(extension):\r
- png = loadPNG("/usr/share/enigma2/extensions/" + EXTENSIONS[extension] + ".png")\r
- else:\r
- png = None\r
- if png is not None:\r
- res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 10, 2, 20, 20, png))\r
- return res\r
-\r
-\r
-##################\r
-class XMLloader:\r
- DEFAULT_NAMESPACES = (\r
- None, # RSS 0.91, 0.92, 0.93, 0.94, 2.0\r
- 'http://purl.org/rss/1.0/', # RSS 1.0\r
- 'http://my.netscape.com/rdf/simple/0.9/' # RSS 0.90\r
- )\r
- DUBLIN_CORE = ('http://purl.org/dc/elements/1.1/',)\r
- def getElementsByTagName( self, node, tagName, possibleNamespaces=DEFAULT_NAMESPACES ):\r
- for namespace in possibleNamespaces:\r
- children = node.getElementsByTagNameNS(namespace, tagName)\r
- if len(children): return children\r
- return []\r
-\r
- def node_data( self, node, tagName, possibleNamespaces=DEFAULT_NAMESPACES):\r
- children = self.getElementsByTagName(node, tagName, possibleNamespaces)\r
- node = len(children) and children[0] or None\r
- return node and "".join([child.data.encode("utf-8") for child in node.childNodes]) or None\r
-\r
- def get_txt( self, node, tagName, default_txt="" ):\r
- """\r
- Liefert den Inhalt >tagName< des >node< zurueck, ist dieser nicht\r
- vorhanden, wird >default_txt< zurueck gegeben.\r
- """\r
- return self.node_data( node, tagName ) or self.node_data( node, tagName, self.DUBLIN_CORE ) or default_txt\r
-\r
- def getScreenXMLTitle( self,node ):\r
- return self.get_txt( node, "name", "no title" )\r
+from enigma import eListbox
+from enigma import eListboxPythonMultiContent
+from enigma import loadPic
+from enigma import loadPNG
+from enigma import gFont
+### Picturelist
+from Screens.Screen import Screen
+from Screens.MessageBox import MessageBox
+from Screens.InputBox import InputBox
+from Screens.ChoiceBox import ChoiceBox
+from Components.ActionMap import ActionMap
+from Components.Label import Label
+from Components.MenuList import MenuList
+from Components.FileList import EXTENSIONS
+## configmenu
+from Components.config import config, ConfigSubsection,ConfigSelection,ConfigText,ConfigYesNo
+####
+from Components.Input import Input
+from Components.Pixmap import Pixmap
+from Plugins.Plugin import PluginDescriptor
+### System
+import os
+from re import compile
+## XML
+from pyexpat import ExpatError
+import xml.dom.minidom
+from Tools.XMLTools import elementsWithTag
+
+### my
+from WebcamViewConfig import WebcamViewerMenu
+from PictureScreen import PictureScreen
+###
+myname = "Webcam/Picture Viewer"
+myversion = "1.1"
+
+
+
+config.plugins.pictureviewer = ConfigSubsection()
+config.plugins.pictureviewer.slideshowtime = ConfigSelection(default="5000", choices = [("5000", _("5 Sekunden")), ("10000", _("10 Sekunden")), ("20000", _("20 Sekunden")), ("60000", _("1 Minute"))])
+config.plugins.pictureviewer.slideshowmode = ConfigSelection(default="0", choices = [("0", _("normal")), ("1", _("endlos"))])
+#not editable configs
+config.plugins.pictureviewer.slideshowext = ConfigText(default=".3ssl")
+config.plugins.pictureviewer.matchingPattern = ConfigText(default="(?i)^.*\.(jpeg|jpg|jpe|png|bmp|gif)")
+config.plugins.pictureviewer.slideshowdir = ConfigText(default="/media/hdd/slideshows/")
+config.plugins.pictureviewer.rootdir = ConfigText(default="/media/")
+config.plugins.pictureviewer.stopserviceonstart = ConfigYesNo(default = False)
+SLIDESHOWMODE_NORMAL = 0
+SLIDESHOWMODE_REPEAT = 1
+
+originalservice = None
+mysession = None
+
+def main1(session,**kwargs):
+ global originalservice,mysession
+ mysession = session
+ originalservice = session.nav.getCurrentlyPlayingServiceReference()
+ if config.plugins.pictureviewer.stopserviceonstart.value:
+ session.nav.stopService()
+ session.openWithCallback(mainCB,PictureViewer)
+
+def main2(session,**kwargs):
+ global originalservice,mysession
+ mysession = session
+ originalservice = session.nav.getCurrentlyPlayingServiceReference()
+ if config.plugins.pictureviewer.stopserviceonstart.value:
+ session.nav.stopService()
+ xmlfile = "/usr/lib/enigma2/python/Plugins/Extensions/WebcamViewer/webcam.xml"
+ if os.path.isfile(xmlfile):
+ try:
+ xmlnode = xml.dom.minidom.parse( open(xmlfile) )
+ session.openWithCallback(mainCB,WebcamViewer,xmlnode.childNodes[1])
+ except ExpatError,e:
+ session.open(MessageBox,_("Loading config file failed!\n\n%s"%e), MessageBox.TYPE_WARNING)
+ else:
+ session.open(MessageBox,_("Loading config file failed!\n\nconfigfile not found!"), MessageBox.TYPE_WARNING)
+
+def mainCB():
+ global originalservice,mysession
+ if config.plugins.pictureviewer.stopserviceonstart.value:
+ mysession.nav.playService(originalservice)
+
+def Plugins(path,**kwargs):
+ p = [
+ PluginDescriptor(
+ name="PictureViewer",
+ description="browse your local pictures",
+ where = PluginDescriptor.WHERE_PLUGINMENU,
+ fnc = main1,
+ icon="pictureviewer.png"
+ )
+ ,
+ PluginDescriptor(
+ name="WebcamViewer",
+ description="view webcams around the world",
+ where = PluginDescriptor.WHERE_PLUGINMENU,
+ fnc = main2,
+ icon="webcamviewer.png"
+ )
+ ]
+ return p
+
+
+
+
+###################
+class Slideshow:
+ filelist=[]
+ currentslideshowitem =0
+ wbviewer = False
+ def __init__(self,session,callback):
+ self.session = session
+ self.callback = callback
+ def setfiles(self,filelist):
+ self.filelist = filelist
+
+ def start(self):
+ if len(self.filelist)>0:
+ self.currentslideshowitem = -1
+ self.nextSlideshowItem()
+
+ def nextSlideshowItem(self):
+ if self.currentslideshowitem is not (len(self.filelist)-1):
+ self.currentslideshowitem = self.currentslideshowitem+1
+ filetoshow = self.filelist[self.currentslideshowitem][1]
+ if self.wbviewer is False:
+ self.wbviewer = self.session.openWithCallback(self.cb,PictureScreen,filetoshow.split("/")[-1],filetoshow,slideshowcallback=self.nextSlideshowItem)
+ else:
+ self.wbviewer.filename = filetoshow
+ self.wbviewer.do()
+ elif self.currentslideshowitem is (len(self.filelist)-1) and int(config.plugins.pictureviewer.slideshowmode.value) is SLIDESHOWMODE_REPEAT:
+ print "["+myname+"] restarting slideshow"
+ self.start()
+ else:
+ print "["+myname+"] slideshow finished"
+ self.wbviewer.exit()
+ self.cb()
+ def cb(self):
+ self.callback()
+###################
+class PictureViewer(Screen):
+ skin = ""
+ filelist = []
+ currList = "slideshowlist"
+ wbviewer = False
+ loadedslideshowlistlistname = False
+ def __init__(self, session, args = 0):
+ self.session = session
+ s = "<screen position=\"93,70\" size=\"550,450\" title=\"%s\">\n" %config.plugins.pictureviewer.rootdir.value
+ s = s+"<widget name=\"menu\" position=\"1,1\" size=\"275,400\" scrollbarMode=\"showOnDemand\" />\n"
+ s = s+"<widget name=\"pixmap\" position=\"550,450\" size=\"275,200\" backgroundColor=\"red\"/>\n"
+ s = s+"<widget name=\"slist\" position=\"275,200\" size=\"275,200\" scrollbarMode=\"showOnDemand\"/>\n"
+ s = s+"<widget name=\"buttonred\" position=\"6,405\" size=\"130,40\" backgroundColor=\"red\" valign=\"center\" halign=\"center\" zPosition=\"2\" foregroundColor=\"white\" font=\"Regular;18\"/>\n"
+ s = s+"<widget name=\"buttongreen\" position=\"142,405\" size=\"130,40\" backgroundColor=\"green\" valign=\"center\" halign=\"center\" zPosition=\"2\" foregroundColor=\"white\" font=\"Regular;18\"/>\n"
+ s = s+"<widget name=\"buttonyellow\" position=\"278,405\" size=\"130,40\" backgroundColor=\"yellow\" valign=\"center\" halign=\"center\" zPosition=\"2\" foregroundColor=\"white\" font=\"Regular;18\"/>\n"
+ s = s+"<widget name=\"buttonblue\" position=\"414,405\" size=\"130,40\" backgroundColor=\"blue\" valign=\"center\" halign=\"center\" zPosition=\"2\" foregroundColor=\"white\" font=\"Regular;18\"/>\n"
+ self.skin = s+"</screen>"
+ Screen.__init__(self, session)
+ self.filelist = PictureList(config.plugins.pictureviewer.rootdir.value, matchingPattern = config.plugins.pictureviewer.matchingPattern.value)
+ self["menu"] = self.filelist
+ self.preview = Pixmap()
+ self["pixmap"] = self.preview
+ self.slideshowfiles = []
+ self.slideshowlist =MenuList(self.slideshowfiles)
+ self["slist"] = self.slideshowlist
+ self["buttonred"] = Label("")
+ self["buttongreen"] = Label("")
+ self["buttonyellow"] = Label("")
+ self["buttonblue"] = Label("")
+ self["actions"] = ActionMap(["WizardActions","MenuActions", "DirectionActions","ShortcutActions"],
+ {
+ "ok": self.go,
+ "back": self.close,
+ "menu": self.openMenu,
+ "up": self.up,
+ "down": self.down,
+ "left": self.leftUp,
+ "right": self.rightUp,
+ "red": self.KeyRed,
+ "green": self.KeyGreen,
+ "yellow": self.KeyYellow,
+ "blue": self.switchList,
+ }, -1)
+ self.onLayoutFinish.append(self.switchList)
+ self.onLayoutFinish.append(self.updateInfoPanel)
+ def KeyGreen(self):
+ if self.currList is "filelist" :
+ ## adding all files in current dir to slideshowlist
+ dirname = self["menu"].getCurrentDir()
+ if os.path.isdir(dirname):
+ s = os.listdir(dirname)
+ s.sort()
+ for file in s:
+ if compile(config.plugins.pictureviewer.matchingPattern.value).search(dirname+file):
+ self.slideshowfiles.append((_(file),dirname+file))
+ self["slist"].l.setList(self.slideshowfiles)
+
+ else:
+ #loading list
+ list = []
+ try:
+ for file in os.listdir(config.plugins.pictureviewer.slideshowdir.value):
+ if file.endswith(config.plugins.pictureviewer.slideshowext.value):
+ list.append((_(file.split("/")[-1]),file))
+ self.session.openWithCallback(self.fileToLoadFilelistEntered,ChoiceBox,_("select List to load"),list)
+ except IOError,e:
+ print "["+myname+"] IOError:",e
+ except OSError,e:
+ print "["+myname+"] OSError:",e
+
+ def KeyRed(self):
+ if self.currList is "filelist" :
+ #do slideshow
+ self.hide()
+ x = Slideshow(self.session,self.show)
+ x.setfiles(self.slideshowfiles)
+ x.start()
+ else:
+ # save filelist
+ if self.loadedslideshowlistlistname is False:
+ newname = "slideshowlist"
+ else:
+ newname = self.loadedslideshowlistlistname
+ self.session.openWithCallback(self.fileToSaveFilelistEntered,InputBox, title=_("Enter filename to save the List:"), text=newname, maxSize=False, type=Input.TEXT)
+
+ def fileToLoadFilelistEntered(self,fileselection):
+ if fileselection is not None:
+ try:
+ filename = fileselection[1]
+ fp = open(config.plugins.pictureviewer.slideshowdir.value+filename)
+ list = []
+ for x in fp.readlines():
+ file = x.replace("\n","")
+ if x.startswith("#"):
+ pass
+ elif os.path.exists(file) is not True:
+ print "["+myname+"] loaded file from filelist isnt avaible! ignoreing ->",file
+ else:
+ list.append((_(file.split("/")[-1]),file))
+ self.slideshowfiles =list
+ self["slist"].l.setList(self.slideshowfiles)
+ self.loadedslideshowlistlistname = filename.replace(config.plugins.pictureviewer.slideshowext.value,"")
+ except IOError,e:
+ print "["+myname+"] error:",e
+
+ def fileToSaveFilelistEntered(self,filename):
+ if filename is not None:
+ print "["+myname+"] saving list to ",config.plugins.pictureviewer.slideshowdir.value+filename+config.plugins.pictureviewer.slideshowext.value
+ try:
+ if os.path.exists(config.plugins.pictureviewer.slideshowdir.value) is not True:
+ print "+"*10,os.path.basename(filename)
+ os.mkdir(config.plugins.pictureviewer.slideshowdir.value)
+ fp = open(config.plugins.pictureviewer.slideshowdir.value+filename+config.plugins.pictureviewer.slideshowext.value,"w")
+ fp.write("# this is a slideshow file for "+myname+" made by V"+myversion+"\n")
+ fp.write("# you can make your own... each line with full path of the imagefile\n")
+ fp.write("# by importing this file,we will ignoring a file if is doesnt exist\n")
+ for x in self.slideshowfiles:
+ fp.write(x[1]+"\n")
+ fp.close()
+ except IOError,e:
+ print "["+myname+"] error:",e
+ def KeyYellow(self):
+ if self.currList is "filelist" :
+ # add picture to list
+ fullfile = self["menu"].getSelection()[0]
+ if os.path.isfile(fullfile):
+ self.slideshowfiles.append((_(fullfile.split("/")[-1]),fullfile))
+ self["slist"].l.setList(self.slideshowfiles)
+ else:
+ # deleting an Picture
+ if len(self.slideshowfiles) >=1:
+ indexinlist = self["slist"].l.getCurrentSelectionIndex()
+ self.slideshowfiles.pop(indexinlist)
+ self["slist"].l.setList(self.slideshowfiles)
+
+ def switchList(self):
+ if self.currList is "filelist" :
+ # Slideshow activieren
+ self.filelist.selectionEnabled(0)
+ self.slideshowlist.selectionEnabled(1)
+ self["buttonred"].setText("speichern")
+ self["buttongreen"].setText("laden")
+ self["buttonyellow"].setText("loeschen")
+ self["buttonblue"].setText("Dateien")
+ self.currList = "slideshowlist"
+ else:
+ # filelist activieren
+ self.filelist.selectionEnabled(1)
+ self.slideshowlist.selectionEnabled(0)
+ self["buttonred"].setText("starte Slideshow")
+ self["buttongreen"].setText("alle hinzufuegen")
+ self["buttonyellow"].setText("hinzufuegen")
+ self["buttonblue"].setText("Slideshow bearbeiten")
+ self.currList = "filelist"
+
+ def go(self):
+ if self.currList is "filelist" :
+ selection = self["menu"].getSelection()
+ if self.filelist.canDescent():
+ self.setTitle(selection[0])
+ self.filelist.descent()
+ else:
+ if selection[1] == True: # isDir
+ pass
+ else:
+ print "["+myname+"] file selected ",selection[0]
+ if os.path.isfile(selection[0]):
+ self.session.open(PictureScreen,selection[0].split("/")[-1],selection[0])
+ else:
+ print "["+myname+"] file not found " + selection[0]+""
+ else:
+ self.updateInfoPanel()
+ def up(self):
+ if self.currList is "filelist" :
+ self.filelist.up()
+ self.updateInfoPanel()
+ else:
+ self.slideshowlist.up()
+ def leftUp(self):
+ if self.currList is "filelist" :
+ self.filelist.pageUp()
+ self.updateInfoPanel()
+ else:
+
+ self.slideshowlist.pageUp()
+ def rightUp(self):
+ if self.currList is "filelist" :
+ self.filelist.pageDown()
+ self.updateInfoPanel()
+ else:
+ self.slideshowlist.pageDown()
+ def down(self):
+ if self.currList is "filelist" :
+ self.filelist.down()
+ self.updateInfoPanel()
+ else:
+ self.slideshowlist.down()
+
+ def updateInfoPanel(self):
+ if self.currList is "filelist" :
+ selectedfile = self["menu"].getSelection()[0]
+ else:
+ selectedfile = self["slist"].l.getCurrentSelection()[1]
+ pixmap = loadPic(selectedfile, 275,200, 1,1, 0,1)
+ if pixmap is not None:
+ self["pixmap"].instance.setPixmap(pixmap.__deref__())
+ self["pixmap"].move(275,0)
+ else:
+ pass
+
+ def output(self,str):
+ print "+"*10,str
+ def openMenu(self):
+ self.session.open(WebcamViewerMenu)
+###################
+class WebcamViewer(Screen):
+ skin = ""
+ filelist = []
+ def __init__(self, session,xmlnode, args = 0):
+ self.xmlnode = xmlnode
+ screen_x = 736
+ screen_y = 576
+ size_x = 350
+ size_y = 250
+ pos_x = (screen_x/2)-(size_x/2)
+ pos_y = (screen_y/2)-(size_y/2)
+ self.session = session
+ self.skin = """
+ <screen position="%i,%i" size="%i,%i" title="%s">
+ <widget name="menu" position="1,1" size="%i,%i" scrollbarMode="showOnDemand"/>
+ </screen>""" % (pos_x,pos_y,size_x,size_y,myname,size_x,size_y)
+ Screen.__init__(self, session)
+ self.filelist = MenuList(self.getMenuData())
+ self["menu"] = self.filelist
+ self["actions"] = ActionMap(["WizardActions", "DirectionActions"],
+ {
+ "ok": self.go,
+ "back": self.close,
+ }, -1)
+ self.onLayoutFinish.append(self.settingTitle)
+
+ def settingTitle(self):
+ self.setTitle(myname+": "+self.menutitle)
+
+ def go(self):
+ selected = self["menu"].l.getCurrentSelection()[1]
+ menuitemtitle = self["menu"].l.getCurrentSelection()[0]
+ type = selected[0]
+ data = selected[1]
+ if type.startswith("cam"):
+ self.session.open(PictureScreen,menuitemtitle,data)
+ else:
+ self.hide()
+ self.session.openWithCallback(self.cb,WebcamViewer,data)
+
+ def cb(self):
+ self.show()
+
+ def getMenuData(self):
+ xloader = XMLloader()
+ self.menutitle = xloader.getScreenXMLTitle(self.xmlnode)
+ data =[]
+ for node in elementsWithTag(self.xmlnode._get_childNodes(), 'menu'):
+ nodex={}
+ nodex['name'] = xloader.get_txt( node, "name", "no name" )
+ data.append((_("*"+nodex['name']),["node",node]))
+
+ for node2 in elementsWithTag(self.xmlnode._get_childNodes(), 'cam'):
+ nodex={}
+ nodex['name'] = xloader.get_txt( node2, "name", "no name" )
+ nodex['url'] = xloader.get_txt( node2, "url", "no url" )
+ data.append((_(nodex['name']),["cam",nodex['url']]))
+ return data
+###################
+
+##################
+class PictureList(MenuList):
+ def __init__(self, directory, matchingPattern = None, enableWrapAround = False):
+ MenuList.__init__(self, None, enableWrapAround, eListboxPythonMultiContent)
+ self.showDirectories = True
+ self.showFiles = True
+ self.isTop = False
+ self.matchingPattern = matchingPattern
+ self.changeDir(directory)
+ self.l.setFont(0, gFont("Regular", 18))
+ self.currentDir = directory
+
+ def getCurrentDir(self):
+ return self.currentDir
+
+ def getSelection(self):
+ return self.l.getCurrentSelection()[0]
+
+ def getFileList(self):
+ return self.list
+
+ def changeDir(self, directory):
+ self.currentDir = directory
+ self.list = []
+
+ directories = []
+ files = []
+ files = os.listdir(directory)
+ files.sort()
+ tmpfiles = files[:]
+ for x in tmpfiles:
+ if os.path.isdir(directory +"/"+ x):
+ directories.append(x)
+ files.remove(x)
+ directories.sort()
+ files.sort()
+ if directory != "/" and self.showDirectories and not self.isTop:
+ self.list.append(self.getPictureEntryComponent("..",'/'.join(directory.split('/')[:-2]) + '/',True))
+
+ if self.showDirectories:
+ for x in directories:
+ name = (directory+x).split('/')[-1]
+ self.list.append(self.getPictureEntryComponent(name,'/'.join(directory.split('/')[:-1]) + '/'+x+'/',True))
+
+ if self.showFiles:
+ for x in files:
+ path = directory + x
+ name = x
+ if self.matchingPattern is not None:
+ if compile(self.matchingPattern).search(path):
+ self.list.append(self.getPictureEntryComponent(name,path ,False))
+ else:
+ pass
+
+ self.l.setList(self.list)
+
+ def canDescent(self):
+ return self.getSelection()[1]
+
+ def descent(self):
+ self.changeDir(self.getSelection()[0])
+
+ def getFilename(self):
+ return self.getSelection()[0].getPath()
+
+ def getServiceRef(self):
+ return self.getSelection()[0]
+
+ def postWidgetCreate(self, instance):
+ MenuList.postWidgetCreate(self, instance)
+ instance.setItemHeight(23)
+
+ def getPictureEntryComponent(self,name, absolute, isDir):
+ """ name={angezeigter Name}, absolute={vollstaendiger Pfad}, isDir={True,False} """
+ res = [ (absolute, isDir) ]
+ res.append((eListboxPythonMultiContent.TYPE_TEXT, 35, 1, 200, 20, 0, 0, name))
+ if isDir:
+ png = loadPNG("/usr/share/enigma2/extensions/directory.png")
+ else:
+ extension = name.split('.')
+ extension = extension[-1].lower()
+ if EXTENSIONS.has_key(extension):
+ png = loadPNG("/usr/share/enigma2/extensions/" + EXTENSIONS[extension] + ".png")
+ else:
+ png = None
+ if png is not None:
+ res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 10, 2, 20, 20, png))
+ return res
+
+
+##################
+class XMLloader:
+ DEFAULT_NAMESPACES = (
+ None, # RSS 0.91, 0.92, 0.93, 0.94, 2.0
+ 'http://purl.org/rss/1.0/', # RSS 1.0
+ 'http://my.netscape.com/rdf/simple/0.9/' # RSS 0.90
+ )
+ DUBLIN_CORE = ('http://purl.org/dc/elements/1.1/',)
+ def getElementsByTagName( self, node, tagName, possibleNamespaces=DEFAULT_NAMESPACES ):
+ for namespace in possibleNamespaces:
+ children = node.getElementsByTagNameNS(namespace, tagName)
+ if len(children): return children
+ return []
+
+ def node_data( self, node, tagName, possibleNamespaces=DEFAULT_NAMESPACES):
+ children = self.getElementsByTagName(node, tagName, possibleNamespaces)
+ node = len(children) and children[0] or None
+ return node and "".join([child.data.encode("utf-8") for child in node.childNodes]) or None
+
+ def get_txt( self, node, tagName, default_txt="" ):
+ """
+ Liefert den Inhalt >tagName< des >node< zurueck, ist dieser nicht
+ vorhanden, wird >default_txt< zurueck gegeben.
+ """
+ return self.node_data( node, tagName ) or self.node_data( node, tagName, self.DUBLIN_CORE ) or default_txt
+
+ def getScreenXMLTitle( self,node ):
+ return self.get_txt( node, "name", "no title" )