# -*- coding: utf-8 -*- # script.module.python.koding.aio # Python Koding AIO (c) by TOTALREVOLUTION LTD (support@trmc.freshdesk.com) # Python Koding AIO is licensed under a # Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. # You should have received a copy of the license along with this # work. If not, see http://creativecommons.org/licenses/by-nc-nd/4.0. # Please make sure you've read and understood the license, this code can NOT be used commercially # and it can NOT be modified and redistributed. If you're found to be in breach of this license # then any affected add-ons will be blacklisted and will not be able to work on the same system # as any other add-ons which use this code. Thank you for your cooperation. import os import re import sys import urllib import xbmc import xbmcaddon import xbmcgui import xbmcplugin import xbmcvfs from directory import Add_Dir from filetools import Text_File from vartools import Find_In_Text from guitools import Text_Box, Show_Busy, Keyboard from systemtools import Sleep_If_Window_Active from video import Play_Video from web import Open_URL dialog = xbmcgui.Dialog() py_path = 'special://home/addons/script.module.python.koding.aio/lib/koding' video_base = 'http://totalrevolution.tv/videos/python_koding/' #---------------------------------------------------------------- def Grab_Tutorials(): """ internal command ~""" import re full_array = [] dirs,files = xbmcvfs.listdir(py_path) # Check all the modules for functions with tutorial info for file in files: file_path = os.path.join(py_path,file) if file.endswith('.py') and file != 'tutorials.py': content = Text_File(file_path,'r').replace('\r','') # content_array = re.compile('# TUTORIAL #\ndef (.+?)\(').findall(content) content_array = Find_In_Text(content=content, start='# TUTORIAL #\ndef ', end='\(', show_errors=False) if content_array: for item in content_array: item = item.strip() full_array.append('%s~%s'%(item,file_path)) content_array = Find_In_Text(content=content, start='# TUTORIAL #\nclass ', end='\(', show_errors=False) if content_array: for item in content_array: item = item.strip() full_array.append('%s~%s'%(item,file_path)) # Return a list of tutorials Add_Dir('[COLOR=gold]CREATE YOUR FIRST ADD-ON[/COLOR]',video_base+'Create_Addon.mov','play_video', folder=False, icon='', fanart='', description='How to create your own add-on using the Python Koding framework.') for item in sorted(full_array,key=str.lower): name, filepath = item.split('~') filepath = urllib.quote(filepath) Add_Dir(name=name.upper().replace('_',' '), url='%s~%s'%(name,filepath), mode='show_tutorial', folder=False, icon='', fanart='', description='Instructions for how to use the %s function.'%name) #---------------------------------------------------------------- def Show_Tutorial(url): """ internal command ~""" name, filepath = url.split('~') filepath = urllib.unquote(filepath) readfile = Text_File(filepath,'r').replace('\r','') try: raw_find = Find_In_Text(content=readfile, start='# TUTORIAL #\ndef %s' % name,end='~"""')[0] except: raw_find = Find_In_Text(content=readfile, start='# TUTORIAL #\nclass %s' % name,end='~"""')[0] # Check if an example code segment exists in the comments if 'EXAMPLE CODE:' in raw_find: code = re.findall(r'(?<=EXAMPLE CODE:)(?s)(.*$)', raw_find)[0] code = code.replace('script.module.python.koding.aio','temp_replace_string') code = code.replace('koding.','').strip() code = code.replace('temp_replace_string','script.module.python.koding.aio') else: code = None # Check if a video exists in the comments internetstate = xbmc.getInfoLabel('System.InternetState') if internetstate: video_page = Open_URL(video_base) extension = Find_In_Text(video_page, name, '"', False) if extension != '' and extension != None: video = video_base+name+extension[0] else: video = None else: video = None counter = 0 removal_string = '' final_header = '' newline = '' temp_raw = raw_find.splitlines() for line in temp_raw: if counter == 0: removal_string += line if '[' in line: replace_file = Find_In_Text(content=line,start='\[',end='\]') for item in replace_file: line = line.replace(item,'') if ',' in line: header_extension = line.split(',') for item in header_extension: if '=' in item: item = item.split('=')[0] final_header += item+',' final_header = 'koding.'+name+final_header[:-2]+')' else: final_header = 'koding.'+name+line[:-1] else: removal_string += '\n'+line counter += 1 if counter == 2: break if final_header.endswith('))'): final_header = final_header[:-1] if final_header.startswith('koding.User_Info'): final_header = 'koding.User_Info()' full_text = raw_find.replace(removal_string,'').strip() # Initialise the dialog select dialog_array = ['Documentation'] if code: dialog_array.append('Run Example Code') if video: dialog_array.append('Watch Video') # If there's more than one item we show a dialog select otherwise we just load up the text window if len(dialog_array) > 1: choice = dialog.select(name, dialog_array) if choice >= 0: choice = dialog_array[choice] if choice == 'Documentation': Text_Box(final_header,full_text .replace('AVAILABLE PARAMS:','[COLOR=dodgerblue]AVAILABLE PARAMS:[/COLOR]') .replace('EXAMPLE CODE:','[COLOR=dodgerblue]EXAMPLE CODE:[/COLOR]') .replace('IMPORTANT:','[COLOR=gold]IMPORTANT:[/COLOR]') .replace('CODE:','[COLOR=dodgerblue]CODE:[/COLOR]') .replace('AVAILABLE VALUES:','[COLOR=dodgerblue]AVAILABLE VALUES:[/COLOR]') .replace('WARNING:','[COLOR=red]WARNING:[/COLOR]')) elif choice == 'Run Example Code': codefile = filepath.split(os.sep) codefile = codefile[len(codefile)-1].replace('.py','') exec('from %s import *' % codefile) # exec('from %s import %s' % (codefile, params["name"])) exec(code) elif choice == 'Watch Video': Play_Video(video) if choice < 0: return else: Text_Box(final_header,full_text .replace('AVAILABLE PARAMS:','[COLOR=dodgerblue]AVAILABLE PARAMS:[/COLOR]') .replace('EXAMPLE CODE:','[COLOR=dodgerblue]EXAMPLE CODE:[/COLOR]') .replace('IMPORTANT:','[COLOR=gold]IMPORTANT:[/COLOR]') .replace('CODE:','[COLOR=dodgerblue]CODE:[/COLOR]') .replace('AVAILABLE VALUES:','[COLOR=dodgerblue]AVAILABLE VALUES:[/COLOR]') .replace('WARNING:','[COLOR=red]WARNING:[/COLOR]'))