Esempio n. 1
0
def addMissingModules2DB(addonIdList):
    """
    Add the list of modules (which failed to be installed) to the list of missing module
    """
    # Update list of module which fail to install
    missingModules = []
    if os.path.exists(MISSING_MODULES_PATH):
        pdr = PersistentDataRetriever( MISSING_MODULES_PATH )
        missingModules = pdr.get_data()

    print 'missingModules:'
    print missingModules
    for lib in addonIdList:
        print lib
        # add missing module and check if already in the list
        if len(missingModules) > 0:
            for module in missingModules:
                if module['id'] == lib['id']:
                    print "Module already in missing module list - checking version ..."
                    if versionsCmp( module['version'], lib["version"] ) < 0:
                        print "module version in list older than lib required - updating version ..."
                        module['version'] = lib["version"]
                    break
                else:
                    print "module not found in missing module list - adding it"
                    missingModules.append(lib)
        else:
            print "module not found in missing module list - adding it"
            missingModules.append(lib)

    PersistentDataCreator( missingModules, MISSING_MODULES_PATH )
Esempio n. 2
0
def addMissingModules2DB(addonIdList):
    """
    Add the list of modules (which failed to be installed) to the list of missing module
    """
    # Update list of module which fail to install
    missingModules = []
    if os.path.exists(MISSING_MODULES_PATH):
        pdr = PersistentDataRetriever(MISSING_MODULES_PATH)
        missingModules = pdr.get_data()

    print 'missingModules:'
    print missingModules
    for lib in addonIdList:
        print lib
        # add missing module and check if already in the list
        if len(missingModules) > 0:
            for module in missingModules:
                if module['id'] == lib['id']:
                    print "Module already in missing module list - checking version ..."
                    if versionsCmp(module['version'], lib["version"]) < 0:
                        print "module version in list older than lib required - updating version ..."
                        module['version'] = lib["version"]
                    break
                else:
                    print "module not found in missing module list - adding it"
                    missingModules.append(lib)
        else:
            print "module not found in missing module list - adding it"
            missingModules.append(lib)

    PersistentDataCreator(missingModules, MISSING_MODULES_PATH)
Esempio n. 3
0
def removeMissingModule2DB(item):
    """
    Check if a module is part of the missing modules list and remove it if it is the case
    Remove only module with version identical or more recent than the one in the list
    """
    # Update list of module which fail to install
    missingModules = []
    if os.path.exists(MISSING_MODULES_PATH):
        pdr = PersistentDataRetriever( MISSING_MODULES_PATH )
        missingModules = pdr.get_data()

    print 'missingModules:'
    print missingModules
    if len(missingModules) > 0:
        for module in missingModules:
            if module['id'] == item['id']:
                print "Module already in missing module list - checking version ..."
                if module['version'] == item["version"] or versionsCmp( module['version'], item["version"] ) < 0:
                    print "module version in list identical or older than installed module - removing it form list ..."
                    missingModules.remove(item)
                break
            else:
                print "module not found in missing module list"
    else:
        print "No missing modules"
    PersistentDataCreator( missingModules, MISSING_MODULES_PATH )
Esempio n. 4
0
def removeMissingModule2DB(item):
    """
    Check if a module is part of the missing modules list and remove it if it is the case
    Remove only module with version identical or more recent than the one in the list
    """
    # Update list of module which fail to install
    missingModules = []
    if os.path.exists(MISSING_MODULES_PATH):
        pdr = PersistentDataRetriever(MISSING_MODULES_PATH)
        missingModules = pdr.get_data()

    print 'missingModules:'
    print missingModules
    if len(missingModules) > 0:
        for module in missingModules:
            if module['id'] == item['id']:
                print "Module already in missing module list - checking version ..."
                if module['version'] == item["version"] or versionsCmp(
                        module['version'], item["version"]) < 0:
                    print "module version in list identical or older than installed module - removing it form list ..."
                    missingModules.remove(item)
                break
            else:
                print "module not found in missing module list"
    else:
        print "No missing modules"
    PersistentDataCreator(missingModules, MISSING_MODULES_PATH)
Esempio n. 5
0
    def _getAddonRequiredLibs ( self, addonIdList, repoId = None):
        """
        Display the addons to install for a repository
        """
        status = "OK"

        # List of repositories we will look in order to find the required modules
        repoList = [ getInstalledAddonInfo( os.path.join( DIR_ADDON_REPO, REPO_ID_XBMC4XBOX) ) ]
        if repoId:
            repoList.extend( [ getInstalledAddonInfo( os.path.join( DIR_ADDON_REPO, repoId) ) ] )
        repoList.extend( [ getInstalledAddonInfo( os.path.join( DIR_ADDON_REPO, REPO_ID_XBMC) ) ] )

        # Check if required lib already exist - we do an additional check later for non script modules once we have the module name from the addons repo
        addonIdCheck = []
        addonIdCheck.extend(addonIdList)
        for requiredlib in addonIdCheck:
            localLibVersion = isLibInstalled( requiredlib['id'] )
            if localLibVersion:
                xbmc.log("Requested %s version %s - found version %s" % (requiredlib['id'], requiredlib["version"], localLibVersion), xbmc.LOGDEBUG)
                if versionsCmp( localLibVersion, requiredlib["version"] ) >= 0:
                    addonIdList.remove(requiredlib)

                else:
                    installPath = get_install_path( TYPE_ADDON_MODULE )
                    fileMgr().deleteDir( os.path.join( installPath, requiredlib['id'] ) )

        if len(addonIdList) == 0:
            xbmc.log("No required libs", xbmc.LOGDEBUG)
            return "OK"

        # Parse each repository in the list and try to find in it the required module
        if len(addonIdList) > 0:
            allLibsFound = False
            for repoInfo in repoList:
                # Retrieving addons.xml from remote repository
                xmlInfofPath = os.path.join( DIR_CACHE, repoInfo [ "id" ] + ".xml")
                if fileOlderThan(xmlInfofPath, 60 * 30):
                    data = readURL( repoInfo [ "repo_url" ], save=True, localPath=xmlInfofPath )

                if ( os.path.exists( xmlInfofPath ) ):
                    try:
                        xmlData = open( os.path.join( xmlInfofPath ), "r" )
                        listAddonsXml = ListItemFromXML(xmlData)
                        xmlData.close()
                    except:
                        print_exc()

                    keepParsingCurrentRepo = True
                    while (keepParsingCurrentRepo):
                        item = listAddonsXml.getNextItem()
                        if item:
                            if len(addonIdList) > 0:
                                for lib in addonIdList:
                                    if lib["id"] == item['id']:
                                        localLibVersion = isLibInstalled( item['id'], item['type'], item['name'] )
                                        if localLibVersion:
                                            xbmc.log("Requested %s version %s - found version %s" % (requiredlib['id'], requiredlib["version"], localLibVersion), xbmc.LOGDEBUG)
                                            if versionsCmp( localLibVersion, lib["version"] ) >= 0:
                                                addonIdList.remove(lib)
                                                continue
                                            else:
                                                name = item['name']
                                                if item['type'] == TYPE_ADDON_MODULE:
                                                    name = item['id']
                                                installPath = get_install_path( item['type'] )
                                                fileMgr().deleteDir( os.path.join( installPath, name ) )

                                        endRepoChar = "/"
                                        if repoInfo [ "repo_datadir" ].endswith( "/" ):
                                            endRepoChar = ""

                                        if repoInfo [ "repo_format" ] ==  'zip':
                                            downloadUrl = (repoInfo [ "repo_datadir" ] + endRepoChar + item["id"] + '/' + item["id"]  + '-' + item["version"] + ".zip").replace(' ', '%20')
                                            changelog   = (repoInfo [ "repo_datadir" ] + endRepoChar + item["id"] + '/' + "changelog" + '-' + item["version"] + ".txt").replace(' ', '%20')
                                            iconimage   = (repoInfo [ "repo_datadir" ] + endRepoChar + item["id"] + '/' + "icon.png").replace(' ', '%20')
                                        else:
                                            downloadUrl = (repoInfo [ "repo_datadir" ] + endRepoChar + item["id"] + '/').replace(' ', '%20')
                                            changelog   = (repoInfo [ "repo_datadir" ] + endRepoChar + item["id"] + '/' + "changelog" + ".txt").replace(' ', '%20')
                                            iconimage   = (repoInfo [ "repo_datadir" ] + endRepoChar + item["id"] + '/' + "icon.png").replace(' ', '%20')
                                        item["ImageUrl"] = iconimage
                                        item["changelog"] = changelog

                                        xbmc.log("Download URL: %s" % (downloadUrl), xbmc.LOGDEBUG)

                                        # Install lib
                                        installMgr = InstallMgr()
                                        status, itemName, destination, addonInstaller = installMgr.install_from_repo( item['name'].encode('utf8'), downloadUrl, repoInfo[ "repo_format" ], repoInfo[ "repo_datadir" ] )
                                        if status == "OK":
                                            status, destination = addonInstaller.installItem()
                                            if status == "OK":
                                                saveLocalAddonInfo(repoInfo[ "id" ], destination, addonInstaller)
                                            # recursively install further dependencies
                                            requiredLibs = addonInstaller.itemInfo[ "required_lib" ]
                                            if len(requiredLibs) > 0:
                                                status = self._getAddonRequiredLibs ( addonInstaller.itemInfo[ "required_lib" ], repoInfo[ "id" ] )
                                                if status != "OK":
                                                    return status
                                        else:
                                            # Notify user it is impossible to install the current kib and check if he want to continue
                                            if not xbmcgui.Dialog().yesno( item['name'].encode('utf8'), __language__( 30070 ), __language__( 30071 ), __language__( 30072 ) ):
                                                keepParsingCurrentRepo = False
                                                allLibsFound = True
                                                status = "CANCELED"
                                                xbmc.log("User cancelled due to error of a lib install", xbmc.LOGDEBUG)
                                            else:
                                                # User wants to continue
                                                status = "OK"
                                        # Module installed or already installed - Remove it for the list of libs to install
                                        addonIdList.remove(lib)
                            else:
                                # No lib to find remaining
                                keepParsingCurrentRepo = False
                                allLibsFound = True
                        else:
                            keepParsingCurrentRepo = False
                if not allLibsFound:
                    # all libs found, no need to go to parse next repo
                    continue
            if len(addonIdList) > 0:
                xbmc.log("Not all required lib has been installed", xbmc.LOGDEBUG)

                if not xbmcgui.Dialog().yesno( lib['id'], __language__( 30070 ), __language__( 30071 ), __language__( 30072 ) ):
                    xbmc.log("User cancelled due to error of a lib install", xbmc.LOGDEBUG)
                    allLibsFound = True
                    status = "CANCELED"
                else:
                    # User wants to continue

                    # Update list of module which fail to install
                    #self.addMissingModules(addonIdList)
                    addMissingModules2DB(addonIdList)

                    status = "OK"

        return status#, itemName, destination, addonInstaller