continue work on plugin manager
authoracid-burn <acidburn@opendreambox.org>
Wed, 27 May 2009 10:43:41 +0000 (12:43 +0200)
committeracid-burn <acidburn@opendreambox.org>
Wed, 27 May 2009 10:43:41 +0000 (12:43 +0200)
not yet finished

lib/python/Components/DreamInfoHandler.py
lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py
lib/python/Plugins/SystemPlugins/VideoTune/meta/plugin_videotune.xml [changed mode: 0644->0755]
lib/python/Tools/Directories.py

index 25397feb48260db796e6f50fb427d9c3325c7986..6004e1f32f83f2e6efa3c3173b77d33b99ebefd5 100755 (executable)
@@ -7,6 +7,7 @@ from Components.config import config, configfile
 from Tools.HardwareInfo import HardwareInfo
 from enigma import eConsoleAppContainer, eDVBDB
 import os
 from Tools.HardwareInfo import HardwareInfo
 from enigma import eConsoleAppContainer, eDVBDB
 import os
+from re import compile as re_compile, search as re_search, IGNORECASE
 
 class InfoHandlerParseError(Exception):
        def __init__(self, value):
 
 class InfoHandlerParseError(Exception):
        def __init__(self, value):
@@ -25,9 +26,10 @@ class InfoHandler(xml.sax.ContentHandler):
                self.validFileTypes = ["skin", "config", "services", "favourites", "package"]
                self.prerequisitesMet = prerequisiteMet
                self.data = ""
                self.validFileTypes = ["skin", "config", "services", "favourites", "package"]
                self.prerequisitesMet = prerequisiteMet
                self.data = ""
-               self.languagedata = ""
                self.language = language
                self.language = language
-               
+               self.translatedPackageInfos = {}
+               self.foundTranslation = None
+
        def printError(self, error):
                print "Error in defaults xml files:", error
                raise InfoHandlerParseError, error
        def printError(self, error):
                print "Error in defaults xml files:", error
                raise InfoHandlerParseError, error
@@ -35,6 +37,7 @@ class InfoHandler(xml.sax.ContentHandler):
        def startElement(self, name, attrs):
                #print name, ":", attrs.items()
                self.elements.append(name)
        def startElement(self, name, attrs):
                #print name, ":", attrs.items()
                self.elements.append(name)
+
                if name in ("hardware", "bcastsystem", "satellite", "tag", "flag"):
                        if not attrs.has_key("type"):
                                        self.printError(str(name) + " tag with no type attribute")
                if name in ("hardware", "bcastsystem", "satellite", "tag", "flag"):
                        if not attrs.has_key("type"):
                                        self.printError(str(name) + " tag with no type attribute")
@@ -45,6 +48,21 @@ class InfoHandler(xml.sax.ContentHandler):
                        if not prerequisites.has_key(name):
                                prerequisites[name] = []
                        prerequisites[name].append(str(attrs["type"]))
                        if not prerequisites.has_key(name):
                                prerequisites[name] = []
                        prerequisites[name].append(str(attrs["type"]))
+
+               if name == "info":
+                       if not attrs.has_key("language"):
+                                       self.printError(str(name) + " tag with no language attribute")
+                       else:
+                               if attrs["language"] == 'en': # read default translations
+                                       self.foundTranslation = False
+                                       self.data = ""
+                               elif attrs["language"] == self.language:
+                                       self.foundTranslation = True
+                                       self.data = ""
+                               else:
+                                       self.foundTranslation = None
+                                       self.data = ""
+
                if name == "files":
                        if attrs.has_key("type"):
                                if attrs["type"] == "directories":
                if name == "files":
                        if attrs.has_key("type"):
                                if attrs["type"] == "directories":
@@ -52,6 +70,7 @@ class InfoHandler(xml.sax.ContentHandler):
                                elif attrs["type"] == "package":
                                        self.attributes["filestype"] = "package"
                                # TODO add a compressed archive type
                                elif attrs["type"] == "package":
                                        self.attributes["filestype"] = "package"
                                # TODO add a compressed archive type
+
                if name == "file":
                        self.prerequisites = {}
                        if not attrs.has_key("type"):
                if name == "file":
                        self.prerequisites = {}
                        if not attrs.has_key("type"):
@@ -81,10 +100,13 @@ class InfoHandler(xml.sax.ContentHandler):
 
                if name == "screenshot":
                        if attrs.has_key("src"):
 
                if name == "screenshot":
                        if attrs.has_key("src"):
-                               self.attributes["screenshot"] = str(attrs["src"])
+                               if self.foundTranslation is False:
+                                       self.attributes["screenshot"] = str(attrs["src"])
+                               elif self.foundTranslation is True:
+                                       self.translatedPackageInfos["screenshot"] = str(attrs["src"])
 
        def endElement(self, name):
 
        def endElement(self, name):
-               #print "end", name
+               #print "endElement", name
                #print "self.elements:", self.elements
                self.elements.pop()
                if name == "file":
                #print "self.elements:", self.elements
                self.elements.pop()
                if name == "file":
@@ -101,7 +123,7 @@ class InfoHandler(xml.sax.ContentHandler):
                                self.attributes[self.filetype].append({ "name": str(self.fileattrs["name"]), "directory": directory })
 
                if name in ( "default", "package" ):
                                self.attributes[self.filetype].append({ "name": str(self.fileattrs["name"]), "directory": directory })
 
                if name in ( "default", "package" ):
-                       self.list.append({"attributes": self.attributes, 'prerequisites': self.globalprerequisites})
+                       self.list.append({"attributes": self.attributes, 'prerequisites': self.globalprerequisites ,"translation": self.translatedPackageInfos})
                        self.attributes = {}
                        self.globalprerequisites = {}
 
                        self.attributes = {}
                        self.globalprerequisites = {}
 
@@ -110,50 +132,60 @@ class InfoHandler(xml.sax.ContentHandler):
                        self.attributes["author"] = str(data)
                if self.elements[-1] == "name":
                        self.attributes["name"] = str(data)
                        self.attributes["author"] = str(data)
                if self.elements[-1] == "name":
                        self.attributes["name"] = str(data)
-               if self.elements[-1] == "packagename":
-                       self.attributes["packagename"] = str(data.encode("utf-8"))
-               if self.elements[-1] == "shortdescription":
-                       self.attributes["shortdescription"] = str(data.encode("utf-8"))
-               if self.elements[-1] == "description":
-                       self.data += data.strip()
-                       self.attributes["description"] = str(self.data.encode("utf-8"))
-               if self.language is not None:
-                       if self.elements[-1] == ("name_" + str(self.language)):
-                               self.attributes["name"] = str(data.encode("utf-8"))
-                       if self.elements[-1] == ("shortdescription_" + str(self.language)):
+               if self.foundTranslation is False:
+                       if self.elements[-1] == "author":
+                               self.attributes["author"] = str(data)
+                       if self.elements[-1] == "name":
+                               self.attributes["name"] = str(data)
+                       if self.elements[-1] == "packagename":
+                               self.attributes["packagename"] = str(data.encode("utf-8"))
+                       if self.elements[-1] == "shortdescription":
                                self.attributes["shortdescription"] = str(data.encode("utf-8"))
                                self.attributes["shortdescription"] = str(data.encode("utf-8"))
-                       if self.elements[-1] == ("description_" + str(self.language)):
-                               self.languagedata += data.strip()
-                               self.attributes["description"] = str(self.languagedata.encode("utf-8"))
+                       if self.elements[-1] == "description":
+                               self.data += data.strip()
+                               self.attributes["description"] = str(self.data.encode("utf-8"))
+               elif self.foundTranslation is True:
+                       if self.elements[-1] == "author":
+                               self.translatedPackageInfos["author"] = str(data)
+                       if self.elements[-1] == "name":
+                               self.translatedPackageInfos["name"] = str(data)
+                       if self.elements[-1] == "description":
+                               self.data += data.strip()
+                               self.translatedPackageInfos["description"] = str(self.data.encode("utf-8"))
+                       if self.elements[-1] == "name":
+                               self.translatedPackageInfos["name"] = str(data.encode("utf-8"))
+                       if self.elements[-1] == "shortdescription":
+                               self.translatedPackageInfos["shortdescription"] = str(data.encode("utf-8"))
                #print "characters", data
                #print "characters", data
-               
+
+
 class DreamInfoHandler:
        STATUS_WORKING = 0
        STATUS_DONE = 1
        STATUS_ERROR = 2
        STATUS_INIT = 4
 class DreamInfoHandler:
        STATUS_WORKING = 0
        STATUS_DONE = 1
        STATUS_ERROR = 2
        STATUS_INIT = 4
-       
+
        def __init__(self, statusCallback, blocking = False, neededTag = None, neededFlag = None, language = None):
                self.hardware_info = HardwareInfo()
                self.directory = "/"
        def __init__(self, statusCallback, blocking = False, neededTag = None, neededFlag = None, language = None):
                self.hardware_info = HardwareInfo()
                self.directory = "/"
-               
+
                self.neededTag = neededTag
                self.neededFlag = neededFlag
                self.language = language
                self.neededTag = neededTag
                self.neededFlag = neededFlag
                self.language = language
-               
+
                # caution: blocking should only be used, if further execution in enigma2 depends on the outcome of
                # the installer!
                self.blocking = blocking
                # caution: blocking should only be used, if further execution in enigma2 depends on the outcome of
                # the installer!
                self.blocking = blocking
-               
+
                self.currentlyInstallingMetaIndex = None
                self.currentlyInstallingMetaIndex = None
-               
+
                self.console = eConsoleAppContainer()
                self.console.appClosed.append(self.installNext)
                self.reloadFavourites = False
                self.console = eConsoleAppContainer()
                self.console.appClosed.append(self.installNext)
                self.reloadFavourites = False
-               
+
                self.statusCallback = statusCallback
                self.setStatus(self.STATUS_INIT)
                self.statusCallback = statusCallback
                self.setStatus(self.STATUS_INIT)
-                               
+
                self.packageslist = []
                self.packagesIndexlist = []
                self.packageDetails = []
                self.packageslist = []
                self.packagesIndexlist = []
                self.packageDetails = []
@@ -167,7 +199,7 @@ class DreamInfoHandler:
                                self.packageslist.append((entry,file)) 
                except InfoHandlerParseError:
                        print "file", file, "ignored due to errors in the file"
                                self.packageslist.append((entry,file)) 
                except InfoHandlerParseError:
                        print "file", file, "ignored due to errors in the file"
-               print handler.list
+               #print handler.list
 
        def readIndex(self, directory, file):
                print "Reading .xml meta index file", file
 
        def readIndex(self, directory, file):
                print "Reading .xml meta index file", file
@@ -181,6 +213,7 @@ class DreamInfoHandler:
                #print handler.list
 
        def readDetails(self, directory, file):
                #print handler.list
 
        def readDetails(self, directory, file):
+               self.packageDetails = []
                print "Reading .xml meta details file", file
                handler = InfoHandler(self.prerequisiteMet, directory, self.language)
                try:
                print "Reading .xml meta details file", file
                handler = InfoHandler(self.prerequisiteMet, directory, self.language)
                try:
@@ -191,19 +224,20 @@ class DreamInfoHandler:
                        print "file", file, "ignored due to errors in the file"
                #print handler.list
 
                        print "file", file, "ignored due to errors in the file"
                #print handler.list
 
+
        # prerequisites = True: give only packages matching the prerequisites
        def fillPackagesList(self, prerequisites = True):
                self.packageslist = []
                packages = []
                if not isinstance(self.directory, list):
                        self.directory = [self.directory]
        # prerequisites = True: give only packages matching the prerequisites
        def fillPackagesList(self, prerequisites = True):
                self.packageslist = []
                packages = []
                if not isinstance(self.directory, list):
                        self.directory = [self.directory]
-               
+
                for directory in self.directory:
                        packages += crawlDirectory(directory, ".*\.info$")
 
                for package in packages:
                        self.readInfo(package[0] + "/", package[0] + "/" + package[1])
                for directory in self.directory:
                        packages += crawlDirectory(directory, ".*\.info$")
 
                for package in packages:
                        self.readInfo(package[0] + "/", package[0] + "/" + package[1])
-                       
+
                if prerequisites:
                        for package in self.packageslist[:]:
                                if not self.prerequisiteMet(package[0]["prerequisites"]):
                if prerequisites:
                        for package in self.packageslist[:]:
                                if not self.prerequisiteMet(package[0]["prerequisites"]):
@@ -213,13 +247,26 @@ class DreamInfoHandler:
        # prerequisites = True: give only packages matching the prerequisites
        def fillPackagesIndexList(self, prerequisites = True):
                self.packagesIndexlist = []
        # prerequisites = True: give only packages matching the prerequisites
        def fillPackagesIndexList(self, prerequisites = True):
                self.packagesIndexlist = []
-               if self.language is not None:
-                       indexfile = 'index_' + self.language + '.xml'
-               else:
-                       indexfile = 'index.xml'
+               indexfileList = []
+
                if not isinstance(self.directory, list):
                        self.directory = [self.directory]
                if not isinstance(self.directory, list):
                        self.directory = [self.directory]
-               self.readIndex(self.directory[0] + "/", self.directory[0] + "/" + indexfile)
+
+               for indexfile in os.listdir(self.directory[0]):
+                       if indexfile.startswith("index"):
+                               if os.path.splitext(indexfile)[0][-3:-2] is not "_": #we first catch all non translated indexfiles
+                                       indexfileList.append(os.path.splitext(indexfile)[0])
+
+               if len(indexfileList):
+                       for file in indexfileList:
+                               neededFile = self.directory[0] + "/" + file
+                               if self.language is not None:
+                                       if os.path.exists(neededFile + '_' + self.language + '.xml' ):
+                                               #print "translated index file found",neededFile + '_' + self.language + '.xml'
+                                               self.readIndex(self.directory[0] + "/", neededFile + '_' + self.language + '.xml')
+                                       else:
+                                               #print "reading original index file"
+                                               self.readIndex(self.directory[0] + "/", neededFile + '.xml')
 
                if prerequisites:
                        for package in self.packagesIndexlist[:]:
 
                if prerequisites:
                        for package in self.packagesIndexlist[:]:
index ffc227d656839626fbe311e01ad1e1c0f51cae2d..20b3bf4cf4c9d5081d355377c6741c9933807cd1 100755 (executable)
@@ -650,32 +650,32 @@ class PacketManager(Screen):
 
 
 class PluginManager(Screen, DreamInfoHandler):
 
 
 class PluginManager(Screen, DreamInfoHandler):
+
+       lastDownloadDate = None
+
        skin = """
                <screen position="80,90" size="560,420" title="Plugin manager..." >
                        <widget source="list" render="Listbox" position="5,10" size="550,365" scrollbarMode="showOnDemand">
                                <convert type="TemplatedMultiContent">
                                {"templates":
        skin = """
                <screen position="80,90" size="560,420" title="Plugin manager..." >
                        <widget source="list" render="Listbox" position="5,10" size="550,365" scrollbarMode="showOnDemand">
                                <convert type="TemplatedMultiContent">
                                {"templates":
-                                       {"default": [
-                                                       MultiContentEntryText(pos = (30, 1), size = (500, 28), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name
-                                                       MultiContentEntryText(pos = (30, 26), size = (500, 20), font=1, flags = RT_HALIGN_LEFT, text = 2), # index 2 is the description
-                                                       MultiContentEntryPixmapAlphaTest(pos = (500, 2), size = (48, 48), png = 5), # index 5 is the status pixmap
-                                                       MultiContentEntryPixmapAlphaTest(pos = (0, 50), size = (550, 2), png = 6), # index 6 is the div pixmap
-                                                       MultiContentEntryPixmapAlphaTest(pos = (0, 10), size = (25, 25), png = 7), # index 7 is the selected pixmap
-                                               ],
-                                       "category": [
+                                       {"default": (52,[
                                                        MultiContentEntryText(pos = (30, 1), size = (500, 28), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name
                                                        MultiContentEntryText(pos = (30, 26), size = (500, 20), font=1, flags = RT_HALIGN_LEFT, text = 2), # index 2 is the description
                                                        MultiContentEntryText(pos = (30, 1), size = (500, 28), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name
                                                        MultiContentEntryText(pos = (30, 26), size = (500, 20), font=1, flags = RT_HALIGN_LEFT, text = 2), # index 2 is the description
-                                                       MultiContentEntryPixmapAlphaTest(pos = (500, 2), size = (48, 48), png = 5), # index 5 is the status pixmap
+                                                       MultiContentEntryPixmapAlphaTest(pos = (480, 2), size = (48, 48), png = 5), # index 5 is the status pixmap
                                                        MultiContentEntryPixmapAlphaTest(pos = (0, 50), size = (550, 2), png = 6), # index 6 is the div pixmap
                                                        MultiContentEntryPixmapAlphaTest(pos = (0, 10), size = (25, 25), png = 7), # index 7 is the selected pixmap
                                                        MultiContentEntryPixmapAlphaTest(pos = (0, 50), size = (550, 2), png = 6), # index 6 is the div pixmap
                                                        MultiContentEntryPixmapAlphaTest(pos = (0, 10), size = (25, 25), png = 7), # index 7 is the selected pixmap
-                                               ]
+                                               ]),
+                                       "category": (42,[
+                                                       MultiContentEntryText(pos = (30, 0), size = (500, 24), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name
+                                                       MultiContentEntryText(pos = (30, 26), size = (500, 14), font=1, flags = RT_HALIGN_LEFT, text = 1), # index 2 is the description
+                                                       MultiContentEntryPixmapAlphaTest(pos = (0, 40), size = (550, 2), png = 3), # index 6 is the div pixmap
+                                               ])
                                        },
                                        "fonts": [gFont("Regular", 22),gFont("Regular", 14)],
                                        "itemHeight": 52
                                }
                                </convert>
                        </widget>
                                        },
                                        "fonts": [gFont("Regular", 22),gFont("Regular", 14)],
                                        "itemHeight": 52
                                }
                                </convert>
                        </widget>
-
                        <ePixmap pixmap="skin_default/buttons/red.png" position="0,380" zPosition="2" size="140,40" transparent="1" alphatest="on" />
                        <widget name="closetext" position="0,380" zPosition="10" size="140,40" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" />
                        <ePixmap pixmap="skin_default/buttons/green.png" position="140,380" zPosition="2" size="140,40" transparent="1" alphatest="on" />
                        <ePixmap pixmap="skin_default/buttons/red.png" position="0,380" zPosition="2" size="140,40" transparent="1" alphatest="on" />
                        <widget name="closetext" position="0,380" zPosition="10" size="140,40" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" />
                        <ePixmap pixmap="skin_default/buttons/green.png" position="140,380" zPosition="2" size="140,40" transparent="1" alphatest="on" />
@@ -696,11 +696,8 @@ class PluginManager(Screen, DreamInfoHandler):
                        self.ImageVersion = 'Experimental'
                else:
                        self.ImageVersion = 'Stable'
                        self.ImageVersion = 'Experimental'
                else:
                        self.ImageVersion = 'Stable'
-               lang = language.getLanguage()[:2] # getLanguage returns e.g. "fi_FI" for "language_country"
-               if lang == "en":
-                       self.language = None
-               else:
-                       self.language = lang
+               self.language = language.getLanguage()[:2] # getLanguage returns e.g. "fi_FI" for "language_country"
+
                DreamInfoHandler.__init__(self, self.statusCallback, blocking = False, neededTag = 'ALL_TAGS', neededFlag = self.ImageVersion, language = self.language)
                self.directory = resolveFilename(SCOPE_METADIR)
 
                DreamInfoHandler.__init__(self, self.statusCallback, blocking = False, neededTag = 'ALL_TAGS', neededFlag = self.ImageVersion, language = self.language)
                self.directory = resolveFilename(SCOPE_METADIR)
 
@@ -741,6 +738,7 @@ class PluginManager(Screen, DreamInfoHandler):
                self["selecttext"].hide()
                self["viewtext"].hide()
                self.currList = ""
                self["selecttext"].hide()
                self["viewtext"].hide()
                self.currList = ""
+               self.currentSelectedTag = None
 
                self.onShown.append(self.setWindowTitle)
                self.onLayoutFinish.append(self.rebuildList)
 
                self.onShown.append(self.setWindowTitle)
                self.onLayoutFinish.append(self.rebuildList)
@@ -751,6 +749,8 @@ class PluginManager(Screen, DreamInfoHandler):
        def exit(self):
                if self.currList == "packages":
                        self.currList = "category"
        def exit(self):
                if self.currList == "packages":
                        self.currList = "category"
+                       self.currentSelectedTag = None
+                       self["list"].style = "category"
                        self['list'].setList(self.categoryList)
                else:
                        self.ipkg.stop()
                        self['list'].setList(self.categoryList)
                else:
                        self.ipkg.stop()
@@ -816,7 +816,6 @@ class PluginManager(Screen, DreamInfoHandler):
                                self["viewtext"].setText(_("View"))
                                self["viewtext"].show()
 
                                self["viewtext"].setText(_("View"))
                                self["viewtext"].show()
 
-
        def changeSelectionState(self):
                current = self["list"].getCurrent()
                if current:
        def changeSelectionState(self):
                current = self["list"].getCurrent()
                if current:
@@ -844,29 +843,44 @@ class PluginManager(Screen, DreamInfoHandler):
                                        else:
                                                newList.append(x)
                                        count += 1
                                        else:
                                                newList.append(x)
                                        count += 1
-
+                               old_index = self["list"].index
                                self.list = newList
                                self.list = newList
-                               self['list'].updateList(self.list)
+                               self["list"].disable_callbacks = True
+                               self["list"].list = self.list
+                               self["list"].disable_callbacks = False
+                               self["list"].setList(self.list)
+                               self["list"].setIndex(old_index)
+                               self["list"].updateList(self.list)
                                self.selectionChanged()
 
        def rebuildList(self):
                self.setState('update')
                                self.selectionChanged()
 
        def rebuildList(self):
                self.setState('update')
-               self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)
+               if not PluginManager.lastDownloadDate or (time() - PluginManager.lastDownloadDate) > 3600:
+                       # Only update from internet once per hour
+                       PluginManager.lastDownloadDate = time()
+                       print "last update time > 1h"
+                       self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)
+               else:
+                       print "last update time < 1h"
+                       self.startInstallMetaPackage()
 
        def ipkgCallback(self, event, param):
                if event == IpkgComponent.EVENT_ERROR:
                        self.list_updating = False
                        self.setState('error')
                elif event == IpkgComponent.EVENT_DONE:
 
        def ipkgCallback(self, event, param):
                if event == IpkgComponent.EVENT_ERROR:
                        self.list_updating = False
                        self.setState('error')
                elif event == IpkgComponent.EVENT_DONE:
-                       if self.list_updating:
-                               self.list_updating = False
-                               if not self.Console:
-                                       self.Console = Console()
-                               cmd = "ipkg list" ###  ipkg install enigma2-plugins-meta
-                               self.Console.ePopen(cmd, self.IpkgList_Finished)
+                       self.startInstallMetaPackage()
                pass
 
                pass
 
-       def IpkgList_Finished(self, result, retval, extra_args = None):
+       def startInstallMetaPackage(self):
+               if self.list_updating:
+                       self.list_updating = False
+                       if not self.Console:
+                               self.Console = Console()
+                       cmd = "ipkg list" ###  will change into "ipkg install enigma2-plugins-meta"
+                       self.Console.ePopen(cmd, self.InstallMetaPackage_Finished)
+
+       def InstallMetaPackage_Finished(self, result, retval, extra_args = None):
                if len(result):
                        self.fillPackagesIndexList()
                if not self.Console:
                if len(result):
                        self.fillPackagesIndexList()
                if not self.Console:
@@ -882,15 +896,20 @@ class PluginManager(Screen, DreamInfoHandler):
                                split = x.split(' - ')
                                if not any(split[0].strip().endswith(x) for x in self.unwanted_extensions):
                                        self.installed_packetlist[split[0].strip()] = split[1].strip()
                                split = x.split(' - ')
                                if not any(split[0].strip().endswith(x) for x in self.unwanted_extensions):
                                        self.installed_packetlist[split[0].strip()] = split[1].strip()
-               self.buildCategoryList()
+               if self.currentSelectedTag is None:
+                       self.buildCategoryList()
+               else:
+                       self.buildPacketList(self.currentSelectedTag)
 
        def go(self, returnValue = None):
                current = self["list"].getCurrent()
                if current:
                        if self.currList == "category":
 
        def go(self, returnValue = None):
                current = self["list"].getCurrent()
                if current:
                        if self.currList == "category":
-                               selectedTag = current[4]
+                               selectedTag = current[2]
                                self.buildPacketList(selectedTag)
                        elif self.currList == "packages":
                                self.buildPacketList(selectedTag)
                        elif self.currList == "packages":
+                               #self.installPlugins()
+                               #uncomment the above line and comment the bottom lines to have install functionality on OK
                                if current[8] is not '':
                                        detailsfile = self.directory[0] + "/" + current[1]
                                        if (os_path.exists(detailsfile) == True):
                                if current[8] is not '':
                                        detailsfile = self.directory[0] + "/" + current[1]
                                        if (os_path.exists(detailsfile) == True):
@@ -902,8 +921,10 @@ class PluginManager(Screen, DreamInfoHandler):
                        if not self.Console:
                                self.Console = Console()
                        self.setState('sync')
                        if not self.Console:
                                self.Console = Console()
                        self.setState('sync')
-                       cmd = "ipkg list_installed"
-                       self.Console.ePopen(cmd, self.IpkgListInstalled_Finished)
+                       PluginManager.lastDownloadDate = time()
+                       self.selectedFiles = []
+                       cmd = "ipkg update"
+                       self.Console.ePopen(cmd, self.InstallMetaPackage_Finished)
 
        def buildEntryComponent(self, name, details, description, packagename, state, selected = False):
                divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/div-h.png"))
 
        def buildEntryComponent(self, name, details, description, packagename, state, selected = False):
                divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/div-h.png"))
@@ -922,6 +943,7 @@ class PluginManager(Screen, DreamInfoHandler):
        def buildPacketList(self, categorytag = None):
                if categorytag is not None:
                        self.currList = "packages"
        def buildPacketList(self, categorytag = None):
                if categorytag is not None:
                        self.currList = "packages"
+                       self.currentSelectedTag = categorytag
                        #print self.packagesIndexlist
                        self.packetlist = []
                        for package in self.packagesIndexlist[:]:
                        #print self.packagesIndexlist
                        self.packetlist = []
                        for package in self.packagesIndexlist[:]:
@@ -934,10 +956,9 @@ class PluginManager(Screen, DreamInfoHandler):
                                                        attributes = package[0]["attributes"]
                                                        #print "attributes---->",attributes
                                                        self.packetlist.append([attributes["name"], attributes["details"], attributes["shortdescription"], attributes["packagename"]])
                                                        attributes = package[0]["attributes"]
                                                        #print "attributes---->",attributes
                                                        self.packetlist.append([attributes["name"], attributes["details"], attributes["shortdescription"], attributes["packagename"]])
-
                        self.list = []
                        self.list = []
+                       #print "self.packetlist---->",self.packetlist
                        for x in self.packetlist:
                        for x in self.packetlist:
-                               print x
                                status = ""
                                if self.installed_packetlist.has_key(x[3].strip()):
                                        status = "installed"
                                status = ""
                                if self.installed_packetlist.has_key(x[3].strip()):
                                        status = "installed"
@@ -945,14 +966,13 @@ class PluginManager(Screen, DreamInfoHandler):
                                else:
                                        status = "installable"
                                        self.list.append(self.buildEntryComponent(x[0].strip(), x[1].strip(), x[2].strip(), x[3].strip(), status, selected = False))
                                else:
                                        status = "installable"
                                        self.list.append(self.buildEntryComponent(x[0].strip(), x[1].strip(), x[2].strip(), x[3].strip(), status, selected = False))
-
                        if len(self.list):
                                self.list.sort(key=lambda x: x[0])
                        self["list"].style = "default"
                        self['list'].setList(self.list)
                        if len(self.list):
                                self.list.sort(key=lambda x: x[0])
                        self["list"].style = "default"
                        self['list'].setList(self.list)
+                       self["list"].updateList(self.list)
                        self.selectionChanged()
 
                        self.selectionChanged()
 
-
        def buildCategoryList(self):
                self.currList = "category"
                #print self.packagesIndexlist
        def buildCategoryList(self):
                self.currList = "category"
                #print self.packagesIndexlist
@@ -971,36 +991,38 @@ class PluginManager(Screen, DreamInfoHandler):
                self.categoryList.sort(key=lambda x: x[0])
                self["list"].style = "category"
                self['list'].setList(self.categoryList)
                self.categoryList.sort(key=lambda x: x[0])
                self["list"].style = "category"
                self['list'].setList(self.categoryList)
+               self["list"].updateList(self.categoryList)
                self.selectionChanged()
 
        def buildCategoryComponent(self, tag = None):
                divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/div-h.png"))
                if tag is not None:
                        if tag == 'System':
                self.selectionChanged()
 
        def buildCategoryComponent(self, tag = None):
                divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/div-h.png"))
                if tag is not None:
                        if tag == 'System':
-                               return(( _("System"), '', _("View list of available system extensions" ),'', tag, None, divpng, None, '' ))
+                               return(( _("System"), _("View list of available system extensions" ), tag, divpng ))
                        elif tag == 'Skin':
                        elif tag == 'Skin':
-                               return(( _("Skins"), '', _("View list of available skins" ),'', tag, None, divpng, None, '' ))
+                               return(( _("Skins"), _("View list of available skins" ), tag, divpng ))
                        elif tag == 'Recording':
                        elif tag == 'Recording':
-                               return(( _("Recordings"), '', _("View list of available recording extensions" ),'', tag, None, divpng, None, '' ))
+                               return(( _("Recordings"), _("View list of available recording extensions" ), tag, divpng ))
                        elif tag == 'Network':
                        elif tag == 'Network':
-                               return(( _("Network"), '', _("View list of available networking extensions" ),'', tag, None, divpng, None, '' ))
+                               return(( _("Network"), _("View list of available networking extensions" ), tag, divpng ))
                        elif tag == 'CI':
                        elif tag == 'CI':
-                               return(( _("CommonInterface"), '', _("View list of available CommonInterface extensions" ),'', tag, None, divpng, None, '' ))
+                               return(( _("CommonInterface"), _("View list of available CommonInterface extensions" ), tag, divpng ))
                        elif tag == 'Default':
                        elif tag == 'Default':
-                               return(( _("Default Settings"), '', _("View list of available default settings" ),'', tag, None, divpng, None, '' ))
+                               return(( _("Default Settings"), _("View list of available default settings" ), tag, divpng ))
                        elif tag == 'SAT':
                        elif tag == 'SAT':
-                               return(( _("Satteliteequipment"), '', _("View list of available Satteliteequipment extensions." ),'', tag, None, divpng, None, '' ))
+                               return(( _("Satteliteequipment"), _("View list of available Satteliteequipment extensions." ), tag, divpng ))
                        elif tag == 'Software':
                        elif tag == 'Software':
-                               return(( _("Software"), '', _("View list of available software extensions" ),'', tag, None, divpng, None, '' ))
+                               return(( _("Software"), _("View list of available software extensions" ), tag, divpng ))
                        elif tag == 'Multimedia':
                        elif tag == 'Multimedia':
-                               return(( _("Multimedia"), '', _("View list of available multimedia extensions." ),'', tag, None, divpng, None, '' ))
+                               return(( _("Multimedia"), _("View list of available multimedia extensions." ), tag, divpng ))
                        elif tag == 'Display':
                        elif tag == 'Display':
-                               return(( _("Display and Userinterface"), '', _("View list of available Display and Userinterface extensions." ),'', tag, None, divpng, None, '' ))
+                               return(( _("Display and Userinterface"), _("View list of available Display and Userinterface extensions." ), tag, divpng ))
                        elif tag == 'EPG':
                        elif tag == 'EPG':
-                               return(( _("Electronic Program Guide"), '', _("View list of available EPG extensions." ),'', tag, None, divpng, None, '' ))
+                               return(( _("Electronic Program Guide"), _("View list of available EPG extensions." ), tag, divpng ))
                        elif tag == 'Communication':
                        elif tag == 'Communication':
-                               return(( _("Communication"), '', _("View list of available communication extensions." ),'', tag, None, divpng, None, '' ))
-
+                               return(( _("Communication"), _("View list of available communication extensions." ), tag, divpng ))
+                       else: # dynamically generate non existent tags
+                               return(( str(tag), _("View list of available ") + str(tag) + _(" extensions." ), tag, divpng ))
 
        def installPlugins(self):
                self.cmdList = []
 
        def installPlugins(self):
                self.cmdList = []
@@ -1009,6 +1031,7 @@ class PluginManager(Screen, DreamInfoHandler):
                                #print "processing Plugin-->",plugin
                                detailsfile = self.directory[0] + "/" + plugin[0]
                                if (os_path.exists(detailsfile) == True):
                                #print "processing Plugin-->",plugin
                                detailsfile = self.directory[0] + "/" + plugin[0]
                                if (os_path.exists(detailsfile) == True):
+                                       #print "plugin[1]-->",plugin[1]
                                        self.fillPackageDetails(plugin[0])
                                        self.package = self.packageDetails[0]
                                        if self.package[0].has_key("attributes"):
                                        self.fillPackageDetails(plugin[0])
                                        self.package = self.packageDetails[0]
                                        if self.package[0].has_key("attributes"):
@@ -1036,6 +1059,7 @@ class PluginManager(Screen, DreamInfoHandler):
                        current = self["list"].getCurrent()
                        if current:
                                if current[8] is not '':
                        current = self["list"].getCurrent()
                        if current:
                                if current[8] is not '':
+                                       #print "current[4]-->",current[4]
                                        detailsfile = self.directory[0] + "/" + current[1]
                                        if (os_path.exists(detailsfile) == True):
                                                self.fillPackageDetails(current[1])
                                        detailsfile = self.directory[0] + "/" + current[1]
                                        if (os_path.exists(detailsfile) == True):
                                                self.fillPackageDetails(current[1])
@@ -1061,7 +1085,6 @@ class PluginManager(Screen, DreamInfoHandler):
                                                else:
                                                        #print "adding package: ",current[0]
                                                        self.cmdList.append((IpkgComponent.CMD_INSTALL, { "package": current[3] }))
                                                else:
                                                        #print "adding package: ",current[0]
                                                        self.cmdList.append((IpkgComponent.CMD_INSTALL, { "package": current[3] }))
-
                if len(self.cmdList):
                        print self.cmdList
                        self.session.openWithCallback(self.runExecute, MessageBox, _("Do you want to continue installing or removing selected plugins?\n") + self.oktext)
                if len(self.cmdList):
                        print self.cmdList
                        self.session.openWithCallback(self.runExecute, MessageBox, _("Do you want to continue installing or removing selected plugins?\n") + self.oktext)
@@ -1102,11 +1125,9 @@ class PluginDetails(Screen, DreamInfoHandler):
        def __init__(self, session, plugin_path, packagedata = None):
                Screen.__init__(self, session)
                self.skin_path = plugin_path
        def __init__(self, session, plugin_path, packagedata = None):
                Screen.__init__(self, session)
                self.skin_path = plugin_path
-               lang = language.getLanguage()[:2] # getLanguage returns e.g. "fi_FI" for "language_country"
-               if lang == "en":
-                       self.language = None
-               else:
-                       self.language = lang
+               self.language = language.getLanguage()[:2] # getLanguage returns e.g. "fi_FI" for "language_country"
+               self.attributes = None
+               self.translatedAttributes = None
                DreamInfoHandler.__init__(self, self.statusCallback, blocking = False, language = self.language)
                self.directory = resolveFilename(SCOPE_METADIR)
                if packagedata:
                DreamInfoHandler.__init__(self, self.statusCallback, blocking = False, language = self.language)
                self.directory = resolveFilename(SCOPE_METADIR)
                if packagedata:
@@ -1142,9 +1163,10 @@ class PluginDetails(Screen, DreamInfoHandler):
                self["divpic"].hide()
 
                self.package = self.packageDetails[0]
                self["divpic"].hide()
 
                self.package = self.packageDetails[0]
-               #print "PACKAGE-------im DETAILS",self.package
                if self.package[0].has_key("attributes"):
                        self.attributes = self.package[0]["attributes"]
                if self.package[0].has_key("attributes"):
                        self.attributes = self.package[0]["attributes"]
+               if self.package[0].has_key("translation"):
+                       self.translatedAttributes = self.package[0]["translation"]
 
                self.cmdList = []
                self.oktext = _("\nAfter pressing OK, please wait!")
 
                self.cmdList = []
                self.oktext = _("\nAfter pressing OK, please wait!")
@@ -1169,19 +1191,32 @@ class PluginDetails(Screen, DreamInfoHandler):
                pass
 
        def setInfos(self):
                pass
 
        def setInfos(self):
-               if self.attributes.has_key("name"):
+               if self.translatedAttributes.has_key("name"):
+                       self.pluginname = self.translatedAttributes["name"]
+               elif self.attributes.has_key("name"):
                        self.pluginname = self.attributes["name"]
                else:
                        self.pluginname = _("unknown")
                        self.pluginname = self.attributes["name"]
                else:
                        self.pluginname = _("unknown")
-               if self.attributes.has_key("author"):
+
+               if self.translatedAttributes.has_key("author"):
+                       self.author = self.translatedAttributes["author"]
+               elif self.attributes.has_key("author"):
                        self.author = self.attributes["author"]
                else:
                        self.author = _("unknown")
                        self.author = self.attributes["author"]
                else:
                        self.author = _("unknown")
-               if self.attributes.has_key("description"):
+
+               if self.translatedAttributes.has_key("description"):
+                       self.description = self.translatedAttributes["description"]
+               elif self.attributes.has_key("description"):
                        self.description = self.attributes["description"]
                else:
                        self.description = self.attributes["description"]
                else:
-                       self.author = _("No description available.")
-               self.loadThumbnail(self.attributes)
+                       self.description = _("No description available.")
+
+               if self.translatedAttributes.has_key("screenshot"):
+                       self.loadThumbnail(self.translatedAttributes)
+               else:
+                       self.loadThumbnail(self.attributes)
+
                self["author"].setText(_("Author: ") + self.author)
                self["detailtext"].setText(self.description.strip())
                if self.pluginstate == 'installable':
                self["author"].setText(_("Author: ") + self.author)
                self["detailtext"].setText(self.description.strip())
                if self.pluginstate == 'installable':
old mode 100644 (file)
new mode 100755 (executable)
index 5bc398e..75abb90
@@ -1,27 +1,26 @@
 <default>
 <default>
-       <prerequisites>
-               <tag type="Display" />
-               <tag type="System" />                    
-       </prerequisites>
-       <info language="en">
-               <author>Dream Multimedia</author>
-               <name>VideoTune</name>
-               <packagename>enigma2-plugin-systemplugins-videotune</packagename>
-               <shortdescription>VideoTune helps fine-tuning your tv display.</shortdescription>
-               <description>The VideoTune helps fine-tuning your tv display.\nYou can control brightness and contrast of your tv.</description>
-               <screenshot src="http://www.dreamboxupdate.com/preview/videotune.jpg" />
-               <screenshot src="screenshot_videotune.jpg" />
-       </info>
-       <info language="de">
-               <author>Dream Multimedia</author>
-               <name>VideoTune</name>
-               <packagename>enigma2-plugin-systemplugins-videotune</packagename>
-               <shortdescription>VideoTune hilf beim fein-einstellen des Fernsehers.</shortdescription> 
-               <description>VideoTune hilf beim fein-einstellen des Fernsehers.\nSie können Kontrast und Helligkeit fein-einstellen.
-               </description>
-               <screenshot src="http://www.dreamboxupdate.com/preview/videotune.jpg" />
-       </info>
-       <files type="package"> <!-- without versionnumber, without .ipkg-suffix -->
+         <prerequisites>
+                    <tag type="Display" />
+                    <tag type="System" />
+         </prerequisites>
+          <info language="en">
+                    <author>Dream Multimedia</author>
+                    <name>VideoTune</name>
+                    <packagename>enigma2-plugin-systemplugins-videotune</packagename>
+                    <shortdescription>VideoTune helps fine-tuning your tv display.</shortdescription>
+                    <description>The VideoTune helps fine-tuning your tv display.\nYou can control brightness and contrast of your tv.</description>
+                    <screenshot src="http://www.dreamboxupdate.com/preview/videotune.jpg" />
+          </info>
+          <info language="de">
+                    <author>Dream Multimedia - DE</author>
+                    <name>VideoTune - DE </name>
+                    <packagename>enigma2-plugin-systemplugins-videotune</packagename>
+                    <shortdescription>VideoTune hilft beim fein-einstellen des Fernsehers.</shortdescription>
+                    <description>VideoTune hilf beim fein-einstellen des Fernsehers.\nSie können Kontrast und Helligkeit fein-einstellen.
+                    </description>
+                    <screenshot src="http://www.dreamboxupdate.com/preview/videotune.jpg" />
+          </info>
+         <files type="package"> <!-- ohne versionsnummer, ohne .ipkg -->
                <file type="package" name="enigma2-plugin-systemplugins-videotune" />
                <file type="package" name="enigma2-plugin-systemplugins-videotune" />
-       </files>
+         </files>
 </default>
 </default>
index 0a06467ba948ef467ce1a6d5c9588093902fa374..1858152b1247073549a1aee59c328388f73d4298 100755 (executable)
@@ -57,7 +57,7 @@ defaultPaths = {
                SCOPE_DEFAULTDIR: ("/usr/share/enigma2/defaults/", PATH_CREATE),
                SCOPE_DEFAULTPARTITION: ("/dev/mtdblock/6", PATH_DONTCREATE),
                SCOPE_DEFAULTPARTITIONMOUNTDIR: ("/usr/share/enigma2/dealer", PATH_CREATE),
                SCOPE_DEFAULTDIR: ("/usr/share/enigma2/defaults/", PATH_CREATE),
                SCOPE_DEFAULTPARTITION: ("/dev/mtdblock/6", PATH_DONTCREATE),
                SCOPE_DEFAULTPARTITIONMOUNTDIR: ("/usr/share/enigma2/dealer", PATH_CREATE),
-               SCOPE_METADIR: ("/usr/share/enigma2/meta", PATH_CREATE),
+               SCOPE_METADIR: ("/usr/lib/enigma2/python/Plugins/meta", PATH_CREATE),
        }
 
 FILE_COPY = 0 # copy files from fallback dir to the basedir
        }
 
 FILE_COPY = 0 # copy files from fallback dir to the basedir