#!/usr/bin/python # -*- coding: utf-8 -*- import os import re import sys import xbmc import json import base64 import string import urllib import requests import shutil import xbmcplugin import xbmcgui import socket from . import client from . import control ADDONTITLE = 'Enigma2Tv-Xtra' def regex_from_to( text, from_string, to_string, excluding=True, ): if excluding: try: r = re.search('(?i)' + from_string + "([\S\s]+?)" + to_string, text).group(1) except: r = '' else: try: r = re.search('(?i)(' + from_string + "[\S\s]+?" + to_string + ')', text).group(1) except: r = '' return r def regex_get_all(text, start_with, end_with): r = re.findall('(?i)(' + start_with + "[\S\s]+?" + end_with + ')', text) return r def addDir( name, url, mode, iconimage, fanart, description, ): u = sys.argv[0] + '?url=' + urllib.parse.quote_plus(url) + '&mode=' \ + str(mode) + '&name=' + urllib.parse.quote_plus(name) \ + '&iconimage=' + urllib.parse.quote_plus(iconimage) \ + '&description=' + urllib.parse.quote_plus(description) ok = True xbmc.log(str(u)) liz = xbmcgui.ListItem(name) liz.setArt({'icon': iconimage, 'thumb': iconimage}) liz.setInfo(type='Video', infoLabels={'Title': name, 'Plot': description}) liz.setProperty('fanart_image', fanart) if mode == 4: liz.setProperty('IsPlayable', 'true') ok = xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), url=u, listitem=liz, isFolder=False) elif mode == 7 or mode == 10 or mode == 17: liz.setInfo(type='Video', infoLabels={'Title': name, 'Plot': description}) ok = xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), url=u, listitem=liz, isFolder=False) else: liz.setInfo(type='Video', infoLabels={'Title': name, 'Plot': description}) ok = xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), url=u, listitem=liz, isFolder=True) return ok xbmcplugin.endOfDirectory def addDirMeta( name, url, mode, iconimage, fanart, description, year, cast, rating, runtime, genre, ): u = sys.argv[0] + '?url=' + urllib.parse.quote_plus(url) + '&mode=' \ + str(mode) + '&name=' + urllib.parse.quote_plus(name) \ + '&iconimage=' + urllib.parse.quote_plus(iconimage) \ + '&description=' + urllib.parse.quote_plus(description) ok = True liz = xbmcgui.ListItem(name) liz.setArt({'icon': iconimage, 'thumb': iconimage}) liz.setInfo(type='Video', infoLabels={ 'Title': name, 'Plot': description, 'Rating': rating, 'Year': year, 'Duration': runtime, 'Cast': cast, 'Genre': genre, }) liz.setProperty('fanart_image', fanart) liz.setProperty('IsPlayable', 'true') cm = [] cm.append(('Play Trailer', 'XBMC.RunPlugin(plugin://plugin.video.Enigma2Tv-Xtra/?mode=9&url=' + str(name) + ')')) cm.append(('Movie Information', 'XBMC.Action(Info)')) liz.addContextMenuItems(cm, replaceItems=True) ok = xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), url=u, listitem=liz, isFolder=False) return ok def OPEN_URL(url): headers = {} headers['User-Agent'] = 'TheWizardIsHere' link = requests.session().get(url, headers=headers, verify=False).text link = link.encode('ascii', 'ignore') return link.decode("utf-8") def clear_cache(): xbmc.log('CLEAR CACHE ACTIVATED') xbmc_cache_path = os.path.join(xbmc.translatePath('special://home' ), 'cache') confirm = xbmcgui.Dialog().yesno( 'Please Confirm', 'Please Confirm You Wish To Delete Your Kodi Application Data', '', '', 'Cancel', 'Clear', ) if confirm: if os.path.exists(xbmc_cache_path) == True: for (root, dirs, files) in os.walk(xbmc_cache_path): file_count = 0 file_count += len(files) if file_count > 0: for f in files: try: os.unlink(os.path.join(root, f)) except: pass for d in dirs: try: shutil.rmtree(os.path.join(root, d)) except: pass dialog = xbmcgui.Dialog() dialog.ok(ADDONTITLE, 'Cache Cleared Successfully!') xbmc.executebuiltin('Container.Refresh()') 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 class Trailer: def __init__(self): self.base_link = 'http://www.youtube.com' self.key_link = \ 'QUl6YVN5QnZES3JnSU1NVmRPajZSb1pnUWhaSzRHM3MybDZXeVhn' self.key_link = '&key=%s' \ % base64.urlsafe_b64decode(self.key_link) self.search_link = \ 'https://www.googleapis.com/youtube/v3/search?part=snippet&type=video&maxResults=5&q=%s' self.youtube_search = \ 'https://www.googleapis.com/youtube/v3/search?q=' self.youtube_watch = 'http://www.youtube.com/watch?v=%s' def play(self, name, url=None): try: url = self.worker(name, url) if url == None: return title = control.infoLabel('listitem.title') if title == '': title = control.infoLabel('listitem.label') icon = control.infoLabel('listitem.icon') item = control.item(path=url, iconImage=icon, thumbnailImage=icon) try: item.setArt({'icon': icon}) except: pass item.setInfo(type='Video', infoLabels={'title': title}) control.player.play(url, item) except: pass def worker(self, name, url): try: if url.startswith(self.base_link): url = self.resolve(url) if url == None: raise Exception() return url elif not url.startswith('http://'): url = self.youtube_watch % url url = self.resolve(url) if url == None: raise Exception() return url else: raise Exception() except: query = name + ' trailer' query = self.youtube_search + query url = self.search(query) if url == None: return return url def search(self, url): try: query = \ urllib.parse.parse_qs(urllib.parse.urllib.parse(url).query)['q' ][0] url = self.search_link % urllib.parse.quote_plus(query) \ + self.key_link result = client.request(url) items = json.loads(result)['items'] items = [i['id']['videoId'] for i in items] for url in items: url = self.resolve(url) if not url is None: return url except: return def resolve(self, url): try: id = url.split('?v=')[-1].split('/')[-1].split('?' )[0].split('&')[0] result = client.request('http://www.youtube.com/watch?v=%s' % id) message = client.parseDOM(result, 'div', attrs={'id': 'unavailable-submessage'}) message = ''.join(message) alert = client.parseDOM(result, 'div', attrs={'id': 'watch7-notification-area' }) if len(alert) > 0: raise Exception() if re.search('[a-zA-Z]', message): raise Exception() url = 'plugin://plugin.video.youtube/play/?video_id=%s' % id return url except: return def getlocalip(): s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.connect(('8.8.8.8', 0)) s = s.getsockname()[0] return s def getexternalip(): open = OPEN_URL('http://canyouseeme.org/') ip = \ re.search('(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' , open) return str(ip.group()) def MonthNumToName(num): if '01' in num: month = 'January' elif '02' in num: month = 'Febuary' elif '03' in num: month = 'March' elif '04' in num: month = 'April' elif '05' in num: month = 'May' elif '06' in num: month = 'June' elif '07' in num: month = 'July' elif '08' in num: month = 'Augast' elif '09' in num: month = 'September' elif '10' in num: month = 'October' elif '11' in num: month = 'November' elif '12' in num: month = 'December' return month