################################################################################ # Copyright (C) 2015 Surfacingx # # # # This Program is free software; you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # # the Free Software Foundation; either version 2, or (at your option) # # any later version. # # # # This Program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License # # along with XBMC; see the file COPYING. If not, write to # # the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. # # http://www.gnu.org/copyleft/gpl.html # ################################################################################ # -*- coding: utf-8 -*- import glob, os, sys import shutil import re import uservar import fnmatch import xbmc, xbmcaddon, xbmcgui, xbmcplugin, xbmcvfs import zipfile from datetime import date, datetime, timedelta import urllib.request as urllib2 from urllib.parse import urljoin, quote_plus, unquote_plus from resources.libs import extract, downloader, notify, debridit, traktit, loginit, skinSwitch, uploadLog, yt, speedtest, wizard as wiz KODIV = float(xbmc.getInfoLabel("System.BuildVersion")[:4]) transPath = xbmcvfs.translatePath legalFilename = xbmcvfs.makeLegalFilename LOGNOTICE = xbmc.LOGINFO ADDON_ID = uservar.ADDON_ID ADDONTITLE = uservar.ADDONTITLE ADDON = wiz.addonId(ADDON_ID) VERSION = wiz.addonInfo(ADDON_ID,'version') ADDONPATH = wiz.addonInfo(ADDON_ID, 'path') DIALOG = xbmcgui.Dialog() DP = xbmcgui.DialogProgress() HOME = transPath('special://home/') LOG = transPath('special://logpath/') PROFILE = transPath('special://profile/') TEMPDIR = transPath('special://temp') ADDONS = os.path.join(HOME, 'addons') USERDATA = os.path.join(HOME, 'userdata') PLUGIN = os.path.join(ADDONS, ADDON_ID) PACKAGES = os.path.join(ADDONS, 'packages') ADDOND = os.path.join(USERDATA, 'addon_data') ADDONDATA = os.path.join(USERDATA, 'addon_data', ADDON_ID) ADVANCED = os.path.join(USERDATA, 'advancedsettings.xml') SOURCES = os.path.join(USERDATA, 'sources.xml') FAVOURITES = os.path.join(USERDATA, 'favourites.xml') PROFILES = os.path.join(USERDATA, 'profiles.xml') GUISETTINGS = os.path.join(USERDATA, 'guisettings.xml') THUMBS = os.path.join(USERDATA, 'Thumbnails') DATABASE = os.path.join(USERDATA, 'Database') FANART = os.path.join(PLUGIN, 'fanart.jpg') ICON = os.path.join(PLUGIN, 'icon.png') ART = os.path.join(PLUGIN, 'resources', 'art') WIZLOG = os.path.join(ADDONDATA, 'wizard.log') SPEEDTESTFOLD = os.path.join(ADDONDATA, 'SpeedTest') ARCHIVE_CACHE = os.path.join(TEMPDIR, 'archive_cache') SKIN = xbmc.getSkinDir() BUILDNAME = wiz.getS('buildname') DEFAULTSKIN = wiz.getS('defaultskin') DEFAULTNAME = wiz.getS('defaultskinname') DEFAULTIGNORE = wiz.getS('defaultskinignore') BUILDVERSION = wiz.getS('buildversion') BUILDTHEME = wiz.getS('buildtheme') BUILDLATEST = wiz.getS('latestversion') SHOW15 = wiz.getS('show15') SHOW16 = wiz.getS('show16') SHOW17 = wiz.getS('show17') SHOW18 = wiz.getS('show18') SHOW19 = wiz.getS('show19') SHOW20 = wiz.getS('show20') SHOW21 = wiz.getS('show21') SHOWADULT = wiz.getS('adult') SHOWMAINT = wiz.getS('showmaint') AUTOCLEANUP = wiz.getS('autoclean') AUTOCACHE = wiz.getS('clearcache') AUTOPACKAGES = wiz.getS('clearpackages') AUTOTHUMBS = wiz.getS('clearthumbs') AUTOFEQ = wiz.getS('autocleanfeq') AUTONEXTRUN = wiz.getS('nextautocleanup') INCLUDEVIDEO = wiz.getS('includevideo') INCLUDEALL = wiz.getS('includeall') INCLUDETHECREW = wiz.getS('includethecrew') INCLUDEHOMELANDER = wiz.getS('includehomelander') INCLUDEMORIA = wiz.getS('includemoria') INCLUDEGAIA = wiz.getS('includegaia') INCLUDESEREN = wiz.getS('includeseren') SEPERATE = wiz.getS('seperate') NOTIFY = wiz.getS('notify') NOTEID = wiz.getS('noteid') NOTEDISMISS = wiz.getS('notedismiss') TRAKTSAVE = wiz.getS('traktlastsave') REALSAVE = wiz.getS('debridlastsave') LOGINSAVE = wiz.getS('loginlastsave') KEEPFAVS = wiz.getS('keepfavourites') KEEPSOURCES = wiz.getS('keepsources') KEEPPROFILES = wiz.getS('keepprofiles') KEEPPLAYERCORE = wiz.getS('keepplayercore') KEEPADVANCED = wiz.getS('keepadvanced') KEEPREPOS = wiz.getS('keeprepos') KEEPSUPER = wiz.getS('keepsuper') KEEPWHITELIST = wiz.getS('keepwhitelist') KEEPTRAKT = wiz.getS('keeptrakt') KEEPREAL = wiz.getS('keepdebrid') KEEPLOGIN = wiz.getS('keeplogin') DEVELOPER = wiz.getS('developer') THIRDPARTY = wiz.getS('enable3rd') THIRD1NAME = wiz.getS('wizard1name') THIRD1URL = wiz.getS('wizard1url') THIRD2NAME = wiz.getS('wizard2name') THIRD2URL = wiz.getS('wizard2url') THIRD3NAME = wiz.getS('wizard3name') THIRD3URL = wiz.getS('wizard3url') BACKUPLOCATION = ADDON.getSetting('path') if not ADDON.getSetting('path') == '' else 'special://home/' BACKUPROMS = wiz.getS('rompath') MYBUILDS = os.path.join(BACKUPLOCATION, 'My_Builds', '') AUTOFEQ = int(float(AUTOFEQ)) if AUTOFEQ.isdigit() else 0 TODAY = date.today() TOMORROW = TODAY + timedelta(days=1) THREEDAYS = TODAY + timedelta(days=3) MCNAME = wiz.mediaCenter() EXCLUDES = uservar.EXCLUDES CACHETEXT = uservar.CACHETEXT CACHEAGE = uservar.CACHEAGE if str(uservar.CACHEAGE).isdigit() else 30 BUILDFILE = uservar.BUILDFILE APKFILE = uservar.APKFILE YOUTUBETITLE = uservar.YOUTUBETITLE YOUTUBEFILE = uservar.YOUTUBEFILE ADDONFILE = uservar.ADDONFILE ADVANCEDFILE = uservar.ADVANCEDFILE UPDATECHECK = uservar.UPDATECHECK if str(uservar.UPDATECHECK).isdigit() else 1 NEXTCHECK = TODAY + timedelta(days=UPDATECHECK) NOTIFICATION = uservar.NOTIFICATION ENABLE = uservar.ENABLE HEADERMESSAGE = uservar.HEADERMESSAGE AUTOUPDATE = uservar.AUTOUPDATE BUILDERNAME = uservar.BUILDERNAME WIZARDFILE = uservar.WIZARDFILE HIDECONTACT = uservar.HIDECONTACT CONTACT = uservar.CONTACT CONTACTICON = uservar.CONTACTICON if not uservar.CONTACTICON == 'http://' else ICON CONTACTFANART = uservar.CONTACTFANART if not uservar.CONTACTFANART == 'http://' else FANART HIDESPACERS = uservar.HIDESPACERS COLOR1 = uservar.COLOR1 COLOR2 = uservar.COLOR2 THEME1 = uservar.THEME1 THEME2 = uservar.THEME2 THEME3 = uservar.THEME3 THEME4 = uservar.THEME4 THEME5 = uservar.THEME5 ICONBUILDS = uservar.ICONBUILDS if not uservar.ICONBUILDS == 'http://' else ICON ICONMAINT = uservar.ICONMAINT if not uservar.ICONMAINT == 'http://' else ICON ICONAPK = uservar.ICONAPK if not uservar.ICONAPK == 'http://' else ICON ICONADDONS = uservar.ICONADDONS if not uservar.ICONADDONS == 'http://' else ICON ICONYOUTUBE = uservar.ICONYOUTUBE if not uservar.ICONYOUTUBE == 'http://' else ICON ICONSAVE = uservar.ICONSAVE if not uservar.ICONSAVE == 'http://' else ICON ICONTRAKT = uservar.ICONTRAKT if not uservar.ICONTRAKT == 'http://' else ICON ICONREAL = uservar.ICONREAL if not uservar.ICONREAL == 'http://' else ICON ICONLOGIN = uservar.ICONLOGIN if not uservar.ICONLOGIN == 'http://' else ICON ICONCONTACT = uservar.ICONCONTACT if not uservar.ICONCONTACT == 'http://' else ICON ICONSETTINGS = uservar.ICONSETTINGS if not uservar.ICONSETTINGS == 'http://' else ICON LOGFILES = wiz.LOGFILES TRAKTID = traktit.TRAKTID DEBRIDID = debridit.DEBRIDID LOGINID = loginit.LOGINID MODURL = 'http://tribeca.tvaddons.ag/tools/maintenance/modules/' MODURL2 = 'http://mirrors.kodi.tv/addons/jarvis/' INSTALLMETHODS = ['Always Ask', 'Reload Profile', 'Force Close'] DEFAULTPLUGINS = ['game.controller.default', 'game.controller.snes', 'metadata.album.universal', 'metadata.artists.universal', 'metadata.common.fanart.tv', 'metadata.common.imdb.com', 'metadata.common.themoviedb.org', 'metadata.themoviedb.org.python', 'metadata.tvshows.themoviedb.org', 'metadata.tvshows.themoviedb.org.python', 'service.xbmc.versioncheck'] try: INSTALLMETHOD = int(float(wiz.getS('installmethod'))) except: INSTALLMETHOD = 0 ########################### ###### Menu Items ####### ########################### #addDir (display,mode,name=None,url=None,menu=None,overwrite=True,fanart=FANART,icon=ICON, themeit=None) #addFile(display,mode,name=None,url=None,menu=None,overwrite=True,fanart=FANART,icon=ICON, themeit=None) def index(): errors = int(errorChecking(count=True)) errorsfound = str(errors) + ' Error(s) Found' if errors > 0 else 'None Found' if AUTOUPDATE == 'Yes': wizfile = wiz.textCache(WIZARDFILE) if not wizfile == False: ver = wiz.checkWizard('version') if ver > VERSION: addFile('%s [v%s] [COLOR red][B][UPDATE v%s][/B][/COLOR]' % (ADDONTITLE, VERSION, ver), 'wizardupdate', themeit=THEME2) else: addFile('%s [v%s]' % (ADDONTITLE, VERSION), '', themeit=THEME2) else: addFile('%s [v%s]' % (ADDONTITLE, VERSION), '', themeit=THEME2) else: addFile('%s [v%s]' % (ADDONTITLE, VERSION), '', themeit=THEME2) if len(BUILDNAME) > 0: version = wiz.checkBuild(BUILDNAME, 'version') build = '[B][COLOR dodgerblue]Installed:[/COLOR][/B][B][COLOR white]%s (v%s)[/COLOR][/B]' % (BUILDNAME, BUILDVERSION) try: if version > BUILDVERSION: build = '%s [COLOR red][B][UPDATE v%s][/B][/COLOR]' % (build, version) addDir(build,'viewbuild', BUILDNAME) themefile = wiz.themeCount(BUILDNAME) if not themefile == False: addFile('None' if BUILDTHEME == "" else BUILDTHEME, 'theme', BUILDNAME, themeit=THEME5) except: wiz.forceText() pass else: addDir('None', 'builds', themeit=THEME4) if HIDESPACERS == 'No': addFile(wiz.sep(), '', themeit=THEME3) addDir ('Builds', 'builds', icon=ICONBUILDS, themeit=THEME1) addDir ('Maintenance', 'maint', icon=ICONMAINT, themeit=THEME1) if wiz.platform() == 'android' or DEVELOPER == 'true': addDir ('Apk Installer' ,'apk', icon=ICONAPK, themeit=THEME1) #if not ADDONFILE == 'http://': addDir ('Addon Installer' ,'addons', icon=ICONADDONS, themeit=THEME1) if not YOUTUBEFILE == 'http://' and not YOUTUBETITLE == '': addDir (YOUTUBETITLE ,'youtube', icon=ICONYOUTUBE, themeit=THEME1) addDir ('Save Data', 'savedata', icon=ICONSAVE, themeit=THEME1) #if HIDECONTACT == 'No': addFile('Contact' ,'contact', icon=ICONCONTACT, themeit=THEME1) if HIDESPACERS == 'No': addFile(wiz.sep(), '', themeit=THEME3) addFile('Upload Log File', 'uploadlog', icon=ICONMAINT, themeit=THEME1) addFile('View Errors in Log: %s' % (errorsfound), 'viewerrorlog', icon=ICONMAINT, themeit=THEME1) if errors > 0: addFile('View Last Error In Log', 'viewerrorlast', icon=ICONMAINT, themeit=THEME1) if HIDESPACERS == 'No': addFile(wiz.sep(), '', themeit=THEME3) addFile('Settings', 'settings', icon=ICONSETTINGS, themeit=THEME1) addFile('Force Update Text Files', 'forcetext', icon=ICONMAINT, themeit=THEME1) if DEVELOPER == 'true': addDir('Developer Menu', 'developer', icon=ICON, themeit=THEME1) setView('files', 'viewType') def buildMenu(): bf = wiz.textCache(BUILDFILE) if bf == False: WORKINGURL = wiz.workingURL(BUILDFILE) addFile('%s Version: %s' % (MCNAME, KODIV), '', icon=ICONBUILDS, themeit=THEME3) addDir ('Save Data Menu' ,'savedata', icon=ICONSAVE, themeit=THEME3) if HIDESPACERS == 'No': addFile(wiz.sep(), '', themeit=THEME3) addFile('Url for txt file not valid', '', icon=ICONBUILDS, themeit=THEME3) addFile('%s' % WORKINGURL, '', icon=ICONBUILDS, themeit=THEME3) return total, count15, count16, count17, count18, count19, count20, count21, adultcount, hidden = wiz.buildCount() third = False; addin = [] if THIRDPARTY == 'true': if not THIRD1NAME == '' and not THIRD1URL == '': third = True; addin.append('1') if not THIRD2NAME == '' and not THIRD2URL == '': third = True; addin.append('2') if not THIRD3NAME == '' and not THIRD3URL == '': third = True; addin.append('3') link = bf.decode('utf-8').replace('\n','').replace('\r','').replace('\t','').replace('gui=""', 'gui="http://"').replace('theme=""', 'theme="http://"').replace('adult=""', 'adult="no"') match = re.compile('name="(.+?)".+?ersion="(.+?)".+?rl="(.+?)".+?ui="(.+?)".+?odi="(.+?)".+?heme="(.+?)".+?con="(.+?)".+?anart="(.+?)".+?dult="(.+?)".+?escription="(.+?)"').findall(link) if total == 1 and third == False: for name, version, url, gui, kodi, theme, icon, fanart, adult, description in match: if not SHOWADULT == 'true' and adult.lower() == 'yes': continue if not DEVELOPER == 'true' and wiz.strTest(name): continue viewBuild(match[0][0]) return addFile('%s Version: %s' % (MCNAME, KODIV), '', icon=ICONBUILDS, themeit=THEME3) addDir ('Save Data Menu' ,'savedata', icon=ICONSAVE, themeit=THEME3) if HIDESPACERS == 'No': addFile(wiz.sep(), '', themeit=THEME3) if third == True: for item in addin: name = eval('THIRD%sNAME' % item) addDir ("[B]%s[/B]" % name, 'viewthirdparty', item, icon=ICONBUILDS, themeit=THEME3) if len(match) >= 1: if SEPERATE == 'true': for name, version, url, gui, kodi, theme, icon, fanart, adult, description in match: if not SHOWADULT == 'true' and adult.lower() == 'yes': continue if not DEVELOPER == 'true' and wiz.strTest(name): continue menu = createMenu('install', '', name) addDir('[%s] %s (v%s)' % (float(kodi), name, version), 'viewbuild', name, description=description, fanart=fanart,icon=icon, menu=menu, themeit=THEME2) else: if count21 > 0: state = '+' if SHOW21 == 'false' else '-' # addFile('[B]%s Omega Builds(%s)[/B]' % (state, count21), 'togglesetting', 'show21', themeit=THEME3) if SHOW21 == 'true': addFile('[B]%s Omega Builds(%s)[/B]' % (state, count21), '', icon=ICONBUILDS, themeit=THEME3) for name, version, url, gui, kodi, theme, icon, fanart, adult, description, in match: if not SHOWADULT == 'true' and adult.lower() == 'yes': continue if not DEVELOPER == 'true' and wiz.strTest(name): continue kodiv = int(float(kodi)) if kodiv == 21: menu = createMenu('install', '', name) addDir('[%s] %s (v%s)' % (float(kodi), name, version), 'viewbuild', name, description=description, fanart=fanart,icon=icon, menu=menu, themeit=THEME2) if count20 > 0: state = '+' if SHOW20 == 'false' else '-' # addFile('[B]%s Nexus Builds(%s)[/B]' % (state, count20), 'togglesetting', 'show20', themeit=THEME3) if SHOW20 == 'true': addFile('[B]%s Nexus Builds(%s)[/B]' % (state, count20), '', icon=ICONBUILDS, themeit=THEME3) for name, version, url, gui, kodi, theme, icon, fanart, adult, description, in match: if not SHOWADULT == 'true' and adult.lower() == 'yes': continue if not DEVELOPER == 'true' and wiz.strTest(name): continue kodiv = int(float(kodi)) if kodiv == 20: menu = createMenu('install', '', name) addDir('[%s] %s (v%s)' % (float(kodi), name, version), 'viewbuild', name, description=description, fanart=fanart,icon=icon, menu=menu, themeit=THEME2) if count19 > 0: state = '+' if SHOW19 == 'false' else '-' # addFile('[B]%s Matrix Builds(%s)[/B]' % (state, count19), 'togglesetting', 'show19', themeit=THEME3) if SHOW19 == 'true': addFile('[B]%s Matrix Builds(%s)[/B]' % (state, count19), '', icon=ICONBUILDS, themeit=THEME3) for name, version, url, gui, kodi, theme, icon, fanart, adult, description in match: if not SHOWADULT == 'true' and adult.lower() == 'yes': continue if not DEVELOPER == 'true' and wiz.strTest(name): continue kodiv = int(float(kodi)) if kodiv == 19: menu = createMenu('install', '', name) addDir('[%s] %s (v%s)' % (float(kodi), name, version), 'viewbuild', name, description=description, fanart=fanart,icon=icon, menu=menu, themeit=THEME2) if count18 > 0: state = '+' if SHOW18 == 'false' else '-' # addFile('[B]%s Leia Builds(%s)[/B]' % (state, count18), 'togglesetting', 'show18', themeit=THEME3) if SHOW18 == 'true': addFile('[B]%s Leia Builds(%s)[/B]' % (state, count18), '', icon=ICONBUILDS, themeit=THEME3) for name, version, url, gui, kodi, theme, icon, fanart, adult, description in match: if not SHOWADULT == 'true' and adult.lower() == 'yes': continue if not DEVELOPER == 'true' and wiz.strTest(name): continue kodiv = int(float(kodi)) if kodiv == 18: menu = createMenu('install', '', name) addDir('[%s] %s (v%s)' % (float(kodi), name, version), 'viewbuild', name, description=description, fanart=fanart,icon=icon, menu=menu, themeit=THEME2) if count17 > 0: state = '+' if SHOW17 == 'false' else '-' # addFile('[B]%s Krypton Builds(%s)[/B]' % (state, count17), 'togglesetting', 'show17', themeit=THEME3) if SHOW17 == 'true': addFile('[B]%s Krypton Builds(%s)[/B]' % (state, count17), '', icon=ICONBUILDS, themeit=THEME3) for name, version, url, gui, kodi, theme, icon, fanart, adult, description in match: if not SHOWADULT == 'true' and adult.lower() == 'yes': continue if not DEVELOPER == 'true' and wiz.strTest(name): continue kodiv = int(float(kodi)) if kodiv == 17: menu = createMenu('install', '', name) addDir('[%s] [COLOR %s][B] %s [/B][/COLOR](v%s)' % (float(kodi), name, version), 'viewbuild', name, description=description, fanart=fanart,icon=icon, menu=menu, themeit=THEME2) if count16 > 0: state = '+' if SHOW16 == 'false' else '-' # addFile('[B]%s Jarvis Builds(%s)[/B]' % (state, count16), 'togglesetting', 'show16', themeit=THEME3) if SHOW16 == 'true': addFile('[B]%s Jarvis Builds(%s)[/B]' % (state, count16), '', icon=ICONBUILDS, themeit=THEME3) for name, version, url, gui, kodi, theme, icon, fanart, adult, description in match: if not SHOWADULT == 'true' and adult.lower() == 'yes': continue if not DEVELOPER == 'true' and wiz.strTest(name): continue kodiv = int(float(kodi)) if kodiv == 16: menu = createMenu('install', '', name) addDir('[%s] [COLOR %s][B] %s [/B][/COLOR](v%s)' % (float(kodi), name, version), 'viewbuild', name, description=description, fanart=fanart,icon=icon, menu=menu, themeit=THEME2) if count15 > 0: state = '+' if SHOW15 == 'false' else '-' # addFile('[B]%s Isengard and Below Builds(%s)[/B]' % (state, count15), 'togglesetting', 'show15', themeit=THEME3) if SHOW15 == 'true': addFile('[B]%s Isengard and Below Builds(%s)[/B]' % (state, count15), '', icon=ICONBUILDS, themeit=THEME3) for name, version, url, gui, kodi, theme, icon, fanart, adult, description in match: if not SHOWADULT == 'true' and adult.lower() == 'yes': continue if not DEVELOPER == 'true' and wiz.strTest(name): continue kodiv = int(float(kodi)) if kodiv <= 15: menu = createMenu('install', '', name) addDir('[%s] [COLOR %s][B] %s [/B][/COLOR](v%s)' % (float(kodi), name, version), 'viewbuild', name, description=description, fanart=fanart,icon=icon, menu=menu, themeit=THEME2) elif hidden > 0: if adultcount > 0: addFile('There is currently only Adult builds', '', icon=ICONBUILDS, themeit=THEME3) addFile('Enable Show Adults in Addon Settings > Misc', '', icon=ICONBUILDS, themeit=THEME3) else: addFile('Currently No Builds Offered from %s' % ADDONTITLE, '', icon=ICONBUILDS, themeit=THEME3) else: addFile('Text file for builds not formated correctly.', '', icon=ICONBUILDS, themeit=THEME3) setView('files', 'viewType') def viewBuild(name): bf = wiz.textCache(BUILDFILE) if bf == False: WORKINGURL = wiz.workingURL(BUILDFILE) addFile('Url for txt file not valid', '', themeit=THEME3) addFile('%s' % WORKINGURL, '', themeit=THEME3) return if wiz.checkBuild(name, 'version') == False: addFile('Error reading the txt file.', '', themeit=THEME3) addFile('%s was not found in the builds list.' % name, '', themeit=THEME3) return link = bf.decode('utf-8').replace('\n','').replace('\r','').replace('\t','').replace('gui=""', 'gui="http://"').replace('theme=""', 'theme="http://"') match = re.compile('name="%s".+?ersion="(.+?)".+?rl="(.+?)".+?inor="(.+?)".+?ui="(.+?)".+?odi="(.+?)".+?heme="(.+?)".+?con="(.+?)".+?anart="(.+?)".+?review="(.+?)".+?dult="(.+?)".+?nfo="(.+?)".+?escription="(.+?)"' % name).findall(link) for version, url, minor, gui, kodi, themefile, icon, fanart, preview, adult, info, description in match: icon = icon fanart = fanart build = '%s (v%s)' % (name, version) if BUILDNAME == name and version > BUILDVERSION: build = '%s [COLOR red][CURRENT v%s][/COLOR]' % (build, BUILDVERSION) addFile(build, '', description=description, fanart=fanart, icon=icon, themeit=THEME4) if HIDESPACERS == 'No': addFile(wiz.sep(), '', themeit=THEME3) addDir ('Save Data Menu', 'savedata', icon=ICONSAVE, themeit=THEME3) addFile('Build Information', 'buildinfo', name, description=description, fanart=fanart, icon=icon, themeit=THEME3) if not preview == "http://": addFile('View Video Preview', 'buildpreview', name, description=description, fanart=fanart, icon=icon, themeit=THEME3) temp1 = int(float(KODIV)); temp2 = int(float(kodi)) if not temp1 == temp2: if temp1 == 16 and temp2 <= 15: warning = False else: warning = True else: warning = False if warning == True: addFile('[I]Build designed for kodi version %s(installed: %s)[/I]' % (str(kodi), str(KODIV)), '', fanart=fanart, icon=icon, themeit=THEME3) addFile(wiz.sep('INSTALL'), '', fanart=fanart, icon=icon, themeit=THEME3) addFile('Fresh Install' , 'install', name, 'fresh' , description=description, fanart=fanart, icon=icon, themeit=THEME1) addFile('Standard Install', 'install', name, 'normal' , description=description, fanart=fanart, icon=icon, themeit=THEME1) if not gui == 'http://': addFile('Apply guiFix' , 'install', name, 'gui' , description=description, fanart=fanart, icon=icon, themeit=THEME1) if not themefile == 'http://': themecheck = wiz.textCache(themefile) if not themecheck == False: addFile(wiz.sep('THEMES'), '', fanart=fanart, icon=icon, themeit=THEME3) link = themecheck.decode('utf-8').replace('\n','').replace('\r','').replace('\t','') match = re.compile('name="(.+?)".+?rl="(.+?)".+?con="(.+?)".+?anart="(.+?)".+?dult="(.+?)".+?escription="(.+?)"').findall(link) for themename, themeurl, themeicon, themefanart, themeadult, description in match: if not SHOWADULT == 'true' and themeadult.lower() == 'yes': continue themeicon = themeicon if themeicon == 'http://' else icon themefanart = themefanart if themefanart == 'http://' else fanart addFile(themename if not themename == BUILDTHEME else "[B]%s (Installed)[/B]" % themename, 'theme', name, themename, description=description, fanart=themefanart, icon=themeicon, themeit=THEME3) setView('files', 'viewType') def viewThirdList(number): name = eval('THIRD%sNAME' % number) url = eval('THIRD%sURL' % number) work = wiz.workingURL(url) if not work == True: addFile('Url for txt file not valid', '', icon=ICONBUILDS, themeit=THEME3) addFile('%s' % WORKINGURL, '', icon=ICONBUILDS, themeit=THEME3) else: type, buildslist = wiz.thirdParty(url) addFile("[B]%s[/B]" % name, '', themeit=THEME3) if HIDESPACERS == 'No': addFile(wiz.sep(), '', themeit=THEME3) if type: for name, version, url, kodi, icon, fanart, adult, description in buildslist: if not SHOWADULT == 'true' and adult.lower() == 'yes': continue addFile("[%s] %s v%s" % (kodi, name, version), 'installthird', name, url, icon=icon, fanart=fanart, description=description, themeit=THEME2) else: for name, url, icon, fanart, description in buildslist: addFile(name, 'installthird', name, url, icon=icon, fanart=fanart, description=description, themeit=THEME2) def editThirdParty(number): name = eval('THIRD%sNAME' % number) url = eval('THIRD%sURL' % number) name2 = wiz.getKeyboard(name, 'Enter the Name of the Wizard') url2 = wiz.getKeyboard(url, 'Enter the URL of the Wizard Text') wiz.setS('wizard%sname' % number, name2) wiz.setS('wizard%surl' % number, url2) def apkScraper(name=""): if name == 'kodi': kodiurl1 = 'http://mirrors.kodi.tv/releases/android/arm/' kodiurl2 = 'https://mirrors.kodi.tv/releases/android/arm64-v8a/' url1 = wiz.openURL(kodiurl1).decode('utf-8').replace('\n', '').replace('\r', '').replace('\t', '') url2 = wiz.openURL(kodiurl2).decode('utf-8').replace('\n', '').replace('\r', '').replace('\t', '') x = 0 match1 = re.compile('(.+?)(.+?)(.+?)').findall(url1) match2 = re.compile('(.+?)(.+?)(.+?)').findall(url2) addFile("Official Kodi Apk\'s", themeit=THEME1) rc = False kodiapks = [] for url, name, size, date in match1: if url in ['../', 'old/']: continue if not url.endswith('.apk'): continue if not url.find('_') == -1 and rc == True: continue try: tempname = name.split('-') if not url.find('_') == -1: rc = True name2, v2 = tempname[2].split('_') else: name2 = tempname[2] v2 = '' title = "[COLOR %s]%s v%s%s %s[/COLOR] [COLOR %s]%s[/COLOR] [COLOR %s]%s[/COLOR]" % (COLOR1, tempname[0].title(), tempname[1], v2.upper(), name2, COLOR2, size.replace(' ', '').replace('MiB', 'MB'), COLOR1, date) download = urljoin(kodiurl1, url) apkname = "%s v%s%s %s" % (tempname[0].title(), tempname[1], v2.upper(), name2) kodiapks.append([title, apkname, download]) x += 1 except: wiz.log("Error on: %s" % name) for url, name, size, date in match2: if url in ['../', 'old/']: continue if not url.endswith('.apk'): continue if not url.find('_') == -1: continue try: tempname = name.split('-') title = "[COLOR %s]%s v%s %s[/COLOR] [COLOR %s]%s[/COLOR] [COLOR %s]%s[/COLOR]" % (COLOR1, tempname[0].title(), tempname[1], tempname[2], COLOR2, size.replace(' ', '').replace('MiB', 'MB'), COLOR1, date) download = urljoin(kodiurl2, url) apkname = "%s v%s %s arm64" % (tempname[0].title(), tempname[1], tempname[2]) kodiapks.append([title, apkname, download]) x += 1 except: wiz.log("Error on: %s" % name) kodiapks.sort(key=lambda x: x[0], reverse=True) for t, n, d in kodiapks: addFile(t, 'apkinstall', n, d) if x == 0: addFile("Error Kodi Scraper Is Currently Down.") def apkMenu(name=None, url=None): if url == None: addDir ('Official Kodi Apk\'s', 'apkscrape', 'kodi', icon=ICONAPK, themeit=THEME1) if HIDESPACERS == 'No': addFile(wiz.sep(), '', themeit=THEME3) if not APKFILE == 'http://': if url == None: TEMPAPKFILE = wiz.textCache(uservar.APKFILE) if TEMPAPKFILE == False: APKWORKING = wiz.workingURL(uservar.APKFILE) else: TEMPAPKFILE = wiz.textCache(url) if TEMPAPKFILE == False: APKWORKING = wiz.workingURL(url) if not TEMPAPKFILE == False: link = TEMPAPKFILE.decode('utf-8').replace('\n','').replace('\r','').replace('\t','') match = re.compile('name="(.+?)".+?ection="(.+?)".+?rl="(.+?)".+?con="(.+?)".+?anart="(.+?)".+?dult="(.+?)".+?escription="(.+?)"').findall(link) if len(match) > 0: x = 0 for aname, section, url, icon, fanart, adult, description in match: if not SHOWADULT == 'true' and adult.lower() == 'yes': continue if section.lower() == 'yes': x += 1 addDir ("[B]%s[/B]" % aname, 'apk', aname, url, description=description, icon=icon, fanart=fanart, themeit=THEME3) elif section.lower() == 'yes': x += 1 addFile(aname, 'rominstall', aname, url, description=description, icon=icon, fanart=fanart, themeit=THEME2) else: x += 1 addFile(aname, 'apkinstall', aname, url, description=description, icon=icon, fanart=fanart, themeit=THEME2) if x == 0: addFile("No addons added to this menu yet!", '', themeit=THEME2) else: wiz.log("[APK Menu] ERROR: Invalid Format.", xbmc.LOGERROR) else: wiz.log("[APK Menu] ERROR: URL for apk list not working.", xbmc.LOGERROR) addFile('Url for txt file not valid', '', themeit=THEME3) addFile('%s' % APKWORKING, '', themeit=THEME3) return else: wiz.log("[APK Menu] No APK list added.") setView('files', 'viewType') def addonMenu(name=None, url=None): if not ADDONFILE == 'http://': if url == None: TEMPADDONFILE = wiz.textCache(uservar.ADDONFILE) if TEMPADDONFILE == False: ADDONWORKING = wiz.workingURL(uservar.ADDONFILE) else: TEMPADDONFILE = wiz.textCache(url) if TEMPADDONFILE == False: ADDONWORKING = wiz.workingURL(url) if not TEMPADDONFILE == False: link = TEMPADDONFILE.decode('utf-8').replace('\n','').replace('\r','').replace('\t','').replace('repository=""', 'repository="none"').replace('repositoryurl=""', 'repositoryurl="http://"').replace('repositoryxml=""', 'repositoryxml="http://"') match = re.compile('name="(.+?)".+?lugin="(.+?)".+?rl="(.+?)".+?epository="(.+?)".+?epositoryxml="(.+?)".+?epositoryurl="(.+?)".+?con="(.+?)".+?anart="(.+?)".+?dult="(.+?)".+?escription="(.+?)"').findall(link) if len(match) > 0: x = 0 for aname, plugin, aurl, repository, repositoryxml, repositoryurl, icon, fanart, adult, description in match: if plugin.lower() == 'section': x += 1 addDir ("[B]%s[/B]" % aname, 'addons', aname, aurl, description=description, icon=icon, fanart=fanart, themeit=THEME3) elif plugin.lower() == 'skin': if not SHOWADULT == 'true' and adult.lower() == 'yes': continue x += 1 addFile("[B]%s[/B]" % aname, 'skinpack', aname, aurl, description=description, icon=icon, fanart=fanart, themeit=THEME2) elif plugin.lower() == 'pack': if not SHOWADULT == 'true' and adult.lower() == 'yes': continue x += 1 addFile("[B]%s[/B]" % aname, 'addonpack', aname, aurl, description=description, icon=icon, fanart=fanart, themeit=THEME2) else: if not SHOWADULT == 'true' and adult.lower() == 'yes': continue try: add = xbmcaddon.Addon(id=plugin).getAddonInfo('path') if os.path.exists(add): aname = "[COLOR springgreen][Installed][/COLOR] %s" % aname except: pass x += 1 addFile(aname, 'addoninstall', plugin, url, description=description, icon=icon, fanart=fanart, themeit=THEME2) if x < 1: addFile("No addons added to this menu yet!", '', themeit=THEME2) else: addFile('Text File not formated correctly!', '', themeit=THEME3) wiz.log("[Addon Menu] ERROR: Invalid Format.") else: wiz.log("[Addon Menu] ERROR: URL for Addon list not working.") addFile('Url for txt file not valid', '', themeit=THEME3) addFile('%s' % ADDONWORKING, '', themeit=THEME3) else: wiz.log("[Addon Menu] No Addon list added.") setView('files', 'viewType') def packInstaller(name, url): if not wiz.workingURL(url) == True: wiz.LogNotify("[COLOR %s]Addon Installer[/COLOR]" % COLOR1, '[COLOR %s]%s:[/COLOR] [COLOR %s]Invalid Zip Url![/COLOR]' % (COLOR1, name, COLOR2)); return if not os.path.exists(PACKAGES): os.makedirs(PACKAGES) DP.create(ADDONTITLE,'[COLOR %s][B]Downloading:[/B][/COLOR] [COLOR %s]%s[/COLOR][COLOR %s Please Wait[/COLOR]' % (COLOR2, COLOR1, name, COLOR2)) urlsplits = url.split('/') lib = legalFilename(os.path.join(PACKAGES, urlsplits[-1])) try: xbmcvfs.delete(lib) except: pass downloader.download(url, lib, DP, name) title = '[COLOR %s][B]Installing:[/B][/COLOR] [COLOR %s]%s[/COLOR]' % (COLOR2, COLOR1, name) DP.update(0, '%s[COLOR %s]Please Wait[/COLOR]' % (title, COLOR2)) percent, errors, error = extract.all(lib,ADDONS,DP, title=title) installed = grabAddons(lib) if KODIV >= 17: wiz.addonDatabase(installed, 1, True) DP.close() wiz.LogNotify("[COLOR %s]Addon Installer[/COLOR]" % COLOR1, '[COLOR %s]%s: Installed![/COLOR]' % (COLOR2, name)) wiz.ebi('UpdateAddonRepos()') wiz.ebi('UpdateLocalAddons()') wiz.refresh() def skinInstaller(name, url): if not wiz.workingURL(url) == True: wiz.LogNotify("[COLOR %s]Addon Installer[/COLOR]" % COLOR1, '[COLOR %s]%s:[/COLOR] [COLOR %s]Invalid Zip Url![/COLOR]' % (COLOR1, name, COLOR2)); return if not os.path.exists(PACKAGES): os.makedirs(PACKAGES) DP.create(ADDONTITLE,'[COLOR %s][B]Downloading:[/B][/COLOR] [COLOR %s]%s[/COLOR][CR][CR][COLOR %s]Please Wait[/COLOR]' % (COLOR2, COLOR1, name, COLOR2)) urlsplits = url.split('/') lib = legalFilename(os.path.join(PACKAGES, urlsplits[-1])) try: xbmcvfs.delete(lib) except: pass downloader.download(url, lib, DP, name) title = '[COLOR %s][B]Installing:[/B][/COLOR] [COLOR %s]%s[/COLOR]' % (COLOR2, COLOR1, name) DP.update(0, '%s[COLOR %s]Please Wait[/COLOR]' % (title, COLOR2)) percent, errors, error = extract.all(lib,HOME,DP, title=title) installed = grabAddons(lib) if KODIV >= 17: wiz.addonDatabase(installed, 1, True) DP.close() wiz.LogNotify("[COLOR %s]Addon Installer[/COLOR]" % COLOR1, '[COLOR %s]%s: Installed![/COLOR]' % (COLOR2, name)) wiz.ebi('UpdateAddonRepos()') wiz.ebi('UpdateLocalAddons()') for item in installed: if item.startswith('skin.') == True and not item == 'skin.shortcuts': if not BUILDNAME == '' and DEFAULTIGNORE == 'true': wiz.setS('defaultskinignore', 'true') wiz.swapSkins(item, 'Skin Installer') wiz.refresh() def addonInstaller(plugin, url): if not ADDONFILE == 'http://': if url == None: url = ADDONFILE ADDONWORKING = wiz.workingURL(url) if ADDONWORKING == True: link = wiz.textCache(url).decode('utf-8').replace('\n','').replace('\r','').replace('\t','').replace('repository=""', 'repository="none"').replace('repositoryurl=""', 'repositoryurl="http://"').replace('repositoryxml=""', 'repositoryxml="http://"') match = re.compile('name="(.+?)".+?lugin="%s".+?rl="(.+?)".+?epository="(.+?)".+?epositoryxml="(.+?)".+?epositoryurl="(.+?)".+?con="(.+?)".+?anart="(.+?)".+?dult="(.+?)".+?escription="(.+?)"' % plugin).findall(link) if len(match) > 0: for name, url, repository, repositoryxml, repositoryurl, icon, fanart, adult, description in match: if os.path.exists(os.path.join(ADDONS, plugin)): do = ['Launch Addon', 'Remove Addon'] selected = DIALOG.select("[COLOR %s]Addon already installed what would you like to do?[/COLOR]" % COLOR2, do) if selected == 0: wiz.ebi('RunAddon(%s)' % plugin) xbmc.sleep(500) return True elif selected == 1: wiz.cleanHouse(os.path.join(ADDONS, plugin)) try: wiz.removeFolder(os.path.join(ADDONS, plugin)) except: pass if DIALOG.yesno(ADDONTITLE, "[COLOR %s]Would you like to remove the addon_data for:[CR][COLOR %s]%s[/COLOR]?[/COLOR]" % (COLOR2, COLOR1, plugin), yeslabel="[B][COLOR springgreen]Yes Remove[/COLOR][/B]", nolabel="[B][COLOR red]No Skip[/COLOR][/B]"): removeAddonData(plugin) wiz.refresh() return True else: return False repo = os.path.join(ADDONS, repository) if not repository.lower() == 'none' and not os.path.exists(repo): wiz.log("Repository not installed, installing it") if DIALOG.yesno(ADDONTITLE, "[COLOR %s]Would you like to install the repository for [COLOR %s]%s[/COLOR]:" % (COLOR2, COLOR1, plugin), "[COLOR %s]%s[/COLOR]?[/COLOR]" % (COLOR1, repository), yeslabel="[B][COLOR springgreen]Yes Install[/COLOR][/B]", nolabel="[B][COLOR red]No Skip[/COLOR][/B]"): ver = wiz.parseDOM(wiz.openURL(repositoryxml), 'addon', ret='version', attrs = {'id': repository}) if len(ver) > 0: repozip = '%s%s-%s.zip' % (repositoryurl, repository, ver[0]) wiz.log(repozip) if KODIV >= 17: wiz.addonDatabase(repository, 1) installAddon(repository, repozip) wiz.ebi('UpdateAddonRepos()') #wiz.ebi('UpdateLocalAddons()') wiz.log("Installing Addon from Kodi") install = installFromKodi(plugin) wiz.log("Install from Kodi: %s" % install) if install: wiz.refresh() return True else: wiz.log("[Addon Installer] Repository not installed: Unable to grab url! (%s)" % repository) else: wiz.log("[Addon Installer] Repository for %s not installed: %s" % (plugin, repository)) elif repository.lower() == 'none': wiz.log("No repository, installing addon") pluginid = plugin zipurl = url installAddon(plugin, url) wiz.refresh() return True else: wiz.log("Repository installed, installing addon") install = installFromKodi(plugin, False) if install: wiz.refresh() return True if os.path.exists(os.path.join(ADDONS, plugin)): return True ver2 = wiz.parseDOM(wiz.openURL(repositoryxml), 'addon', ret='version', attrs = {'id': plugin}) if len(ver2) > 0: url = "%s%s-%s.zip" % (url, plugin, ver2[0]) wiz.log(str(url)) if KODIV >= 17: wiz.addonDatabase(plugin, 1) installAddon(plugin, url) wiz.refresh() else: wiz.log("no match"); return False else: wiz.log("[Addon Installer] Invalid Format") else: wiz.log("[Addon Installer] Text File: %s" % ADDONWORKING) else: wiz.log("[Addon Installer] Not Enabled.") def installFromKodi(plugin, over=True): if over == True: xbmc.sleep(2000) wiz.ebi('InstallAddon(%s)' % plugin) #wiz.ebi('RunPlugin(plugin://%s)' % plugin) if not wiz.whileWindow('yesnodialog'): return False xbmc.sleep(500) if wiz.whileWindow('okdialog'): return False wiz.whileWindow('progressdialog') if os.path.exists(os.path.join(ADDONS, plugin)): return True else: return False def installAddon(name, url): if not wiz.workingURL(url) == True: wiz.LogNotify("[COLOR %s]Addon Installer[/COLOR]" % COLOR1, '[COLOR %s]%s:[/COLOR] [COLOR %s]Invalid Zip Url![/COLOR]' % (COLOR1, name, COLOR2)); return if not os.path.exists(PACKAGES): os.makedirs(PACKAGES) DP.create(ADDONTITLE,'[COLOR %s][B]Downloading:[/B][/COLOR] [COLOR %s]%s[/COLOR][CR][CR][COLOR %s]Please Wait[/COLOR]' % (COLOR2, COLOR1, name, COLOR2)) urlsplits = url.split('/') lib=os.path.join(PACKAGES, urlsplits[-1]) try: xbmcvfs.delete(lib) except: pass downloader.download(url, lib, DP, name) title = '[COLOR %s][B]Installing:[/B][/COLOR] [COLOR %s]%s[/COLOR]' % (COLOR2, COLOR1, name) DP.update(0, '%s[COLOR %s]Please Wait[/COLOR]' % (title, COLOR2)) percent, errors, error = extract.all(lib,ADDONS,DP, title=title) DP.update(0, '%s[COLOR %s]Installing Dependencies[/COLOR]' % (title, COLOR2)) installed(name) installlist = grabAddons(lib) wiz.log(str(installlist)) if KODIV >= 17: wiz.addonDatabase(installlist, 1, True) installDep(name, DP) DP.close() wiz.ebi('UpdateAddonRepos()') wiz.ebi('UpdateLocalAddons()') wiz.refresh() for item in installlist: if item.startswith('skin.') == True and not item == 'skin.shortcuts': if not BUILDNAME == '' and DEFAULTIGNORE == 'true': wiz.setS('defaultskinignore', 'true') wiz.swapSkins(item, 'Skin Installer') def installDep(name, DP=None): dep=os.path.join(ADDONS,name,'addon.xml') if os.path.exists(dep): source = xbmcvfs.File(dep); link = source.read(); source.close(); match = wiz.parseDOM(link, 'import', ret='addon') for depends in match: if not 'xbmc.python' in depends: if not DP == None: DP.update(0, '[CR][COLOR %s]%s[/COLOR]' % (COLOR1, depends)) try: add = xbmcaddon.Addon(id=depends) name2 = add.getAddonInfo('name') except: wiz.createTemp(depends) if KODIV >= 17: wiz.addonDatabase(depends, 1) # continue # dependspath=os.path.join(ADDONS, depends) # if not os.path.exists(dependspath): # zipname = '%s-%s.zip' % (depends, match2[match.index(depends)]) # depzip = urljoin("%s%s/" % (MODURL2, depends), zipname) # if not wiz.workingURL(depzip) == True: # depzip = urljoin(MODURL, '%s.zip' % depends) # if not wiz.workingURL(depzip) == True: # wiz.createTemp(depends) # if KODIV >= 17: wiz.addonDatabase(depends, 1) # continue # lib=os.path.join(PACKAGES, '%s.zip' % depends) # try: xbmcvfs.delete(lib) # except: pass # DP.update(0, '[COLOR %s][B]Downloading Dependency:[/B][/COLOR] [COLOR %s]%s[/COLOR]' % (COLOR2, COLOR1, depends),'', 'Please Wait') # downloader.download(depzip, lib, DP) # xbmc.sleep(100) # title = '[COLOR %s][B]Installing Dependency:[/B][/COLOR] [COLOR %s]%s[/COLOR]' % (COLOR2, COLOR1, depends) # DP.update(0, title,'', 'Please Wait') # percent, errors, error = extract.all(lib,ADDONS,DP, title=title) # if KODIV >= 17: wiz.addonDatabase(depends, 1) # installed(depends) # installDep(depends) # xbmc.sleep(100) # DP.close() def installed(addon): url = os.path.join(ADDONS,addon,'addon.xml') if os.path.exists(url): try: list = xbmcvfs.File(url); g = list.read(); list.close() name = wiz.parseDOM(g, 'addon', ret='name', attrs = {'id': addon}) icon = os.path.join(ADDONS,addon,'icon.png') wiz.LogNotify('[COLOR %s]%s[/COLOR]' % (COLOR1, name[0]), '[COLOR %s]Addon Enabled[/COLOR]' % COLOR2, '2000', icon) except: pass def youtubeMenu(name=None, url=None): if not YOUTUBEFILE == 'http://': if url == None: TEMPYOUTUBEFILE = wiz.textCache(uservar.YOUTUBEFILE) if TEMPYOUTUBEFILE == False: YOUTUBEWORKING = wiz.workingURL(uservar.YOUTUBEFILE) else: TEMPYOUTUBEFILE = wiz.textCache(url) if TEMPYOUTUBEFILE == False: YOUTUBEWORKING = wiz.workingURL(url) if not TEMPYOUTUBEFILE == False: link = TEMPYOUTUBEFILE.decode('utf-8').replace('\n','').replace('\r','').replace('\t','') match = re.compile('name="(.+?)".+?ection="(.+?)".+?rl="(.+?)".+?con="(.+?)".+?anart="(.+?)".+?escription="(.+?)"').findall(link) if len(match) > 0: for name, section, url, icon, fanart, description in match: if section.lower() == "yes": addDir ("[B]%s[/B]" % name, 'youtube', name, url, description=description, icon=icon, fanart=fanart, themeit=THEME3) else: addFile(name, 'viewVideo', url=url, description=description, icon=icon, fanart=fanart, themeit=THEME2) else: wiz.log("[YouTube Menu] ERROR: Invalid Format.") else: wiz.log("[YouTube Menu] ERROR: URL for YouTube list not working.") addFile('Url for txt file not valid', '', themeit=THEME3) addFile('%s' % YOUTUBEWORKING, '', themeit=THEME3) else: wiz.log("[YouTube Menu] No YouTube list added.") setView('files', 'viewType') def maintMenu(view=None): on = '[B][COLOR springgreen]ON[/COLOR][/B]'; off = '[B][COLOR red]OFF[/COLOR][/B]' autoclean = 'true' if AUTOCLEANUP == 'true' else 'false' cache = 'true' if AUTOCACHE == 'true' else 'false' packages = 'true' if AUTOPACKAGES == 'true' else 'false' thumbs = 'true' if AUTOTHUMBS == 'true' else 'false' maint = 'true' if SHOWMAINT == 'true' else 'false' includevid = 'true' if INCLUDEVIDEO == 'true' else 'false' includeall = 'true' if INCLUDEALL == 'true' else 'false' thirdparty = 'true' if THIRDPARTY == 'true' else 'false' errors = int(errorChecking(count=True)) errorsfound = str(errors) + ' Error(s) Found' if errors > 0 else 'None Found' wizlogsize = ': [COLOR red]Not Found[/COLOR]' if not os.path.exists(WIZLOG) else ": [COLOR springgreen]%s[/COLOR]" % wiz.convertSize(os.path.getsize(WIZLOG)) if includeall == 'true': includeseren = 'true' includegaia = 'true' includethecrew = 'true' includehomelander = 'true' includemoria = 'true' else: includethecrew = 'true' if INCLUDETHECREW == 'true' else 'false' includehomelander = 'true' if INCLUDEHOMELANDER == 'true' else 'false' includeMORIA = 'true' if INCLUDEMORIA == 'true' else 'false' includegaia = 'true' if INCLUDEGAIA == 'true' else 'false' includeseren = 'true' if INCLUDESEREN == 'true' else 'false' sizepack = wiz.getSize(PACKAGES) sizethumb = wiz.getSize(THUMBS) archive = wiz.getSize(ARCHIVE_CACHE) sizecache = (wiz.getCacheSize())-archive totalsize = sizepack+sizethumb+sizecache feq = ['Always', 'Daily', '3 Days', 'Weekly'] addDir ('[B]Cleaning Tools[/B]' ,'maint', 'clean', icon=ICONMAINT, themeit=THEME1) if view == "clean" or SHOWMAINT == 'true': addFile('Total Clean Up: [COLOR springgreen][B]%s[/B][/COLOR]' % wiz.convertSize(totalsize), 'fullclean', icon=ICONMAINT, themeit=THEME3) addFile('Clear Cache: [COLOR springgreen][B]%s[/B][/COLOR]' % wiz.convertSize(sizecache), 'clearcache', icon=ICONMAINT, themeit=THEME3) if (xbmc.getCondVisibility('System.HasAddon(script.module.urlresolver)') or xbmc.getCondVisibility('System.HasAddon(script.module.resolveurl)')): addFile('Clear Resolver Function Caches', 'clearfunctioncache', icon=ICONMAINT, themeit=THEME3) addFile('Clear Packages: [COLOR springgreen][B]%s[/B][/COLOR]' % wiz.convertSize(sizepack), 'clearpackages', icon=ICONMAINT, themeit=THEME3) addFile('Clear Thumbnails: [COLOR springgreen][B]%s[/B][/COLOR]' % wiz.convertSize(sizethumb), 'clearthumb', icon=ICONMAINT, themeit=THEME3) if os.path.exists(ARCHIVE_CACHE): addFile('Clear Archive_Cache: [COLOR springgreen][B]%s[/B][/COLOR]' % wiz.convertSize(archive), 'cleararchive', icon=ICONMAINT, themeit=THEME3) addFile('Clear Old Thumbnails', 'oldThumbs', icon=ICONMAINT, themeit=THEME3) addFile('Clear Crash Logs', 'clearcrash', icon=ICONMAINT, themeit=THEME3) addFile('Purge Databases', 'purgedb', icon=ICONMAINT, themeit=THEME3) addFile('Fresh Start', 'freshstart', icon=ICONMAINT, themeit=THEME3) addDir ('[B]Addon Tools[/B]', 'maint', 'addon', icon=ICONMAINT, themeit=THEME1) if view == "addon" or SHOWMAINT == 'true': addFile('Remove Addons', 'removeaddons', icon=ICONMAINT, themeit=THEME3) addDir ('Remove Addon Data', 'removeaddondata', icon=ICONMAINT, themeit=THEME3) addDir ('Enable/Disable Addons', 'enableaddons', icon=ICONMAINT, themeit=THEME3) addFile('Enable/Disable Adult Addons', 'toggleadult', icon=ICONMAINT, themeit=THEME3) addFile('Force Update Addons', 'forceupdate', icon=ICONMAINT, themeit=THEME3) addFile('Hide Passwords On Keyboard Entry', 'hidepassword', icon=ICONMAINT, themeit=THEME3) addFile('Unhide Passwords On Keyboard Entry', 'unhidepassword', icon=ICONMAINT, themeit=THEME3) addDir ('[B]Misc Maintenance[/B]' ,'maint', 'misc', icon=ICONMAINT, themeit=THEME1) if view == "misc" or SHOWMAINT == 'true': addFile('Kodi 17 Fix', 'kodi17fix', icon=ICONMAINT, themeit=THEME3) addFile('Kodi 19 Fix', 'kodi19fix', icon=ICONMAINT, themeit=THEME3) addFile('Restore Manually Installed Repos Updates', 'restorautoupdt', icon=ICONMAINT, themeit=THEME3) addDir ('Speed Test', 'speedtest', icon=ICONMAINT, themeit=THEME3) addFile('Enable Unknown Sources', 'unknownsources', icon=ICONMAINT, themeit=THEME3) addFile('Reload Skin', 'forceskin', icon=ICONMAINT, themeit=THEME3) addFile('Reload Profile', 'forceprofile', icon=ICONMAINT, themeit=THEME3) addFile('Force Close Kodi', 'forceclose', icon=ICONMAINT, themeit=THEME3) addFile('Upload Log File', 'uploadlog', icon=ICONMAINT, themeit=THEME3) addFile('View Errors in Log: %s' % (errorsfound), 'viewerrorlog', icon=ICONMAINT, themeit=THEME3) if errors > 0: addFile('View Last Error In Log', 'viewerrorlast', icon=ICONMAINT, themeit=THEME3) addFile('View Log File', 'viewlog', icon=ICONMAINT, themeit=THEME3) addFile('View Wizard Log File', 'viewwizlog', icon=ICONMAINT, themeit=THEME3) addFile('Clear Wizard Log File%s' % wizlogsize,'clearwizlog', icon=ICONMAINT, themeit=THEME3) addDir ('[B]Back up/Restore[/B]' ,'maint', 'backup', icon=ICONMAINT, themeit=THEME1) if view == "backup" or SHOWMAINT == 'true': addFile('Clean Up Back Up Folder', 'clearbackup', icon=ICONMAINT, themeit=THEME3) addFile('Back Up Location: [COLOR %s]%s[/COLOR]' % (COLOR2, MYBUILDS),'settings', 'Maintenance', icon=ICONMAINT, themeit=THEME3) #addFile('Extract a ZipFile', 'extractazip', icon=ICONMAINT, themeit=THEME3) addFile('[Back Up]: Build', 'backupbuild', icon=ICONMAINT, themeit=THEME3) addFile('[Back Up]: GuiFix', 'backupgui', icon=ICONMAINT, themeit=THEME3) addFile('[Back Up]: Theme', 'backuptheme', icon=ICONMAINT, themeit=THEME3) addFile('[Back Up]: Addon Pack', 'backupaddonpack', icon=ICONMAINT, themeit=THEME3) addFile('[Back Up]: Addon_data', 'backupaddon', icon=ICONMAINT, themeit=THEME3) addFile('[Restore]: Local Build', 'restorezip', icon=ICONMAINT, themeit=THEME3) addFile('[Restore]: Local GuiFix', 'restoregui', icon=ICONMAINT, themeit=THEME3) addFile('[Restore]: Local Addon_data', 'restoreaddon', icon=ICONMAINT, themeit=THEME3) addFile('[Restore]: External Build', 'restoreextzip', icon=ICONMAINT, themeit=THEME3) addFile('[Restore]: External GuiFix', 'restoreextgui', icon=ICONMAINT, themeit=THEME3) addFile('[Restore]: External Addon_data', 'restoreextaddon', icon=ICONMAINT, themeit=THEME3) addDir ('[B]System Tweaks/Fixes[/B]', 'maint', 'tweaks', icon=ICONMAINT, themeit=THEME1) if view == "tweaks" or SHOWMAINT == 'true': if not ADVANCEDFILE == 'http://' and not ADVANCEDFILE == '': addDir ('Advanced Settings', 'advancedsetting', icon=ICONMAINT, themeit=THEME3) else: if os.path.exists(ADVANCED): addFile('View Current AdvancedSettings.xml', 'currentsettings', icon=ICONMAINT, themeit=THEME3) addFile('Remove Current AdvancedSettings.xml', 'removeadvanced', icon=ICONMAINT, themeit=THEME3) addFile('Quick Configure AdvancedSettings.xml', 'autoadvanced', icon=ICONMAINT, themeit=THEME3) addFile('Scan Sources for broken links', 'checksources', icon=ICONMAINT, themeit=THEME3) addFile('Scan For Broken Repositories', 'checkrepos', icon=ICONMAINT, themeit=THEME3) addFile('Fix Addons Not Updating', 'fixaddonupdate', icon=ICONMAINT, themeit=THEME3) addFile('Remove Non-Ascii filenames', 'asciicheck', icon=ICONMAINT, themeit=THEME3) addFile('Convert Paths to special', 'convertpath', icon=ICONMAINT, themeit=THEME3) addDir ('System Information', 'systeminfo', icon=ICONMAINT, themeit=THEME3) addFile('Show All Maintenance: %s' % maint.replace('true',on).replace('false',off) ,'togglesetting', 'showmaint', icon=ICONMAINT, themeit=THEME2) addDir ('[I]<< Return to Main Menu[/I]', icon=ICONMAINT, themeit=THEME2) addFile('Third Party Wizards: %s' % thirdparty.replace('true',on).replace('false',off) ,'togglesetting', 'enable3rd', fanart=FANART, icon=ICONMAINT, themeit=THEME1) if thirdparty == 'true': first = THIRD1NAME if not THIRD1NAME == '' else 'Not Set' secon = THIRD2NAME if not THIRD2NAME == '' else 'Not Set' third = THIRD3NAME if not THIRD3NAME == '' else 'Not Set' addFile('Edit Third Party Wizard 1: [COLOR %s]%s[/COLOR]' % (COLOR2, first), 'editthird', '1', icon=ICONMAINT, themeit=THEME3) addFile('Edit Third Party Wizard 2: [COLOR %s]%s[/COLOR]' % (COLOR2, secon), 'editthird', '2', icon=ICONMAINT, themeit=THEME3) addFile('Edit Third Party Wizard 3: [COLOR %s]%s[/COLOR]' % (COLOR2, third), 'editthird', '3', icon=ICONMAINT, themeit=THEME3) addFile('Auto Clean', '', fanart=FANART, icon=ICONMAINT, themeit=THEME1) addFile('Auto Clean Up On Startup: %s' % autoclean.replace('true',on).replace('false',off) ,'togglesetting', 'autoclean', icon=ICONMAINT, themeit=THEME3) if autoclean == 'true': addFile('--- Auto Clean Fequency: [B][COLOR springgreen]%s[/COLOR][/B]' % feq[AUTOFEQ], 'changefeq', icon=ICONMAINT, themeit=THEME3) addFile('--- Clear Cache on Startup: %s' % cache.replace('true',on).replace('false',off), 'togglesetting', 'clearcache', icon=ICONMAINT, themeit=THEME3) addFile('--- Clear Packages on Startup: %s' % packages.replace('true',on).replace('false',off), 'togglesetting', 'clearpackages', icon=ICONMAINT, themeit=THEME3) addFile('--- Clear Old Thumbs on Startup: %s' % thumbs.replace('true',on).replace('false',off), 'togglesetting', 'clearthumbs', icon=ICONMAINT, themeit=THEME3) addFile('Clear Video Cache', '', fanart=FANART, icon=ICONMAINT, themeit=THEME1) addFile('Include Video Cache in Clear Cache: %s' % includevid.replace('true',on).replace('false',off), 'togglecache', 'includevideo', icon=ICONMAINT, themeit=THEME3) if includevid == 'true': addFile('--- Include All Video Addons: %s' % includeall.replace('true',on).replace('false',off), 'togglecache', 'includeall', icon=ICONMAINT, themeit=THEME3) if xbmc.getCondVisibility('System.HasAddon(plugin.video.gaia)'): addFile('--- Include Gaia: %s' % includegaia.replace('true',on).replace('false',off), 'togglecache', 'includegaia', icon=ICONMAINT, themeit=THEME3) if xbmc.getCondVisibility('System.HasAddon(plugin.video.thecrew)'): addFile('--- Include The Crew: %s' % includethecrew.replace('true',on).replace('false',off), 'togglecache', 'includethecrew', icon=ICONMAINT, themeit=THEME3) if xbmc.getCondVisibility('System.HasAddon(plugin.video.homelander)'): addFile('--- Include Homelander: %s' % includehomelander.replace('true',on).replace('false',off), 'togglecache', 'includehomelander', icon=ICONMAINT, themeit=THEME3) if xbmc.getCondVisibility('System.HasAddon(plugin.video.moria)'): addFile('--- Include MORIA: %s' % includemoria.replace('true',on).replace('false',off), 'togglecache', 'includemoria', icon=ICONMAINT, themeit=THEME3) if xbmc.getCondVisibility('System.HasAddon(plugin.video.seren)'): addFile('--- Include Seren: %s' % includeseren.replace('true',on).replace('false',off), 'togglecache', 'includeseren', icon=ICONMAINT, themeit=THEME3) addFile('--- Enable All Video Addons', 'togglecache', 'true', icon=ICONMAINT, themeit=THEME3) addFile('--- Disable All Video Addons', 'togglecache', 'false', icon=ICONMAINT, themeit=THEME3) setView('files', 'viewType') #########################################NET TOOLS############################################# def net_tools(view=None): addFile ('Speed Tester' ,'speedtestM', icon=ICONAPK, themeit=THEME1) if HIDESPACERS == 'No': addFile(wiz.sep(), '', themeit=THEME3) addDir ('View IP Address & MAC Address', 'viewIP', icon=ICONMAINT, themeit=THEME1) setView('files', 'viewType') def viewIP(): mac,inter_ip,ip,city,state,country,isp = wiz.net_info() addFile('[COLOR %s]Mac:[/COLOR] [COLOR %s]%s[/COLOR]' % (COLOR1, COLOR2, mac), '', icon=ICONMAINT, themeit=THEME2) addFile('[COLOR %s]Internal IP: [COLOR %s]%s[/COLOR]' % (COLOR1, COLOR2, inter_ip), '', icon=ICONMAINT, themeit=THEME2) addFile('[COLOR %s]External IP:[/COLOR] [COLOR %s]%s[/COLOR]' % (COLOR1, COLOR2, ip), '', icon=ICONMAINT, themeit=THEME2) addFile('[COLOR %s]City:[/COLOR] [COLOR %s]%s[/COLOR]' % (COLOR1, COLOR2, city), '', icon=ICONMAINT, themeit=THEME2) addFile('[COLOR %s]State:[/COLOR] [COLOR %s]%s[/COLOR]' % (COLOR1, COLOR2, state), '', icon=ICONMAINT, themeit=THEME2) addFile('[COLOR %s]Country:[/COLOR] [COLOR %s]%s[/COLOR]' % (COLOR1, COLOR2, country), '', icon=ICONMAINT, themeit=THEME2) addFile('[COLOR %s]ISP:[/COLOR] [COLOR %s]%s[/COLOR]' % (COLOR1, COLOR2, isp), '', icon=ICONMAINT, themeit=THEME2) setView('files', 'viewType') def speedTest(): if not xbmc.getCondVisibility('System.HasAddon(script.speedtester)'): xbmc.executebuiltin('ActivateWindow(10001,"plugin://script.speedtester/")') elif not xbmc.getCondVisibility('System.AddonIsEnabled(script.speedtester)'): xbmc.executebuiltin('EnableAddon(script.speedtester)') else: xbmc.executebuiltin('RunAddon(script.speedtester)') def clearSpeedTest(): speedimg = glob.glob(os.path.join(SPEEDTESTFOLD, '*.png')) for file in speedimg: wiz.removeFile(file) def viewSpeedTest(img=None): img = os.path.join(SPEEDTESTFOLD, img) notify.speedTest(img) def runSpeedTest(): try: found = speedtest.speedtest() if not os.path.exists(SPEEDTESTFOLD): os.makedirs(SPEEDTESTFOLD) urlsplits = found[0].split('/') dest = os.path.join(SPEEDTESTFOLD, urlsplits[-1]) urllib2.urlretrieve(found[0], dest) viewSpeedTest(urlsplits[-1]) except: wiz.log("[Speed Test] Error Running Speed Test") pass def advancedWindow(url=None): if not ADVANCEDFILE == 'http://': if url == None: TEMPADVANCEDFILE = wiz.textCache(uservar.ADVANCEDFILE) if TEMPADVANCEDFILE == False: ADVANCEDWORKING = wiz.workingURL(uservar.ADVANCEDFILE) else: TEMPADVANCEDFILE = wiz.textCache(url) if TEMPADVANCEDFILE == False: ADVANCEDWORKING = wiz.workingURL(url) addFile('Quick Configure AdvancedSettings.xml', 'autoadvanced', icon=ICONMAINT, themeit=THEME3) if os.path.exists(ADVANCED): addFile('View Current AdvancedSettings.xml', 'currentsettings', icon=ICONMAINT, themeit=THEME3) addFile('Remove Current AdvancedSettings.xml', 'removeadvanced', icon=ICONMAINT, themeit=THEME3) if not TEMPADVANCEDFILE == False: if HIDESPACERS == 'No': addFile(wiz.sep(), '', icon=ICONMAINT, themeit=THEME3) link = TEMPADVANCEDFILE.decode('utf-8').replace('\n','').replace('\r','').replace('\t','') match = re.compile('name="(.+?)".+?ection="(.+?)".+?rl="(.+?)".+?con="(.+?)".+?anart="(.+?)".+?escription="(.+?)"').findall(link) if len(match) > 0: for name, section, url, icon, fanart, description in match: if section.lower() == "yes": addDir ("[B]%s[/B]" % name, 'advancedsetting', url, description=description, icon=icon, fanart=fanart, themeit=THEME3) else: addFile(name, 'writeadvanced', name, url, description=description, icon=icon, fanart=fanart, themeit=THEME2) else: wiz.log("[Advanced Settings] ERROR: Invalid Format.") else: wiz.log("[Advanced Settings] URL not working: %s" % ADVANCEDWORKING) else: wiz.log("[Advanced Settings] not Enabled") def writeAdvanced(name, url): ADVANCEDWORKING = wiz.workingURL(url) if ADVANCEDWORKING == True: if os.path.exists(ADVANCED): choice = DIALOG.yesno(ADDONTITLE, "[COLOR %s]Would you like to overwrite your current Advanced Settings with [COLOR %s]%s[/COLOR]?[/COLOR]" % (COLOR2, COLOR1, name), yeslabel="[B][COLOR springgreen]Overwrite[/COLOR][/B]", nolabel="[B][COLOR red]Cancel[/COLOR][/B]") else: choice = DIALOG.yesno(ADDONTITLE, "[COLOR %s]Would you like to download and install [COLOR %s]%s[/COLOR]?[/COLOR]" % (COLOR2, COLOR1, name), yeslabel="[B][COLOR springgreen]Install[/COLOR][/B]", nolabel="[B][COLOR red]Cancel[/COLOR][/B]") if choice == 1: file = wiz.openURL(url) f = xbmcvfs.File(ADVANCED, 'w'); f.write(file) f.close() DIALOG.ok(ADDONTITLE, '[COLOR %s]AdvancedSettings.xml file has been successfully written. Once you click okay it will force close kodi.[/COLOR]' % COLOR2) wiz.killxbmc(True) else: wiz.log("[Advanced Settings] install canceled"); wiz.LogNotify('[COLOR %s]%s[/COLOR]' % (COLOR1, ADDONTITLE), "[COLOR %s]Write Cancelled![/COLOR]" % COLOR2); return else: wiz.log("[Advanced Settings] URL not working: %s" % ADVANCEDWORKING); wiz.LogNotify('[COLOR %s]%s[/COLOR]' % (COLOR1, ADDONTITLE), "[COLOR %s]URL Not Working[/COLOR]" % COLOR2) def viewAdvanced(): f = xbmcvfs.File(ADVANCED) a = f.read().replace('\t', ' ') wiz.TextBox(ADDONTITLE, a) f.close() def removeAdvanced(): if os.path.exists(ADVANCED): wiz.removeFile(ADVANCED) else: wiz.LogNotify("[COLOR %s]%s[/COLOR]" % (COLOR1, ADDONTITLE), "[COLOR %s]AdvancedSettings.xml not found[/COLOR]") def showAutoAdvanced(): notify.autoConfig() def getIP(): site = 'http://whatismyipaddress.com/' if not wiz.workingURL(site): return 'Unknown', 'Unknown', 'Unknown' page = wiz.openURL(site).decode('utf-8').replace('\n','').replace('\r','') if not 'Access Denied' in page: ipmatch = re.compile('whatismyipaddress.com/ip/(.+?)"').findall(page) ipfinal = ipmatch[0] if (len(ipmatch) > 0) else 'Unknown' details = re.compile('"font-size:14px;">(.+?)').findall(page) provider = details[0] if (len(details) > 0) else 'Unknown' location = details[1]+', '+details[2]+', '+details[3] if (len(details) > 2) else 'Unknown' return ipfinal, provider, location else: return 'Unknown', 'Unknown', 'Unknown' def systemInfo(): 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 = wiz.getInfo(info) y = 0 while temp == "Busy" and y < 10: temp = wiz.getInfo(info); y += 1; wiz.log("%s sleep %s" % (info, str(y))); xbmc.sleep(200) data.append(temp) x += 1 #storage_free = data[8] if 'Una' in data[8] else wiz.convertSize(int(float(data[8][:-8]))*1024*1024) #storage_used = data[9] if 'Una' in data[9] else wiz.convertSize(int(float(data[9][:-8]))*1024*1024) #storage_total = data[10] if 'Una' in data[10] else wiz.convertSize(int(float(data[10][:-8]))*1024*1024) ram_free = wiz.convertSize(int(float(data[11][:-2]))*1024*1024) ram_used = wiz.convertSize(int(float(data[12][:-2]))*1024*1024) ram_total = wiz.convertSize(int(float(data[13][:-2]))*1024*1024) picture = []; music = []; video = []; programs = []; repos = []; scripts = []; skins = [] fold = glob.glob(os.path.join(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): f = xbmcvfs.File(xml) a = f.read() prov = re.compile("(.+?)").findall(a) 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) addFile('[B]Media Center Info:[/B]', '', icon=ICONMAINT, themeit=THEME2) addFile('[COLOR %s]Name:[/COLOR] [COLOR %s]%s[/COLOR]' % (COLOR1, COLOR2, data[0]), '', icon=ICONMAINT, themeit=THEME3) addFile('[COLOR %s]Version:[/COLOR] [COLOR %s]%s[/COLOR]' % (COLOR1, COLOR2, data[1]), '', icon=ICONMAINT, themeit=THEME3) addFile('[COLOR %s]Platform:[/COLOR] [COLOR %s]%s[/COLOR]' % (COLOR1, COLOR2, wiz.platform().title()), '', icon=ICONMAINT, themeit=THEME3) addFile('[COLOR %s]CPU Usage:[/COLOR] [COLOR %s]%s[/COLOR]' % (COLOR1, COLOR2, data[2]), '', icon=ICONMAINT, themeit=THEME3) addFile('[COLOR %s]Screen Mode:[/COLOR] [COLOR %s]%s[/COLOR]' % (COLOR1, COLOR2, data[3]), '', icon=ICONMAINT, themeit=THEME3) addFile('[B]Uptime:[/B]', '', icon=ICONMAINT, themeit=THEME2) addFile('[COLOR %s]Current Uptime:[/COLOR] [COLOR %s]%s[/COLOR]' % (COLOR1, COLOR2, data[6]), '', icon=ICONMAINT, themeit=THEME2) addFile('[COLOR %s]Total Uptime:[/COLOR] [COLOR %s]%s[/COLOR]' % (COLOR1, COLOR2, data[7]), '', icon=ICONMAINT, themeit=THEME2) #addFile('[B]Local Storage:[/B]', '', icon=ICONMAINT, themeit=THEME2) #addFile('[COLOR %s]Used Storage:[/COLOR] [COLOR %s]%s[/COLOR]' % (COLOR1, COLOR2, storage_used), '', icon=ICONMAINT, themeit=THEME2) #addFile('[COLOR %s]Free Storage:[/COLOR] [COLOR %s]%s[/COLOR]' % (COLOR1, COLOR2, storage_free), '', icon=ICONMAINT, themeit=THEME2) #addFile('[COLOR %s]Total Storage:[/COLOR] [COLOR %s]%s[/COLOR]' % (COLOR1, COLOR2, storage_total), '', icon=ICONMAINT, themeit=THEME2) addFile('[B]Ram Usage:[/B]', '', icon=ICONMAINT, themeit=THEME2) addFile('[COLOR %s]Used Memory:[/COLOR] [COLOR %s]%s[/COLOR]' % (COLOR1, COLOR2, ram_free), '', icon=ICONMAINT, themeit=THEME2) addFile('[COLOR %s]Free Memory:[/COLOR] [COLOR %s]%s[/COLOR]' % (COLOR1, COLOR2, ram_used), '', icon=ICONMAINT, themeit=THEME2) addFile('[COLOR %s]Total Memory:[/COLOR] [COLOR %s]%s[/COLOR]' % (COLOR1, COLOR2, ram_total), '', icon=ICONMAINT, themeit=THEME2) addFile('[B]Network:[/B]', '', icon=ICONMAINT, themeit=THEME2) mac,inter_ip,ip,city,state,country,isp = wiz.net_info() addFile('[COLOR %s]Mac:[/COLOR] [COLOR %s]%s[/COLOR]' % (COLOR1, COLOR2, mac), '', icon=ICONMAINT, themeit=THEME2) addFile('[COLOR %s]Internal IP: [COLOR %s]%s[/COLOR]' % (COLOR1, COLOR2, inter_ip), '', icon=ICONMAINT, themeit=THEME2) addFile('[COLOR %s]External IP:[/COLOR] [COLOR %s]%s[/COLOR]' % (COLOR1, COLOR2, ip), '', icon=ICONMAINT, themeit=THEME2) addFile('[COLOR %s]City:[/COLOR] [COLOR %s]%s[/COLOR]' % (COLOR1, COLOR2, city), '', icon=ICONMAINT, themeit=THEME2) addFile('[COLOR %s]State:[/COLOR] [COLOR %s]%s[/COLOR]' % (COLOR1, COLOR2, state), '', icon=ICONMAINT, themeit=THEME2) addFile('[COLOR %s]Country:[/COLOR] [COLOR %s]%s[/COLOR]' % (COLOR1, COLOR2, country), '', icon=ICONMAINT, themeit=THEME2) addFile('[COLOR %s]ISP:[/COLOR] [COLOR %s]%s[/COLOR]' % (COLOR1, COLOR2, isp), '', icon=ICONMAINT, themeit=THEME2) totalcount = len(picture) + len(music) + len(video) + len(programs) + len(scripts) + len(skins) + len(repos) addFile('[B]Addons([COLOR %s]%s[/COLOR]):[/B]' % (COLOR1, totalcount), '', icon=ICONMAINT, themeit=THEME2) addFile('[COLOR %s]Video Addons:[/COLOR] [COLOR %s]%s[/COLOR]' % (COLOR1, COLOR2, str(len(video))), '', icon=ICONMAINT, themeit=THEME2) addFile('[COLOR %s]Program Addons:[/COLOR] [COLOR %s]%s[/COLOR]' % (COLOR1, COLOR2, str(len(programs))), '', icon=ICONMAINT, themeit=THEME2) addFile('[COLOR %s]Music Addons:[/COLOR] [COLOR %s]%s[/COLOR]' % (COLOR1, COLOR2, str(len(music))), '', icon=ICONMAINT, themeit=THEME2) addFile('[COLOR %s]Picture Addons:[/COLOR] [COLOR %s]%s[/COLOR]' % (COLOR1, COLOR2, str(len(picture))), '', icon=ICONMAINT, themeit=THEME2) addFile('[COLOR %s]Repositories:[/COLOR] [COLOR %s]%s[/COLOR]' % (COLOR1, COLOR2, str(len(repos))), '', icon=ICONMAINT, themeit=THEME2) addFile('[COLOR %s]Skins:[/COLOR] [COLOR %s]%s[/COLOR]' % (COLOR1, COLOR2, str(len(skins))), '', icon=ICONMAINT, themeit=THEME2) addFile('[COLOR %s]Scripts/Modules:[/COLOR] [COLOR %s]%s[/COLOR]' % (COLOR1, COLOR2, str(len(scripts))), '', icon=ICONMAINT, themeit=THEME2) def saveMenu(): on = '[COLOR springgreen]ON[/COLOR]'; off = '[COLOR red]OFF[/COLOR]' trakt = 'true' if KEEPTRAKT == 'true' else 'false' real = 'true' if KEEPREAL == 'true' else 'false' login = 'true' if KEEPLOGIN == 'true' else 'false' sources = 'true' if KEEPSOURCES == 'true' else 'false' advanced = 'true' if KEEPADVANCED == 'true' else 'false' profiles = 'true' if KEEPPROFILES == 'true' else 'false' playercore = 'true' if KEEPPLAYERCORE == 'true' else 'false' favourites = 'true' if KEEPFAVS == 'true' else 'false' repos = 'true' if KEEPREPOS == 'true' else 'false' super = 'true' if KEEPSUPER == 'true' else 'false' whitelist = 'true' if KEEPWHITELIST == 'true' else 'false' addDir ('Keep Trakt Data', 'trakt', icon=ICONTRAKT, themeit=THEME1) addDir ('Keep Debrid', 'realdebrid', icon=ICONREAL, themeit=THEME1) addDir ('Keep Login Info', 'login', icon=ICONLOGIN, themeit=THEME1) addFile('Import Save Data', 'managedata', 'import', icon=ICONSAVE, themeit=THEME1) addFile('Export Save Data', 'managedata', 'export', icon=ICONSAVE, themeit=THEME1) addFile('- Click to toggle settings -', '', themeit=THEME3) addFile('Save Trakt: %s' % trakt.replace('true',on).replace('false',off) ,'togglesetting', 'keeptrakt', icon=ICONTRAKT, themeit=THEME1) addFile('Save Debrid: %s' % real.replace('true',on).replace('false',off) ,'togglesetting', 'keepdebrid', icon=ICONREAL, themeit=THEME1) addFile('Save Login Info: %s' % login.replace('true',on).replace('false',off) ,'togglesetting', 'keeplogin', icon=ICONLOGIN, themeit=THEME1) addFile('Keep \'Sources.xml\': %s' % sources.replace('true',on).replace('false',off) ,'togglesetting', 'keepsources', icon=ICONSAVE, themeit=THEME1) addFile('Keep \'Profiles.xml\': %s' % profiles.replace('true',on).replace('false',off) ,'togglesetting', 'keepprofiles', icon=ICONSAVE, themeit=THEME1) addFile('Keep \'playercorefactory.xml\': %s' % playercore.replace('true', on).replace('false', off), 'togglesetting', 'keepplayercore', icon=ICONSAVE, themeit=THEME1) addFile('Keep \'Advancedsettings.xml\': %s' % advanced.replace('true',on).replace('false',off) ,'togglesetting', 'keepadvanced', icon=ICONSAVE, themeit=THEME1) addFile('Keep \'Favourites.xml\': %s' % favourites.replace('true',on).replace('false',off) ,'togglesetting', 'keepfavourites', icon=ICONSAVE, themeit=THEME1) addFile('Keep Super Favourites: %s' % super.replace('true',on).replace('false',off) ,'togglesetting', 'keepsuper', icon=ICONSAVE, themeit=THEME1) addFile('Keep Installed Repo\'s: %s' % repos.replace('true',on).replace('false',off) ,'togglesetting', 'keeprepos', icon=ICONSAVE, themeit=THEME1) addFile('Keep My \'WhiteList\': %s' % whitelist.replace('true',on).replace('false',off) ,'togglesetting', 'keepwhitelist', icon=ICONSAVE, themeit=THEME1) if whitelist == 'true': addFile('Edit My Whitelist', 'whitelist', 'edit', icon=ICONSAVE, themeit=THEME1) addFile('View My Whitelist', 'whitelist', 'view', icon=ICONSAVE, themeit=THEME1) addFile('Clear My Whitelist', 'whitelist', 'clear', icon=ICONSAVE, themeit=THEME1) addFile('Import My Whitelist', 'whitelist', 'import', icon=ICONSAVE, themeit=THEME1) addFile('Export My Whitelist', 'whitelist', 'export', icon=ICONSAVE, themeit=THEME1) setView('files', 'viewType') def traktMenu(): trakt = '[COLOR springgreen]ON[/COLOR]' if KEEPTRAKT == 'true' else '[COLOR red]OFF[/COLOR]' last = str(TRAKTSAVE) if not TRAKTSAVE == '' else 'Trakt hasnt been saved yet.' addFile('[I]Register FREE Account at http://trakt.tv[/I]', '', icon=ICONTRAKT, themeit=THEME3) addFile('Save Trakt Data: %s' % trakt, 'togglesetting', 'keeptrakt', icon=ICONTRAKT, themeit=THEME3) if KEEPTRAKT == 'true': addFile('Last Save: %s' % str(last), '', icon=ICONTRAKT, themeit=THEME3) if HIDESPACERS == 'No': addFile(wiz.sep(), '', icon=ICONTRAKT, themeit=THEME3) for trakt in traktit.ORDER: if xbmc.getCondVisibility('System.HasAddon(%s)' % TRAKTID[trakt]['plugin']): name = TRAKTID[trakt]['name'] path = TRAKTID[trakt]['path'] saved = TRAKTID[trakt]['saved'] file = TRAKTID[trakt]['file'] user = wiz.getS(saved) auser = traktit.traktUser(trakt) icon = TRAKTID[trakt]['icon'] if os.path.exists(path) else ICONTRAKT fanart = TRAKTID[trakt]['fanart'] if os.path.exists(path) else FANART menu = createMenu('saveaddon', 'Trakt', trakt) menu2 = createMenu('save', 'Trakt', trakt) menu.append((THEME2 % '%s Settings' % name, 'RunPlugin(plugin://%s/?mode=opensettings&name=%s&url=trakt)' % (ADDON_ID, trakt))) addFile('[+]-> %s' % name, '', icon=icon, fanart=fanart, themeit=THEME3) if not os.path.exists(path): addFile('[COLOR red]Addon Data: Not Installed[/COLOR]', '', icon=icon, fanart=fanart, menu=menu) elif not auser: addFile('[COLOR red]Addon Data: Not Registered[/COLOR]','authtrakt', trakt, icon=icon, fanart=fanart, menu=menu) else: addFile('[COLOR springgreen]Addon Data: %s[/COLOR]' % auser,'authtrakt', trakt, icon=icon, fanart=fanart, menu=menu) if user == "": if os.path.exists(file): addFile('[COLOR red]Saved Data: Save File Found(Import Data)[/COLOR]','importtrakt', trakt, icon=icon, fanart=fanart, menu=menu2) else : addFile('[COLOR red]Saved Data: Not Saved[/COLOR]','savetrakt', trakt, icon=icon, fanart=fanart, menu=menu2) else: addFile('[COLOR springgreen]Saved Data: %s[/COLOR]' % user, '', icon=icon, fanart=fanart, menu=menu2) if HIDESPACERS == 'No': addFile(wiz.sep(), '', themeit=THEME3) addFile('Save All Trakt Data', 'savetrakt', 'all', icon=ICONTRAKT, themeit=THEME3) addFile('Recover All Saved Trakt Data', 'restoretrakt', 'all', icon=ICONTRAKT, themeit=THEME3) addFile('Import Trakt Data', 'importtrakt', 'all', icon=ICONTRAKT, themeit=THEME3) addFile('Clear All Addon Trakt Data', 'addontrakt', 'all', icon=ICONTRAKT, themeit=THEME3) addFile('Clear All Saved Trakt Data', 'cleartrakt', 'all', icon=ICONTRAKT, themeit=THEME3) setView('files', 'viewType') def realMenu(): real = '[COLOR springgreen]ON[/COLOR]' if KEEPREAL == 'true' else '[COLOR red]OFF[/COLOR]' last = str(REALSAVE) if not REALSAVE == '' else 'Real Debrid hasnt been saved yet.' addFile('[I]http://real-debrid.com is a PAID service.[/I]', '', icon=ICONREAL, themeit=THEME3) addFile('Save Real Debrid Data: %s' % real, 'togglesetting', 'keepdebrid', icon=ICONREAL, themeit=THEME3) if KEEPREAL == 'true': addFile('Last Save: %s' % str(last), '', icon=ICONREAL, themeit=THEME3) if HIDESPACERS == 'No': addFile(wiz.sep(), '', icon=ICONREAL, themeit=THEME3) for debrid in debridit.ORDER: if xbmc.getCondVisibility('System.HasAddon(%s)' % DEBRIDID[debrid]['plugin']): name = DEBRIDID[debrid]['name'] path = DEBRIDID[debrid]['path'] saved = DEBRIDID[debrid]['saved'] file = DEBRIDID[debrid]['file'] user = wiz.getS(saved) auser = debridit.debridUser(debrid) icon = DEBRIDID[debrid]['icon'] if os.path.exists(path) else ICONREAL fanart = DEBRIDID[debrid]['fanart'] if os.path.exists(path) else FANART menu = createMenu('saveaddon', 'Debrid', debrid) menu2 = createMenu('save', 'Debrid', debrid) menu.append((THEME2 % '%s Settings' % name, 'RunPlugin(plugin://%s/?mode=opensettings&name=%s&url=debrid)' % (ADDON_ID, debrid))) addFile('[+]-> %s' % name, '', icon=icon, fanart=fanart, themeit=THEME3) if not os.path.exists(path): addFile('[COLOR red]Addon Data: Not Installed[/COLOR]', '', icon=icon, fanart=fanart, menu=menu) elif not auser: addFile('[COLOR red]Addon Data: Not Registered[/COLOR]','authdebrid', debrid, icon=icon, fanart=fanart, menu=menu) else: addFile('[COLOR springgreen]Addon Data: %s[/COLOR]' % auser,'authdebrid', debrid, icon=icon, fanart=fanart, menu=menu) if user == "": if os.path.exists(file): addFile('[COLOR red]Saved Data: Save File Found(Import Data)[/COLOR]','importdebrid', debrid, icon=icon, fanart=fanart, menu=menu2) else : addFile('[COLOR red]Saved Data: Not Saved[/COLOR]','savedebrid', debrid, icon=icon, fanart=fanart, menu=menu2) else: addFile('[COLOR springgreen]Saved Data: %s[/COLOR]' % user, '', icon=icon, fanart=fanart, menu=menu2) if HIDESPACERS == 'No': addFile(wiz.sep(), '', themeit=THEME3) addFile('Save All Debrid Data', 'savedebrid', 'all', icon=ICONREAL, themeit=THEME3) addFile('Recover All Saved Debrid Data', 'restoredebrid', 'all', icon=ICONREAL, themeit=THEME3) addFile('Import Debrid Data', 'importdebrid', 'all', icon=ICONREAL, themeit=THEME3) addFile('Clear All Addon Debrid Data', 'addondebrid', 'all', icon=ICONREAL, themeit=THEME3) addFile('Clear All Saved Debrid Data', 'cleardebrid', 'all', icon=ICONREAL, themeit=THEME3) setView('files', 'viewType') def loginMenu(): login = '[COLOR springgreen]ON[/COLOR]' if KEEPLOGIN == 'true' else '[COLOR red]OFF[/COLOR]' last = str(LOGINSAVE) if not LOGINSAVE == '' else 'Login data hasnt been saved yet.' addFile('[I]Several of these addons are PAID services.[/I]', '', icon=ICONLOGIN, themeit=THEME3) addFile('Save API Keys: %s' % login, 'togglesetting', 'keeplogin', icon=ICONLOGIN, themeit=THEME3) if KEEPLOGIN == 'true': addFile('Last Save: %s' % str(last), '', icon=ICONLOGIN, themeit=THEME3) if HIDESPACERS == 'No': addFile(wiz.sep(), '', icon=ICONLOGIN, themeit=THEME3) for login in loginit.ORDER: if xbmc.getCondVisibility('System.HasAddon(%s)' % LOGINID[login]['plugin']): name = LOGINID[login]['name'] path = LOGINID[login]['path'] saved = LOGINID[login]['saved'] file = LOGINID[login]['file'] user = wiz.getS(saved) auser = loginit.loginUser(login) icon = LOGINID[login]['icon'] if os.path.exists(path) else ICONLOGIN fanart = LOGINID[login]['fanart'] if os.path.exists(path) else FANART menu = createMenu('saveaddon', 'Login', login) menu2 = createMenu('save', 'Login', login) menu.append((THEME2 % '%s Settings' % name, 'RunPlugin(plugin://%s/?mode=opensettings&name=%s&url=login)' % (ADDON_ID, login))) addFile('[+]-> %s' % name, '', icon=icon, fanart=fanart, themeit=THEME3) if not os.path.exists(path): addFile('[COLOR red]Addon Data: Not Installed[/COLOR]', '', icon=icon, fanart=fanart, menu=menu) elif not auser: addFile('[COLOR red]Addon Data: Not Registered[/COLOR]','authlogin', login, icon=icon, fanart=fanart, menu=menu) else: addFile('[COLOR springgreen]Addon Data: %s[/COLOR]' % auser,'authlogin', login, icon=icon, fanart=fanart, menu=menu) if user == "": if os.path.exists(file): addFile('[COLOR red]Saved Data: Save File Found(Import Data)[/COLOR]','importlogin', login, icon=icon, fanart=fanart, menu=menu2) else : addFile('[COLOR red]Saved Data: Not Saved[/COLOR]','savelogin', login, icon=icon, fanart=fanart, menu=menu2) else: addFile('[COLOR springgreen]Saved Data: %s[/COLOR]' % user, '', icon=icon, fanart=fanart, menu=menu2) if HIDESPACERS == 'No': addFile(wiz.sep(), '', themeit=THEME3) addFile('Save All Login Info', 'savelogin', 'all', icon=ICONLOGIN, themeit=THEME3) addFile('Recover All Saved Login Info', 'restorelogin', 'all', icon=ICONLOGIN, themeit=THEME3) addFile('Import Login Info', 'importlogin', 'all', icon=ICONLOGIN, themeit=THEME3) addFile('Clear All Addon Login Info', 'addonlogin', 'all', icon=ICONLOGIN, themeit=THEME3) addFile('Clear All Saved Login Info', 'clearlogin', 'all', icon=ICONLOGIN, themeit=THEME3) setView('files', 'viewType') def fixUpdate(): if KODIV < 17: dbfile = os.path.join(DATABASE, wiz.latestDB('Addons')) try: xbmcvfs.delete(dbfile) except Exception as e: wiz.log("Unable to remove %s, Purging DB" % dbfile) wiz.purgeDb(dbfile) else: xbmc.executebuiltin('ActivateWindow(10000)') xbmc.sleep(500) xbmc.executeJSONRPC('{"jsonrpc":"2.0","method":"Settings.ResetSettingValue", "params":{"setting":"locale.language"},"id":1}') freememory = xbmc.getInfoLabel('System.FreeMemory').replace('MB', '') xbmc.sleep(500) if int(freememory) <= 1000: delay = 10000 else: delay = 5000 DIALOG.notification("Fix Addons Not Updating", "Please Wait", xbmcgui.NOTIFICATION_INFO, delay, False) xbmc.sleep(delay) if os.path.exists(os.path.join(USERDATA, 'autoexec.py')): temp = os.path.join(USERDATA, 'autoexec_temp.py') if os.path.exists(temp): xbmcvfs.delete(temp) xbmcvfs.rename(os.path.join(USERDATA, 'autoexec.py'), temp) xbmcvfs.copy(os.path.join(PLUGIN, 'resources', 'libs', 'autoexec.py'), os.path.join(USERDATA, 'autoexec.py')) dbfile = os.path.join(DATABASE, wiz.latestDB('Addons')) try: xbmcvfs.delete(dbfile) except Exception as e: wiz.log("Unable to remove %s, Purging DB" % dbfile) wiz.purgeDb(dbfile) DIALOG.ok(ADDONTITLE, '[COLOR %s]Please click OK to close kodi and apply the changes[/COLOR]' % COLOR2) wiz.killxbmc(True) def removeAddonMenu(): fold = glob.glob(os.path.join(ADDONS, '*/')) addonnames = []; addonids = [] for folder in sorted(fold, key = lambda x: x): foldername = os.path.split(folder[:-1])[1] if foldername in EXCLUDES: continue elif foldername in DEFAULTPLUGINS: continue elif foldername == 'packages': continue xml = os.path.join(folder, 'addon.xml') if os.path.exists(xml): f = xbmcvfs.File(xml) a = f.read() match = wiz.parseDOM(a, 'addon', ret='id') addid = foldername if len(match) == 0 else match[0] try: add = xbmcaddon.Addon(id=addid) addonnames.append(add.getAddonInfo('name')) addonids.append(addid) except: pass if len(addonnames) == 0: wiz.LogNotify("[COLOR %s]%s[/COLOR]" % (COLOR1, ADDONTITLE), "[COLOR %s]No Addons To Remove[/COLOR]" % COLOR2) return if KODIV > 16: selected = DIALOG.multiselect("%s: Select the addons you wish to remove." % ADDONTITLE, addonnames) else: selected = []; choice = 0 tempaddonnames = ["-- Click here to Continue --"] + addonnames while not choice == -1: choice = DIALOG.select("%s: Select the addons you wish to remove." % 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 %s]%s[/COLOR][/B]" % (COLOR1, addonnames[choice2]) if selected == None: return if len(selected) > 0: wiz.addonUpdates('set') for addon in selected: removeAddon(addonids[addon], addonnames[addon], True) xbmc.sleep(500) if INSTALLMETHOD == 1: todo = 1 elif INSTALLMETHOD == 2: todo = 0 else: todo = DIALOG.yesno(ADDONTITLE, "[COLOR %s]Would you like to [COLOR %s]Force close[/COLOR] kodi or [COLOR %s]Reload Profile[/COLOR]?[/COLOR]" % (COLOR2, COLOR1, COLOR1), yeslabel="[B][COLOR springgreen]Reload Profile[/COLOR][/B]", nolabel="[B][COLOR red]Force Close[/COLOR][/B]") if todo == 1: wiz.reloadFix('remove addon') else: wiz.addonUpdates('reset'); wiz.killxbmc(True) def removeAddonDataMenu(): if os.path.exists(ADDOND): addFile('[COLOR red][B][REMOVE][/B][/COLOR] All Addon_Data', 'removedata', 'all', themeit=THEME2) addFile('[COLOR red][B][REMOVE][/B][/COLOR] All Addon_Data for Uninstalled Addons', 'removedata', 'uninstalled', themeit=THEME2) addFile('[COLOR red][B][REMOVE][/B][/COLOR] All Empty Folders in Addon_Data', 'removedata', 'empty', themeit=THEME2) addFile('[COLOR red][B][REMOVE][/B][/COLOR] %s Addon_Data' % ADDONTITLE, 'resetaddon', themeit=THEME2) if HIDESPACERS == 'No': addFile(wiz.sep(), '', themeit=THEME3) fold = glob.glob(os.path.join(ADDOND, '*/')) for folder in sorted(fold, key = lambda x: x): foldername = folder.replace(ADDOND, '').replace('\\', '').replace('/', '') icon = os.path.join(folder.replace(ADDOND, ADDONS), 'icon.png') fanart = os.path.join(folder.replace(ADDOND, ADDONS), 'fanart.png') folderdisplay = foldername replace = {'audio.':'[COLOR orange][AUDIO] [/COLOR]', 'metadata.':'[COLOR cyan][METADATA] [/COLOR]', 'module.':'[COLOR orange][MODULE] [/COLOR]', 'plugin.':'[COLOR blue][PLUGIN] [/COLOR]', 'program.':'[COLOR orange][PROGRAM] [/COLOR]', 'repository.':'[COLOR gold][REPO] [/COLOR]', 'script.':'[COLOR springgreen][SCRIPT] [/COLOR]', 'service.':'[COLOR springgreen][SERVICE] [/COLOR]', 'skin.':'[COLOR dodgerblue][SKIN] [/COLOR]', 'video.':'[COLOR orange][VIDEO] [/COLOR]', 'weather.':'[COLOR yellow][WEATHER] [/COLOR]'} for rep in replace: folderdisplay = folderdisplay.replace(rep, replace[rep]) if foldername in EXCLUDES: folderdisplay = '[COLOR springgreen][B][PROTECTED][/B][/COLOR] %s' % folderdisplay else: folderdisplay = '[COLOR red][B][REMOVE][/B][/COLOR] %s' % folderdisplay addFile(' %s' % folderdisplay, 'removedata', foldername, icon=icon, fanart=fanart, themeit=THEME2) else: addFile('No Addon data folder found.', '', themeit=THEME3) setView('files', 'viewType') def enableAddons(): addFile("[I][B][COLOR red]!!Notice: Disabling Some Addons Can Cause Issues!![/COLOR][/B][/I]", '', icon=ICONMAINT) fold = glob.glob(os.path.join(ADDONS, '*/')) x = 0 for folder in sorted(fold, key = lambda x: x): foldername = os.path.split(folder[:-1])[1] if foldername in EXCLUDES: continue if foldername in DEFAULTPLUGINS: continue addonxml = os.path.join(folder, 'addon.xml') if os.path.exists(addonxml): x += 1 fold = folder.replace(ADDONS, '')[1:-1] f = xbmcvfs.File(addonxml) a = f.read().replace('\n','').replace('\r','').replace('\t','') match = wiz.parseDOM(a, 'addon', ret='id') match2 = wiz.parseDOM(a, 'addon', ret='name') try: pluginid = match[0] name = match2[0] except: continue try: add = xbmcaddon.Addon(id=pluginid) state = "[COLOR springgreen][Enabled][/COLOR]" goto = "false" except: state = "[COLOR red][Disabled][/COLOR]" goto = "true" pass icon = os.path.join(folder, 'icon.png') if os.path.exists(os.path.join(folder, 'icon.png')) else ICON fanart = os.path.join(folder, 'fanart.jpg') if os.path.exists(os.path.join(folder, 'fanart.jpg')) else FANART addFile("%s %s" % (state, name), 'toggleaddon', fold, goto, icon=icon, fanart=fanart) f.close() if x == 0: addFile("No Addons Found to Enable or Disable.", '', icon=ICONMAINT) setView('files', 'viewType') def changeFeq(): feq = ['Every Startup', 'Every Day', 'Every Three Days', 'Every Weekly'] change = DIALOG.select("[COLOR %s]How often would you list to Auto Clean on Startup?[/COLOR]" % COLOR2, feq) if not change == -1: wiz.setS('autocleanfeq', str(change)) wiz.LogNotify('[COLOR %s]Auto Clean Up[/COLOR]' % COLOR1, '[COLOR %s]Fequency Now %s[/COLOR]' % (COLOR2, feq[change])) def developer(): # addFile('Convert Text Files to 0.1.7', 'converttext', themeit=THEME1) addFile('Create QR Code', 'createqr', themeit=THEME1) addFile('Test Notifications', 'testnotify', themeit=THEME1) addFile('Test Update', 'testupdate', themeit=THEME1) addFile('Test First Run', 'testfirst', themeit=THEME1) addFile('Test First Run Settings', 'testfirstrun', themeit=THEME1) ########################### ###### Build Install ###### ########################### def buildWizard(name, type, theme=None, over=False): if over == False: testbuild = wiz.checkBuild(name, 'url') if testbuild == False: wiz.LogNotify("[COLOR %s]%s[/COLOR]" % (COLOR1, ADDONTITLE), "[COLOR %s]Unabled to find build[/COLOR]" % COLOR2) return testworking = wiz.workingURL(testbuild) if testworking == False: wiz.LogNotify("[COLOR %s]%s[/COLOR]" % (COLOR1, ADDONTITLE), "[COLOR %s]Build Zip Error: %s[/COLOR]" % (COLOR2, testworking)) return if type == 'gui': if name == BUILDNAME: if over == True: yes = 1 else: yes = DIALOG.yesno(ADDONTITLE, '[COLOR %s]Would you like to apply the guifix for:[CR][COLOR %s]%s[/COLOR]?[/COLOR]' % (COLOR2, COLOR1, name), nolabel='[B][COLOR red]No, Cancel[/COLOR][/B]',yeslabel='[B][COLOR springgreen]Apply Fix[/COLOR][/B]') else: yes = DIALOG.yesno("%s - [COLOR red]WARNING!![/COLOR]" % ADDONTITLE, "[COLOR %s][COLOR %s]%s[/COLOR] community build is not currently installed." % (COLOR2, COLOR1, name), "Would you like to apply the guiFix anyways?.[/COLOR]", nolabel='[B][COLOR red]No, Cancel[/COLOR][/B]',yeslabel='[B][COLOR springgreen]Apply Fix[/COLOR][/B]') if yes: buildzip = wiz.checkBuild(name,'gui') zipname = name.replace('\\', '').replace('/', '').replace(':', '').replace('*', '').replace('?', '').replace('"', '').replace('<', '').replace('>', '').replace('|', '') if not wiz.workingURL(buildzip) == True: wiz.LogNotify("[COLOR %s]%s[/COLOR]" % (COLOR1, ADDONTITLE), '[COLOR %s]GuiFix: Invalid Zip Url![/COLOR]' % COLOR2); return if not os.path.exists(PACKAGES): os.makedirs(PACKAGES) DP.create(ADDONTITLE,'[COLOR %s][B]Downloading GuiFix:[/B][/COLOR] [COLOR %s]%s[/COLOR]Please Wait' % (COLOR2, COLOR1, name)) lib=os.path.join(PACKAGES, '%s_guisettings.zip' % zipname) try: xbmcvfs.delete(lib) except: pass downloader.download(buildzip, lib, DP, name) xbmc.sleep(500) title = '[COLOR %s][B]Installing:[/B][/COLOR] [COLOR %s]%s[/COLOR]' % (COLOR2, COLOR1, name) DP.update(0, '%sPlease Wait' % title) extract.all(lib,USERDATA,DP, title=title) DP.close() wiz.defaultSkin() wiz.lookandFeelData('save') if KODIV >= 17: installed = grabAddons(lib) wiz.addonDatabase(installed, 1, True) if INSTALLMETHOD == 1: todo = 1 elif INSTALLMETHOD == 2: todo = 0 else: todo = DIALOG.yesno(ADDONTITLE, "[COLOR %s]The Gui fix has been installed. Would you like to Reload the profile or Force Close Kodi?[/COLOR]" % COLOR2, yeslabel="[B][COLOR red]Reload Profile[/COLOR][/B]", nolabel="[B][COLOR springgreen]Force Close[/COLOR][/B]") if todo == 1: wiz.reloadFix() else: DIALOG.ok(ADDONTITLE, "[COLOR %s]To save changes you now need to force close Kodi, Press OK to force close Kodi[/COLOR]" % COLOR2); wiz.killxbmc('true') else: wiz.LogNotify("[COLOR %s]%s[/COLOR]" % (COLOR1, ADDONTITLE), '[COLOR %s]GuiFix: Cancelled![/COLOR]' % COLOR2) elif type == 'fresh': freshStart(name) elif type == 'normal': if url == 'normal': if KEEPTRAKT == 'true': traktit.autoUpdate('all') wiz.setS('traktlastsave', str(THREEDAYS)) if KEEPREAL == 'true': debridit.autoUpdate('all') wiz.setS('debridlastsave', str(THREEDAYS)) if KEEPLOGIN == 'true': loginit.autoUpdate('all') wiz.setS('loginlastsave', str(THREEDAYS)) temp_kodiv = int(KODIV); buildv = int(float(wiz.checkBuild(name, 'kodi'))) if not temp_kodiv == buildv: if temp_kodiv == 16 and buildv <= 15: warning = False else: warning = True else: warning = False if warning == True: yes_pressed = DIALOG.yesno("%s - [COLOR red]WARNING!![/COLOR]" % ADDONTITLE, '[COLOR %s]There is a chance that the skin will not appear correctly When installing a %s build on a Kodi %s install [/COLOR][COLOR %s]%s v%s ?[/COLOR]' % (COLOR2, wiz.checkBuild(name, 'kodi'), KODIV, COLOR1, name, wiz.checkBuild(name,'version')), nolabel='[B][COLOR springgreen]No, Cancel[/COLOR][/B]',yeslabel='[B][COLOR red]Yes, Install[/COLOR][/B]') else: if not over == False: yes_pressed = 1 else: yes_pressed = DIALOG.yesno(ADDONTITLE, '[COLOR %s]Would you like to Download and Install:[COLOR %s]%s v%s[/COLOR]?[/COLOR]' % (COLOR2, COLOR1, name, wiz.checkBuild(name,'version')), nolabel='[B][COLOR red]No, Cancel[/COLOR][/B]',yeslabel='[B][COLOR springgreen]Yes, Install[/COLOR][/B]') if yes_pressed: wiz.clearS('build') buildzip = wiz.checkBuild(name, 'url') zipname = name.replace('\\', '').replace('/', '').replace(':', '').replace('*', '').replace('?', '').replace('"', '').replace('<', '').replace('>', '').replace('|', '') if not wiz.workingURL(buildzip) == True: wiz.LogNotify("[COLOR %s]%s[/COLOR]" % (COLOR1, ADDONTITLE), '[COLOR %s]Build Install: Invalid Zip Url![/COLOR]' % COLOR2); return if not os.path.exists(PACKAGES): os.makedirs(PACKAGES) bname = '[B][COLOR %s]%s[/COLOR] v%s[/B]' % (wiz.checkBuild(name,'color'), name, wiz.checkBuild(name,'version')) DP.create(ADDONTITLE,'[COLOR %s][B]Downloading: %s[/B][/COLOR] [COLOR %s] v%s[/COLOR]Please Wait' % (COLOR2, wiz.checkBuild(name,'color'), name, wiz.checkBuild(name,'version'))) lib=os.path.join(PACKAGES, '%s.zip' % zipname) try: xbmcvfs.delete(lib) except: pass downloader.download(buildzip, lib, DP, bname) xbmc.sleep(500) title = '[COLOR %s][B]Installing:[/B][/COLOR] [COLOR %s]%s v%s[/COLOR]' % (COLOR2, COLOR1, name, wiz.checkBuild(name,'version')) DP.update(0, '%s[CR][CR] Please Wait' % title) percent, errors, error = extract.all(lib,HOME,DP, title=title) if int(float(percent)) > 0: wiz.fixmetas() wiz.lookandFeelData('save') wiz.defaultSkin() #wiz.addonUpdates('set') wiz.setS('buildname', name) wiz.setS('buildversion', wiz.checkBuild( name,'version')) wiz.setS('buildtheme', '') wiz.setS('latestversion', wiz.checkBuild( name,'version')) wiz.setS('lastbuildcheck', str(NEXTCHECK)) wiz.setS('installed', 'true') wiz.setS('extract', str(percent)) wiz.setS('errors', str(errors)) wiz.log('INSTALLED %s: [ERRORS:%s]' % (percent, errors)) try: xbmcvfs.delete(lib) except: pass if int(float(errors)) > 0: yes=DIALOG.yesno(ADDONTITLE, '[COLOR %s][COLOR %s]%s v%s[/COLOR][CR]Done: [COLOR %s]%s%s[/COLOR] [Errors:[COLOR %s]%s[/COLOR]][CR]Would you like to view the errors?[/COLOR]' % (COLOR2, COLOR1, name, wiz.checkBuild(name,'version'), COLOR1, percent, '%', COLOR1, errors), nolabel='[B][COLOR white]No Thanks[/COLOR][/B]', yeslabel='[B][COLOR white]View Errors[/COLOR][/B]') if yes: wiz.TextBox(ADDONTITLE, error) DP.close() themefile = wiz.themeCount(name) if not themefile == False: buildWizard(name, 'theme') if KODIV >= 17: wiz.addonDatabase(ADDON_ID, 1) if INSTALLMETHOD == 1: todo = 1 elif INSTALLMETHOD == 2: todo = 0 else: todo = DIALOG.yesno(ADDONTITLE, "[COLOR %s]Would you like to [COLOR %s]Force close[/COLOR] kodi or [COLOR %s]Reload Profile[/COLOR]?[/COLOR]" % (COLOR2, COLOR1, COLOR1), yeslabel="[B][COLOR red]Reload Profile[/COLOR][/B]", nolabel="[B][COLOR springgreen]Force Close[/COLOR][/B]") if todo == 1: wiz.reloadFix() else: wiz.killxbmc(True) else: wiz.TextBox("%s: Error Installing Build" % ADDONTITLE, error) else: wiz.LogNotify("[COLOR %s]%s[/COLOR]" % (COLOR1, ADDONTITLE), '[COLOR %s]Build Install: Cancelled![/COLOR]' % COLOR2) elif type == 'theme': if theme == None: themefile = wiz.checkBuild(name, 'theme') themelist = [] if not themefile == 'http://' and wiz.workingURL(themefile) == True: themelist = wiz.themeCount(name, False) if len(themelist) > 0: if DIALOG.yesno(ADDONTITLE, "[COLOR %s]The Build [COLOR %s]%s[/COLOR] comes with [COLOR %s]%s[/COLOR] different themes" % (COLOR2, COLOR1, name, COLOR1, len(themelist)), "Would you like to install one now?[/COLOR]", yeslabel="[B][COLOR springgreen]Install Theme[/COLOR][/B]", nolabel="[B][COLOR red]Cancel Themes[/COLOR][/B]"): wiz.log("Theme List: %s " % str(themelist)) ret = DIALOG.select(ADDONTITLE, themelist) wiz.log("Theme install selected: %s" % ret) if not ret == -1: theme = themelist[ret]; installtheme = True else: wiz.LogNotify("[COLOR %s]%s[/COLOR]" % (COLOR1, ADDONTITLE), '[COLOR %s]Theme Install: Cancelled![/COLOR]' % COLOR2); return else: wiz.LogNotify("[COLOR %s]%s[/COLOR]" % (COLOR1, ADDONTITLE), '[COLOR %s]Theme Install: Cancelled![/COLOR]' % COLOR2); return else: wiz.LogNotify("[COLOR %s]%s[/COLOR]" % (COLOR1, ADDONTITLE), '[COLOR %s]Theme Install: None Found![/COLOR]' % COLOR2) else: installtheme = DIALOG.yesno(ADDONTITLE, '[COLOR %s]Would you like to install the theme:' % COLOR2, '[COLOR %s]%s[/COLOR]' % (COLOR1, theme), 'for [COLOR %s]%s v%s[/COLOR]?[/COLOR]' % (COLOR1, name, wiz.checkBuild(name,'version')), yeslabel="[B][COLOR springgreen]Install Theme[/COLOR][/B]", nolabel="[B][COLOR red]Cancel Themes[/COLOR][/B]") if installtheme: themezip = wiz.checkTheme(name, theme, 'url') zipname = name.replace('\\', '').replace('/', '').replace(':', '').replace('*', '').replace('?', '').replace('"', '').replace('<', '').replace('>', '').replace('|', '') if not wiz.workingURL(themezip) == True: wiz.LogNotify("[COLOR %s]%s[/COLOR]" % (COLOR1, ADDONTITLE), '[COLOR %s]Theme Install: Invalid Zip Url![/COLOR]' % COLOR2); return False if not os.path.exists(PACKAGES): os.makedirs(PACKAGES) DP.create(ADDONTITLE,'[COLOR %s][B]Downloading:[/B][/COLOR] [COLOR %s]%s[/COLOR]Please Wait' % (COLOR2, COLOR1, theme)) lib=os.path.join(PACKAGES, '%s.zip' % zipname) try: xbmcvfs.delete(lib) except: pass downloader.download(themezip, lib, DP, theme) xbmc.sleep(500) DP.update(0,"Installing %s " % name) test = False if url not in ["fresh", "normal"]: test = testTheme(lib) if not wiz.currSkin() in ['skin.confluence', 'skin.estuary'] else False test2 = testGui(lib) if not wiz.currSkin() in ['skin.confluence', 'skin.estuary'] else False if test == True: wiz.lookandFeelData('save') swap = wiz.skinToDefault('Theme Install') if swap == False: return False xbmc.sleep(500) title = '[COLOR %s][B]Installing Theme:[/B][/COLOR] [COLOR %s]%s[/COLOR]' % (COLOR2, COLOR1, theme) DP.update(0, '%sPlease Wait' % title) percent, errors, error = extract.all(lib,HOME,DP, title=title) wiz.setS('buildtheme', theme) wiz.log('INSTALLED %s: [ERRORS:%s]' % (percent, errors)) DP.close() if url not in ["fresh", "normal"]: wiz.forceUpdate() if KODIV >= 17: installed = grabAddons(lib) wiz.addonDatabase(installed, 1, True) if test2 == True: wiz.lookandFeelData('save') wiz.defaultSkin() gotoskin = wiz.getS('defaultskin') wiz.swapSkins(gotoskin, "Theme Installer") wiz.lookandFeelData('restore') elif test == True: switch = wiz.swapSkins(wiz.getS('defaultskin'), 'Theme Install') if switch == False: return wiz.lookandFeelData('restore') else: wiz.ebi("ReloadSkin()") xbmc.sleep(1000) wiz.ebi("Container.Refresh") else: wiz.LogNotify("[COLOR %s]%s[/COLOR]" % (COLOR1, ADDONTITLE), '[COLOR %s]Theme Install: Cancelled![/COLOR]' % COLOR2) def thirdPartyInstall(name, url): if not wiz.workingURL(url): wiz.LogNotify("[COLOR %s]%s[/COLOR]" % (COLOR1, ADDONTITLE), '[COLOR %s]Invalid URL for Build[/COLOR]' % COLOR2); return type = DIALOG.yesno(ADDONTITLE, "[COLOR %s]Would you like to preform a [COLOR %s]Fresh Install[/COLOR] or [COLOR %s]Normal Install[/COLOR] for:[/COLOR][CR][COLOR %s]%s[/COLOR]" % (COLOR2, COLOR1, COLOR1, COLOR1, name), yeslabel="[B][COLOR springgreen]Fresh Install[/COLOR][/B]", nolabel="[B][COLOR red]Normal Install[/COLOR][/B]") if type == 1: freshStart('third', True) wiz.clearS('build') zipname = name.replace('\\', '').replace('/', '').replace(':', '').replace('*', '').replace('?', '').replace('"', '').replace('<', '').replace('>', '').replace('|', '') if not os.path.exists(PACKAGES): os.makedirs(PACKAGES) DP.create(ADDONTITLE,'[COLOR %s][B]Downloading:[/B][/COLOR] [COLOR %s]%s[/COLOR][CR][CR]Please Wait' % (COLOR2, COLOR1, name)) lib=os.path.join(PACKAGES, '%s.zip' % zipname) try: xbmcvfs.delete(lib) except: pass downloader.download(url, lib, DP, name) xbmc.sleep(500) title = '[COLOR %s][B]Installing:[/B][/COLOR] [COLOR %s]%s[/COLOR]' % (COLOR2, COLOR1, name) DP.update(0, '%s[CR][CR]Please Wait' % title) percent, errors, error = extract.all(lib,HOME,DP, title=title) if int(float(percent)) > 0: wiz.fixmetas() wiz.lookandFeelData('save') wiz.defaultSkin() #wiz.addonUpdates('set') wiz.setS('installed', 'true') wiz.setS('extract', str(percent)) wiz.setS('errors', str(errors)) wiz.log('INSTALLED %s: [ERRORS:%s]' % (percent, errors)) try: xbmcvfs.delete(lib) except: pass if int(float(errors)) > 0: yes=DIALOG.yesno(ADDONTITLE, '[COLOR %s][COLOR %s]%s[/COLOR]' % (COLOR2, COLOR1, name), 'Completed: [COLOR %s]%s%s[/COLOR] [Errors:[COLOR %s]%s[/COLOR]]' % (COLOR1, percent, '%', COLOR1, errors), 'Would you like to view the errors?[/COLOR]', nolabel='[B][COLOR red]No Thanks[/COLOR][/B]',yeslabel='[B][COLOR springgreen]View Errors[/COLOR][/B]') if yes: wiz.TextBox(ADDONTITLE, error) DP.close() if KODIV >= 17: wiz.addonDatabase(ADDON_ID, 1) if INSTALLMETHOD == 1: todo = 1 elif INSTALLMETHOD == 2: todo = 0 else: todo = DIALOG.yesno(ADDONTITLE, "[COLOR %s]Would you like to [COLOR %s]Force close[/COLOR] kodi or [COLOR %s]Reload Profile[/COLOR]?[/COLOR]" % (COLOR2, COLOR1, COLOR1), yeslabel="[B][COLOR springgreen]Reload Profile[/COLOR][/B]", nolabel="[B][COLOR red]Force Close[/COLOR][/B]") if todo == 1: wiz.reloadFix() else: wiz.killxbmc(True) def testTheme(path): zfile = zipfile.ZipFile(path) for item in zfile.infolist(): wiz.log(str(item.filename)) if '/settings.xml' in item.filename: return True return False def testGui(path): zfile = zipfile.ZipFile(path) for item in zfile.infolist(): if '/guisettings.xml' in item.filename: return True return False def grabAddons(path): zfile = zipfile.ZipFile(path) addonlist = [] for item in zfile.infolist(): if str(item.filename).find('addon.xml') == -1: continue info = str(item.filename).split('/') if not info[-2] in addonlist: addonlist.append(info[-2]) return addonlist def apkInstaller(apk, url): wiz.log(apk) wiz.log(url) if wiz.platform() == 'android': yes = DIALOG.yesno(ADDONTITLE, "[COLOR %s]Would you like to download and install:" % COLOR2, "[COLOR %s]%s[/COLOR]" % (COLOR1, apk), yeslabel="[B][COLOR springgreen]Download[/COLOR][/B]", nolabel="[B][COLOR red]Cancel[/COLOR][/B]") if not yes: wiz.LogNotify("[COLOR %s]%s[/COLOR]" % (COLOR1, ADDONTITLE), '[COLOR %s]ERROR: Install Cancelled[/COLOR]' % COLOR2); return display = apk if not os.path.exists(PACKAGES): os.makedirs(PACKAGES) if not wiz.workingURL(url) == True: wiz.LogNotify("[COLOR %s]%s[/COLOR]" % (COLOR1, ADDONTITLE), '[COLOR %s]APK Installer: Invalid Apk Url![/COLOR]' % COLOR2); return if KODIV >= 18: wiz.ebi('StartAndroidActivity(,android.intent.action.VIEW,,%s)' % (url)) else: DP.create(ADDONTITLE,'[COLOR %s][B]Downloading:[/B][/COLOR] [COLOR %s]%s[/COLOR][CR][CR]Please Wait!' % (COLOR2, COLOR1, display)) lib=os.path.join(PACKAGES, "%s.apk" % apk.replace('\\', '').replace('/', '').replace(':', '').replace('*', '').replace('?', '').replace('"', '').replace('<', '').replace('>', '').replace('|', '')) try: xbmcvfs.delete(lib) except: pass downloader.download(url, lib, DP, display) xbmc.sleep(100) DP.close() notify.apkInstaller(apk) wiz.ebi('StartAndroidActivity("","android.intent.action.VIEW","application/vnd.android.package-archive","file:'+lib+'")') else: wiz.LogNotify("[COLOR %s]%s[/COLOR]" % (COLOR1, ADDONTITLE), '[COLOR %s]ERROR: None Android Device[/COLOR]' % COLOR2) def romInstaller(name, url): myroms = transPath(BACKUPROMS) if myroms == '': if DIALOG.yesno(ADDONTITLE, "[COLOR %s]It seems that you do not have an extract location setup for Rom Packs" % COLOR2, "Would you like to set one?[/COLOR]", yeslabel="[COLOR springgreen][B]Set Location[/B][/COLOR]", nolabel="[COLOR red][B]Cancel Download[/B][/COLOR]"): wiz.openS() myroms = wiz.getS('rompath') if myroms == '': return yes = DIALOG.yesno(ADDONTITLE, "[COLOR %s]Are you sure you would like to download and extract [COLOR %s]%s[/COLOR] to:" % (COLOR2, COLOR1, name), "[COLOR %s]%s[/COLOR]" % (COLOR1, myroms), yeslabel="[B][COLOR springgreen]Download[/COLOR][/B]", nolabel="[B][COLOR red]Cancel[/COLOR][/B]") if not yes: wiz.LogNotify("[COLOR %s]%s[/COLOR]" % (COLOR1, ADDONTITLE), '[COLOR %s]ERROR: Install Cancelled[/COLOR]' % COLOR2); return display = name if not os.path.exists(PACKAGES): os.makedirs(PACKAGES) if not wiz.workingURL(url) == True: wiz.LogNotify("[COLOR %s]%s[/COLOR]" % (COLOR1, ADDONTITLE), '[COLOR %s]APK Installer: Invalid Rom Url![/COLOR]' % COLOR2); return DP.create(ADDONTITLE,'[COLOR %s][B]Downloading:[/B][/COLOR] [COLOR %s]%s[/COLOR][CR][CR]Please Wait!' % (COLOR2, COLOR1, display)) lib=os.path.join(PACKAGES, "%s.zip" % name.replace('\\', '').replace('/', '').replace(':', '').replace('*', '').replace('?', '').replace('"', '').replace('<', '').replace('>', '').replace('|', '')) try: xbmcvfs.delete(lib) except: pass downloader.download(url, lib, DP, display) xbmc.sleep(100) percent, errors, error = extract.all(lib,myroms,DP, title=display) try: xbmcvfs.delete(lib) except: pass wiz.LogNotify("[COLOR %s]%s[/COLOR]" % (COLOR1, ADDONTITLE), '[COLOR %s]Rom Pack Installed[/COLOR]' % COLOR2) DP.close() ########################### ###### Misc Functions###### ########################### def createMenu(type, add, name): if type == 'saveaddon': menu_items=[] add2 = quote_plus(add.lower().replace(' ', '')) add3 = add.replace('Debrid', 'Real Debrid') name2 = quote_plus(name.lower().replace(' ', '')) name = name.replace('url', 'URL Resolver') menu_items.append((THEME2 % name.title(), ' ')) menu_items.append((THEME3 % 'Save %s Data' % add3, 'RunPlugin(plugin://%s/?mode=save%s&name=%s)' % (ADDON_ID, add2, name2))) menu_items.append((THEME3 % 'Restore %s Data' % add3, 'RunPlugin(plugin://%s/?mode=restore%s&name=%s)' % (ADDON_ID, add2, name2))) menu_items.append((THEME3 % 'Clear %s Data' % add3, 'RunPlugin(plugin://%s/?mode=clear%s&name=%s)' % (ADDON_ID, add2, name2))) elif type == 'save' : menu_items=[] add2 = quote_plus(add.lower().replace(' ', '')) add3 = add.replace('Debrid', 'Real Debrid') name2 = quote_plus(name.lower().replace(' ', '')) name = name.replace('url', 'URL Resolver') menu_items.append((THEME2 % name.title(), ' ')) menu_items.append((THEME3 % 'Register %s' % add3, 'RunPlugin(plugin://%s/?mode=auth%s&name=%s)' % (ADDON_ID, add2, name2))) menu_items.append((THEME3 % 'Save %s Data' % add3, 'RunPlugin(plugin://%s/?mode=save%s&name=%s)' % (ADDON_ID, add2, name2))) menu_items.append((THEME3 % 'Restore %s Data' % add3, 'RunPlugin(plugin://%s/?mode=restore%s&name=%s)' % (ADDON_ID, add2, name2))) menu_items.append((THEME3 % 'Import %s Data' % add3, 'RunPlugin(plugin://%s/?mode=import%s&name=%s)' % (ADDON_ID, add2, name2))) menu_items.append((THEME3 % 'Clear Addon %s Data' % add3, 'RunPlugin(plugin://%s/?mode=addon%s&name=%s)' % (ADDON_ID, add2, name2))) elif type == 'install' : menu_items=[] name2 = quote_plus(name) menu_items.append((THEME2 % name, 'RunAddon(%s, ?mode=viewbuild&name=%s)' % (ADDON_ID, name2))) menu_items.append((THEME3 % 'Fresh Install', 'RunPlugin(plugin://%s/?mode=install&name=%s&url=fresh)' % (ADDON_ID, name2))) menu_items.append((THEME3 % 'Normal Install', 'RunPlugin(plugin://%s/?mode=install&name=%s&url=normal)' % (ADDON_ID, name2))) menu_items.append((THEME3 % 'Apply guiFix', 'RunPlugin(plugin://%s/?mode=install&name=%s&url=gui)' % (ADDON_ID, name2))) menu_items.append((THEME3 % 'Build Information', 'RunPlugin(plugin://%s/?mode=buildinfo&name=%s)' % (ADDON_ID, name2))) menu_items.append((THEME2 % '%s Settings' % ADDONTITLE, 'RunPlugin(plugin://%s/?mode=settings)' % ADDON_ID)) return menu_items def toggleCache(state): cachelist = ['includevideo', 'includeall', 'includegaia', 'includethecrew', 'includeseren'] titlelist = ['Include Video Addons', 'Include All Addons', 'Include Gaia', 'Include The Crew', 'Include Homelander', 'Include Moria', 'Include Seren'] if state in ['true', 'false']: for item in cachelist: wiz.setS(item, state) else: if not state in ['includevideo', 'includeall'] and wiz.getS('includeall') == 'true': try: item = titlelist[cachelist.index(state)] DIALOG.ok(ADDONTITLE, "[COLOR %s]You will need to turn off [COLOR %s]Include All Addons[/COLOR] to disable[/COLOR] [COLOR %s]%s[/COLOR]" % (COLOR2, COLOR1, COLOR1, item)) except: wiz.LogNotify("[COLOR %s]Toggle Cache[/COLOR]" % COLOR1, "[COLOR %s]Invalid id: %s[/COLOR]" % (COLOR2, state)) else: new = 'true' if wiz.getS(state) == 'false' else 'false' wiz.setS(state, new) def playVideo(url): if 'watch?v=' in url: a, b = url.split('?') find = b.split('&') for item in find: if item.startswith('v='): url = item[2:] break else: continue elif 'embed' in url or 'youtu.be' in url: a = url.split('/') if len(a[-1]) > 5: url = a[-1] elif len(a[-2]) > 5: url = a[-2] wiz.log("YouTube URL: %s" % url) if wiz.getCond('System.HasAddon(plugin.video.youtube)') == 1: url = 'plugin://plugin.video.youtube/play/?video_id=%s' % url xbmc.Player().play(url) xbmc.sleep(2000) if xbmc.Player().isPlayingVideo() == 0: yt.PlayVideo(url) def viewLogFile(): mainlog = wiz.Grab_Log(True) oldlog = wiz.Grab_Log(True, True) which = 0; logtype = mainlog if not oldlog == False and not mainlog == False: which = DIALOG.select(ADDONTITLE, ["View %s" % mainlog.replace(LOG, ""), "View %s" % oldlog.replace(LOG, "")]) if which == -1: wiz.LogNotify('[COLOR %s]View Log[/COLOR]' % COLOR1, '[COLOR %s]View Log Cancelled![/COLOR]' % COLOR2); return elif mainlog == False and oldlog == False: wiz.LogNotify('[COLOR %s]View Log[/COLOR]' % COLOR1, '[COLOR %s]No Log File Found![/COLOR]' % COLOR2) return elif not mainlog == False: which = 0 elif not oldlog == False: which = 1 logtype = mainlog if which == 0 else oldlog msg = wiz.Grab_Log(False) if which == 0 else wiz.Grab_Log(False, True) wiz.TextBox("%s - %s" % (ADDONTITLE, logtype), msg) def errorList(file): errors = [] a=xbmcvfs.File(file).read() b=a.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 errorChecking(log=None, count=None, last=None): errors = []; error1 = []; error2 = []; if log == None: curr = wiz.Grab_Log(True, False) old = wiz.Grab_Log(True, True) if old == False and curr == False: if count == None: wiz.LogNotify('[COLOR %s]View Error Log[/COLOR]' % COLOR1, '[COLOR %s]No Log File Found![/COLOR]' % COLOR2) return else: return 0 if not curr == False: error1 = errorList(curr) if not old == False: error2 = errorList(old) if len(error2) > 0: for item in error2: errors = [item] + errors if len(error1) > 0: for item in error1: errors = [item] + errors else: error1 = errorList(log) if len(error1) > 0: for item in error1: errors = [item] + errors if not count == None: return len(errors) elif len(errors) > 0: if last == None: i = 0; string = '' for item in errors: i += 1 string += "[B][COLOR red]ERROR NUMBER %s:[/B][/COLOR]%s\n" % (str(i), item.replace(HOME, '/').replace(' ', '')) else: string = "[B][COLOR red]Last Error in Log:[/B][/COLOR]%s\n" % (errors[0].replace(HOME, '/').replace(' ', '')) wiz.TextBox("%s: Errors in Log" % ADDONTITLE, string) else: wiz.LogNotify('[COLOR %s]View Error Log[/COLOR]' % COLOR1, '[COLOR %s]No Errors Found![/COLOR]' % COLOR2) ACTION_PREVIOUS_MENU = 10 ## ESC action ACTION_NAV_BACK = 92 ## Backspace action ACTION_MOVE_LEFT = 1 ## Left arrow key ACTION_MOVE_RIGHT = 2 ## Right arrow key ACTION_MOVE_UP = 3 ## Up arrow key ACTION_MOVE_DOWN = 4 ## Down arrow key ACTION_MOUSE_WHEEL_UP = 104 ## Mouse wheel up ACTION_MOUSE_WHEEL_DOWN = 105 ## Mouse wheel down ACTION_MOVE_MOUSE = 107 ## Down arrow key ACTION_SELECT_ITEM = 7 ## Number Pad Enter ACTION_BACKSPACE = 110 ## ? ACTION_MOUSE_LEFT_CLICK = 100 ACTION_MOUSE_LONG_CLICK = 108 def LogViewer(default=None): class LogViewer(xbmcgui.WindowXMLDialog): def __init__(self,*args,**kwargs): self.default = kwargs['default'] def onInit(self): self.title = 101 self.msg = 102 self.scrollbar = 103 self.upload = 201 self.kodi = 202 self.kodiold = 203 self.wizard = 204 self.okbutton = 205 f = open(self.default, "rb") self.logmsg = f.read().decode('utf-8', errors="ignore") f.close() self.titlemsg = "%s: %s" % (ADDONTITLE, self.default.replace(LOG, '').replace(ADDONDATA, '')) self.showdialog() def showdialog(self): self.getControl(self.title).setLabel(self.titlemsg) self.getControl(self.msg).setText(wiz.highlightText(self.logmsg)) self.setFocusId(self.scrollbar) def onClick(self, controlId): if controlId == self.okbutton: self.close() elif controlId == self.upload: self.close(); uploadLog.Main() elif controlId == self.kodi: newmsg = wiz.Grab_Log(False) filename = wiz.Grab_Log(True) if newmsg == False: self.titlemsg = "%s: View Log Error" % ADDONTITLE self.getControl(self.msg).setText("Log File Does Not Exists!") else: self.titlemsg = "%s: %s" % (ADDONTITLE, filename.replace(LOG, '')) self.getControl(self.title).setLabel(self.titlemsg) self.getControl(self.msg).setText(wiz.highlightText(newmsg)) self.setFocusId(self.scrollbar) elif controlId == self.kodiold: newmsg = wiz.Grab_Log(False, True) filename = wiz.Grab_Log(True, True) if newmsg == False: self.titlemsg = "%s: View Log Error" % ADDONTITLE self.getControl(self.msg).setText("Log File Does Not Exists!") else: self.titlemsg = "%s: %s" % (ADDONTITLE, filename.replace(LOG, '')) self.getControl(self.title).setLabel(self.titlemsg) self.getControl(self.msg).setText(wiz.highlightText(newmsg)) self.setFocusId(self.scrollbar) elif controlId == self.wizard: newmsg = wiz.Grab_Log(False, False, True) filename = wiz.Grab_Log(True, False, True) if newmsg == False: self.titlemsg = "%s: View Log Error" % ADDONTITLE self.getControl(self.msg).setText("Log File Does Not Exists!") else: self.titlemsg = "%s: %s" % (ADDONTITLE, filename.replace(ADDONDATA, '')) self.getControl(self.title).setLabel(self.titlemsg) self.getControl(self.msg).setText(wiz.highlightText(newmsg)) self.setFocusId(self.scrollbar) def onAction(self, action): if action == ACTION_PREVIOUS_MENU: self.close() elif action == ACTION_NAV_BACK: self.close() if default == None: default = wiz.Grab_Log(True) lv = LogViewer( "LogViewer.xml" , ADDON.getAddonInfo('path'), 'DefaultSkin', default=default) lv.doModal() del lv def removeAddon(addon, name, over=False): if not over == False: yes = 1 else: yes = DIALOG.yesno(ADDONTITLE, '[COLOR %s]Are you sure you want to delete the addon:'% COLOR2, 'Name: [COLOR %s]%s[/COLOR]' % (COLOR1, name), 'ID: [COLOR %s]%s[/COLOR][/COLOR]' % (COLOR1, addon), yeslabel='[B][COLOR springgreen]Remove Addon[/COLOR][/B]', nolabel='[B][COLOR red]Don\'t Remove[/COLOR][/B]') if yes == 1: folder = os.path.join(ADDONS, addon) wiz.log("Removing Addon %s" % addon) wiz.cleanHouse(folder) xbmc.sleep(200) try: shutil.rmtree(folder) except Exception as e: wiz.log("Error removing %s" % addon, LOGNOTICE) removeAddonData(addon, name, over) if over == False: wiz.LogNotify("[COLOR %s]%s[/COLOR]" % (COLOR1, ADDONTITLE), "[COLOR %s]%s Removed[/COLOR]" % (COLOR2, name)) def removeAddonData(addon, name=None, over=False): if addon == 'all': if DIALOG.yesno(ADDONTITLE, '[COLOR %s]Would you like to remove [COLOR %s]ALL[/COLOR] addon data stored in you Userdata folder?[/COLOR]' % (COLOR2, COLOR1), yeslabel='[B][COLOR springgreen]Remove Data[/COLOR][/B]', nolabel='[B][COLOR red]Don\'t Remove[/COLOR][/B]'): wiz.cleanHouse(ADDOND) else: wiz.LogNotify('[COLOR %s]Remove Addon Data[/COLOR]' % COLOR1, '[COLOR %s]Cancelled![/COLOR]' % COLOR2) elif addon == 'uninstalled': if DIALOG.yesno(ADDONTITLE, '[COLOR %s]Would you like to remove [COLOR %s]ALL[/COLOR] addon data stored in you Userdata folder for uninstalled addons?[/COLOR]' % (COLOR2, COLOR1), yeslabel='[B][COLOR springgreen]Remove Data[/COLOR][/B]', nolabel='[B][COLOR red]Don\'t Remove[/COLOR][/B]'): total = 0 for folder in glob.glob(os.path.join(ADDOND, '*')): foldername = folder.replace(ADDOND, '').replace('\\', '').replace('/', '') if foldername in EXCLUDES: pass elif os.path.exists(os.path.join(ADDONS, foldername)): pass else: wiz.cleanHouse(folder); total += 1; wiz.log(folder); shutil.rmtree(folder) wiz.LogNotify('[COLOR %s]Clean up Uninstalled[/COLOR]' % COLOR1, '[COLOR %s]%s Folders(s) Removed[/COLOR]' % (COLOR2, total)) else: wiz.LogNotify('[COLOR %s]Remove Addon Data[/COLOR]' % COLOR1, '[COLOR %s]Cancelled![/COLOR]' % COLOR2) elif addon == 'empty': if DIALOG.yesno(ADDONTITLE, '[COLOR %s]Would you like to remove [COLOR %s]ALL[/COLOR] empty addon data folders in you Userdata folder?[/COLOR]' % (COLOR2, COLOR1), yeslabel='[B][COLOR springgreen]Remove Data[/COLOR][/B]', nolabel='[B][COLOR red]Don\'t Remove[/COLOR][/B]'): total = wiz.emptyfolder(ADDOND) wiz.LogNotify('[COLOR %s]Remove Empty Folders[/COLOR]' % COLOR1, '[COLOR %s]%s Folders(s) Removed[/COLOR]' % (COLOR2, total)) else: wiz.LogNotify('[COLOR %s]Remove Empty Folders[/COLOR]' % COLOR1, '[COLOR %s]Cancelled![/COLOR]' % COLOR2) else: addon_data = os.path.join(USERDATA, 'addon_data', addon) if addon in EXCLUDES: wiz.LogNotify("[COLOR %s]Protected Plugin[/COLOR]" % COLOR1, "[COLOR %s]Not allowed to remove Addon_Data[/COLOR]" % COLOR2) elif os.path.exists(addon_data): if DIALOG.yesno(ADDONTITLE, ('[COLOR %s]Would you also like to remove the addon data for:[/COLOR]' % COLOR2)+"[CR]"+('[COLOR %s]%s[/COLOR]' % (COLOR1, addon)), yeslabel='[B][COLOR springgreen]Remove Data[/COLOR][/B]', nolabel='[B][COLOR red]Don\'t Remove[/COLOR][/B]'): wiz.cleanHouse(addon_data) try: shutil.rmtree(addon_data) except: wiz.log("Error deleting: %s" % addon_data) else: wiz.log('Addon data for %s was not removed' % addon) wiz.refresh() def restoreit(type): if type == 'build': x = freshStart('restore') if x == False: wiz.LogNotify("[COLOR %s]%s[/COLOR]" % (COLOR1, ADDONTITLE), "[COLOR %s]Local Restore Cancelled[/COLOR]" % COLOR2); return if not wiz.currSkin() in ['skin.confluence', 'skin.estuary']: wiz.skinToDefault('Restore Backup') wiz.restoreLocal(type) def restoreextit(type): if type == 'build': x = freshStart('restore') if x == False: wiz.LogNotify("[COLOR %s]%s[/COLOR]" % (COLOR1, ADDONTITLE), "[COLOR %s]External Restore Cancelled[/COLOR]" % COLOR2); return wiz.restoreExternal(type) def buildInfo(name): if wiz.workingURL(BUILDFILE) == True: if wiz.checkBuild(name, 'url'): name, version, url, minor, gui, kodi, theme, icon, fanart, preview, adult, info, description = wiz.checkBuild(name, 'all') adult = 'Yes' if adult.lower() == 'yes' else 'No' extend = False if not info == "http://": try: tname, extracted, zipsize, skin, created, programs, video, music, picture, repos, scripts = wiz.checkInfo(info) extend = True except: extend = False if extend == True: msg = "[COLOR %s]Build Name:[/COLOR] [COLOR %s]%s[/COLOR][CR][CR]" % (COLOR2, COLOR1, name) msg += "[COLOR %s]Build Version:[/COLOR] v[COLOR %s]%s[/COLOR][CR][CR]" % (COLOR2, COLOR1, version) msg += "[COLOR %s]Latest Update:[/COLOR] [COLOR %s]%s[/COLOR][CR][CR]" % (COLOR2, COLOR1, created) if not theme == "http://": themecount = wiz.themeCount(name, False) msg += "[COLOR %s]Build Theme(s):[/COLOR] [COLOR %s]%s[/COLOR][CR][CR]" % (COLOR2, COLOR1, ', '.join(themecount)) msg += "[COLOR %s]Kodi Version:[/COLOR] [COLOR %s]%s[/COLOR][CR][CR]" % (COLOR2, COLOR1, kodi) msg += "[COLOR %s]Extracted Size:[/COLOR] [COLOR %s]%s[/COLOR][CR][CR]" % (COLOR2, COLOR1, wiz.convertSize(int(float(extracted)))) msg += "[COLOR %s]Zip Size:[/COLOR] [COLOR %s]%s[/COLOR][CR][CR]" % (COLOR2, COLOR1, wiz.convertSize(int(float(zipsize)))) msg += "[COLOR %s]Skin Name:[/COLOR] [COLOR %s]%s[/COLOR][CR][CR]" % (COLOR2, COLOR1, skin) msg += "[COLOR %s]Adult Content:[/COLOR] [COLOR %s]%s[/COLOR][CR][CR]" % (COLOR2, COLOR1, adult) msg += "[COLOR %s]Description:[/COLOR] [COLOR %s]%s[/COLOR][CR][CR]" % (COLOR2, COLOR1, description) msg += "[COLOR %s]Programs:[/COLOR] [COLOR %s]%s[/COLOR][CR][CR]" % (COLOR2, COLOR1, programs) msg += "[COLOR %s]Video:[/COLOR] [COLOR %s]%s[/COLOR][CR][CR]" % (COLOR2, COLOR1, video) msg += "[COLOR %s]Music:[/COLOR] [COLOR %s]%s[/COLOR][CR][CR]" % (COLOR2, COLOR1, music) msg += "[COLOR %s]Pictures:[/COLOR] [COLOR %s]%s[/COLOR][CR][CR]" % (COLOR2, COLOR1, picture) msg += "[COLOR %s]Repositories:[/COLOR] [COLOR %s]%s[/COLOR][CR][CR]" % (COLOR2, COLOR1, repos) msg += "[COLOR %s]Scripts:[/COLOR] [COLOR %s]%s[/COLOR]" % (COLOR2, COLOR1, scripts) else: msg = "[COLOR %s]Build Name:[/COLOR] [COLOR %s]%s[/COLOR][CR]" % (COLOR2, COLOR1, name) msg += "[COLOR %s]Build Version:[/COLOR] [COLOR %s]%s[/COLOR][CR]" % (COLOR2, COLOR1, version) if not theme == "http://": themecount = wiz.themeCount(name, False) msg += "[COLOR %s]Build Theme(s):[/COLOR] [COLOR %s]%s[/COLOR][CR]" % (COLOR2, COLOR1, ', '.join(themecount)) msg += "[COLOR %s]Kodi Version:[/COLOR] [COLOR %s]%s[/COLOR][CR]" % (COLOR2, COLOR1, kodi) msg += "[COLOR %s]Adult Content:[/COLOR] [COLOR %s]%s[/COLOR][CR]" % (COLOR2, COLOR1, adult) msg += "[COLOR %s]Description:[/COLOR] [COLOR %s]%s[/COLOR][CR]" % (COLOR2, COLOR1, description) wiz.TextBox(ADDONTITLE, msg) else: wiz.log("Invalid Build Name!") else: wiz.log("Build text file not working: %s" % WORKINGURL) def buildVideo(name): if wiz.workingURL(BUILDFILE) == True: videofile = wiz.checkBuild(name, 'preview') if videofile and not videofile == 'http://': playVideo(videofile) else: wiz.log("[%s]Unable to find url for video preview" % name) else: wiz.log("Build text file not working: %s" % WORKINGURL) def dependsList(plugin): addonxml = os.path.join(ADDONS, plugin, 'addon.xml') if os.path.exists(addonxml): source = xbmcvfs.File(addonxml); link = source.read(); source.close(); match = wiz.parseDOM(link, 'import', ret='addon') items = [] for depends in match: if not 'xbmc.python' in depends: items.append(depends) return items return [] def manageSaveData(do): if do == 'import': TEMP = os.path.join(ADDONDATA, 'temp') if not os.path.exists(TEMP): os.makedirs(TEMP) source = DIALOG.browse(1, '[COLOR %s]Select the location of the SaveData.zip[/COLOR]' % COLOR2, 'files', '.zip', False, False, HOME) if not source.endswith('.zip'): wiz.LogNotify("[COLOR %s]%s[/COLOR]" % (COLOR1, ADDONTITLE), "[COLOR %s]Import Data Error![/COLOR]" % (COLOR2)) return source = transPath(source) tempfile = transPath(os.path.join(MYBUILDS, 'SaveData.zip')) if not tempfile == source: goto = xbmcvfs.copy(source, tempfile) if extract.all(transPath(tempfile), TEMP) == False: wiz.log("Error trying to extract the zip file!") wiz.LogNotify("[COLOR %s]%s[/COLOR]" % (COLOR1, ADDONTITLE), "[COLOR %s]Import Data Error![/COLOR]" % (COLOR2)) return trakt = os.path.join(TEMP, 'trakt') login = os.path.join(TEMP, 'login') debrid = os.path.join(TEMP, 'debrid') super = os.path.join(TEMP, 'plugin.program.super.favourites') xmls = os.path.join(TEMP, 'xmls') x = 0 overwrite = DIALOG.yesno(ADDONTITLE, "[COLOR %s]Would you rather we overwrite all Save Data files or ask you for each file being imported?[/COLOR]" % (COLOR2), yeslabel="[B][COLOR springgreen]Overwrite All[/COLOR][/B]", nolabel="[B][COLOR red]No Ask[/COLOR][/B]") if os.path.exists(trakt): x += 1 files = os.listdir(trakt) if not os.path.exists(traktit.TRAKTFOLD): os.makedirs(traktit.TRAKTFOLD) for item in files: old = os.path.join(traktit.TRAKTFOLD, item) temp = os.path.join(trakt, item) if os.path.exists(old): if overwrite == 1: xbmcvfs.delete(old) else: if not DIALOG.yesno(ADDONTITLE, "[COLOR %s]Would you like replace the current [COLOR %s]%s[/COLOR] file?" % (COLOR2, COLOR1, item), yeslabel="[B][COLOR springgreen]Yes Replace[/COLOR][/B]", nolabel="[B][COLOR red]No Skip[/COLOR][/B]"): continue else: xbmcvfs.delete(old) shutil.copy(temp, old) traktit.importlist('all') traktit.traktIt('restore', 'all') if os.path.exists(login): x += 1 files = os.listdir(login) if not os.path.exists(loginit.LOGINFOLD): os.makedirs(loginit.LOGINFOLD) for item in files: old = os.path.join(loginit.LOGINFOLD, item) temp = os.path.join(login, item) if os.path.exists(old): if overwrite == 1: xbmcvfs.delete(old) else: if not DIALOG.yesno(ADDONTITLE, "[COLOR %s]Would you like replace the current [COLOR %s]%s[/COLOR] file?" % (COLOR2, COLOR1, item), yeslabel="[B][COLOR springgreen]Yes Replace[/COLOR][/B]", nolabel="[B][COLOR red]No Skip[/COLOR][/B]"): continue else: xbmcvfs.delete(old) shutil.copy(temp, old) loginit.importlist('all') loginit.loginIt('restore', 'all') if os.path.exists(debrid): x += 1 files = os.listdir(debrid) if not os.path.exists(debridit.REALFOLD): os.makedirs(debridit.REALFOLD) for item in files: old = os.path.join(debridit.REALFOLD, item) temp = os.path.join(debrid, item) if os.path.exists(old): if overwrite == 1: xbmcvfs.delete(old) else: if not DIALOG.yesno(ADDONTITLE, "[COLOR %s]Would you like replace the current [COLOR %s]%s[/COLOR] file?" % (COLOR2, COLOR1, item), yeslabel="[B][COLOR springgreen]Yes Replace[/COLOR][/B]", nolabel="[B][COLOR red]No Skip[/COLOR][/B]"): continue else: xbmcvfs.delete(old) shutil.copy(temp, old) debridit.importlist('all') debridit.debridIt('restore', 'all') if os.path.exists(xmls): x += 1 files = ['advancedsettings.xml', 'sources.xml', 'favourites.xml', 'profiles.xml'] for item in files: old = os.path.join(USERDATA, item) new = os.path.join(xmls, item) if not os.path.exists(new): continue if os.path.exists(old): if not overwrite == 1: if not DIALOG.yesno(ADDONTITLE, "[COLOR %s]Would you like replace the current [COLOR %s]%s[/COLOR] file?" % (COLOR2, COLOR1, item), yeslabel="[B][COLOR springgreen]Yes Replace[/COLOR][/B]", nolabel="[B][COLOR red]No Skip[/COLOR][/B]"): continue xbmcvfs.delete(old) shutil.copy(new, old) if os.path.exists(super): x += 1 old = os.path.join(ADDOND, 'plugin.program.super.favourites') if os.path.exists(old): cont = DIALOG.yesno(ADDONTITLE, "[COLOR %s]Would you like replace the current [COLOR %s]Super Favourites[/COLOR] addon_data folder with the new one?" % (COLOR2, COLOR1), yeslabel="[B][COLOR springgreen]Yes Replace[/COLOR][/B]", nolabel="[B][COLOR red]No Skip[/COLOR][/B]") else: cont = 1 if cont == 1: wiz.cleanHouse(old) wiz.removeFolder(old) shutil.copytree(super, old) wiz.cleanHouse(TEMP) wiz.removeFolder(TEMP) if not tempfile == source: xbmcvfs.delete(tempfile) if x == 0: wiz.LogNotify("[COLOR %s]%s[/COLOR]" % (COLOR1, ADDONTITLE), "[COLOR %s]Save Data Import Failed[/COLOR]" % COLOR2) else: wiz.LogNotify("[COLOR %s]%s[/COLOR]" % (COLOR1, ADDONTITLE), "[COLOR %s]Save Data Import Complete[/COLOR]" % COLOR2) elif do == 'export': mybuilds = transPath(MYBUILDS) dir = [traktit.TRAKTFOLD, debridit.REALFOLD, loginit.LOGINFOLD] xmls = ['advancedsettings.xml', 'sources.xml', 'favourites.xml', 'profiles.xml'] keepx = [KEEPADVANCED, KEEPSOURCES, KEEPFAVS, KEEPPROFILES, KEEPPLAYERCORE] traktit.traktIt('update', 'all') loginit.loginIt('update', 'all') debridit.debridIt('update', 'all') source = DIALOG.browse(3, '[COLOR %s]Select where you wish to export the savedata zip?[/COLOR]' % COLOR2, 'files', '', False, True, HOME) source = transPath(source) tempzip = os.path.join(mybuilds, 'SaveData.zip') superfold = os.path.join(ADDOND, 'plugin.program.super.favourites') zipf = zipfile.ZipFile(tempzip, mode='w') for fold in dir: if os.path.exists(fold): files = os.listdir(fold) for file in files: fn = os.path.join(fold, file) zipf.write(fn, fn[len(ADDONDATA):], zipfile.ZIP_DEFLATED) if KEEPSUPER == 'true' and os.path.exists(superfold): for base, dirs, files in os.walk(superfold): for file in files: fn = os.path.join(base, file) zipf.write(fn, fn[len(ADDOND):], zipfile.ZIP_DEFLATED) for item in xmls: if keepx[xmls.index(item)] == 'true' and os.path.exists(os.path.join(USERDATA, item)): zipf.write(os.path.join(USERDATA, item), os.path.join('xmls', item), zipfile.ZIP_DEFLATED) zipf.close() if source == mybuilds: DIALOG.ok(ADDONTITLE, "[COLOR %s]Save data has been backed up to:[/COLOR][CR][COLOR %s]%s[/COLOR]" % (COLOR2, COLOR1, tempzip)) else: try: xbmcvfs.copy(tempzip, os.path.join(source, 'SaveData.zip')) DIALOG.ok(ADDONTITLE, "[COLOR %s]Save data has been backed up to:[/COLOR][CR][COLOR %s]%s[/COLOR]" % (COLOR2, COLOR1, os.path.join(source, 'SaveData.zip'))) except: DIALOG.ok(ADDONTITLE, "[COLOR %s]Save data has been backed up to:[/COLOR][CR][COLOR %s]%s[/COLOR]" % (COLOR2, COLOR1, tempzip)) ########################### ###### Fresh Install ###### ########################### def freshStart(install=None, over=False): if KEEPTRAKT == 'true': traktit.autoUpdate('all') wiz.setS('traktlastsave', str(THREEDAYS)) if KEEPREAL == 'true': debridit.autoUpdate('all') wiz.setS('debridlastsave', str(THREEDAYS)) if KEEPLOGIN == 'true': loginit.autoUpdate('all') wiz.setS('loginlastsave', str(THREEDAYS)) if over == True: yes_pressed = 1 elif install == 'restore': yes_pressed=DIALOG.yesno(ADDONTITLE, "[COLOR %s]Do you want to reset Kodi to its original settings before installing local backup?[/COLOR]"% COLOR2, nolabel = '[B][COLOR red]No, cancel [/COLOR] [/B]', yeslabel = '[B] [COLOR springgreen]Continue[/COLOR][/B]') elif install: yes_pressed=DIALOG.yesno(ADDONTITLE, "[COLOR %s]Do you want to reset [CR] Kodi to its original settings before installing [COLOR %s]%s[/COLOR]?"% ( COLOR2, COLOR1, install), nolabel = '[B] [COLOR red]No, cancel [/COLOR][/B]', yeslabel = '[B] [COLOR springgreen] Continue [/COLOR] [/B]' ) else: yes_pressed=DIALOG.yesno(ADDONTITLE, "[COLOR %s]Do you want to reset Kodi to its original settings? [/COLOR]"% COLOR2, nolabel = '[B][COLOR red]No, cancel [/COLOR] [/B] ', yeslabel =' [B] [COLOR springgreen] Continued [/COLOR][/B] ') if yes_pressed: if not wiz.currSkin() in ['skin.confluence', 'skin.estuary']: swap = wiz.skinToDefault('Fresh Install') if swap == False: return False xbmc.sleep(1000) if not wiz.currSkin() in ['skin.confluence', 'skin.estuary']: wiz.LogNotify("[COLOR %s]%s[/COLOR]" % (COLOR1, ADDONTITLE), '[COLOR %s]Fresh Install: Skin Swap Failed![/COLOR]' % COLOR2) return wiz.addonUpdates('set') xbmcPath=os.path.abspath(HOME) DP.create(ADDONTITLE,"[COLOR %s]Calculating files and folders Please Wait![/COLOR]" % COLOR2) total_files = sum([len(files) for r, d, files in os.walk(xbmcPath)]); del_file = 0 DP.update(0, "[COLOR %s]Gathering Excludes list." % COLOR2) EXCLUDES.append('My_Builds') EXCLUDES.append('archive_cache') if KEEPREPOS == 'true': repos = glob.glob(os.path.join(ADDONS, 'repo*/')) for item in repos: repofolder = os.path.split(item[:-1])[1] if not repofolder == EXCLUDES: EXCLUDES.append(repofolder) if KEEPSUPER == 'true': EXCLUDES.append('plugin.program.super.favourites') if KEEPWHITELIST == 'true': pvr = '' whitelist = wiz.whiteList('read') if len(whitelist) > 0: for item in whitelist: try: name, id, fold = item except: pass if fold.startswith('pvr'): pvr = id depends = dependsList(fold) for plug in depends: if not plug in EXCLUDES: EXCLUDES.append(plug) depends2 = dependsList(plug) for plug2 in depends2: if not plug2 in EXCLUDES: EXCLUDES.append(plug2) if not fold in EXCLUDES: EXCLUDES.append(fold) if not pvr == '': wiz.setS('pvrclient', fold) if wiz.getS('pvrclient') == '': for item in EXCLUDES: if item.startswith('pvr'): wiz.setS('pvrclient', item) DP.update(0, "[COLOR %s]Clearing out files and folders:" % COLOR2) latestAddonDB = wiz.latestDB('Addons') for root, dirs, files in os.walk(xbmcPath,topdown=True): dirs[:] = [d for d in dirs if d not in EXCLUDES] for name in files: del_file += 1 fold = root.replace('/','\\').split('\\') x = len(fold)-1 if name == 'sources.xml' and fold[-1] == 'userdata' and KEEPSOURCES == 'true': wiz.log("Keep Sources: %s" % os.path.join(root, name), LOGNOTICE) elif name == 'favourites.xml' and fold[-1] == 'userdata' and KEEPFAVS == 'true': wiz.log("Keep Favourites: %s" % os.path.join(root, name), LOGNOTICE) elif name == 'profiles.xml' and fold[-1] == 'userdata' and KEEPPROFILES == 'true': wiz.log("Keep Profiles: %s" % os.path.join(root, name), LOGNOTICE) elif name == 'playercorefactory.xml' and fold[-1] == 'userdata' and KEEPPLAYERCORE == 'true': wiz.log("Keep playercorefactory.xml: %s" % os.path.join(root, name), LOGNOTICE) elif name == 'advancedsettings.xml' and fold[-1] == 'userdata' and KEEPADVANCED == 'true': wiz.log("Keep Advanced Settings: %s" % os.path.join(root, name), LOGNOTICE) elif name in LOGFILES: wiz.log("Keep Log File: %s" % name, LOGNOTICE) elif name.endswith('.db'): try: if name == latestAddonDB and KODIV >= 17: wiz.log("Ignoring %s on v%s" % (name, KODIV), LOGNOTICE) else: xbmcvfs.delete(os.path.join(root,name)) except Exception as e: if not name.startswith('Textures13'): wiz.log('Failed to delete, Purging DB', LOGNOTICE) wiz.log("-> %s" % (str(e)), LOGNOTICE) wiz.purgeDb(os.path.join(root,name)) else: DP.update(int(wiz.percentage(del_file, total_files)), '[COLOR %s]File: [/COLOR][COLOR %s]%s[/COLOR]' % (COLOR2, COLOR1, name)) try: xbmcvfs.delete(os.path.join(root,name)) except Exception as e: wiz.log("Error removing %s" % os.path.join(root, name), LOGNOTICE) wiz.log("-> / %s" % (str(e)), LOGNOTICE) if DP.iscanceled(): DP.close() wiz.LogNotify("[COLOR %s]%s[/COLOR]" % (COLOR1, ADDONTITLE), "[COLOR %s]Fresh Start Cancelled[/COLOR]" % COLOR2) return False for root, dirs, files in os.walk(xbmcPath,topdown=True): dirs[:] = [d for d in dirs if d not in EXCLUDES] for name in dirs: DP.update(100, 'Cleaning Up Empty Folder: [COLOR%s]%s[/COLOR]' % (COLOR1, name)) if name not in ["Database","userdata","temp","addons","addon_data"]: shutil.rmtree(os.path.join(root,name),ignore_errors=True, onerror=None) if DP.iscanceled(): DP.close() wiz.LogNotify("[COLOR %s]%s[/COLOR]" % (COLOR1, ADDONTITLE), "[COLOR %s]Fresh Start Cancelled[/COLOR]" % COLOR2) return False DP.close() wiz.clearS('build') if over == True: return True elif install == 'restore': return True elif install: buildWizard(install, 'normal', over=True) else: if INSTALLMETHOD == 1: todo = 1 elif INSTALLMETHOD == 2: todo = 0 else: todo = DIALOG.yesno(ADDONTITLE, "[COLOR %s]Would you like to [COLOR %s]Force close[/COLOR] kodi or [COLOR %s]Reload Profile[/COLOR]?[/COLOR]" % (COLOR2, COLOR1, COLOR1), yeslabel="[B][COLOR red]Reload Profile[/COLOR][/B]", nolabel="[B][COLOR springgreen]Force Close[/COLOR][/B]") if todo == 1: wiz.reloadFix('fresh') else: wiz.addonUpdates('reset'); wiz.killxbmc(True) else: if not install == 'restore': wiz.LogNotify("[COLOR %s]%s[/COLOR]" % (COLOR1, ADDONTITLE), '[COLOR %s]Fresh Install: Cancelled![/COLOR]' % COLOR2) wiz.refresh() ############################# ###DELETE CACHE############## ####THANKS GUYS @ NaN ####### def clearCache(): if DIALOG.yesno(ADDONTITLE, '[COLOR %s]Would you like to clear cache?[/COLOR]' % COLOR2, nolabel='[B][COLOR red]No, Cancel[/COLOR][/B]', yeslabel='[B][COLOR springgreen]Clear Cache[/COLOR][/B]'): wiz.clearCache() def clearFunctionCache(): if DIALOG.yesno(ADDONTITLE, '[COLOR %s]Would you like to clear resolver function caches?[/COLOR]' % COLOR2, nolabel='[B][COLOR red]No, Cancel[/COLOR][/B]', yeslabel='[B][COLOR springgreen]Clear Cache[/COLOR][/B]'): wiz.clearFunctionCache() def clearArchive(): if DIALOG.yesno(ADDONTITLE, '[COLOR %s]Would you like to clear the \'Archive_Cache\' folder?[/COLOR]' % COLOR2, nolabel='[B][COLOR red]No, Cancel[/COLOR][/B]', yeslabel='[B][COLOR springgreen]Yes Clear[/COLOR][/B]'): wiz.clearArchive() def totalClean(): if DIALOG.yesno(ADDONTITLE, '[COLOR %s]Would you like to clear cache, packages and thumbnails?[/COLOR]' % COLOR2, nolabel='[B][COLOR red]Cancel Process[/COLOR][/B]',yeslabel='[B][COLOR springgreen]Clean All[/COLOR][/B]'): wiz.clearCache() wiz.clearFunctionCache() wiz.clearPackages('total') clearThumb('total') def clearThumb(type=None): latest = wiz.latestDB('Textures') if not type == None: choice = 1 else: choice = DIALOG.yesno(ADDONTITLE, '[COLOR %s]Would you like to delete the %s and Thumbnails folder? They will repopulate on the next startup[/COLOR]' % (COLOR2, latest), nolabel='[B][COLOR red]Don\'t Delete[/COLOR][/B]', yeslabel='[B][COLOR springgreen]Delete Thumbs[/COLOR][/B]') if choice == 1: try: wiz.removeFile(os.path.join(DATABASE, latest)) except: wiz.log('Failed to delete, Purging DB.'); wiz.purgeDb(latest) wiz.removeFolder(THUMBS) #if not type == 'total': wiz.killxbmc() else: wiz.log('Clear thumbnames cancelled') wiz.redoThumbs() def purgeDb(): DB = []; display = [] for dirpath, dirnames, files in os.walk(HOME): for f in fnmatch.filter(files, '*.db'): if f != 'Thumbs.db': found = os.path.join(dirpath, f) DB.append(found) dir = found.replace('\\', '/').split('/') display.append('(%s) %s' % (dir[len(dir)-2], dir[len(dir)-1])) if KODIV >= 16: choice = DIALOG.multiselect("[COLOR %s]Select DB File to Purge[/COLOR]" % COLOR2, display) if choice == None: wiz.LogNotify("[COLOR %s]Purge Database[/COLOR]" % COLOR1, "[COLOR %s]Cancelled[/COLOR]" % COLOR2) elif len(choice) == 0: wiz.LogNotify("[COLOR %s]Purge Database[/COLOR]" % COLOR1, "[COLOR %s]Cancelled[/COLOR]" % COLOR2) else: for purge in choice: wiz.purgeDb(DB[purge]) else: choice = DIALOG.select("[COLOR %s]Select DB File to Purge[/COLOR]" % COLOR2, display) if choice == -1: wiz.LogNotify("[COLOR %s]Purge Database[/COLOR]" % COLOR1, "[COLOR %s]Cancelled[/COLOR]" % COLOR2) else: wiz.purgeDb(DB[purge]) ########################## ### DEVELOPER MENU ####### ########################## def testnotify(): url = wiz.workingURL(NOTIFICATION) if url == True: try: id, msg = wiz.splitNotify(NOTIFICATION) if id == False: wiz.LogNotify("[COLOR %s]%s[/COLOR]" % (COLOR1, ADDONTITLE), "[COLOR %s]Notification: Not Formated Correctly[/COLOR]" % COLOR2); return notify.notification(msg, True) except Exception as e: wiz.log("Error on Notifications Window: %s" % str(e), xbmc.LOGERROR) else: wiz.LogNotify("[COLOR %s]%s[/COLOR]" % (COLOR1, ADDONTITLE), "[COLOR %s]Invalid URL for Notification[/COLOR]" % COLOR2) def testupdate(): if BUILDNAME == "": notify.updateWindow() else: notify.updateWindow(BUILDNAME, BUILDVERSION, BUILDLATEST, wiz.checkBuild(BUILDNAME, 'icon'), wiz.checkBuild(BUILDNAME, 'fanart')) def testfirst(): notify.firstRun() def testfirstRun(): notify.firstRunSettings() ########################### ## Making the Directory#### ########################### def addDir(display, mode=None, name=None, url=None, menu=None, description=ADDONTITLE, overwrite=True, fanart=FANART, icon=ICON, themeit=None): u = sys.argv[0] if not mode == None: u += "?mode=%s" % quote_plus(mode) if not name == None: u += "&name="+quote_plus(name) if not url == None: u += "&url="+quote_plus(url) ok=True if themeit: display = themeit % display liz=xbmcgui.ListItem(display) liz.setArt({ 'fanart': fanart, 'icon' : icon, 'thumb' : icon }) liz.setInfo( type="Video", infoLabels={ "Title": display, "Plot": description} ) liz.setProperty( "Fanart_Image", fanart ) if not menu == None: liz.addContextMenuItems(menu, replaceItems=overwrite) ok=xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]),url=u,listitem=liz,isFolder=True) return ok def addFile(display, mode=None, name=None, url=None, menu=None, description=ADDONTITLE, overwrite=True, fanart=FANART, icon=ICON, themeit=None): u = sys.argv[0] if not mode == None: u += "?mode=%s" % quote_plus(mode) if not name == None: u += "&name="+quote_plus(name) if not url == None: u += "&url="+quote_plus(url) ok=True if themeit: display = themeit % display liz=xbmcgui.ListItem(display) liz.setArt({ 'fanart': fanart, 'icon' : icon, 'thumb' : icon }) liz.setInfo( type="Video", infoLabels={ "Title": display, "Plot": description} ) liz.setProperty( "Fanart_Image", fanart ) if not menu == None: liz.addContextMenuItems(menu, replaceItems=overwrite) ok=xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]),url=u,listitem=liz,isFolder=False) return ok def get_params(): param=[] paramstring=sys.argv[2] if len(paramstring)>=2: params=sys.argv[2] cleanedparams=params.replace('?','') if (params[len(params)-1]=='/'): params=params[0:len(params)-2] pairsofparams=cleanedparams.split('&') param={} for i in range(len(pairsofparams)): splitparams={} splitparams=pairsofparams[i].split('=') if (len(splitparams))==2: param[splitparams[0]]=splitparams[1] return param ################KODI VERSION########################################## def KodiVer(): if KODIV >= 16.0 and KODIV <= 16.9:vername = 'Jarvis' elif KODIV >= 17.0 and KODIV <= 17.9:vername = 'Krypton' elif KODIV >= 18.0 and KODIV <= 18.9:vername = 'Leia' elif KODIV >= 19.0 and KODIV <= 19.9:vername = 'Matrix' elif KODIV >= 20.0 and KODIV <= 20.9:vername = 'Nexus' elif KODIV >= 21.0 and KODIV <= 21.9:vername = 'Omega' else: vername = "Unknown" return vername ###################################################################################################################### ###################################################################################################################### params=get_params() url=None name=None mode=None try: mode=unquote_plus(params["mode"]) except: pass try: name=unquote_plus(params["name"]) except: pass try: url=unquote_plus(params["url"]) except: pass wiz.log('[ Version : \'%s\' ] [ Mode : \'%s\' ] [ Name : \'%s\' ] [ Url : \'%s\' ]' % (VERSION, mode if not mode == '' else None, name, url)) def setView(content, viewType): if wiz.getS('auto-view')=='true': views = wiz.getS(viewType) if views == '50' and KODIV >= 17 and SKIN == 'skin.estuary': views = '55' if views == '500' and KODIV >= 17 and SKIN == 'skin.estuary': views = '50' wiz.ebi("Container.SetViewMode(%s)" % views) if mode==None : index() elif mode=='wizardupdate' : wiz.wizardUpdate() elif mode=='builds' : buildMenu() elif mode=='viewbuild' : viewBuild(name) elif mode=='buildinfo' : buildInfo(name) elif mode=='buildpreview' : buildVideo(name) elif mode=='install' : buildWizard(name, url) elif mode=='theme' : buildWizard(name, mode, url) elif mode=='viewthirdparty' : viewThirdList(name) elif mode=='installthird' : thirdPartyInstall(name, url) elif mode=='editthird' : editThirdParty(name); wiz.refresh() elif mode=='maint' : maintMenu(name) elif mode=='kodi17fix' : wiz.kodi17Fix() elif mode=='kodi19fix' : wiz.kodi19Fix() elif mode=='unknownsources' : skinSwitch.swapUS() elif mode=='advancedsetting': advancedWindow(name) elif mode=='autoadvanced' : showAutoAdvanced(); wiz.refresh() elif mode=='removeadvanced' : removeAdvanced(); wiz.refresh() elif mode=='asciicheck' : wiz.asciiCheck() elif mode=='extractazip' : wiz.extractAZip() elif mode=='backupbuild' : wiz.backUpOptions('build') elif mode=='backupgui' : wiz.backUpOptions('guifix') elif mode=='backuptheme' : wiz.backUpOptions('theme') elif mode=='backupaddonpack': wiz.backUpOptions('addon pack') elif mode=='backupaddon' : wiz.backUpOptions('addondata') elif mode=='oldThumbs' : wiz.oldThumbs() elif mode=='clearbackup' : wiz.cleanupBackup() elif mode=='convertpath' : wiz.convertSpecial(HOME) elif mode=='currentsettings': viewAdvanced() elif mode=='fullclean' : totalClean(); wiz.refresh() elif mode=='clearcache' : clearCache(); wiz.refresh() elif mode=='clearfunctioncache' : clearFunctionCache(); wiz.refresh() elif mode=='clearpackages' : wiz.clearPackages(); wiz.refresh() elif mode=='clearcrash' : wiz.clearCrash(); wiz.refresh() elif mode=='clearthumb' : clearThumb(); wiz.refresh() elif mode=='cleararchive' : clearArchive(); wiz.refresh() elif mode=='checksources' : wiz.checkSources(); wiz.refresh() elif mode=='checkrepos' : wiz.checkRepos(); wiz.refresh() elif mode=='freshstart' : freshStart() elif mode=='forceupdate' : wiz.forceUpdate() elif mode=='forceprofile' : wiz.reloadProfile(wiz.getInfo('System.ProfileName')) elif mode=='forceclose' : wiz.killxbmc() elif mode=='forceskin' : wiz.ebi("ReloadSkin()"); wiz.refresh() elif mode=='hidepassword' : wiz.hidePassword() elif mode=='unhidepassword' : wiz.unhidePassword() elif mode=='enableaddons' : enableAddons() elif mode=='toggleaddon' : wiz.toggleAddon(name, url); wiz.refresh() elif mode=='togglecache' : toggleCache(name); wiz.refresh() elif mode=='toggleadult' : wiz.toggleAdult(); wiz.refresh() elif mode=='changefeq' : changeFeq(); wiz.refresh() elif mode=='uploadlog' : uploadLog.Main() elif mode=='viewlog' : LogViewer() elif mode=='viewwizlog' : LogViewer(WIZLOG) elif mode=='viewerrorlog' : errorChecking() elif mode=='viewerrorlast' : errorChecking(last=True) elif mode=='clearwizlog' : f = xbmcvfs.File(WIZLOG, 'w'); f.close(); wiz.LogNotify("[COLOR %s]%s[/COLOR]" % (COLOR1, ADDONTITLE), "[COLOR %s]Wizard Log Cleared![/COLOR]" % COLOR2) elif mode=='purgedb' : purgeDb() elif mode=='fixaddonupdate' : wiz.force_check_updates(auto=True, over=False) elif mode=='removeaddons' : removeAddonMenu() elif mode=='removeaddon' : removeAddon(name) elif mode=='removeaddondata': removeAddonDataMenu() elif mode=='removedata' : removeAddonData(name) elif mode=='resetaddon' : total = wiz.cleanHouse(ADDONDATA, ignore=True); wiz.LogNotify("[COLOR %s]%s[/COLOR]" % (COLOR1, ADDONTITLE), "[COLOR %s]Addon_Data reset[/COLOR]" % COLOR2) elif mode=='systeminfo' : systemInfo() elif mode=='restorezip' : restoreit('build') elif mode=='restoregui' : restoreit('gui') elif mode=='restoreaddon' : restoreit('addondata') elif mode=='restoreextzip' : restoreextit('build') elif mode=='restoreextgui' : restoreextit('gui') elif mode=='restoreextaddon': restoreextit('addondata') elif mode=='writeadvanced' : writeAdvanced(name, url) elif mode=='speedtest' : net_tools() elif mode=='runspeedtest' : runSpeedTest(); wiz.refresh() elif mode=='clearspeedtest' : clearSpeedTest(); wiz.refresh() elif mode=='viewspeedtest' : viewSpeedTest(name); wiz.refresh() elif mode=="viewIP" : viewIP(); elif mode=='speedtestM' : speedTest() elif mode=='apk' : apkMenu(name, url) elif mode=='apkscrape' : apkScraper(name) elif mode=='apkinstall' : apkInstaller(name, url) elif mode=='rominstall' : romInstaller(name, url) elif mode=='youtube' : youtubeMenu(name, url) elif mode=='viewVideo' : playVideo(url) elif mode=='addons' : addonMenu(name, url) elif mode=='addonpack' : packInstaller(name, url) elif mode=='skinpack' : skinInstaller(name, url) elif mode=='addoninstall' : addonInstaller(name, url) elif mode=='savedata' : saveMenu() elif mode=='togglesetting' : wiz.setS(name, 'false' if wiz.getS(name) == 'true' else 'true'); wiz.refresh() elif mode=='managedata' : manageSaveData(name) elif mode=='whitelist' : wiz.whiteList(name) elif mode=='trakt' : traktMenu() elif mode=='savetrakt' : traktit.traktIt('update', name) elif mode=='restoretrakt' : traktit.traktIt('restore', name) elif mode=='addontrakt' : traktit.traktIt('clearaddon', name) elif mode=='cleartrakt' : traktit.clearSaved(name) elif mode=='authtrakt' : traktit.activateTrakt(name); wiz.refresh() elif mode=='updatetrakt' : traktit.autoUpdate('all') elif mode=='importtrakt' : traktit.importlist(name); wiz.refresh() elif mode=='realdebrid' : realMenu() elif mode=='savedebrid' : debridit.debridIt('update', name) elif mode=='restoredebrid' : debridit.debridIt('restore', name) elif mode=='addondebrid' : debridit.debridIt('clearaddon', name) elif mode=='cleardebrid' : debridit.clearSaved(name) elif mode=='authdebrid' : debridit.activateDebrid(name); wiz.refresh() elif mode=='updatedebrid' : debridit.autoUpdate('all') elif mode=='importdebrid' : debridit.importlist(name); wiz.refresh() elif mode=='login' : loginMenu() elif mode=='savelogin' : loginit.loginIt('update', name) elif mode=='restorelogin' : loginit.loginIt('restore', name) elif mode=='addonlogin' : loginit.loginIt('clearaddon', name) elif mode=='clearlogin' : loginit.clearSaved(name) elif mode=='authlogin' : loginit.activateLogin(name); wiz.refresh() elif mode=='updatelogin' : loginit.autoUpdate('all') elif mode=='importlogin' : loginit.importlist(name); wiz.refresh() elif mode=='contact' : notify.contact(CONTACT) elif mode=='settings' : wiz.openS(name); wiz.refresh() elif mode=='forcetext' : wiz.forceText() elif mode=='opensettings' : id = eval(url.upper()+'ID')[name]['plugin']; addonid = wiz.addonId(id); addonid.openSettings(); wiz.refresh() elif mode=='developer' : developer() elif mode=='converttext' : wiz.convertText() elif mode=='createqr' : wiz.createQR() elif mode=='testnotify' : testnotify() elif mode=='testupdate' : testupdate() elif mode=='testfirst' : testfirst() elif mode=='testfirstrun' : testfirstRun() xbmcplugin.endOfDirectory(int(sys.argv[1]))