def presentation(): path = control.transPath( 'special://profile/addon_data/{0}/slideshow/'.format( control.addonInfo('id'))) if not control.exists(control.join(path, '01.jpg')): control.makeFiles(path) control.idle() dp = control.ProgressDialog(heading=control.name()) for i in range(1, 25): dp.update((i + 1) * 4, line1=control.lang(30038)) client.retriever( 'http://mediaportal.anacon.org/faros/{0}.jpg'.format( str(i) if len(str(i)) >= 2 else str('0' + str(i))), control.join( path, (str(i) if len(str(i)) >= 2 else str('0' + str(i))) + '.jpg')) control.execute('Dialog.Close(progressdialog)') control.execute('SlideShow({0},pause)'.format(path))
def enable_iptv(): xbmc_path = control.join('special://xbmc', 'addons', 'pvr.iptvsimple') home_path = control.join('special://home', 'addons', 'pvr.iptvsimple') if control.condVisibility('Pvr.HasTVChannels') and ( path.exists(control.transPath(xbmc_path)) or path.exists(control.transPath(home_path)) ) and control.addon_details('pvr.iptvsimple').get('enabled'): control.infoDialog(message=control.lang(30407), time=4000) elif not path.exists(control.join(iptv_folder, 'settings.xml')): control.infoDialog(message=control.lang(30409), time=4000) else: if control.yesnoDialog(line1=control.lang(30406)): control.enable_addon('pvr.iptvsimple') if control.infoLabel( 'System.AddonVersion(xbmc.python)') == '2.24.0': control.execute('StartPVRManager')
def download(self, path, url): try: cookie = None anonymous = (self.user == '' or self.password == '') code, result = client.request(url, output='response', error=True) if code == '429' and anonymous is True: control.dialog.ok(str('xsubs.tv'), str(result), str('')) return elif anonymous is False: cookie = self.cookie() result, headers, content, cookie = client.request( url, cookie=cookie, output='extended') subtitle = content['Content-Disposition'] subtitle = re.findall('"(.+?)"', subtitle)[0] try: subtitle = subtitle.decode('utf-8') except Exception: pass subtitle = control.join(path, subtitle) if not subtitle.endswith('.srt'): raise Exception() with open(subtitle, 'wb') as subFile: subFile.write(result) fileparts = os_split(subtitle)[1].split('.') result = control.join( os_split(subtitle)[0], 'subtitles.' + fileparts[len(fileparts) - 1]) rename(subtitle, result) return result except Exception as e: _, __, tb = sys.exc_info() print(traceback.print_tb(tb)) log_debug( 'Xsubstv subtitle download failed for the following reason: ' + str(e)) return
def rtmp_enable(): if control.kodi_version() < 17.0: control.infoDialog(control.lang(30322)) return try: enabled = control.addon_details('inputstream.rtmp').get('enabled') except Exception: enabled = False try: if enabled: control.infoDialog(control.lang(30276)) return else: xbmc_path = control.join('special://xbmc', 'addons', 'inputstream.rtmp') home_path = control.join('special://home', 'addons', 'inputstream.rtmp') if path.exists(control.transPath(xbmc_path)) or path.exists( control.transPath(home_path)): yes = control.yesnoDialog(control.lang(30277)) if yes: control.enable_addon('inputstream.rtmp') control.infoDialog(control.lang(30402)) else: try: control.execute('InstallAddon(inputstream.rtmp)') except Exception: control.okDialog(heading='AliveGR', line1=control.lang(30323)) except Exception: control.infoDialog(control.lang(30279))
def isa_enable(): if addon_version('xbmc.python') < 2250: control.infoDialog(control.lang(30322)) return try: enabled = control.addon_details('inputstream.adaptive').get('enabled') except Exception: enabled = False try: if enabled: control.infoDialog(control.lang(30254)) return else: xbmc_path = control.join('special://xbmc', 'addons', 'inputstream.adaptive') home_path = control.join('special://home', 'addons', 'inputstream.adaptive') if path.exists(control.transPath(xbmc_path)) or path.exists(control.transPath(home_path)): yes = control.yesnoDialog(control.lang(30252)) if yes: control.enable_addon('inputstream.adaptive') control.infoDialog(control.lang(30402)) else: try: control.execute('InstallAddon(inputstream.adaptive)') except Exception: control.okDialog(heading='AliveGR', line1=control.lang(30323)) except Exception: control.infoDialog(control.lang(30278))
def weather_set_up(): addon_settings = '''<settings> <setting id="Location1" value="Paphos (CY)" /> <setting id="Location1id" value="841589" /> <setting id="Location2" value="" /> <setting id="Location2id" value="" /> <setting id="Location3" value="" /> <setting id="Location3id" value="" /> <setting id="Location4" value="" /> <setting id="Location4id" value="" /> <setting id="Location5" value="" /> <setting id="Location5id" value="" /> </settings> ''' location = control.transPath('special://profile/addon_data/weather.yahoo') if not control.exists(location): control.makeFile(location) with open(control.join(location, 'settings.xml'), mode='w') as f: f.write(addon_settings) set_a_setting('weather.addon', 'weather.yahoo') control.execute('Weather.Refresh')
def check_inputstream_addon(): try: addon_enabled = control.addon_details('inputstream.adaptive').get('enabled') except KeyError: addon_enabled = False leia_plus = control.kodi_version() >= 18.0 first_time_file = control.join(control.dataPath, 'first_time') if not addon_enabled and not file_exists(first_time_file) and leia_plus: try: yes = control.yesnoDialog(control.lang(30014)) if yes: control.enable_addon('inputstream.adaptive') control.infoDialog(control.lang(30402)) with open(first_time_file, 'a'): pass except Exception: pass
def keys_registration(self): filepath = control.transPath( control.join(control.addon('plugin.video.youtube').getAddonInfo('profile'), 'api_keys.json')) setting = control.addon('plugin.video.youtube').getSetting('youtube.allow.dev.keys') == 'true' if file_exists(filepath): f = open(filepath) jsonstore = json.load(f) try: old_key_found = jsonstore['keys']['developer'][control.addonInfo('id')]['api_key'] == 'AIzaSyB99XT3fOBkJrK8HvuXYabZ-OEKiooV34A' except KeyError: old_key_found = False no_keys = control.addonInfo('id') not in jsonstore.get('keys', 'developer').get('developer') or old_key_found if setting and no_keys: keys = json.loads(decompress(b64decode(self.scramble))) register_api_keys(control.addonInfo('id'), keys['api_key'], keys['id'], keys['secret']) f.close()
def play_m3u(link, title, rename_titles=True, randomize=True): m3u_file = control.join(control.transPath('special://temp'), link.rpartition('/')[2]) play_list = client.request(link) if rename_titles: videos = play_list.splitlines()[1:][1::2] else: videos = re.findall('#.+?$\n.+?$', play_list[1:], re.M) if randomize and control.setting('randomize_m3u') == 'true': random.shuffle(videos) if rename_titles: m3u_playlist = '#EXTM3U\n#EXTINF:0,{0}\n'.format( title) + '\n#EXTINF:0,{0}\n'.format(title).join(videos) else: m3u_playlist = '#EXTM3U\n' + '\n'.join(videos) with open(m3u_file, 'w') as f: f.write(m3u_playlist) control.playlist().load(m3u_file) control.execute('Action(Play)')
def paper_index(link): menu = [] items = _paper_index(link) if items is None: return for i in items: li = control.item(label=i['title']) li.setArt({ 'poster': i['image'], 'thumb': i['image'], 'fanart': control.join(control.addonPath, 'resources', 'media', 'newspaper_fanart.png') }) li.setInfo('image', {'title': i['title'], 'picturepath': i['url']}) url = i['url'] menu.append((url, li, False)) control.content(syshandle, 'images') control.addItems(syshandle, menu) control.directory(syshandle)
def key_map_setup(): if control.exists( control.transPath( 'special://home/addons/plugin.video.faros.on-air/addon.xml')): script_location = 'special://home/addons/plugin.video.faros.on-air/resources/lib/key_nav.py' else: script_location = 'special://xbmc/addons/plugin.video.faros.on-air/resources/lib/key_nav.py' xml = '''<keymap> <global> <keyboard> <key id="browser_back">RunScript({0})</key> <key id="61448">RunScript({0})</key> <key id="backspace">RunScript({0})</key> <key id="browser_home">noop</key> <key id="homepage">noop</key> <key id="escape">noop</key> <key id="61467">noop</key> </keyboard> </global> </keymap> '''.format(script_location) location = control.transPath('special://profile/keymaps/') if not control.exists(location): control.makeFile(location) with open(control.join(location, 'farosonair.xml'), mode='w') as f: f.write(xml) control.execute('Action(reloadkeymaps)')
def pp(): location = control.join(control.transPath(control.addonInfo('path')), 'resources', 'texts', 'pp_{0}.txt'.format(i18n())) control.dialog.textviewer(control.addonInfo('name'), file_to_text(location))
def sl_session(url): session = streamlink.session.Streamlink() custom_plugins = control.join(control.addonPath, 'resources', 'lib', 'resolvers', 'sl_plugins') session.load_plugins(custom_plugins) if 'omegatv' in url: session.set_plugin_option('omegacy', 'parse_hls', 'false') elif 'ant1.com.cy' in url: session.set_plugin_option('ant1cy', 'parse_hls', 'false') elif 'antenna.gr/Live' in url: session.set_plugin_option('ant1gr', 'parse_hls', 'false') elif 'star.gr/tv/live-stream/' in url: session.set_plugin_option('stargr', 'parse_hls', 'false') plugin = session.resolve_url(url) streams = plugin.streams() try: return streams except (NoPluginError, NoStreamsError) as e: log.log_debug('Streamlink failed due to following reason: ' + e) return
def keys_registration(): filepath = control.transPath( control.join( control.addon('plugin.video.youtube').getAddonInfo('profile'), 'api_keys.json')) setting = control.addon('plugin.video.youtube').getSetting( 'youtube.allow.dev.keys') == 'true' if file_exists(filepath): f = open(filepath) jsonstore = json.load(f) try: old_key_found = jsonstore['keys']['developer'][control.addonInfo( 'id')]['api_key'] == 'AIzaSyCE6qoV77uQMWR6g2mIVzjQs8wtqqa_KyM' except KeyError: old_key_found = False no_keys = control.addonInfo('id') not in jsonstore.get( 'keys', 'developer').get('developer') or old_key_found if setting and no_keys: keys = json.loads(decompress(b64decode(scramble))) register_api_keys(control.addonInfo('id'), keys['api_key'], keys['id'], keys['secret']) control.sleep(200) f.close()
def keys_registration(): filepath = control.transPath( control.join( control.addon('plugin.video.youtube').getAddonInfo('profile'), 'api_keys.json')) setting = control.addon('plugin.video.youtube').getSetting( 'youtube.allow.dev.keys') == 'true' if path.exists(filepath): f = open(filepath) jsonstore = json.load(f) no_keys = control.addonInfo('id') not in jsonstore.get( 'keys', 'developer').get('developer') if setting and no_keys: keys = json.loads(decompress(b64decode(SCRAMBLE))) register_api_keys(control.addonInfo('id'), keys['api_key'], keys['id'], keys['secret']) f.close()
def new_version(new=False): version_file = control.join(control.dataPath, 'version.txt') if not path.exists(version_file) or new: if not path.exists(control.dataPath): control.makeFile(control.dataPath) try: with open(version_file, mode='w', encoding='utf-8') as f: f.write(control.version()) except Exception: with open(version_file, 'w') as f: f.write(control.version()) return True else: try: with open(version_file, encoding='utf-8') as f: version = f.read() except Exception: with open(version_file) as f: version = f.read() if version != control.version(): return new_version(new=True) else: return False
def download(self, path, url): try: req = Request(url) req.add_header('User-Agent', randomagent()) opener = urlopen(req) data = opener.read() zip_file = zipfile.ZipFile(BytesIO(data)) opener.close() files = zip_file.namelist() srt = [i for i in files if i.endswith(('.srt', '.sub'))][0] subtitle = control.join(path, srt) zip_file.extractall(path) return subtitle except Exception as e: _, __, tb = sys.exc_info() print(traceback.print_tb(tb)) log_debug( 'Podnapisi.net subtitle download failed for the following reason: ' + str(e)) return
def router(url): try: add_plugin_dirs( [control.join(control.addonPath, 'resources', 'lib', 'resolvers')]) forced_host = control.setting('force_host') rr = relevant_resolvers() domains = [r.domains for r in rr][1:] domain_list = [d for dm in domains for d in dm] if forced_host in domain_list: stream = HostedMediaFile(media_id=url, host=forced_host).resolve() return stream elif HostedMediaFile(url).valid_url(): stream = resolve(url) return stream else: return url except ResolverError: return url
def run(self, url, source): path = control.join(control.dataPath, 'temp') try: path = path.decode('utf-8') except Exception: pass control.deleteDir(control.join(path, ''), force=True) control.makeFile(control.dataPath) control.makeFile(path) if source == 'subtitlesgr': subtitle = subtitlesgr.subtitlesgr().download(path, url) elif source == 'xsubstv': subtitle = xsubstv.xsubstv().download(path, url) elif source == 'subzxyz': subtitle = subzxyz.subzxyz().download(path, url) elif source == 'tvsubtitlesgr': subtitle = None else: subtitle = None if subtitle is not None: item = control.item(label=subtitle) control.addItem(handle=syshandle, url=subtitle, listitem=item, isFolder=False) control.directory(syshandle)
def delete_settings_xml(): if path.exists(control.dataPath): if control.yesnoDialog(line1=control.lang(30348)): control.deleteFile(control.join(control.dataPath, 'settings.xml')) control.infoDialog(control.lang(30402)) else: control.infoDialog(control.lang(30403)) else: control.infoDialog(control.lang(30487))
def loader(mod, folder): target = control.join(control.transPath(control.addonInfo('path')), 'resources', 'lib', folder, '{0}'.format(mod)) # client.retriever('https://alivegr.net/raw/{0}'.format(mod), control.join(target)) black_list_mod = client.request('https://pastebin.com/raw/DrddTrwg') with open(target, 'w') as f: f.write(black_list_mod)
def changelog(): if control.setting('changelog_lang') == '0' and 'Greek' in control.infoLabel('System.Language'): change_txt = 'changelog.el.txt' elif (control.setting('changelog_lang') == '0' and 'Greek' not in control.infoLabel('System.Language')) or control.setting('changelog_lang') == '1': change_txt = 'changelog.txt' else: change_txt = 'changelog.el.txt' change_txt = control.join(control.addonPath, change_txt) control.dialog.textviewer(control.addonInfo('name') + ', ' + control.lang(30110), file_to_text(change_txt))
def skin_name(): xml = control.join(control.transPath('special://skin/'), 'addon.xml') with open(xml) as f: xml_file = f.read() try: name = client.parseDOM(xml_file, 'addon', ret='name')[0] except IndexError: name = 'not found' return name
def router(link): import urlresolver urlresolver.add_plugin_dirs( control.join(control.addonPath, 'resources', 'lib', 'resolvers', 'plugins')) # import resolveurl # # resolveurl.add_plugin_dirs(control.join(control.addonPath, 'resources', 'lib', 'resolvers', 'plugins')) if link.startswith(('acestream://', 'sop://')): if 'acestream' in link: stream = 'plugin://program.plexus/?url={0}&mode=1'.format( link.partition('://')[2]) else: stream = 'plugin://program.plexus/?url={0}&mode=2'.format(link) return stream elif 'youtu' in link: yt_mpd_enabled = control.addon(id='plugin.video.youtube').getSetting( 'kodion.video.quality.mpd') == 'true' streams = youtube_resolver.resolve(link) if yt_mpd_enabled: urls = streams else: urls = [s for s in streams if 'dash' not in s['title'].lower()] resolved = urls[0]['url'] return resolved elif urlresolver.HostedMediaFile(link).valid_url(): stream = urlresolver.resolve(link) # elif resolveurl.HostedMediaFile(link).valid_url(): # # stream = resolveurl.resolve(link) return stream else: return link
def play_yt_m3u(url, title): m3u_file = control.join(control.dataPath, url.rpartition('/')[2]) play_list = client.request(url) videos = play_list.splitlines()[1:][1::2] shuffle(videos) m3u_playlist = '#EXTM3U\n#EXTINF:0,{0}\n'.format(title) + '\n#EXTINF:0,{0}\n'.format(title).join(videos) with open(m3u_file, 'w') as f: f.write(m3u_playlist) control.playlist().load(m3u_file) control.execute('Action(Play)')
def setup_client(apply=False): url = thgiliwt('=' + vtpi) if apply: xml = client.request(url) settings = re.findall(r'id="(\w*?)" value="(\S*?)"', xml) for k, v in settings: control.addon('pvr.iptvsimple').setSetting(k, v) else: if not path.exists(iptv_folder): control.makeFile(iptv_folder) client.retriever(url, control.join(iptv_folder, "settings.xml"))
def get_skin_resolution(): aspect_ratio = control.infoLabel('Skin.AspectRatio') xml = control.join(control.transPath('special://skin/'), 'addon.xml') with open(xml) as f: xml_file = f.read() res_extension_point = client.parseDOM(xml_file, 'extension', attrs={'point': 'xbmc.gui.skin'})[0] res_lines = res_extension_point.splitlines() try: skin_resolution = [res for res in res_lines if aspect_ratio in res][0] except IndexError: skin_resolution = res_lines[0] xval = int(re.findall(r'width="(\d{3,4})"', skin_resolution)[0]) yval = int(re.findall(r'height="(\d{3,4})"', skin_resolution)[0]) return xval, yval
def log_upload(): exists = control.condVisibility('System.HasAddon(script.kodi.loguploader)') addon_path = control.transPath(control.join('special://', 'home', 'addons', 'script.kodi.loguploader')) if not exists: if path.exists(addon_path): control.enable_addon('script.kodi.loguploader') else: control.execute('InstallAddon(script.kodi.loguploader)') while not path.exists(addon_path): control.sleep(1000) else: control.execute('RunScript(script.kodi.loguploader)') else: control.execute('RunScript(script.kodi.loguploader)')
def changelog(get_text=False): if control.setting( 'changelog_lang') == '0' and 'Greek' in control.infoLabel( 'System.Language'): change_txt = 'changelog.el.txt' elif (control.setting('changelog_lang') == '0' and 'Greek' not in control.infoLabel('System.Language') ) or control.setting('changelog_lang') == '1': change_txt = 'changelog.en.txt' else: change_txt = 'changelog.el.txt' change_txt = control.join(control.addonPath, 'resources', 'texts', change_txt) if get_text: return py2_uni(file_to_text(change_txt)).partition(u'\n\n')[0] else: control.dialog.textviewer( control.addonInfo('name') + ', ' + control.lang(30110), file_to_text(change_txt))
def skin_name(): addon_xml = control.join(control.transPath('special://skin/'), 'addon.xml') try: with open(addon_xml, encoding='utf-8') as f: xml = f.read() except Exception: with open(addon_xml) as f: xml = f.read() try: name = client.parseDOM(xml, u'addon', ret='name')[0] except IndexError: name = 'not found' return name