def grab_log(file=False, old=False, wizard=False): if wizard: if os.path.exists(CONFIG.WIZLOG): return CONFIG.WIZLOG if file else tools.read_from_file( CONFIG.WIZLOG) else: return False logsfound = [] for item in [ file for file in os.listdir(CONFIG.LOGPATH) if os.path.basename(file).startswith('kodi') ]: if item.endswith('.log'): if (old and 'old' in item) or (not old and 'old' not in item): logsfound.append(os.path.join(CONFIG.LOGPATH, item)) if len(logsfound) > 0: logsfound.sort(key=lambda f: os.path.getmtime(f)) if file: return logsfound[-1] else: return tools.read_from_file(logsfound[-1]) else: return False
def grab_log(file=False, old=False, wizard=False): from resources.libs.common import tools if wizard: if not os.path.exists(CONFIG.WIZLOG): return False else: if file: return CONFIG.WIZLOG else: return tools.read_from_file(CONFIG.WIZLOG) finalfile = 0 logfilepath = os.listdir(CONFIG.LOGPATH) logsfound = [] for item in logfilepath: if old and item.endswith('.old.log'): logsfound.append(os.path.join(CONFIG.LOGPATH, item)) elif not old and item.endswith('.log') and not item.endswith('.old.log'): logsfound.append(os.path.join(CONFIG.LOGPATH, item)) if len(logsfound) > 0: logsfound.sort(key=lambda f: os.path.getmtime(f)) if file: return logsfound[-1] else: return tools.read_from_file(logsfound[-1]) else: return False
def view_advanced(): from resources.libs.common import tools from resources.libs.gui import window window.show_text_box( CONFIG.ADDONTITLE, tools.read_from_file(CONFIG.ADVANCED).replace('\t', ' '))
def kodi_17_fix(): from resources.libs.common import tools from resources.libs import update addonlist = glob.glob(os.path.join(CONFIG.ADDONS, '*/')) disabledAddons = [] for folder in sorted(addonlist, key=lambda x: x): addonxml = os.path.join(folder, 'addon.xml') if os.path.exists(addonxml): fold = folder.replace(CONFIG.ADDONS, '')[1:-1] aid = tools.parse_dom(tools.read_from_file(addonxml), 'addon', ret='id') try: if len(aid) > 0: addonid = aid[0] else: addonid = fold except: try: logging.log("{0} was disabled".format(aid[0])) disabledAddons.append(addonid) except: logging.log("Unable to enable: {0}".format(folder), level=xbmc.LOGERROR) if len(disabledAddons) > 0: addon_database(disabledAddons, 1, True) logging.log_notify( CONFIG.ADDONTITLE, "[COLOR {0}]Enabling Addons Complete![/COLOR]".format( CONFIG.COLOR2)) update.force_update() xbmc.executebuiltin("ReloadSkin()")
def unhide_password(): from resources.libs.common import tools from resources.libs.common import logging dialog = xbmcgui.Dialog() if dialog.yesno(CONFIG.ADDONTITLE, "[COLOR {0}]Would you like to [COLOR {1}]unhide[/COLOR] all passwords when typing in the add-on settings menus?[/COLOR]".format(CONFIG.COLOR2, CONFIG.COLOR1), yeslabel="[B][COLOR springgreen]Unhide Passwords[/COLOR][/B]", nolabel="[B][COLOR red]No Cancel[/COLOR][/B]"): count = 0 for folder in glob.glob(os.path.join(CONFIG.ADDONS, '*/')): sett = os.path.join(folder, 'resources', 'settings.xml') if os.path.exists(sett): f = tools.read_from_file(sett) match = tools.parse_dom(f, 'addon', ret='id') for line in match: if 'pass' in line: if 'option="hidden"' in line: try: change = line.replace('option="hidden"', '') f.replace(line, change) count += 1 logging.log("[Unhide Passwords] found in {0} on {1}".format(sett.replace(CONFIG.HOME, ''), line)) except: pass tools.write_to_file(sett, f) logging.log_notify("[COLOR {0}]Unhide Passwords[/COLOR]".format(CONFIG.COLOR1), "[COLOR {0}]{1} items changed[/COLOR]".format(CONFIG.COLOR2, count)) logging.log("[Unhide Passwords] {0} items changed".format(count)) else: logging.log("[Unhide Passwords] Cancelled")
def onInit(self): from resources.libs.common import tools self.title = 101 self.msg = 102 self.scrollbar = 103 self.upload = 201 self.kodilog = 202 self.oldlog = 203 self.wizardlog = 204 self.closebutton = 205 if window_msg is None: self.logmsg = tools.read_from_file(self.log_file) else: self.logmsg = window_msg self.logfile = os.path.basename(self.log_file) self.buttons = 'true' if ext_buttons else 'false' self.setProperty('texture.color1', CONFIG.COLOR1) self.setProperty('texture.color2', CONFIG.COLOR2) self.setProperty('message.title', window_title) self.setProperty('message.logmsg', highlight_text(self.logmsg)) self.setProperty('message.logfile', self.logfile) self.setProperty('message.buttons', self.buttons)
def onInit(self): self.title = 101 self.msg = 102 self.scrollbar = 103 self.upload = 201 self.kodilog = 202 self.oldlog = 203 self.wizardlog = 204 self.closebutton = 205 if 98 - 98: I1IiiI % Ii1I * OoooooooOO if window_msg is None: self.logmsg = tools.read_from_file(self.log_file) else: self.logmsg = window_msg self.logfile = os.path.basename(self.log_file) if 51 - 51: iIii1I11I1II1.OoOoOO00 / oO0o + o0oOOo0O0Ooo self.buttons = 'true' if ext_buttons else 'false' if 33 - 33: ooOoO0o.II111iiii % iII111i + o0oOOo0O0Ooo self.setProperty('texture.color1', CONFIG.COLOR1) self.setProperty('texture.color2', CONFIG.COLOR2) self.setProperty('message.title', window_title) self.setProperty('message.logmsg', I1i1I(self.logmsg)) self.setProperty('message.logfile', self.logfile) self.setProperty('message.buttons', self.buttons) if 71 - 71: Oo0Ooo % OOooOOo
def check_log(): from resources.libs.common import tools next = tools.get_date(days=1) lines = tools.read_from_file(CONFIG.WIZLOG).split('\n') if CONFIG.CLEANWIZLOGBY == '0': # By Days keep = tools.get_date(days=-CONFIG.MAXWIZDATES[int(float(CONFIG.CLEANDAYS))]) x = 0 for line in lines: if str(line[1:11]) >= str(keep): break x += 1 newfile = lines[x:] tools.write_to_file(CONFIG.WIZLOG, '\n'.join(newfile)) elif CONFIG.CLEANWIZLOGBY == '1': # By Size maxsize = CONFIG.MAXWIZSIZE[int(float(CONFIG.CLEANSIZE))]*1024 if os.path.getsize(CONFIG.WIZLOG) >= maxsize: start = len(lines)/2 newfile = lines[start:] tools.write_to_file(CONFIG.WIZLOG, '\n'.join(newfile)) elif CONFIG.CLEANWIZLOGBY == '2': # By Lines maxlines = CONFIG.MAXWIZLINES[int(float(CONFIG.CLEANLINES))] if len(lines) > maxlines: start = len(lines) - int(maxlines/2) newfile = lines[start:] tools.write_to_file(CONFIG.WIZLOG, '\n'.join(newfile)) CONFIG.set_setting('nextcleandate', str(next))
def error_list(file): errors = [] b = tools.read_from_file(file).replace('\n', '[CR]').replace('\r', '') match = re.compile("-->Python callback/script returned the following error<--(.+?)-->End of Python script error report<--").findall(b) for item in match: errors.append(item) return errors
def installed(addon): url = os.path.join(CONFIG.ADDONS, addon, 'addon.xml') if os.path.exists(url): try: name = tools.parse_dom(tools.read_from_file(url), 'addon', ret='name', attrs={'id': addon}) icon = os.path.join(CONFIG.ADDONS, addon, 'icon.png') # read from infolabel? logging.log_notify('[COLOR {0}]{1}[/COLOR]'.format(CONFIG.COLOR1, name[0]), '[COLOR {0}]Add-on Enabled[/COLOR]'.format(CONFIG.COLOR2), '2000', icon) except: pass
def create_temp(plugin): from resources.libs.common import tools temp = os.path.join(CONFIG.PLUGIN, 'resources', 'tempaddon.xml') r = tools.read_from_file(temp) plugdir = os.path.join(CONFIG.ADDONS, plugin) if not os.path.exists(plugdir): os.makedirs(plugdir) tools.write_to_file(os.path.join(plugdir, 'addon.xml'), r.replace('testid', plugin).replace('testversion', '0.0.1')) logging.log("{0}: wrote addon.xml".format(plugin))
def depends_list(plugin): addonxml = os.path.join(CONFIG.ADDONS, plugin, 'addon.xml') if os.path.exists(addonxml): match = tools.parse_dom(tools.read_from_file(addonxml), 'import', ret='addon') items = [] for depends in match: if not 'xbmc.python' in depends: items.append(depends) return items return []
def binaries(self): from resources.libs import db from resources.libs import install from resources.libs.common import logging from resources.libs.common import tools dialog = xbmcgui.Dialog() binarytxt = os.path.join(CONFIG.USERDATA, 'build_binaries.txt') restore = False binaryids = [] if os.path.exists(binarytxt): binaryids = tools.read_from_file(binarytxt).split(',') # dialog.ok(CONFIG.ADDONTITLE, '[COLOR {0}]The restored backup may depend on the following platform-specific addons, which were not included:[/COLOR]'.format(CONFIG.COLOR2), '[COLOR {0}]{1}[/COLOR]'.format(CONFIG.COLOR1, ', '.join([tools.get_addon_info(id, 'name') for id in binaryids])), '[COLOR {0}]For best results, consider installing them manually after Kodi restarts.[/COLOR]'.format(CONFIG.COLOR2)) logging.log("[Binary Detection] Reinstalling Eligible Binary Addons", level=xbmc.LOGNOTICE) dialog.ok(CONFIG.ADDONTITLE, '[COLOR {0}]The restored build contains platform-specific addons, which will now be automatically installed. A number of dialogs may pop up during this process. Cancelling them may cause the restored build to function incorrectly.[/COLOR]'.format(CONFIG.COLOR2)) restore = True else: logging.log("[Binary Detection] No Eligible Binary Addons to Reinstall", level=xbmc.LOGNOTICE) return True if restore: success = [] fail = [] if len(binaryids) == 0: logging.log('No addons selected for installation.', level=xbmc.LOGNOTICE) return # clear out the addons for sure # for id in binaryids: # if clear.remove_addon(id, tools.get_addon_info(id, 'name'), over=True, data=False): # continue # finally, reinstall addons for id in binaryids: if install.install_from_kodi(id): logging.log('{0} install succeeded.'.format(id), level=xbmc.LOGNOTICE) success.append(id) else: logging.log('{0} install failed.'.format(id), level=xbmc.LOGNOTICE) fail.append(id) if not fail: dialog.ok(CONFIG.ADDONTITLE, 'The selected addons were all installed successfully.') os.remove(binarytxt) return True else: dialog.ok(CONFIG.ADDONTITLE, 'The following addons failed to install:\n{0}'.format(', '.join(fail))) return False
def binaries(): dialog = xbmcgui.Dialog() binarytxt = os.path.join(CONFIG.USERDATA, 'build_binaries.txt') if os.path.exists(binarytxt): binaryids = tools.read_from_file(binarytxt).split(',') logging.log( "[Binario Detección] Reinstalación de Add-ons Binarios Elegibles") dialog.ok( CONFIG.ADDONTITLE, '[COLOR {0}]La compilación restaurada contiene add-ons específicos de la plataforma, que ahora serán ' 'instalados automáticamente. Es posible que aparezcan varios cuadros de diálogo durante este proceso. Cancelarlos ' 'puede hacer que la compilación restaurada funcione incorrectamente.[/COLOR]' .format(CONFIG.COLOR2)) else: logging.log( "[Detección de Binario] No hay Addons Binarios Elegibles para Reinstalar" ) return True success = [] fail = [] if len(binaryids) == 0: logging.log('No se seleccionaron add-ons para la instalación.') return from resources.libs.gui import addon_menu # finally, reinstall addons for addonid in binaryids: if addon_menu.install_from_kodi(addonid): logging.log('{0} instalación correcta.'.format(addonid)) success.append(addonid) else: logging.log('{0} instalación fallida.'.format(addonid)) fail.append(addonid) if not fail: dialog.ok( CONFIG.ADDONTITLE, 'Todos los addons seleccionados se instalaron correctamente.') os.remove(binarytxt) return True else: dialog.ok( CONFIG.ADDONTITLE, 'Los siguientes addons no se pudieron instalar:\n{0}'.format( ', '.join(fail))) return False
def binaries(): from resources.libs import install dialog = xbmcgui.Dialog() binarytxt = os.path.join(CONFIG.USERDATA, 'build_binaries.txt') if os.path.exists(binarytxt): binaryids = tools.read_from_file(binarytxt).split(',') logging.log("[Binary Detection] Reinstalling Eligible Binary Addons") dialog.ok( CONFIG.ADDONTITLE, '[COLOR {0}]The restored build contains platform-specific addons, which will now be ' 'automatically installed. A number of dialogs may pop up during this process. Cancelling them ' 'may cause the restored build to function incorrectly.[/COLOR]'. format(CONFIG.COLOR2)) else: logging.log( "[Binary Detection] No Eligible Binary Addons to Reinstall") return True success = [] fail = [] if len(binaryids) == 0: logging.log('No addons selected for installation.') return # finally, reinstall addons for addonid in binaryids: if install.install_from_kodi(addonid): logging.log('{0} install succeeded.'.format(addonid)) success.append(addonid) else: logging.log('{0} install failed.'.format(addonid)) fail.append(addonid) if not fail: dialog.ok(CONFIG.ADDONTITLE, 'The selected addons were all installed successfully.') os.remove(binarytxt) return True else: dialog.ok( CONFIG.ADDONTITLE, 'The following addons failed to install:\n{0}'.format( ', '.join(fail))) return False
def install_dependency(self, plugin): from resources.libs import db dep = os.path.join(CONFIG.ADDONS, plugin, 'addon.xml') if os.path.exists(dep): match = tools.parse_dom(tools.read_from_file(dep), 'import', ret='addon') for depends in match: if 'xbmc.python' not in depends: self.progress_dialog.update(0, '\n'+'[COLOR {0}]{1}[/COLOR]'.format(CONFIG.COLOR1, depends)) try: add = tools.get_addon_by_id(id=depends) name2 = tools.get_addon_info(add, 'name') except: db.create_temp(depends) db.addon_database(depends, 1)
def toggle_dependency(name, dp=None): from resources.libs.common import tools dep = os.path.join(CONFIG.ADDONS, name, 'addon.xml') if os.path.exists(dep): match = tools.parse_dom(tools.read_from_file(dep), 'import', ret='addon') for depends in match: if 'xbmc.python' not in depends: dependspath = os.path.join(CONFIG.ADDONS, depends) if dp is not None: dp.update("", "Checking Dependency [COLOR yellow]{0}[/COLOR] for [COLOR yellow]{1}[/COLOR]".format(depends, name), "") if os.path.exists(dependspath): toggle_addon(name, 'true') xbmc.sleep(100)
def binaries(): dialog = xbmcgui.Dialog() binarytxt = os.path.join(CONFIG.USERDATA, 'build_binaries.txt') if os.path.exists(binarytxt): binaryids = tools.read_from_file(binarytxt).split(',') logging.log("[Detecção binária] Reinstalando complementos binários qualificados") dialog.ok(CONFIG.ADDONTITLE, '[COLOR {0}]A compilação restaurada contém complementos específicos da plataforma, que agora serão ' 'instalado automaticamente. Vários diálogos podem aparecer durante este processo. Cancelando-os ' 'pode fazer com que a compilação restaurada funcione incorretamente.[/COLOR]'.format( CONFIG.COLOR2)) else: logging.log("[Detecção binária] Nenhum complemento binário elegível para reinstalar") return True success = [] fail = [] if len(binaryids) == 0: logging.log('Nenhum complemento selecionado para instalação.') return from resources.libs.gui import addon_menu # finally, reinstall addons for addonid in binaryids: if addon_menu.install_from_kodi(addonid): logging.log('{0} instalação bem-sucedida.'.format(addonid)) success.append(addonid) else: logging.log('{0} a instalação falhou.'.format(addonid)) fail.append(addonid) if not fail: dialog.ok(CONFIG.ADDONTITLE, 'Os addons selecionados foram todos instalados com sucesso.') os.remove(binarytxt) return True else: dialog.ok(CONFIG.ADDONTITLE, 'Os seguintes complementos não foram instalados:\n{0}'.format(', '.join(fail))) return False
def IiiIII111iI(addon): IiII = os.path.join(CONFIG.ADDONS, addon, 'addon.xml') if os.path.exists(IiII): try: iI1Ii11111iIi = tools.parse_dom(tools.read_from_file(IiII), 'addon', ret='name', attrs={'id': addon}) i1i1II = os.path.join(CONFIG.ADDONS, addon, 'icon.png') logging.log_notify( '[COLOR {0}]{1}[/COLOR]'.format(CONFIG.COLOR1, iI1Ii11111iIi[0]), '[COLOR {0}]Add-on ativado[/COLOR]'.format(CONFIG.COLOR2), '2000', i1i1II) except: pass if 96 - 96: o0OO0 - Oo0ooO0oo0oO.I1i1iI1i - o00ooo0 / Oo0ooO0oo0oO * Oo0Ooo if 16 - 16: oO0o % OOooOOo * o0OO0.OOooOOo / iIii1I11I1II1 * iIii1I11I1II1
def install_dependency(self, plugin): from resources.libs import db if 31 - 31: I11i - i1IIi * OOooOOo / OoooooooOO iI = os.path.join(CONFIG.ADDONS, plugin, 'addon.xml') if os.path.exists(iI): o00O = tools.parse_dom(tools.read_from_file(iI), 'import', ret='addon') for OOO0OOO00oo in o00O: if 'xbmc.python' not in OOO0OOO00oo: self.progress_dialog.update( 0, '\n' + '[COLOR {0}]{1}[/COLOR]'.format( CONFIG.COLOR1, OOO0OOO00oo)) if 31 - 31: II111iiii - OOooOOo.I1i1iI1i % OoOoOO00 - O0 try: i1 = tools.get_addon_by_id(id=OOO0OOO00oo) iii11 = tools.get_addon_info(i1, 'name') except: db.create_temp(OOO0OOO00oo) db.addon_database(OOO0OOO00oo, 1) if 58 - 58: OOooOOo * i11iIiiIii / OoOoOO00 % I1i1iI1i - I1ii11iIi11i / oO0o
def view_current(): window.show_text_box( CONFIG.ADDONTITLE, tools.read_from_file(CONFIG.ADVANCED).replace('\t', ' '))
def show_menu(self, url=None): response = tools.open_url(CONFIG.ADDONFILE) url_response = tools.open_url(url) local_file = os.path.join(CONFIG.ADDON_PATH, 'resources', 'text', 'addons.json') if url_response: TEMPADDONFILE = url_response.text elif response: TEMPADDONFILE = response.text elif os.path.exists(local_file): TEMPADDONFILE = tools.read_from_file(local_file) else: TEMPADDONFILE = None logging.log("[Addon Menu] No Addon list added.") if TEMPADDONFILE: import json try: addons_json = json.loads(TEMPADDONFILE) except: addons_json = None logging.log("[Advanced Settings] ERROR: Invalid Format for {0}.".format(TEMPADDONFILE)) if addons_json: addons = addons_json['addons'] if addons and len(addons) > 0: for addon in addons: addonname = addon.get('name', '') type = addon.get('type', 'addon') section = addon.get('section', False) plugin = addon.get('plugin', '') addonurl = addon.get('url', '') repository = addon.get('repository', '') repositoryxml = addon.get('repositoryxml', '') repositoryurl = addon.get('repositoryurl', '') icon = addon.get('icon', CONFIG.ADDON_ICON) fanart = addon.get('fanart', CONFIG.ADDON_FANART) adult = addon.get('adult', False) description = addon.get('description', '') if not addonname: logging.log('[Advanced Settings] Missing tag \'name\'', level=xbmc.LOGDEBUG) continue if not addonurl: logging.log('[Advanced Settings] Missing tag \'url\'', level=xbmc.LOGDEBUG) continue else: if '.zip' in addonurl: pass elif not section: broken = False if not repository: logging.log('[Advanced Settings] Missing tag \'repository\'', level=xbmc.LOGDEBUG) broken = True if not repositoryxml: logging.log('[Advanced Settings] Missing tag \'repositoryxml\'', level=xbmc.LOGDEBUG) broken = True if not repositoryurl: logging.log('[Advanced Settings] Missing tag \'repositoryurl\'', level=xbmc.LOGDEBUG) broken = True if broken: continue if section: directory.add_dir(addonname, {'mode': 'addons', 'url': addonurl}, description=description, icon=icon, fanart=fanart, themeit=CONFIG.THEME3) else: if not CONFIG.SHOWADULT == 'true' and adult: continue if type.lower() == 'skin': directory.add_file(addonname, {'mode': 'addons', 'action': 'skin', 'name': addonname, 'url': addonurl}, description=description, icon=icon, fanart=fanart, themeit=CONFIG.THEME2) elif type.lower() == 'addonpack': directory.add_file(addonname, {'mode': 'addons', 'action': 'addonpack', 'name': addonname, 'url': addonurl}, description=description, icon=icon, fanart=fanart, themeit=CONFIG.THEME2) else: try: add = tools.get_addon_info(plugin, 'path') if os.path.exists(add): addonname = "[COLOR springgreen][Installed][/COLOR] {0}".format(addonname) except: pass directory.add_file(addonname, {'mode': 'addons', 'action': 'addon', 'name': plugin, 'addonurl': addonurl, 'repository': repository, 'repositoryxml': repositoryxml, 'repositoryurl': repositoryurl}, description=description, icon=icon, fanart=fanart, themeit=CONFIG.THEME2) else: if not addons: directory.add_file('Text File not formatted correctly!', themeit=CONFIG.THEME3) logging.log("[Addon Menu] ERROR: Invalid Format.") elif len(addons) == 0: directory.add_file("No addons added to this menu yet!", themeit=CONFIG.THEME2) else: logging.log("[Addon Menu] ERROR: URL for Addon list not working.") directory.add_file('Url for txt file not valid', themeit=CONFIG.THEME3) directory.add_file('{0}'.format(CONFIG.ADDONFILE), themeit=CONFIG.THEME3)
def check_sources(): from resources.libs.common import logging from resources.libs.common import tools dialog = xbmcgui.Dialog() progress_dialog = xbmcgui.DialogProgress() if not os.path.exists(CONFIG.SOURCES): logging.log_notify( CONFIG.ADDONTITLE, "[COLOR {0}]No sources.xml File Found![/COLOR]".format( CONFIG.COLOR2)) return False x = 0 bad = [] remove = [] a = tools.read_from_file(CONFIG.SOURCES) temp = a.replace('\r', '').replace('\n', '').replace('\t', '') match = re.compile('<files>.+?</files>').findall(temp) if len(match) > 0: match2 = re.compile( '<source>.+?<name>(.+?)</name>.+?<path pathversion="1">(.+?)</path>.+?<allowsharing>(.+?)</allowsharing>.+?</source>' ).findall(match[0]) progress_dialog.create( CONFIG.ADDONTITLE, "[COLOR {0}]Scanning Sources for Broken links[/COLOR]".format( CONFIG.COLOR2)) for name, path, sharing in match2: x += 1 perc = int(tools.percentage(x, len(match2))) progress_dialog.update( perc, '', "[COLOR {0}]Checking [COLOR {1}]{2}[/COLOR]:[/COLOR]".format( CONFIG.COLOR2, CONFIG.COLOR1, name), "[COLOR {0}]{1}[/COLOR]".format(CONFIG.COLOR1, path)) working = tools.open_url(path, check=True) if not working: bad.append([name, path, sharing, working]) logging.log("Bad Sources: {0}".format(len(bad))) if len(bad) > 0: choice = dialog.yesno( CONFIG.ADDONTITLE, "[COLOR {0}]{1}[/COLOR][COLOR {2}] Source(s) have been found Broken" .format(CONFIG.COLOR1, len(bad), CONFIG.COLOR2), "Would you like to Remove all or choose one by one?[/COLOR]", yeslabel="[B][COLOR springgreen]Remove All[/COLOR][/B]", nolabel="[B][COLOR red]Choose to Delete[/COLOR][/B]") if choice == 1: remove = bad else: for name, path, sharing, working in bad: logging.log("{0} sources: {1}, {2}".format( name, path, working)) if dialog.yesno( CONFIG.ADDONTITLE, "[COLOR {0}]{1}[/COLOR][COLOR {2}] was reported as non working" .format(CONFIG.COLOR1, name, CONFIG.COLOR2), "[COLOR {0}]{1}[/COLOR]".format( CONFIG.COLOR1, path), "[COLOR {0}]{1}[/COLOR]".format( CONFIG.COLOR1, working), yeslabel= "[B][COLOR springgreen]Remove Source[/COLOR][/B]", nolabel="[B][COLOR red]Keep Source[/COLOR][/B]"): remove.append([name, path, sharing, working]) logging.log("Removing Source {0}".format(name)) else: logging.log("Source {0} was not removed".format(name)) if len(remove) > 0: for name, path, sharing, working in remove: a = a.replace( '\n<source>\n<name>{0}</name>\n<path pathversion="1">{1}</path>\n<allowsharing>{2}</allowsharing>\n</source>' .format(name, path, sharing), '') logging.log("Removing Source {0}".format(name)) tools.write_to_file(CONFIG.SOURCES, str(a)) alive = len(match) - len(bad) kept = len(bad) - len(remove) removed = len(remove) dialog.ok( CONFIG.ADDONTITLE, "[COLOR {0}]Checking sources for broken paths has been completed" .format(CONFIG.COLOR2), "Working: [COLOR {0}]{1}[/COLOR] | Kept: [COLOR {2}]{3}[/COLOR] | Removed: [COLOR {4}]{5}[/COLOR][/COLOR]" .format(CONFIG.COLOR2, CONFIG.COLOR1, alive, CONFIG.COLOR1, kept, CONFIG.COLOR1, removed)) else: logging.log("No Bad Sources to be removed.") else: logging.log_notify( CONFIG.ADDONTITLE, "[COLOR {0}]All Sources Are Working[/COLOR]".format( CONFIG.COLOR2)) else: logging.log("No Sources Found")
def check_skin(): from resources.libs.common import logging from resources.libs.common import tools dialog = xbmcgui.Dialog() logging.log("[Build Check] Invalid Skin Check Start") gotoskin = False if not CONFIG.DEFAULTSKIN == '': if os.path.exists(os.path.join(CONFIG.ADDONS, CONFIG.DEFAULTSKIN)): if dialog.yesno( CONFIG.ADDONTITLE, "[COLOR {0}]It seems that the skin has been set back to [COLOR {1}]{2}[/COLOR]" .format(CONFIG.COLOR2, CONFIG.COLOR1, CONFIG.SKIN[5:].title()), "Would you like to set the skin back to:[/COLOR]", '[COLOR {0}]{1}[/COLOR]'.format(CONFIG.COLOR1, CONFIG.DEFAULTNAME)): gotoskin = CONFIG.DEFAULTSKIN gotoname = CONFIG.DEFAULTNAME else: logging.log("Skin was not reset") CONFIG.set_setting('defaultskinignore', 'true') gotoskin = False else: CONFIG.set_setting('defaultskin', '') CONFIG.set_setting('defaultskinname', '') CONFIG.DEFAULTSKIN = '' CONFIG.DEFAULTNAME = '' if CONFIG.DEFAULTSKIN == '': skinname = [] skinlist = [] for folder in glob.glob(os.path.join(CONFIG.ADDONS, 'skin.*/')): xml = "{0}/addon.xml".format(folder) if os.path.exists(xml): g = tools.read_from_file(xml).replace('\n', '').replace( '\r', '').replace('\t', '') match = tools.parse_dom(g, 'addon', ret='id') match2 = tools.parse_dom(g, 'addon', ret='name') logging.log("{0}: {1}".format(folder, str(match[0]))) if len(match) > 0: skinlist.append(str(match[0])) skinname.append(str(match2[0])) else: logging.log("ID not found for {0}".format(folder)) else: logging.log("ID not found for {0}".format(folder)) if len(skinlist) > 0: if len(skinlist) > 1: if dialog.yesno( CONFIG.ADDONTITLE, "[COLOR {0}]It seems that the skin has been set back to [COLOR {1}]{2}[/COLOR]" .format(CONFIG.COLOR2, CONFIG.COLOR1, CONFIG.SKIN[5:].title()), "Would you like to view a list of avaliable skins?[/COLOR]" ): choice = dialog.select("Select skin to switch to!", skinname) if choice == -1: logging.log("Skin was not reset") CONFIG.set_setting('defaultskinignore', 'true') else: gotoskin = skinlist[choice] gotoname = skinname[choice] else: logging.log("Skin was not reset") CONFIG.set_setting('defaultskinignore', 'true') else: if dialog.yesno( CONFIG.ADDONTITLE, "[COLOR {0}]It seems that the skin has been set back to [COLOR {1}]{2}[/COLOR]" .format(CONFIG.COLOR2, CONFIG.COLOR1, CONFIG.SKIN[5:].title()), "Would you like to set the skin back to:[/COLOR]", '[COLOR {0}]{1}[/COLOR]'.format( CONFIG.COLOR1, skinname[0])): gotoskin = skinlist[0] gotoname = skinname[0] else: logging.log("Skin was not reset") CONFIG.set_setting('defaultskinignore', 'true') else: logging.log("No skins found in addons folder.") CONFIG.set_setting('defaultskinignore', 'true') gotoskin = False if gotoskin: from resources.libs import skin if skin.switch_to_skin(gotoskin): skin.look_and_feel_data('restore') logging.log("[Build Check] Invalid Skin Check End")
def whitelist(do): addonnames = [] addonids = [] addonfolds = [] dialog = xbmcgui.Dialog() if do == 'edit': fold = glob.glob(os.path.join(CONFIG.ADDONS, '*/')) for folder in sorted(fold, key=lambda x: x): foldername = os.path.split(folder[:-1])[1] if foldername in CONFIG.EXCLUDES: continue elif foldername in CONFIG.DEFAULTPLUGINS: continue elif foldername == 'packages': continue xml = os.path.join(folder, 'addon.xml') if os.path.exists(xml): a = tools.read_from_file(xml) temp, addid = parse(a, foldername) addonnames.append(temp) addonids.append(addid) addonfolds.append(foldername) fold2 = glob.glob(os.path.join(CONFIG.ADDON_DATA, '*/')) for folder in sorted(fold2, key=lambda x: x): foldername = os.path.split(folder[:-1])[1] if foldername in addonfolds: continue if foldername in CONFIG.EXCLUDES: continue xml = os.path.join(CONFIG.ADDONS, foldername, 'addon.xml') xml2 = os.path.join(CONFIG.XBMC, 'addons', foldername, 'addon.xml') if os.path.exists(xml): a = tools.read_from_file(xml) elif os.path.exists(xml2): a = tools.read_from_file(xml2) else: continue temp, addid = parse(a, foldername) addonnames.append(temp) addonids.append(addid) addonfolds.append(foldername) selected = [] tempaddonnames = ["-- Clic aquí para Continuar --"] + addonnames currentWhite = whitelist(do='read') for item in currentWhite: logging.log(str(item)) try: name, id, fold = item except Exception as e: logging.log(str(e)) if id in addonids: pos = addonids.index(id) + 1 selected.append(pos - 1) tempaddonnames[pos] = "[B][COLOR {0}]{1}[/COLOR][/B]".format( CONFIG.COLOR1, name) else: addonids.append(id) addonnames.append(name) tempaddonnames.append("[B][COLOR {0}]{1}[/COLOR][/B]".format( CONFIG.COLOR1, name)) choice = 1 while choice not in [-1, 0]: choice = dialog.select( "{0}: Seleccione los add-ons que desea incluir en la Lista Blanca." .format(CONFIG.ADDONTITLE), tempaddonnames) if choice == -1: break elif choice == 0: break else: choice2 = (choice - 1) if choice2 in selected: selected.remove(choice2) tempaddonnames[choice] = addonnames[choice2] else: selected.append(choice2) tempaddonnames[ choice] = "[B][COLOR {0}]{1}[/COLOR][/B]".format( CONFIG.COLOR1, addonnames[choice2]) white_list = [] if len(selected) > 0: for addon in selected: white_list.append( "['%s', '%s', '%s']" % (addonnames[addon], addonids[addon], addonfolds[addon])) writing = '\n'.join(white_list) tools.write_to_file(CONFIG.WHITELIST, writing) else: try: os.remove(CONFIG.WHITELIST) except: pass logging.log_notify( CONFIG.ADDONTITLE, "[COLOR {0}]{1} Add-ons en la Lista Blanca[/COLOR]".format( CONFIG.COLOR2, len(selected))) elif do == 'read': white_list = [] if os.path.exists(CONFIG.WHITELIST): lines = tools.read_from_file(CONFIG.WHITELIST).split('\n') for item in lines: try: name, id, fold = eval(item) white_list.append(eval(item)) except: pass return white_list elif do == 'view': list = whitelist(do='read') if len(list) > 0: msg = "Aquí hay una lista de los add-ons de su Lista Blanca, estos add-ons (junto con las dependencias) no se eliminarán cuando se realice un nuevo comienzo o los datos de usuario se sobrescriban en la instalación de una nueva Build.[CR][CR]" for item in list: try: name, id, fold = item except Exception as e: logging.log(str(e)) msg += "[COLOR {0}]{1}[/COLOR] [COLOR {2}]\"{3}\"[/COLOR][CR]".format( CONFIG.COLOR1, name, CONFIG.COLOR2, id) window.show_text_box("Visualización de add-ons de la Lista Blanca", msg) else: logging.log_notify( CONFIG.ADDONTITLE, "[COLOR {0}]No hay add-ons en la Lista Blanca[/COLOR]".format( CONFIG.COLOR2)) elif do == 'import': source = dialog.browse( 1, '[COLOR {0}]Seleccione el archivo de la Lista Blanca para importar[/COLOR]' .format(CONFIG.COLOR2), 'files', '.txt', False, False, CONFIG.HOME) logging.log(str(source)) if not source.endswith('.txt'): logging.log_notify( CONFIG.ADDONTITLE, "[COLOR {0}]Importación Cancelada![/COLOR]".format( CONFIG.COLOR2)) return current = whitelist(do='read') idList = [] count = 0 for item in current: name, id, fold = item idList.append(id) lines = tools.read_from_file(xbmcvfs.File(source)).split('\n') with open(CONFIG.WHITELIST, 'a') as f: for item in lines: try: name, id, folder = eval(item) except Exception as e: logging.log("Error al Agregar: '{0}' / {1}".format( item, str(e)), level=xbmc.LOGERROR) continue logging.log("{0} / {1} / {2}".format(name, id, folder)) if id not in idList: count += 1 writing = "['{0}', '{1}', '{2}']".format(name, id, folder) if len(idList) + count > 1: writing = "\n%s" % writing f.write(writing) logging.log_notify( CONFIG.ADDONTITLE, "[COLOR {0}]{1} Elemento(s) Agregado[/COLOR]".format( CONFIG.COLOR2, count)) elif do == 'export': source = dialog.browse( 3, '[COLOR {0}]Seleccione donde desea exportar el archivo de la Lista Blanca[/COLOR]' .format(CONFIG.COLOR2), 'files', '.txt', False, False, CONFIG.HOME) logging.log(str(source)) try: xbmcvfs.copy(CONFIG.WHITELIST, os.path.join(source, 'whitelist.txt')) dialog.ok( CONFIG.ADDONTITLE, "[COLOR {0}]La Lista Blanca ha sido exportada a:[/COLOR]". format(CONFIG.COLOR2) + '\n' + "[COLOR {0}]{1}[/COLOR]".format( CONFIG.COLOR1, os.path.join(source, 'whitelist.txt'))) logging.log_notify( CONFIG.ADDONTITLE, "[COLOR {0}]Lista Blanca Exportada[/COLOR]".format( CONFIG.COLOR2)) except Exception as e: logging.log("Error de Exportación: {0}".format(str(e)), level=xbmc.LOGERROR) if not dialog.yesno( CONFIG.ADDONTITLE, "[COLOR {0}]La ubicación que seleccionó no se puede escribir. Le gustaría seleccionar otra?[/COLOR]" .format(CONFIG.COLOR2), yeslabel="[B][COLOR cyan]Cambiar Ubicación[/COLOR][/B]", nolabel="[B][COLOR red]No, Cancelar[/COLOR][/B]"): logging.log_notify( CONFIG.ADDONTITLE, "[COLOR {0}]Cancelada la Exportación de la Lista Blanca [/COLOR]" .format(CONFIG.COLOR2, e)) else: whitelist(do='export') elif do == 'clear': if not dialog.yesno( CONFIG.ADDONTITLE, "[COLOR {0}]Estás seguro de que quieres vaciar tu whitelist?". format(CONFIG.COLOR2) + '\n' + "Este proceso no se puede deshacer.[/COLOR]", yeslabel="[B][COLOR springgreen]Si, Eliminar[/COLOR][/B]", nolabel="[B][COLOR red]No, Cancelar[/COLOR][/B]"): logging.log_notify( CONFIG.ADDONTITLE, "[COLOR {0}]Cancelado el borrado de la Lista Blanca[/COLOR]". format(CONFIG.COLOR2)) return try: os.remove(CONFIG.WHITELIST) logging.log_notify( CONFIG.ADDONTITLE, "[COLOR {0}]Lista Blanca Vaciada[/COLOR]".format( CONFIG.COLOR2)) except: logging.log_notify( CONFIG.ADDONTITLE, "[COLOR {0}]Error Vaciando Lista Blanca![/COLOR]".format( CONFIG.COLOR2))
def show_menu(self, url=None): directory.add_dir('Configuração rápida advancedsettings.xml', {'mode': 'advanced_settings', 'action': 'quick_configure'}, icon=CONFIG.ICONMAINT, themeit=CONFIG.THEME3) if os.path.exists(CONFIG.ADVANCED): directory.add_file('Ver atual advancedsettings.xml', {'mode': 'advanced_settings', 'action': 'view_current'}, icon=CONFIG.ICONMAINT, themeit=CONFIG.THEME3) directory.add_file('Remover atual advancedsettings.xml', {'mode': 'advanced_settings', 'action': 'remove_current'}, icon=CONFIG.ICONMAINT, themeit=CONFIG.THEME3) response = tools.open_url(CONFIG.ADVANCEDFILE) url_response = tools.open_url(url) local_file = os.path.join(CONFIG.ADDON_PATH, 'resources', 'text', 'advanced.json') if url_response: TEMPADVANCEDFILE = url_response.text elif response: TEMPADVANCEDFILE = response.text elif os.path.exists(local_file): TEMPADVANCEDFILE = tools.read_from_file(local_file) else: TEMPADVANCEDFILE = None logging.log("[Configurações avançadas] Sem predefinições disponíveis") if TEMPADVANCEDFILE: import json directory.add_separator(icon=CONFIG.ICONMAINT, themeit=CONFIG.THEME3) try: advanced_json = json.loads(TEMPADVANCEDFILE) except: advanced_json = None logging.log("[Configurações avançadas] ERRO: Formato inválido for {0}.".format(TEMPADVANCEDFILE)) if advanced_json: presets = advanced_json['presets'] if presets and len(presets) > 0: for preset in presets: name = preset.get('name', '') section = preset.get('section', False) preseturl = preset.get('url', '') icon = preset.get('icon', CONFIG.ADDON_ICON) fanart = preset.get('fanart', CONFIG.ADDON_FANART) description = preset.get('description', '') if not name: logging.log('[Configurações avançadas] Tag ausente \'name\'', level=xbmc.LOGDEBUG) continue if not preseturl: logging.log('[Configurações avançadas] Tag ausente \'url\'', level=xbmc.LOGDEBUG) continue if section: directory.add_dir(name, {'mode': 'advanced_settings', 'url': preseturl}, description=description, icon=icon, fanart=fanart, themeit=CONFIG.THEME3) else: directory.add_file(name, {'mode': 'advanced_settings', 'action': 'write_advanced', 'name': name, 'url': preseturl}, description=description, icon=icon, fanart=fanart, themeit=CONFIG.THEME2) else: logging.log("[Configurações avançadas] URL não funciona: {0}".format(CONFIG.ADVANCEDFILE))
def system_info(): from resources.libs.common import logging from resources.libs.common import tools from resources.libs import speedtest infoLabel = ['System.FriendlyName', 'System.BuildVersion', 'System.CpuUsage', 'System.ScreenMode', 'Network.IPAddress', 'Network.MacAddress', 'System.Uptime', 'System.TotalUptime', 'System.FreeSpace', 'System.UsedSpace', 'System.TotalSpace', 'System.Memory(free)', 'System.Memory(used)', 'System.Memory(total)'] data = [] x = 0 for info in infoLabel: temp = tools.get_info_label(info) y = 0 while temp == "Busy" and y < 10: temp = tools.get_info_label(info) y += 1 logging.log("{0} sleep {1}".format(info, str(y))) xbmc.sleep(200) data.append(temp) x += 1 storage_free = data[8] if 'Una' in data[8] else tools.convert_size(int(float(data[8][:-8])) * 1024 * 1024) storage_used = data[9] if 'Una' in data[9] else tools.convert_size(int(float(data[9][:-8])) * 1024 * 1024) storage_total = data[10] if 'Una' in data[10] else tools.convert_size(int(float(data[10][:-8])) * 1024 * 1024) ram_free = tools.convert_size(int(float(data[11][:-2])) * 1024 * 1024) ram_used = tools.convert_size(int(float(data[12][:-2])) * 1024 * 1024) ram_total = tools.convert_size(int(float(data[13][:-2])) * 1024 * 1024) picture = [] music = [] video = [] programs = [] repos = [] scripts = [] skins = [] fold = glob.glob(os.path.join(CONFIG.ADDONS, '*/')) for folder in sorted(fold, key = lambda x: x): foldername = os.path.split(folder[:-1])[1] if foldername == 'packages': continue xml = os.path.join(folder, 'addon.xml') if os.path.exists(xml): prov = re.compile("<provides>(.+?)</provides>").findall(tools.read_from_file(xml)) if len(prov) == 0: if foldername.startswith('skin'): skins.append(foldername) elif foldername.startswith('repo'): repos.append(foldername) else: scripts.append(foldername) elif not (prov[0]).find('executable') == -1: programs.append(foldername) elif not (prov[0]).find('video') == -1: video.append(foldername) elif not (prov[0]).find('audio') == -1: music.append(foldername) elif not (prov[0]).find('image') == -1: picture.append(foldername) directory.add_file('[B]Media Center Info:[/B]', icon=CONFIG.ICONMAINT, themeit=CONFIG.THEME2) directory.add_file('[COLOR {0}]Name:[/COLOR] [COLOR {1}]{2}[/COLOR]'.format(CONFIG.COLOR1, CONFIG.COLOR2, data[0]), icon=CONFIG.ICONMAINT, themeit=CONFIG.THEME3) directory.add_file('[COLOR {0}]Version:[/COLOR] [COLOR {1}]{2}[/COLOR]'.format(CONFIG.COLOR1, CONFIG.COLOR2, data[1]), icon=CONFIG.ICONMAINT, themeit=CONFIG.THEME3) directory.add_file('[COLOR {0}]Platform:[/COLOR] [COLOR {1}]{2}[/COLOR]'.format(CONFIG.COLOR1, CONFIG.COLOR2, tools.platform().title()), icon=CONFIG.ICONMAINT, themeit=CONFIG.THEME3) directory.add_file('[COLOR {0}]CPU Usage:[/COLOR] [COLOR {1}]{2}[/COLOR]'.format(CONFIG.COLOR1, CONFIG.COLOR2, data[2]), icon=CONFIG.ICONMAINT, themeit=CONFIG.THEME3) directory.add_file('[COLOR {0}]Screen Mode:[/COLOR] [COLOR {1}]{2}[/COLOR]'.format(CONFIG.COLOR1, CONFIG.COLOR2, data[3]), icon=CONFIG.ICONMAINT, themeit=CONFIG.THEME3) directory.add_file('[B]Uptime:[/B]', icon=CONFIG.ICONMAINT, themeit=CONFIG.THEME2) directory.add_file('[COLOR {0}]Current Uptime:[/COLOR] [COLOR {1}]{2}[/COLOR]'.format(CONFIG.COLOR1, CONFIG.COLOR2, data[6]), icon=CONFIG.ICONMAINT, themeit=CONFIG.THEME2) directory.add_file('[COLOR {0}]Total Uptime:[/COLOR] [COLOR {1}]{2}[/COLOR]'.format(CONFIG.COLOR1, CONFIG.COLOR2, data[7]), icon=CONFIG.ICONMAINT, themeit=CONFIG.THEME2) directory.add_file('[B]Local Storage:[/B]', icon=CONFIG.ICONMAINT, themeit=CONFIG.THEME2) directory.add_file('[COLOR {0}]Used Storage:[/COLOR] [COLOR {1}]{2}[/COLOR]'.format(CONFIG.COLOR1, CONFIG.COLOR2, storage_used), icon=CONFIG.ICONMAINT, themeit=CONFIG.THEME2) directory.add_file('[COLOR {0}]Free Storage:[/COLOR] [COLOR {1}]{2}[/COLOR]'.format(CONFIG.COLOR1, CONFIG.COLOR2, storage_free), icon=CONFIG.ICONMAINT, themeit=CONFIG.THEME2) directory.add_file('[COLOR {0}]Total Storage:[/COLOR] [COLOR {1}]{2}[/COLOR]'.format(CONFIG.COLOR1, CONFIG.COLOR2, storage_total), icon=CONFIG.ICONMAINT, themeit=CONFIG.THEME2) directory.add_file('[B]Ram Usage:[/B]', icon=CONFIG.ICONMAINT, themeit=CONFIG.THEME2) directory.add_file('[COLOR {0}]Used Memory:[/COLOR] [COLOR {1}]{2}[/COLOR]'.format(CONFIG.COLOR1, CONFIG.COLOR2, ram_free), icon=CONFIG.ICONMAINT, themeit=CONFIG.THEME2) directory.add_file('[COLOR {0}]Free Memory:[/COLOR] [COLOR {1}]{2}[/COLOR]'.format(CONFIG.COLOR1, CONFIG.COLOR2, ram_used), icon=CONFIG.ICONMAINT, themeit=CONFIG.THEME2) directory.add_file('[COLOR {0}]Total Memory:[/COLOR] [COLOR {1}]{2}[/COLOR]'.format(CONFIG.COLOR1, CONFIG.COLOR2, ram_total), icon=CONFIG.ICONMAINT, themeit=CONFIG.THEME2) mac, inter_ip, ip, city, state, country, isp = speedtest.net_info() directory.add_file('[B]Network:[/B]', icon=CONFIG.ICONMAINT, themeit=CONFIG.THEME2) directory.add_file('[COLOR {0}]Mac:[/COLOR] [COLOR {1}]{2}[/COLOR]'.format(CONFIG.COLOR1, CONFIG.COLOR2, mac), icon=CONFIG.ICONMAINT, themeit=CONFIG.THEME2) directory.add_file('[COLOR {0}]Internal IP: [COLOR {1}]{2}[/COLOR]'.format(CONFIG.COLOR1, CONFIG.COLOR2, inter_ip), icon=CONFIG.ICONMAINT, themeit=CONFIG.THEME2) directory.add_file('[COLOR {0}]External IP:[/COLOR] [COLOR {1}]{2}[/COLOR]'.format(CONFIG.COLOR1, CONFIG.COLOR2, ip), icon=CONFIG.ICONMAINT, themeit=CONFIG.THEME2) directory.add_file('[COLOR {0}]City:[/COLOR] [COLOR {1}]{2}[/COLOR]'.format(CONFIG.COLOR1, CONFIG.COLOR2, city), icon=CONFIG.ICONMAINT, themeit=CONFIG.THEME2) directory.add_file('[COLOR {0}]State:[/COLOR] [COLOR {1}]{2}[/COLOR]'.format(CONFIG.COLOR1, CONFIG.COLOR2, state), icon=CONFIG.ICONMAINT, themeit=CONFIG.THEME2) directory.add_file('[COLOR {0}]Country:[/COLOR] [COLOR {1}]{2}[/COLOR]'.format(CONFIG.COLOR1, CONFIG.COLOR2, country), icon=CONFIG.ICONMAINT, themeit=CONFIG.THEME2) directory.add_file('[COLOR {0}]ISP:[/COLOR] [COLOR {1}]{2}[/COLOR]'.format(CONFIG.COLOR1, CONFIG.COLOR2, isp), icon=CONFIG.ICONMAINT, themeit=CONFIG.THEME2) totalcount = len(picture) + len(music) + len(video) + len(programs) + len(scripts) + len(skins) + len(repos) directory.add_file('[B]Addons([COLOR {0}]{1}[/COLOR]):[/B]'.format(CONFIG.COLOR1, totalcount), icon=CONFIG.ICONMAINT, themeit=CONFIG.THEME2) directory.add_file('[COLOR {0}]Video Addons:[/COLOR] [COLOR {1}]{2}[/COLOR]'.format(CONFIG.COLOR1, CONFIG.COLOR2, str(len(video))), icon=CONFIG.ICONMAINT, themeit=CONFIG.THEME2) directory.add_file('[COLOR {0}]Program Addons:[/COLOR] [COLOR {1}]{2}[/COLOR]'.format(CONFIG.COLOR1, CONFIG.COLOR2, str(len(programs))), icon=CONFIG.ICONMAINT, themeit=CONFIG.THEME2) directory.add_file('[COLOR {0}]Music Addons:[/COLOR] [COLOR {1}]{2}[/COLOR]'.format(CONFIG.COLOR1, CONFIG.COLOR2, str(len(music))), icon=CONFIG.ICONMAINT, themeit=CONFIG.THEME2) directory.add_file('[COLOR {0}]Picture Addons:[/COLOR] [COLOR {1}]{2}[/COLOR]'.format(CONFIG.COLOR1, CONFIG.COLOR2, str(len(picture))), icon=CONFIG.ICONMAINT, themeit=CONFIG.THEME2) directory.add_file('[COLOR {0}]Repositories:[/COLOR] [COLOR {1}]{2}[/COLOR]'.format(CONFIG.COLOR1, CONFIG.COLOR2, str(len(repos))), icon=CONFIG.ICONMAINT, themeit=CONFIG.THEME2) directory.add_file('[COLOR {0}]Skins:[/COLOR] [COLOR {1}]{2}[/COLOR]'.format(CONFIG.COLOR1, CONFIG.COLOR2, str(len(skins))), icon=CONFIG.ICONMAINT, themeit=CONFIG.THEME2) directory.add_file('[COLOR {0}]Scripts/Modules:[/COLOR] [COLOR {1}]{2}[/COLOR]'.format(CONFIG.COLOR1, CONFIG.COLOR2, str(len(scripts))), icon=CONFIG.ICONMAINT, themeit=CONFIG.THEME2)
def whitelist(do): addonnames = [] addonids = [] addonfolds = [] dialog = xbmcgui.Dialog() if do == 'edit': fold = glob.glob(os.path.join(CONFIG.ADDONS, '*/')) for folder in sorted(fold, key=lambda x: x): foldername = os.path.split(folder[:-1])[1] if foldername in CONFIG.EXCLUDES: continue elif foldername in CONFIG.DEFAULTPLUGINS: continue elif foldername == 'packages': continue xml = os.path.join(folder, 'addon.xml') if os.path.exists(xml): a = tools.read_from_file(xml) temp, addid = parse(a, foldername) addonnames.append(temp) addonids.append(addid) addonfolds.append(foldername) fold2 = glob.glob(os.path.join(CONFIG.ADDON_DATA, '*/')) for folder in sorted(fold2, key=lambda x: x): foldername = os.path.split(folder[:-1])[1] if foldername in addonfolds: continue if foldername in CONFIG.EXCLUDES: continue xml = os.path.join(CONFIG.ADDONS, foldername, 'addon.xml') xml2 = os.path.join(CONFIG.XBMC, 'addons', foldername, 'addon.xml') if os.path.exists(xml): a = tools.read_from_file(xml) elif os.path.exists(xml2): a = tools.read_from_file(xml2) else: continue temp, addid = parse(a, foldername) addonnames.append(temp) addonids.append(addid) addonfolds.append(foldername) selected = [] tempaddonnames = ["-- Click here to Continue --"] + addonnames currentWhite = whitelist(do='read') for item in currentWhite: logging.log(str(item)) try: name, id, fold = item except Exception as e: logging.log(str(e)) if id in addonids: pos = addonids.index(id)+1 selected.append(pos-1) tempaddonnames[pos] = "[B][COLOR {0}]{1}[/COLOR][/B]".format(CONFIG.COLOR1, name) else: addonids.append(id) addonnames.append(name) tempaddonnames.append("[B][COLOR {0}]{1}[/COLOR][/B]".format(CONFIG.COLOR1, name)) choice = 1 while choice not in [-1, 0]: choice = dialog.select("{0}: Select the add-ons you wish to the whitelist.".format(CONFIG.ADDONTITLE), tempaddonnames) if choice == -1: break elif choice == 0: break else: choice2 = (choice-1) if choice2 in selected: selected.remove(choice2) tempaddonnames[choice] = addonnames[choice2] else: selected.append(choice2) tempaddonnames[choice] = "[B][COLOR {0}]{1}[/COLOR][/B]".format(CONFIG.COLOR1, addonnames[choice2]) white_list = [] if len(selected) > 0: for addon in selected: white_list.append("['%s', '%s', '%s']" % (addonnames[addon], addonids[addon], addonfolds[addon])) writing = '\n'.join(white_list) tools.write_to_file(CONFIG.WHITELIST, writing) else: try: os.remove(CONFIG.WHITELIST) except: pass logging.log_notify(CONFIG.ADDONTITLE, "[COLOR {0}]{1} Add-ons in whitelist[/COLOR]".format(CONFIG.COLOR2, len(selected))) elif do == 'read': white_list = [] if os.path.exists(CONFIG.WHITELIST): lines = tools.read_from_file(CONFIG.WHITELIST).split('\n') for item in lines: try: name, id, fold = eval(item) white_list.append(eval(item)) except: pass return white_list elif do == 'view': list = whitelist(do='read') if len(list) > 0: msg = "Here is a list of your whitelist items, these items(along with dependencies) will not be removed when preforming a fresh start or the userdata overwritten in a build install.[CR][CR]" for item in list: try: name, id, fold = item except Exception as e: logging.log(str(e)) msg += "[COLOR {0}]{1}[/COLOR] [COLOR {2}]\"{3}\"[/COLOR][CR]".format(CONFIG.COLOR1, name, CONFIG.COLOR2, id) window.show_text_box("Viewing Whitelisted Items", msg) else: logging.log_notify(CONFIG.ADDONTITLE, "[COLOR {0}]No items in whitelist[/COLOR]".format(CONFIG.COLOR2)) elif do == 'import': source = dialog.browse(1, '[COLOR {0}]Select the whitelist file to import[/COLOR]'.format(CONFIG.COLOR2), 'files', '.txt', False, False, CONFIG.HOME) logging.log(str(source)) if not source.endswith('.txt'): logging.log_notify(CONFIG.ADDONTITLE, "[COLOR {0}]Import Cancelled![/COLOR]".format(CONFIG.COLOR2)) return current = whitelist(do='read') idList = [] count = 0 for item in current: name, id, fold = item idList.append(id) lines = tools.read_from_file(xbmcvfs.File(source)).split('\n') with open(CONFIG.WHITELIST, 'a') as f: for item in lines: try: name, id, folder = eval(item) except Exception as e: logging.log("Error Adding: '{0}' / {1}".format(item, str(e)), level=xbmc.LOGERROR) continue logging.log("{0} / {1} / {2}".format(name, id, folder)) if id not in idList: count += 1 writing = "['{0}', '{1}', '{2}']".format(name, id, folder) if len(idList) + count > 1: writing = "\n%s" % writing f.write(writing) logging.log_notify(CONFIG.ADDONTITLE, "[COLOR {0}]{1} Item(s) Added[/COLOR]".format(CONFIG.COLOR2, count)) elif do == 'export': source = dialog.browse(3, '[COLOR {0}]Select where you wish to export the whitelist file[/COLOR]'.format(CONFIG.COLOR2), 'files', '.txt', False, False, CONFIG.HOME) logging.log(str(source)) try: xbmcvfs.copy(CONFIG.WHITELIST, os.path.join(source, 'whitelist.txt')) dialog.ok(CONFIG.ADDONTITLE, "[COLOR {0}]Whitelist has been exported to:[/COLOR]".format(CONFIG.COLOR2) +'\n'+"[COLOR {0}]{1}[/COLOR]".format(CONFIG.COLOR1, os.path.join(source, 'whitelist.txt'))) logging.log_notify(CONFIG.ADDONTITLE, "[COLOR {0}]Whitelist Exported[/COLOR]".format(CONFIG.COLOR2)) except Exception as e: logging.log("Export Error: {0}".format(str(e)), level=xbmc.LOGERROR) if not dialog.yesno(CONFIG.ADDONTITLE, "[COLOR {0}]The location you selected isn\'t writable would you like to select another one?[/COLOR]".format(CONFIG.COLOR2), yeslabel="[B][COLOR springgreen]Change Location[/COLOR][/B]", nolabel="[B][COLOR red]No Cancel[/COLOR][/B]"): logging.log_notify(CONFIG.ADDONTITLE, "[COLOR {0}]Whitelist Export Cancelled[/COLOR]".format(CONFIG.COLOR2, e)) else: whitelist(do='export') elif do == 'clear': if not dialog.yesno(CONFIG.ADDONTITLE, "[COLOR {0}]Are you sure you want to clear your whitelist?".format(CONFIG.COLOR2) +'\n'+"This process can't be undone.[/COLOR]", yeslabel="[B][COLOR springgreen]Yes Remove[/COLOR][/B]", nolabel="[B][COLOR red]No Cancel[/COLOR][/B]"): logging.log_notify(CONFIG.ADDONTITLE, "[COLOR {0}]Clear Whitelist Cancelled[/COLOR]".format(CONFIG.COLOR2)) return try: os.remove(CONFIG.WHITELIST) logging.log_notify(CONFIG.ADDONTITLE, "[COLOR {0}]Whitelist Cleared[/COLOR]".format(CONFIG.COLOR2)) except: logging.log_notify(CONFIG.ADDONTITLE, "[COLOR {0}]Error Clearing Whitelist![/COLOR]".format(CONFIG.COLOR2))
def show_menu(self, url=None): directory.add_dir( '[COLOR azure]Configuración Rápida advancedsettings.xml[/COLOR]', { 'mode': 'advanced_settings', 'action': 'quick_configure' }, icon=CONFIG.ICONMAINT, themeit=CONFIG.THEME3) if os.path.exists(CONFIG.ADVANCED): directory.add_file('Ver Actual advancedsettings.xml', { 'mode': 'advanced_settings', 'action': 'view_current' }, icon=CONFIG.ICONMAINT, themeit=CONFIG.THEME3) directory.add_file('Eliminar Actual advancedsettings.xml', { 'mode': 'advanced_settings', 'action': 'remove_current' }, icon=CONFIG.ICONMAINT, themeit=CONFIG.THEME3) response = tools.open_url(CONFIG.ADVANCEDFILE) url_response = tools.open_url(url) local_file = os.path.join(CONFIG.ADDON_PATH, 'resources', 'text', 'advanced.json') if url_response: TEMPADVANCEDFILE = url_response.text elif response: TEMPADVANCEDFILE = response.text elif os.path.exists(local_file): TEMPADVANCEDFILE = tools.read_from_file(local_file) else: TEMPADVANCEDFILE = None logging.log( "[Advanced Settings] No hay Ajustes Preestablecidos Disponibles" ) if TEMPADVANCEDFILE: import json directory.add_separator(icon=CONFIG.ICONMAINT, themeit=CONFIG.THEME3) try: advanced_json = json.loads(TEMPADVANCEDFILE) except: advanced_json = None logging.log( "[Advanced Settings] ERROR: Formato no válido para {0}.". format(TEMPADVANCEDFILE)) if advanced_json: presets = advanced_json['presets'] if presets and len(presets) > 0: for preset in presets: name = preset.get('name', '') section = preset.get('section', False) preseturl = preset.get('url', '') icon = preset.get('icon', CONFIG.ADDON_ICON) fanart = preset.get('fanart', CONFIG.ADDON_FANART) description = preset.get('description', '') if not name: logging.log( '[Advanced Settings] Missing tag \'name\'', level=xbmc.LOGDEBUG) continue if not preseturl: logging.log( '[Advanced Settings] Missing tag \'url\'', level=xbmc.LOGDEBUG) continue if section: directory.add_dir(name, { 'mode': 'advanced_settings', 'url': preseturl }, description=description, icon=icon, fanart=fanart, themeit=CONFIG.THEME3) else: directory.add_file(name, { 'mode': 'advanced_settings', 'action': 'write_advanced', 'name': name, 'url': preseturl }, description=description, icon=icon, fanart=fanart, themeit=CONFIG.THEME2) else: logging.log("[Advanced Settings] URL no funciona: {0}".format( CONFIG.ADVANCEDFILE))
def show_menu(self, url=None): directory.add_dir('Quick Configure advancedsettings.xml', { 'mode': 'advanced_settings', 'action': 'quick_configure' }, icon=CONFIG.ICONMAINT, themeit=CONFIG.THEME3) if os.path.exists(CONFIG.ADVANCED): directory.add_file('View Current advancedsettings.xml', { 'mode': 'advanced_settings', 'action': 'view_current' }, icon=CONFIG.ICONMAINT, themeit=CONFIG.THEME3) directory.add_file('Remove Current advancedsettings.xml', { 'mode': 'advanced_settings', 'action': 'remove_current' }, icon=CONFIG.ICONMAINT, themeit=CONFIG.THEME3) response = tools.open_url(CONFIG.ADVANCEDFILE) url_response = tools.open_url(url) local_file = os.path.join(CONFIG.ADDON_PATH, 'resources', 'text', 'advanced.json') if url_response: TEMPADVANCEDFILE = url_response.text elif response: TEMPADVANCEDFILE = response.text elif os.path.exists(local_file): TEMPADVANCEDFILE = tools.read_from_file(local_file) else: TEMPADVANCEDFILE = None logging.log("[Advanced Settings] No Presets Available") if TEMPADVANCEDFILE: import json directory.add_separator(icon=CONFIG.ICONMAINT, themeit=CONFIG.THEME3) try: advanced_json = json.loads(TEMPADVANCEDFILE) except: advanced_json = None logging.log( "[Advanced Settings] ERROR: Invalid Format for {0}.". format(CONFIG.ADVANCEDFILE)) if advanced_json: presets = advanced_json['presets'] if presets and len(presets) > 0: for preset in presets: name = preset.get('name', '') section = preset.get('section', '') preseturl = preset.get('url', '') icon = preset.get('icon', '') fanart = preset.get('fanart', '') description = preset.get('description', '') if not name: logging.log( '[Advanced Settings] Missing tag \'name\'', level=xbmc.LOGDEBUG) continue if not preseturl: logging.log( '[Advanced Settings] Missing tag \'url\'', level=xbmc.LOGDEBUG) continue if section: directory.add_dir(name, { 'mode': 'advanced_settings', 'url': preseturl }, description=description, icon=icon, fanart=fanart, themeit=CONFIG.THEME3) else: directory.add_file(name, { 'mode': 'advanced_settings', 'action': 'write_advanced', 'name': name, 'url': preseturl }, description=description, icon=icon, fanart=fanart, themeit=CONFIG.THEME2) else: logging.log("[Advanced Settings] URL not working: {0}".format( CONFIG.ADVANCEDFILE))