def downloadDemoContent(): import xbmc import requests import zipfile url = 'http://demo.cinemavision.tv/Demo.zip' output = os.path.join(kodiutil.PROFILE_PATH, 'demo.zip') target = os.path.join(kodiutil.PROFILE_PATH, 'demo', 'Trivia Slides') # if not os.path.exists(target): # os.makedirs(target) with open(output, 'wb') as handle: response = requests.get(url, stream=True) total = float(response.headers.get('content-length', 1)) sofar = 0 blockSize = 4096 if not response.ok: return False with kodiutil.Progress(T(32506, 'Download'), T(32507, 'Downloading demo content')) as p: for block in response.iter_content(blockSize): sofar += blockSize pct = int((sofar / total) * 100) p.update(pct) handle.write(block) z = zipfile.ZipFile(output) z.extractall(target) xbmc.sleep(500) try: os.remove(output) except: kodiutil.ERROR() return True
def showQRCode(url): import os import pyqrcode import kodigui # from kodijsonrpc import rpc class ImageWindow(kodigui.BaseDialog): xmlFile = 'script.cinemavision-image.xml' path = kodiutil.ADDON_PATH theme = 'Main' res = '1080i' def __init__(self, *args, **kwargs): kodigui.BaseDialog.__init__(self) self.image = kwargs.get('image') def onFirstInit(self): self.setProperty('image', self.image) with kodiutil.Progress(T(32582, 'QR Code'), T(32583, 'Creating QR code...')): code = pyqrcode.create(url) QRDir = os.path.join(kodiutil.PROFILE_PATH, 'settings', 'QR') if not os.path.exists(QRDir): os.makedirs(QRDir) QR = os.path.join(QRDir, 'QR.png') code.png(QR, scale=6) # rpc.Player.Open(item={'path': QRDir}) ImageWindow.open(image=QR)
def loadContent(from_settings=False, bg=False): import xbmcgui if from_settings and not kodiutil.getPathSetting('content.path'): xbmcgui.Dialog().ok(T(32503, 'No Content Path'), ' ', T(32504, 'Content path not set or not applied')) return contentPath = getContentPath(from_load=True) kodiutil.DEBUG_LOG('Loading content...') with kodiutil.Progress(T(32505, 'Loading Content'), bg=bg) as p: cinemavision.content.UserContent(contentPath, callback=p.msg, trailer_sources=kodiutil.getSetting( 'trailer.scrapers', '').split(',')) createSettingsRSDirs()
def evalActionFile(paths, test=True): import xbmcgui if not paths: xbmcgui.Dialog().ok(T(32511, 'None found'), T(32512, 'No action file(s) set')) return if not isinstance(paths, list): paths = [paths] messages = [] abortPath = kodiutil.getSetting('action.onAbort.file') if not kodiutil.getSetting('action.onAbort', False): abortPath = None # if not abortPath: # yes = xbmcgui.Dialog().yesno('No Abort', 'Abort action not set.', '') # Test = False for path in paths: processor = cinemavision.actions.ActionFileProcessor(path, test=True) messages.append(u'[B]VALIDATE ({0}):[/B]'.format( os.path.basename(path))) messages.append('') parseMessages = [] hasParseMessages = False hasErrors = False if not processor.fileExists: messages.append(u'{0} - [COLOR FFFF0000]{1}[/COLOR]'.format( os.path.basename(path), T(32513, 'MISSING!'))) messages.append('') continue if processor.parserLog: hasParseMessages = True for type_, msg in processor.parserLog: hasErrors = hasErrors or type_ == 'ERROR' parseMessages.append(u'[COLOR {0}]{1}[/COLOR]'.format( type_ == 'ERROR' and 'FFFF0000' or 'FFFFFF00', msg)) else: parseMessages.append('[COLOR FF00FF00]OK[/COLOR]') messages += parseMessages messages.append('') if test: if hasErrors: messages += [ u'[B]TEST ({0}):[/B]'.format(os.path.basename(path)), '' ] messages.append(u'[COLOR FFFF0000]{0}[/COLOR]'.format( 'SKIPPED DUE TO ERRORS')) else: with kodiutil.Progress('Testing', 'Executing actions...'): messages += [ u'[B]TEST ({0}):[/B]'.format(os.path.basename(path)), '' ] for line in processor.test(): if line.startswith('Action ('): lsplit = line.split(': ', 1) line = u'[COLOR FFAAAAFF]{0}:[/COLOR] {1}'.format( lsplit[0], lsplit[1]) elif line.startswith('ERROR:'): line = u'[COLOR FFFF0000]{0}[/COLOR]'.format(line) messages.append(line) messages.append('') if not test and not hasParseMessages: xbmcgui.Dialog().ok(T(32515, 'Done'), T(32516, 'Action file(s) parsed OK')) else: showText(T(32514, 'Parser Messages'), '[CR]'.join(messages)) if test and abortPath: runAbort = kodiutil.getSetting('action.test.runAbort', 0) if runAbort and (runAbort != 2 or xbmcgui.Dialog().yesno( T(32597, 'Cleanup'), T(32598, 'Run abort action?'))): processor = cinemavision.actions.ActionFileProcessor(abortPath) processor.run()
def _pasteLog(logName='kodi.log'): import os import re import xbmc import xbmcgui from pastebin_python import PastebinPython logPath = os.path.join(xbmc.translatePath('special://logpath').decode('utf-8'), logName) if not os.path.exists(logPath): xbmcgui.Dialog().ok(T(32570, 'No Log'), ' ', T(32571, 'That log file does not exist!')) return False def debug_log(msg): kodiutil.DEBUG_LOG('PASTEBIN: {0}'.format(msg)) replaces = ( ('//.+?:.+?@', '//USER:PASSWORD@'), ('<user>.+?</user>', '<user>USER</user>'), ('<pass>.+?</pass>', '<pass>PASSWORD</pass>'), ) apiUserKeyFile = os.path.join(kodiutil.PROFILE_PATH, 'settings.pb.key') apiUserKey = '' if os.path.exists(apiUserKeyFile): with open(apiUserKeyFile, 'r') as f: apiUserKey = f.read() or '' pb = PastebinPython(api_dev_key=kodiutil.getPeanutButter(), api_user_key=apiUserKey) apiUser = kodiutil.getSetting('pastebin.user') if apiUser and not apiUserKey: debug_log('Username set, asking user for password') password = xbmcgui.Dialog().input( T(32572, 'Enter Pastebin password (only needed 1st time - NOT stored)'), '', xbmcgui.INPUT_ALPHANUM, xbmcgui.ALPHANUM_HIDE_INPUT ) if password: debug_log('Getting API user key') apiUserKey = pb.createAPIUserKey(apiUser, password) if apiUserKey.lower().startswith('bad'): xbmcgui.Dialog().ok(T(32573, 'Failed'), u'{0}: {1}'.format(T(32574, 'Failed to create paste as user'), apiUser), '', apiUserKey) debug_log('Failed get user API key ({0}): {1}'.format(apiUser, apiUserKey)) else: with open(apiUserKeyFile, 'w') as f: f.write(apiUserKey) else: debug_log('User aborted') xbmcgui.Dialog().ok(T(32575, 'Aborted'), ' ', T(32576, 'Paste aborted!')) return False elif apiUserKey: debug_log('Creating paste with stored API key') with kodiutil.Progress('Pastebin', T(32577, 'Creating paste...')): with open(logPath, 'r') as f: content = f.read().decode('utf-8') for pattern, repl in replaces: content = re.sub(pattern, repl, content) urlOrError = pb.createPaste(content, 'Kodi CV LOG: {0}'.format(logName), api_paste_private=1, api_paste_expire_date='1W') showQR = False if urlOrError.startswith('http'): showQR = xbmcgui.Dialog().yesno( T(32515, 'Done'), T(32578, 'Paste created at:'), '', urlOrError, T(32579, 'OK'), T(32580, 'Show QR Code') ) debug_log('Paste created: {0}'.format(urlOrError)) else: xbmcgui.Dialog().ok(T(32573, 'Failed'), T(32581, 'Failed to create paste:'), '', urlOrError) debug_log('Failed to create paste: {0}'.format(urlOrError)) if showQR: showQRCode(urlOrError) return True