170 lines
7.4 KiB
Python
170 lines
7.4 KiB
Python
# -*- 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]'))
|