stop service playback on start
authorRico Schulte <ricoschulte@users.schwerkraft.elitedvb.net>
Sat, 18 Oct 2008 17:51:38 +0000 (17:51 +0000)
committerRico Schulte <ricoschulte@users.schwerkraft.elitedvb.net>
Sat, 18 Oct 2008 17:51:38 +0000 (17:51 +0000)
webcamviewer/src/WebcamViewConfig.py
webcamviewer/src/plugin.py

index 48b7c31..1b0309e 100755 (executable)
@@ -18,6 +18,8 @@ class WebcamViewerMenu(ConfigListScreen,Screen):
         self.list = []
         self.list.append(getConfigListEntry(_("Slideshow Time"), config.plugins.pictureviewer.slideshowtime))
         self.list.append(getConfigListEntry(_("Slideshow Mode"), config.plugins.pictureviewer.slideshowmode))
+        self.list.append(getConfigListEntry(_("stop Service on Start"), config.plugins.pictureviewer.stopserviceonstart))
+        
         ConfigListScreen.__init__(self, self.list)
         self["buttonred"] = Label(_("cancel"))
         self["buttongreen"] = Label(_("ok"))
index 6fc1d83..df98bfc 100755 (executable)
-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" )