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 )
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)
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 )
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)
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