################################################################################ # 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 # ################################################################################ import os import xbmc, xbmcgui, xbmcvfs import re import uservar from resources.libs import wizard as wiz from datetime import date, timedelta from urllib.parse import quote_plus transPath = xbmcvfs.translatePath LOGNOTICE = xbmc.LOGINFO ADDON_ID = uservar.ADDON_ID ADDON = wiz.addonId(ADDON_ID) VERSION = wiz.addonInfo(ADDON_ID,'version') ADDONPATH = wiz.addonInfo(ADDON_ID,'path') ADDONTITLE = uservar.ADDONTITLE DIALOG = xbmcgui.Dialog() DP = xbmcgui.DialogProgress() HOME = transPath('special://home/') 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') ADDONDATA = os.path.join(USERDATA, 'addon_data', ADDON_ID) FANART = os.path.join(ADDONPATH, 'fanart.jpg') ICON = os.path.join(ADDONPATH, 'icon.png') ART = os.path.join(ADDONPATH, 'resources', 'art') SKINFOLD = os.path.join(ADDONPATH, 'resources', 'skins', 'DefaultSkin', 'media') ADVANCED = os.path.join(USERDATA, 'advancedsettings.xml') NOTIFY = wiz.getS('notify') NOTEID = wiz.getS('noteid') NOTEDISMISS = wiz.getS('notedismiss') BUILDNAME = wiz.getS('buildname') BUILDVERSION = wiz.getS('buildversion') LATESTVERSION = wiz.checkBuild(BUILDNAME, 'version') TODAY = date.today() KODIV = float(xbmc.getInfoLabel("System.BuildVersion")[:4]) TOMORROW = TODAY + timedelta(days=1) THREEDAYS = TODAY + timedelta(days=3) UPDATECHECK = uservar.UPDATECHECK if str(uservar.UPDATECHECK).isdigit() else 1 NEXTCHECK = TODAY + timedelta(days=UPDATECHECK) NOTIFICATION = uservar.NOTIFICATION ENABLE = uservar.ENABLE HEADERTYPE = uservar.HEADERTYPE if uservar.HEADERTYPE == 'Image' else 'Text' HEADERMESSAGE = uservar.HEADERMESSAGE BACKGROUND = uservar.BACKGROUND HEADERIMAGE = uservar.HEADERIMAGE THEME1 = uservar.THEME1 THEME2 = uservar.THEME2 THEME3 = uservar.THEME3 THEME4 = uservar.THEME4 THEME5 = uservar.THEME5 COLOR1 = uservar.COLOR1 COLOR2 = uservar.COLOR2 CONTACTICON = uservar.CONTACTICON if not uservar.CONTACTICON == 'http://' else ICON CONTACTFANART = uservar.CONTACTFANART if not uservar.CONTACTFANART == 'http://' else FANART if BACKGROUND == '': BACKGROUND = FANART elif not wiz.workingURL(BACKGROUND): BACKGROUND = FANART 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 artwork(file): if file == 'button': return os.path.join(SKINFOLD, 'Button', 'button-focus_lightblue.png'), os.path.join(SKINFOLD, 'Button', 'button-focus_grey.png') elif file == 'radio' : return os.path.join(SKINFOLD, 'RadioButton', 'MenuItemFO.png'), os.path.join(SKINFOLD, 'RadioButton', 'MenuItemNF.png'), os.path.join(SKINFOLD, 'RadioButton', 'radiobutton-focus.png'), os.path.join(SKINFOLD, 'RadioButton', 'radiobutton-nofocus.png') elif file == 'slider': return os.path.join(SKINFOLD, 'Slider', 'osd_slider_nib.png'), os.path.join(SKINFOLD, 'Slider', 'osd_slider_nibNF.png'), os.path.join(SKINFOLD, 'Slider', 'slider1.png'), os.path.join(SKINFOLD, 'Slider', 'slider1.png') def autoConfig(msg='', TxtColor='0xFFFFFFFF', Font='font12', BorderWidth=10): class MyWindow(xbmcgui.WindowDialog): scr={}; def __init__(self,msg='',L=0,T=0,W=1280,H=720,TxtColor='0xFFFFFFFF',Font='font12',BorderWidth=10): if os.path.exists(ADVANCED): r = xbmcvfs.File(ADVANCED).read() if KODIV < 17: try: asvideocachevalue = re.findall('(.+?)', r, re.DOTALL)[0] except: asvideocachevalue = '20971520' try: asreadfactor = re.findall('(.+?)', r, re.DOTALL)[0] except: asreadfactor = '4.0' else: try: asvideocachevalue = re.findall('(.+?)', r, re.DOTALL)[0] except: asvideocachevalue = '20971520' try: asreadfactor = re.findall('(.+?)', r, re.DOTALL)[0] except: asreadfactor = '4.0' asvideocachevalue = int(int(asvideocachevalue)/(1024*1024)) try: ascurl = re.findall('(.+?)', r, re.DOTALL)[0] except: ascurl = '10' try: asbuffer = re.findall('(.+?)', r, re.DOTALL)[0] except: asbuffer = '0' asvideocachevalue = ' = [B][COLOR lime]%s[/COLOR][/B] MB' % asvideocachevalue ascurl = ' = [B][COLOR lime]%s[/COLOR][/B]' % ascurl asreadfactor = ' = [B][COLOR lime]%s[/COLOR][/B]' % asreadfactor asbuffer = ' = [B][COLOR lime]%s[/COLOR][/B]' % asbuffer else: asvideocachevalue = ' : [COLOR yellow]20[/COLOR] MB' ascurl = ' : [COLOR yellow]10[/COLOR]' asreadfactor = ' : [COLOR yellow]4.0[/COLOR]' asbuffer = ' : [COLOR yellow]0[/COLOR]' buttonfocus, buttonnofocus = artwork('button') radiobgfocus, radiobgnofocus, radiofocus, radionofocus = artwork('radio') slidernibfocus, slidernibnofocus, sliderfocus, slidernofocus = artwork('slider') image_path = os.path.join(ART, 'ContentPanel.png') boxbg = os.path.join(ART, 'bgg2.png') self.border = xbmcgui.ControlImage(L,T,W,H, image_path) self.addControl(self.border); self.BG=xbmcgui.ControlImage(L+BorderWidth,T+BorderWidth,W-(BorderWidth*2),H-(BorderWidth*2), FANART, aspectRatio=0, colorDiffuse='0x5FFFFFFF') self.addControl(self.BG) top = T+BorderWidth leftside = L+BorderWidth rightside = L+int(W/2)-(BorderWidth*2) firstrow = top+30 secondrow = firstrow+275+int(BorderWidth/2) currentwidth = int(((W/2)-(BorderWidth*4))/2) header = '[COLOR %s]Advanced Settings Configurator[/COLOR]' % (COLOR2) self.Header=xbmcgui.ControlLabel(L, top, W, 30, header, font='font13', textColor=TxtColor, alignment=0x00000002) self.addControl(self.Header) top += 30+BorderWidth self.bgarea = xbmcgui.ControlImage(leftside, firstrow, rightside-L, 275, boxbg, aspectRatio=0, colorDiffuse='0x5FFFFFFF') self.addControl(self.bgarea) self.bgarea2 = xbmcgui.ControlImage(rightside+BorderWidth+BorderWidth, firstrow, rightside-L, 275, boxbg, aspectRatio=0, colorDiffuse='0x5FFFFFFF') self.addControl(self.bgarea2) self.bgarea3 = xbmcgui.ControlImage(leftside, secondrow, rightside-L, 275, boxbg, aspectRatio=0, colorDiffuse='0x5FFFFFFF') self.addControl(self.bgarea3) self.bgarea4 = xbmcgui.ControlImage(rightside+BorderWidth+BorderWidth, secondrow, rightside-L, 275, boxbg, aspectRatio=0, colorDiffuse='0x5FFFFFFF') self.addControl(self.bgarea4) header = '[COLOR %s]Video Cache Size[/COLOR]%s' % (COLOR2, asvideocachevalue) self.Header2=xbmcgui.ControlLabel(leftside+BorderWidth, firstrow+5, int(W/2)-(BorderWidth*2), 20, header, font='font13', textColor=TxtColor, alignment=0x00000002) self.addControl(self.Header2) freeMemory = int(float(wiz.getInfo('System.Memory(free)')[:-2])*.33) recMemory = int(float(wiz.getInfo('System.Memory(free)')[:-2])*.23) msg3 = "[COLOR %s]Number of bytes used for buffering streams in memory. When set to [COLOR %s]0[/COLOR] the cache will be written to disk instead of RAM. Note: For the memory size set here, Kodi will require 3x the amount of RAM to be free. Setting this too high might cause Kodi to crash if it can't get enough RAM(1/3 of Free Memory: [COLOR %s]%s[/COLOR])[/COLOR]" % (COLOR2, COLOR1, COLOR1, freeMemory) self.Support3=xbmcgui.ControlTextBox(leftside+int(BorderWidth*1.5), firstrow+30+BorderWidth, int(W/2)-(BorderWidth*4), 150, font='font12', textColor=TxtColor) self.addControl(self.Support3) self.Support3.setText(msg3) try: self.videoCacheSize=xbmcgui.ControlSlider(leftside+int(BorderWidth*1.5), firstrow+210,int(W/2)-(BorderWidth*5),20, textureback=sliderfocus, texture=slidernibnofocus, texturefocus=slidernibfocus, orientation=xbmcgui.HORIZONTAL) except: self.videoCacheSize=xbmcgui.ControlSlider(leftside+int(BorderWidth*1.5), firstrow+210,int(W/2)-(BorderWidth*5),20, textureback=sliderfocus, texture=slidernibnofocus, texturefocus=slidernibfocus) self.addControl(self.videoCacheSize) self.videomin = 0; self.videomax = freeMemory if freeMemory < 2000 else 2000 self.recommendedVideo = recMemory if recMemory < 180 else 180; self.currentVideo = self.recommendedVideo videopos = wiz.percentage(self.currentVideo, self.videomax) self.videoCacheSize.setPercent(int(videopos)) current1 = '[COLOR %s]New size:[/COLOR] [COLOR %s]%s MB[/COLOR]' % (COLOR1, COLOR2, self.currentVideo) recommended1 = '[COLOR %s]Recommended:[/COLOR] [COLOR %s]%s MB[/COLOR]' % (COLOR1, COLOR2, self.recommendedVideo) self.currentVideo1=xbmcgui.ControlTextBox(leftside+BorderWidth,firstrow+235,currentwidth,20,font=Font,textColor=TxtColor) self.addControl(self.currentVideo1) self.currentVideo1.setText(current1) self.recommendedVideo1=xbmcgui.ControlTextBox(leftside+BorderWidth+currentwidth,firstrow+235,currentwidth,20,font=Font,textColor=TxtColor) self.addControl(self.recommendedVideo1) self.recommendedVideo1.setText(recommended1) header = '[COLOR %s]CURL Timeout/CURL Low Speed[/COLOR]%s' % (COLOR2, ascurl) self.Header3=xbmcgui.ControlLabel(rightside+BorderWidth, firstrow+5, int(W/2)-(BorderWidth*2), 20, header, font='font13', textColor=TxtColor, alignment=0x00000002) self.addControl(self.Header3) msg3 = "[COLOR %s][B]curlclienttimeout[/B] is the time in seconds for how long it takes for libcurl connection will timeout and [B]curllowspeedtime[/B] is the time in seconds for libcurl to consider a connection lowspeed. For slower connections set it to 20.[/COLOR]" % COLOR2 self.Support3=xbmcgui.ControlTextBox(rightside+int(BorderWidth*3.5), firstrow+30+BorderWidth, int(W/2)-(BorderWidth*4), 150, font='font12', textColor=TxtColor) self.addControl(self.Support3) self.Support3.setText(msg3) try: self.CURLTimeout=xbmcgui.ControlSlider(rightside+int(BorderWidth*3.5),firstrow+210,int(W/2)-(BorderWidth*5),20, textureback=sliderfocus, texture=slidernibnofocus, texturefocus=slidernibfocus, orientation=xbmcgui.HORIZONTAL) except: self.CURLTimeout=xbmcgui.ControlSlider(rightside+int(BorderWidth*3.5),firstrow+210,int(W/2)-(BorderWidth*5),20, textureback=sliderfocus, texture=slidernibnofocus, texturefocus=slidernibfocus) self.addControl(self.CURLTimeout) self.curlmin = 0; self.curlmax = 20 self.recommendedCurl = 10; self.currentCurl = self.recommendedCurl curlpos = wiz.percentage(self.currentCurl, self.curlmax) self.CURLTimeout.setPercent(curlpos) current2 = '[COLOR %s]New time:[/COLOR] [COLOR %s]%ss[/COLOR]' % (COLOR1, COLOR2, self.currentCurl) recommended2 = '[COLOR %s]Recommended:[/COLOR] [COLOR %s]%ss[/COLOR]' % (COLOR1, COLOR2, self.recommendedCurl) self.currentCurl2=xbmcgui.ControlTextBox(rightside+(BorderWidth*3),firstrow+235,currentwidth,20,font=Font,textColor=TxtColor) self.addControl(self.currentCurl2) self.currentCurl2.setText(current2) self.recommendedCurl2=xbmcgui.ControlTextBox(rightside+(BorderWidth*3)+currentwidth,firstrow+235,currentwidth,20,font=Font,textColor=TxtColor) self.addControl(self.recommendedCurl2) self.recommendedCurl2.setText(recommended2) header = '[COLOR %s]Read Buffer Factor[/COLOR]%s' % (COLOR2, asreadfactor) self.Header4=xbmcgui.ControlLabel(leftside, secondrow+5, int(W/2)-(BorderWidth*2), 20, header, font='font13', textColor=TxtColor, alignment=0x00000002) self.addControl(self.Header4) msg3 = "[COLOR %s]The value of this setting is a multiplier of the default limit. If Kodi is loading a typical bluray raw file at 36 Mbit/s, then a value of 2 will need at least 72 Mbit/s of network bandwidth. However, unlike with the RAM setting, you can safely increase this value however high you want, and Kodi won't crash.[/COLOR]" % COLOR2 self.Support3=xbmcgui.ControlTextBox(leftside+int(BorderWidth*1.5), secondrow+30+BorderWidth, int(W/2)-(BorderWidth*4), 150, font='font12', textColor=TxtColor) self.addControl(self.Support3) self.Support3.setText(msg3) try: self.readBufferFactor=xbmcgui.ControlSlider(leftside+int(BorderWidth*1.5), secondrow+210,int(W/2)-(BorderWidth*5),20, textureback=sliderfocus, texture=slidernibnofocus, texturefocus=slidernibfocus, orientation=xbmcgui.HORIZONTAL) except: self.readBufferFactor=xbmcgui.ControlSlider(leftside+int(BorderWidth*1.5), secondrow+210,int(W/2)-(BorderWidth*5),20, textureback=sliderfocus, texture=slidernibnofocus, texturefocus=slidernibfocus) self.addControl(self.readBufferFactor) self.readmin = 0; self.readmax = 10 self.recommendedRead = 5; self.currentRead = self.recommendedRead readpos = wiz.percentage(self.currentRead, self.readmax) self.readBufferFactor.setPercent(readpos) current3 = '[COLOR %s]New value:[/COLOR] [COLOR %s]%s[/COLOR]' % (COLOR1, COLOR2, self.currentRead) recommended3 = '[COLOR %s]Recommended:[/COLOR] [COLOR %s]%s[/COLOR]' % (COLOR1, COLOR2, self.recommendedRead) self.currentRead3=xbmcgui.ControlTextBox(leftside+BorderWidth,secondrow+235,currentwidth,20,font=Font,textColor=TxtColor) self.addControl(self.currentRead3) self.currentRead3.setText(current3) self.recommendedRead3=xbmcgui.ControlTextBox(leftside+BorderWidth+currentwidth,secondrow+235,currentwidth,20,font=Font,textColor=TxtColor) self.addControl(self.recommendedRead3) self.recommendedRead3.setText(recommended3) header = '[COLOR %s]Buffer Mode[/COLOR]%s' % (COLOR2, asbuffer) self.Header4=xbmcgui.ControlLabel(rightside+BorderWidth, secondrow+5, int(W/2)-(BorderWidth*2), 20, header, font='font13', textColor=TxtColor, alignment=0x00000002) self.addControl(self.Header4) msg4 = "[COLOR %s]This setting will force Kodi to use a cache for all video files, including local network, internet, and even the local hard drive. Default value is 0 and will only cache videos that use internet file paths/sources.[/COLOR]" % COLOR2 self.Support4=xbmcgui.ControlTextBox(rightside+int(BorderWidth*3.5), secondrow+30+BorderWidth, int(W/2)-(BorderWidth*4), 110, font='font12', textColor=TxtColor) self.addControl(self.Support4) self.Support4.setText(msg4) B1 = secondrow+130+BorderWidth; B2 = B1+30; B3 = B2+30; B4 = B3+30; self.Button0 = xbmcgui.ControlRadioButton(rightside+(BorderWidth*3), B1, int(W/2)-(BorderWidth*4), 30, '0: Buffer all internet filesystems', font='font12', focusTexture=radiobgfocus, noFocusTexture=radiobgnofocus, focusOnTexture=radiofocus, noFocusOnTexture=radiofocus, focusOffTexture=radionofocus, noFocusOffTexture=radionofocus) self.Button1 = xbmcgui.ControlRadioButton(rightside+(BorderWidth*3), B2, int(W/2)-(BorderWidth*4), 30, '1: Buffer all filesystems', font='font12', focusTexture=radiobgfocus, noFocusTexture=radiobgnofocus, focusOnTexture=radiofocus, noFocusOnTexture=radiofocus, focusOffTexture=radionofocus, noFocusOffTexture=radionofocus) self.Button2 = xbmcgui.ControlRadioButton(rightside+(BorderWidth*3), B3, int(W/2)-(BorderWidth*4), 30, '2: Only buffer true internet filesystems', font='font12', focusTexture=radiobgfocus, noFocusTexture=radiobgnofocus, focusOnTexture=radiofocus, noFocusOnTexture=radiofocus, focusOffTexture=radionofocus, noFocusOffTexture=radionofocus) self.Button3 = xbmcgui.ControlRadioButton(rightside+(BorderWidth*3), B4, int(W/2)-(BorderWidth*4), 30, '3: No Buffer', font='font12', focusTexture=radiobgfocus, noFocusTexture=radiobgnofocus, focusOnTexture=radiofocus, noFocusOnTexture=radiofocus, focusOffTexture=radionofocus, noFocusOffTexture=radionofocus) self.addControl(self.Button0) self.addControl(self.Button1) self.addControl(self.Button2) self.addControl(self.Button3) self.Button0.setSelected(False) self.Button1.setSelected(False) self.Button2.setSelected(True) self.Button3.setSelected(False) self.buttonWrite=xbmcgui.ControlButton(leftside,T+H-40-BorderWidth,int(W/2)-(BorderWidth*2),35,"Write File",textColor="0xFF000000",focusedColor="0xFF000000",alignment=2,focusTexture=buttonfocus,noFocusTexture=buttonnofocus) self.buttonCancel=xbmcgui.ControlButton(rightside+BorderWidth*2,T+H-40-BorderWidth,int(W/2)-(BorderWidth*2),35,"Cancel",textColor="0xFF000000",focusedColor="0xFF000000",alignment=2,focusTexture=buttonfocus,noFocusTexture=buttonnofocus) self.addControl(self.buttonWrite); self.addControl(self.buttonCancel) self.buttonWrite.controlLeft(self.buttonCancel); self.buttonWrite.controlRight(self.buttonCancel); self.buttonWrite.controlUp(self.Button3); self.buttonWrite.controlDown(self.videoCacheSize) self.buttonCancel.controlLeft(self.buttonWrite); self.buttonCancel.controlRight(self.buttonWrite); self.buttonCancel.controlUp(self.Button3); self.buttonCancel.controlDown(self.videoCacheSize) self.videoCacheSize.controlUp(self.buttonWrite); self.videoCacheSize.controlDown(self.CURLTimeout) self.CURLTimeout.controlUp(self.videoCacheSize); self.CURLTimeout.controlDown(self.readBufferFactor) self.readBufferFactor.controlUp(self.CURLTimeout); self.readBufferFactor.controlDown(self.Button0) self.Button0.controlUp(self.CURLTimeout); self.Button0.controlDown(self.Button1); self.Button0.controlLeft(self.readBufferFactor); self.Button0.controlRight(self.readBufferFactor); self.Button1.controlUp(self.Button0); self.Button1.controlDown(self.Button2); self.Button1.controlLeft(self.readBufferFactor); self.Button1.controlRight(self.readBufferFactor); self.Button2.controlUp(self.Button1); self.Button2.controlDown(self.Button3); self.Button2.controlLeft(self.readBufferFactor); self.Button2.controlRight(self.readBufferFactor); self.Button3.controlUp(self.Button2); self.Button3.controlDown(self.buttonWrite); self.Button3.controlLeft(self.readBufferFactor); self.Button3.controlRight(self.readBufferFactor); self.setFocus(self.videoCacheSize) def doExit(self): self.CloseWindow() def updateCurrent(self, control): if control == self.videoCacheSize: self.currentVideo = int((self.videomax)*self.videoCacheSize.getPercent()/100) current = '[COLOR %s]New size:[/COLOR] [COLOR %s]%s MB[/COLOR]' % (COLOR1, COLOR2, self.currentVideo) self.currentVideo1.setText(current) elif control == self.CURLTimeout: self.currentCurl = int((self.curlmax)*self.CURLTimeout.getPercent()/100) current = '[COLOR %s]New time:[/COLOR] [COLOR %s]%ss[/COLOR]' % (COLOR1, COLOR2, self.currentCurl) self.currentCurl2.setText(current) elif control == self.readBufferFactor: self.currentRead = int((self.readmax)*self.readBufferFactor.getPercent()/100) current = '[COLOR %s]New value:[/COLOR] [COLOR %s]%s[/COLOR]' % (COLOR1, COLOR2, self.currentRead) self.currentRead3.setText(current) elif control in [self.Button0, self.Button1, self.Button2, self.Button3]: self.Button0.setSelected(False) self.Button1.setSelected(False) self.Button2.setSelected(False) self.Button3.setSelected(False) control.setSelected(True) def doWrite(self): #self.currentVideo = int((self.videomax-20)*self.videoCacheSize.getPercent()/100+20)*1024*1024 #self.currentCurl = int((self.curlmax)*self.CURLTimeout.getPercent()/100) #self.currentRead = int((self.readmax)*self.readBufferFactor.getPercent()/100) if self.Button0.isSelected(): buffermode = 0 elif self.Button1.isSelected(): buffermode = 1 elif self.Button2.isSelected(): buffermode = 2 elif self.Button3.isSelected(): buffermode = 3 if os.path.exists(ADVANCED): choice = DIALOG.yesno(ADDONTITLE, "[COLOR %s]There is currently an active [COLOR %s]AdvancedSettings.xml[/COLOR], would you like to remove it and continue?[/COLOR]" % (COLOR2, COLOR1), yeslabel="[B][COLOR springgreen]Remove Settings[/COLOR][/B]", nolabel="[B][COLOR red]Cancel Write[/COLOR][/B]") if choice == 0: return try: xbmcvfs.delete(ADVANCED) except: f = xbmcvfs.File(ADVANCED, 'w'); f.close() if KODIV < 17: with xbmcvfs.File(ADVANCED, 'w') as f: f.write('\n') f.write(' \n') f.write(' %s\n' % buffermode) f.write(' %s\n' % int(self.currentVideo*1024*1024)) f.write(' %s\n' % self.currentRead) f.write(' %s\n' % self.currentCurl) f.write(' %s\n' % self.currentCurl) f.write(' \n') f.write('\n') f.close() else: with xbmcvfs.File(ADVANCED, 'w') as f: f.write('\n') f.write(' \n') f.write(' %s\n' % buffermode) f.write(' %s\n' % int(self.currentVideo*1024*1024)) f.write(' %s\n' % self.currentRead) f.write(' \n') f.write(' \n') f.write(' %s\n' % self.currentCurl) f.write(' %s\n' % self.currentCurl) f.write(' \n') f.write('\n') #f.close() self.CloseWindow() def onControl(self, control): try: cntrl=control.getId() except: cntrl=False if cntrl==self.buttonWrite.getId(): self.doWrite() elif cntrl==self.buttonCancel.getId(): self.doExit() def onAction(self, action): try: F=self.getFocusId() except: F=False if F == self.videoCacheSize.getId(): self.updateCurrent(self.videoCacheSize) elif F == self.CURLTimeout.getId(): self.updateCurrent(self.CURLTimeout) elif F == self.readBufferFactor.getId(): self.updateCurrent(self.readBufferFactor) elif F == self.Button0.getId() and action in [ACTION_MOUSE_LEFT_CLICK, ACTION_SELECT_ITEM]: self.updateCurrent(self.Button0) elif F == self.Button1.getId() and action in [ACTION_MOUSE_LEFT_CLICK, ACTION_SELECT_ITEM]: self.updateCurrent(self.Button1) elif F == self.Button2.getId() and action in [ACTION_MOUSE_LEFT_CLICK, ACTION_SELECT_ITEM]: self.updateCurrent(self.Button2) elif F == self.Button3.getId() and action in [ACTION_MOUSE_LEFT_CLICK, ACTION_SELECT_ITEM]: self.updateCurrent(self.Button3) elif action == ACTION_PREVIOUS_MENU: self.doExit() elif action == ACTION_NAV_BACK: self.doExit() def CloseWindow(self): self.close() maxW=1280; maxH=720; W=int(900); H=int(650); L=int((maxW-W)/2); T=int((maxH-H)/2); TempWindow=MyWindow(L=L,T=T,W=W,H=H,TxtColor=TxtColor,Font=Font,BorderWidth=BorderWidth); TempWindow.doModal() del TempWindow ########################## ### Converted to XML ########################## def contact(msg=""): class MyWindow(xbmcgui.WindowXMLDialog): def __init__(self, *args, **kwargs): self.title = THEME3 % kwargs["title"] self.image = kwargs["image"] self.fanart = kwargs["fanart"] self.msg = THEME2 % kwargs["msg"] def onInit(self): self.fanartimage = 101 self.titlebox = 102 self.imagecontrol = 103 self.textbox = 104 self.scrollcontrol = 105 self.showdialog() def showdialog(self): self.getControl(self.imagecontrol).setImage(self.image) self.getControl(self.fanartimage).setImage(self.fanart) self.getControl(self.fanartimage).setColorDiffuse('9FFFFFFF') self.getControl(self.textbox).setText(self.msg) self.getControl(self.titlebox).setLabel(self.title) self.setFocusId(self.scrollcontrol) def onAction(self,action): if action == ACTION_PREVIOUS_MENU: self.close() elif action == ACTION_NAV_BACK: self.close() cw = MyWindow( "Contact.xml" , ADDON.getAddonInfo('path'), 'DefaultSkin', title=ADDONTITLE, fanart=CONTACTFANART, image=CONTACTICON, msg=msg) cw.doModal() del cw def apkInstaller(apk): class APKInstaller(xbmcgui.WindowXMLDialog): def __init__(self,*args,**kwargs): self.shut=kwargs['close_time'] xbmc.executebuiltin("Skin.Reset(AnimeWindowXMLDialogClose)") xbmc.executebuiltin("Skin.SetBool(AnimeWindowXMLDialogClose)") def onClick(self,controlID): self.CloseWindow() def onAction(self,action): if action in [ACTION_PREVIOUS_MENU, ACTION_BACKSPACE, ACTION_NAV_BACK, ACTION_SELECT_ITEM, ACTION_MOUSE_LEFT_CLICK, ACTION_MOUSE_LONG_CLICK]: self.CloseWindow() def CloseWindow(self): xbmc.executebuiltin("Skin.Reset(AnimeWindowXMLDialogClose)") xbmc.sleep(400) self.close() xbmc.executebuiltin('Skin.SetString(apkinstaller, Now that %s has been downloaded[CR]Click install on the next window!)' % apk) popup = APKInstaller('APK.xml', ADDON.getAddonInfo('path'), 'DefaultSkin', close_time=34) popup.doModal() del popup def speedTest(img): class speedTest(xbmcgui.WindowXMLDialog): def __init__(self,*args,**kwargs): self.imgfile = kwargs['img'] def onInit(self): self.imagespeed = 101 self.button = 201 self.showdialog() def showdialog(self): self.setFocus(self.getControl(self.button)) self.getControl(self.imagespeed).setImage(self.imgfile) def onClick(self,controlID): self.CloseWindow() def onAction(self,action): if action in [ACTION_PREVIOUS_MENU, ACTION_BACKSPACE, ACTION_NAV_BACK, ACTION_SELECT_ITEM, ACTION_MOUSE_LEFT_CLICK, ACTION_MOUSE_LONG_CLICK]: self.CloseWindow() def CloseWindow(self): self.close() popup = speedTest('SpeedTest.xml', ADDON.getAddonInfo('path'), 'DefaultSkin', img=img) popup.doModal() del popup def firstRunSettings(): class firstRun(xbmcgui.WindowXMLDialog): def __init__(self,*args,**kwargs): self.whitelistcurrent = kwargs['current'] def onInit(self): self.title = 101 self.okbutton = 201 self.trakt = 301 self.debrid = 302 self.login = 303 self.sources = 304 self.profiles = 305 self.playercore = 314 self.advanced = 306 self.favourites = 307 self.superfav = 308 self.repo = 309 self.whitelist = 310 self.cache = 311 self.packages = 312 self.thumbs = 313 self.showdialog() self.controllist = [self.trakt, self.debrid, self.login, self.sources, self.profiles, self.playercore, self.advanced, self.favourites, self.superfav, self.repo, self.whitelist, self.cache, self.packages, self.thumbs] self.controlsettings = ['keeptrakt', 'keepdebrid', 'keeplogin', 'keepsources', 'keepprofiles', 'keepplayercore', 'keepadvanced', 'keepfavourites', 'keeprepos', 'keepsuper', 'keepwhitelist', 'clearcache', 'clearpackages', 'clearthumbs'] for item in self.controllist: if wiz.getS(self.controlsettings[self.controllist.index(item)]) == 'true': self.getControl(item).setSelected(True) def showdialog(self): self.getControl(self.title).setLabel(ADDONTITLE) self.setFocus(self.getControl(self.okbutton)) def onClick(self, controlId): if controlId == self.okbutton: self.close() for item in self.controllist: at = self.controllist.index(item) if self.getControl(item).isSelected(): wiz.setS(self.controlsettings[at], 'true') else: wiz.setS(self.controlsettings[at], 'false') if self.getControl(self.whitelist).isSelected() and not self.whitelistcurrent == 'true': wiz.whiteList('edit') fr = firstRun( "FirstRunSaveData.xml" , ADDON.getAddonInfo('path'), 'DefaultSkin', current=wiz.getS('keepwhitelist')) fr.doModal() del fr def firstRun(): class MyWindow(xbmcgui.WindowXMLDialog): def __init__(self, *args, **kwargs): self.title = THEME3 % ADDONTITLE self.msg = "Currently no build installed from %s.\n\nSelect 'Build Menu' to install a Community Build from us or 'Ignore' to never see this message again.\n\nThank you for choosing %s." % (ADDONTITLE, ADDONTITLE) self.msg = THEME2 % self.msg def onInit(self): self.image = 101 self.titlebox = 102 self.textbox = 103 self.buildmenu = 201 self.ignore = 202 self.showdialog() def showdialog(self): self.getControl(self.image).setImage(FANART) self.getControl(self.image).setColorDiffuse('9FFFFFFF') self.getControl(self.textbox).setText(self.msg) self.getControl(self.titlebox).setLabel(self.title) self.setFocusId(self.buildmenu) def doBuildMenu(self): wiz.log("[Check Updates] [User Selected: Open Build Menu] [Next Check: %s]" % str(NEXTCHECK), LOGNOTICE) wiz.setS('lastbuildcheck', str(NEXTCHECK)) self.close() url = 'plugin://%s/?mode=builds' % ADDON_ID xbmc.executebuiltin('ActivateWindow(10025, "%s", return)' % url) def doIgnore(self): self.close() wiz.log("[First Run] [User Selected: Ignore Build Menu] [Next Check: %s]" % str(NEXTCHECK), LOGNOTICE) wiz.setS('lastbuildcheck', str(NEXTCHECK)) def onAction(self,action): if action == ACTION_PREVIOUS_MENU: self.doIgnore() elif action == ACTION_NAV_BACK: self.doIgnore() def onClick(self, controlId): if (controlId == self.buildmenu): self.doBuildMenu() else: self.doIgnore() fr = MyWindow( "FirstRunBuild.xml" , ADDON.getAddonInfo('path'), 'DefaultSkin') fr.doModal() del fr def notification(msg='', test=False): class MyWindow(xbmcgui.WindowXMLDialog): def __init__(self, *args, **kwargs): self.test = kwargs['test'] self.message = THEME2 % kwargs['msg'] def onInit(self): self.image = 101 self.titlebox = 102 self.titleimage = 103 self.textbox = 104 self.scroller = 105 self.dismiss = 201 self.remindme = 202 self.showdialog() def showdialog(self): self.testimage = os.path.join(ART, 'text.png') self.getControl(self.image).setImage(BACKGROUND) self.getControl(self.image).setColorDiffuse('9FFFFFFF') self.getControl(self.textbox).setText(self.message) self.setFocusId(self.remindme) if HEADERTYPE == 'Text': self.getControl(self.titlebox).setLabel(THEME3 % HEADERMESSAGE) else: self.getControl(self.titleimage).setImage(HEADERIMAGE) def doRemindMeLater(self): if not test == True: wiz.setS("notedismiss","false") wiz.log("[Notification] NotifyID %s Remind Me Later" % wiz.getS('noteid'), LOGNOTICE) self.close() def doDismiss(self): if not test == True: wiz.setS("notedismiss","true") wiz.log("[Notification] NotifyID %s Dismissed" % wiz.getS('noteid'), LOGNOTICE) self.close() def onAction(self,action): if action == ACTION_PREVIOUS_MENU: self.doRemindMeLater() elif action == ACTION_NAV_BACK: self.doRemindMeLater() def onClick(self, controlId): if (controlId == self.dismiss): self.doDismiss() else: self.doRemindMeLater() xbmc.executebuiltin('Skin.SetString(headertexttype, %s)' % 'true' if HEADERTYPE == 'Text' else 'false') xbmc.executebuiltin('Skin.SetString(headerimagetype, %s)' % 'true' if HEADERTYPE == 'Image' else 'false') notify = MyWindow( "Notifications.xml" , ADDON.getAddonInfo('path'), 'DefaultSkin', msg=msg, test=test) notify.doModal() del notify def updateWindow(name='Testing Window', current='1.0', new='1.1', icon=ICON, fanart=FANART): class MyWindow(xbmcgui.WindowXMLDialog): def __init__(self, *args, **kwargs): self.name = THEME3 % kwargs['name'] self.current = kwargs['current'] self.new = kwargs['new'] self.icon = kwargs['icon'] self.fanart = kwargs['fanart'] self.msgupdate = "Update avaliable for installed build:\n[COLOR %s]%s[/COLOR]\n\nCurrent Version: v[COLOR %s]%s[/COLOR]\nLatest Version: v[COLOR %s]%s[/COLOR]\n\n[COLOR %s]*Recommened: Fresh install[/COLOR]" % (COLOR1, self.name, COLOR1, self.current, COLOR1, self.new, COLOR1) self.msgcurrent = "Running latest version of installed build:\n[COLOR %s]%s[/COLOR]\n\nCurrent Version: v[COLOR %s]%s[/COLOR]\nLatest Version: v[COLOR %s]%s[/COLOR]\n\n[COLOR %s]*Recommended: Fresh install[/COLOR]" % (COLOR1, self.name, COLOR1, self.current, COLOR1, self.new, COLOR1) def onInit(self): self.imagefanart = 101 self.header = 102 self.textbox = 103 self.imageicon = 104 self.fresh = 201 self.normal = 202 self.ignore = 203 self.showdialog() def showdialog(self): self.getControl(self.header).setLabel(self.name) self.getControl(self.textbox).setText(THEME2 % self.msgupdate if current < new else self.msgcurrent) self.getControl(self.imagefanart).setImage(self.fanart) self.getControl(self.imagefanart).setColorDiffuse('2FFFFFFF') self.getControl(self.imageicon).setImage(self.icon) self.setFocusId(self.fresh) def doFreshInstall(self): wiz.log("[Check Updates] [Installed Version: %s] [Current Version: %s] [User Selected: Fresh Install build]" % (BUILDVERSION, LATESTVERSION), LOGNOTICE) wiz.log("[Check Updates] [Next Check: %s]" % str(NEXTCHECK), LOGNOTICE) wiz.setS('lastbuildcheck', str(NEXTCHECK)) self.close() url = 'plugin://%s/?mode=install&name=%s&url=fresh' % (ADDON_ID, quote_plus(BUILDNAME)) xbmc.executebuiltin('RunPlugin(%s)' % url) def doNormalInstall(self): wiz.log("[Check Updates] [Installed Version: %s] [Current Version: %s] [User Selected: Normal Install build]" % (BUILDVERSION, LATESTVERSION), LOGNOTICE) wiz.log("[Check Updates] [Next Check: %s]" % str(NEXTCHECK), LOGNOTICE) wiz.setS('lastbuildcheck', str(NEXTCHECK)) self.close() url = 'plugin://%s/?mode=install&name=%s&url=normal' % (ADDON_ID, quote_plus(BUILDNAME)) xbmc.executebuiltin('RunPlugin(%s)' % url) def doIgnore(self): wiz.log("[Check Updates] [Installed Version: %s] [Current Version: %s] [User Selected: Ignore 3 Days]" % (BUILDVERSION, LATESTVERSION), LOGNOTICE) wiz.log("[Check Updates] [Next Check: %s]" % str(THREEDAYS), LOGNOTICE) wiz.setS('lastbuildcheck', str(THREEDAYS)) self.close() def onAction(self,action): if action == ACTION_PREVIOUS_MENU: self.doIgnore() elif action == ACTION_NAV_BACK: self.doIgnore() def onClick(self, controlId): if (controlId == self.fresh): self.doFreshInstall() elif (controlId == self.normal): self.doNormalInstall() else: self.doIgnore() update = MyWindow( "BuildUpdate.xml" , ADDON.getAddonInfo('path'), 'DefaultSkin', name=name, current=current, new=new, icon=icon, fanart=fanart) update.doModal() del update