def github_install(): import re from libs import github_installer from libs import github c = kodi.dialog_confirm("Confirm Install", kodi.arg('file'), yes="Install", no="Cancel") if not c: return addon_id = re.sub("-[\d\.]+zip$", "", kodi.arg('file')) github_installer.GitHub_Installer( addon_id, kodi.arg('url'), kodi.arg('full_name'), kodi.vfs.join("special://home", "addons")) r = kodi.dialog_confirm(kodi.get_name(), 'Click Continue to install more addons or', 'Restart button to finalize addon installation', yes='Restart', no='Continue') if r: import sys import xbmc if sys.platform in ['linux', 'linux2', 'win32']: xbmc.executebuiltin('RestartApp') else: xbmc.executebuiltin('ShutDown')
def history_delete(): if not kodi.arg('id'): return from libs.database import DB DB.execute("DELETE FROM search_history WHERE search_id=?", [kodi.arg('id')]) DB.commit() kodi.refresh()
def delete_feed(): if not kodi.dialog_confirm('Delete Feed?', kodi.arg('title'), "Click YES to proceed."): return from libs.database import DB DB.execute("DELETE FROM feed_subscriptions WHERE feed_id=?", [kodi.arg('id')]) DB.commit() kodi.refresh()
def browse_repository(): from libs import github xml = github.browse_repository(kodi.arg('url')) heading = "%s/%s" % (kodi.arg('full_name'), kodi.arg('file')) options = [] if xml: for addon in xml.findAll('addon'): options.append("%s (%s)" % (addon['name'], addon['version'])) kodi.dialog_select(heading, sorted(options))
def make_season_directory(season): infoLabel = core.make_season_infolabel(season, ids) if not infoLabel: return if 'aired_episodes' in season and infoLabel[ 'season'] in watched and season['aired_episodes'] == len( watched[infoLabel['season']]): infoLabel['overlay'] = 7 infoLabel['playcount'] = 1 menu = kodi.ContextMenu() menu.add( 'Toggle Watched', { "mode": "toggle_watched", "api": { "name": "trakt", "method": "set_watched_state", "args": ("season", kodi.arg('trakt_id'), season, True), "refresh": True } }) menu.add( 'Set Default View', { "mode": "set_default_view", "api": { "name": "kodi", "method": "set_default_view", "args": ("season", ) } }) menu.add( 'Toggle Watched', { "mode": "toggle_watched", "api": { "name": "trakt", "method": "set_watched_state", "args": ("season", kodi.arg('trakt_id'), True, infoLabel['season']), "refresh": True } }) kodi.add_menu_item( { "mode": "list_episodes", "trakt_id": ids['trakt'], "season": infoLabel['season'], "ids": ids }, infoLabel, menu=menu, image=infoLabel['poster'])
def search_menu(): from libs.database import DB menu = kodi.ContextMenu() menu.add('Search Filter', {"mode": "search_filter"}) kodi.add_menu_item({'mode': 'void'}, {'title': "[COLOR darkorange]%s[/COLOR]" % kodi.arg('title')}, icon='null', menu=menu) kodi.add_menu_item({'mode': 'search', 'type': kodi.arg('type')}, {'title': "*** New Search ***"}, icon='null', menu=menu) results = DB.query_assoc("SELECT search_id, query FROM search_history WHERE search_type=? ORDER BY ts DESC LIMIT 25", [kodi.arg('type')], quiet=True) if results is not None: for result in results: menu = kodi.ContextMenu() menu.add('Search Filter', {"mode": "search_filter"}) menu.add('Delete from search history', {"mode": "history_delete", "id": result['search_id']}) kodi.add_menu_item({'mode': 'search', 'type': kodi.arg('type'), 'query': result['query']}, {'title': result['query']}, menu=menu, icon='null') kodi.eod()
def make_stream_directory(r): menu = kodi.ContextMenu() menu.add( 'Set Default View', { "mode": "set_default_view", "api": { "name": "kodi", "method": "set_default_view", "args": ("stream", ) } }) infoLabel = {"title": r['title'], "display": r['display']} menu.add( 'Master Control', { "mode": "master_control", "media": kodi.args['media'], "raw_url": r['raw_url'], "service": r['service'], "title": kodi.args['title'], "year": kodi.arg('year'), "season": kodi.arg('season'), "episode": kodi.arg('episode'), "trakt_id": kodi.arg('trakt_id') }) if r['torrent']: menu.add( 'Add to Cloud', { "mode": "execute_api", "api": { "name": "premiumize", "method": "create_transfer", "args": (r['raw_url'], ), "notify": True, "confirm": "Add to Premiumize Cloud?", "message": r['title'] } }) kodi.add_video_item( { "mode": "play_stream", "raw_url": r['raw_url'], "title": kodi.args['title'], "service": r['service'], "ids": ids, "media": kodi.args['media'], "trakt_id": kodi.args['trakt_id'] }, infoLabel, menu=menu, icon=r['icon'])
def premiumize_transfers(): import re from commoncore import premiumize from scrapecore.scrapers.common import BaseScraper, QUALITY id = kodi.arg('id', '') transfers = premiumize.list_transfers() kodi.add_menu_item( { "mode": "execute_api", "api": { "name": "premiumize", "method": "clear_transfers", "refresh": True, "confirm": "Confirm Clear Transfers(s)?", "message": "Delete all transfers" } }, {'title': "*** Clear Finished Transfered ***"}, icon="clear_transfers.png") for t in transfers['transfers']: menu = kodi.ContextMenu() kodi.add_menu_item({ 'mode': 'void', "id": t['id'] }, {'title': t['name']}, menu=menu, icon="definition/folder.png") kodi.eod(DEFAULT_VIEWS.STREAMS)
def feed_list(): from commoncore.baseapi import CACHABLE_API, EXPIRE_TIMES class FeedAPI(CACHABLE_API): base_url = '' default_return_type = 'xml' try: xml = FeedAPI().request(kodi.arg('url'), cache_limit=EXPIRE_TIMES.EIGHTHOURS) for r in xml.findAll('repository'): name = r.find('name').text username = r.find('username').text desc = r.find('description').text title = "%s: %s" % (name, desc) kodi.add_menu_item( { 'mode': 'search', 'type': 'username', 'query': username }, { 'title': title, 'plot': desc }, icon='null') kodi.eod() except: pass
def play_stream(): from scrapecore import scrapers if kodi.mode == 'play_stream': from commoncore import trakt ids = kodi.arg('ids', decode='json') if kodi.args['media'] == 'episode': response = trakt.get_episode_info(ids['trakt'], ids['season'], ids['episode']) infoLabel = core.make_infolabel('episode', response['items'], ids=ids) show = trakt.get_show_info(ids['trakt']) metadata = {"show": show, "episode": infoLabel, "ids": ids} infoLabel['title'] = "%s-S%02dE%02d-%s" % ( kodi.args['title'], int(ids['season']), int( ids['episode']), infoLabel['title']) else: response = trakt.get_movie_info(ids['trakt']) infoLabel = core.make_infolabel('movie', response['items']) metadata = {"movie": infoLabel, "ids": ids} kodi.set_playback_info(metadata) kodi.set_trakt_ids(ids) else: infoLabel = {"poster": "", "title": "", "resume_point": ""} resolved_url = scrapers.get_scraper_by_name( kodi.args['service']).resolve_url(kodi.args['raw_url']) if resolved_url: kodi.play_stream(resolved_url, metadata=infoLabel)
def github_install(): import re from libs import github_installer from libs import github c = kodi.dialog_confirm("Confirm Install", kodi.arg('file'), yes="Install", no="Cancel") if not c: return addon_id = re.sub("-[\d\.]+zip$", "", kodi.arg('file')) github_installer.GitHub_Installer(addon_id, kodi.arg('url'), kodi.arg('full_name'), kodi.vfs.join("special://home", "addons")) r = kodi.dialog_confirm(kodi.get_name(), 'Click Continue to install more addons or', 'Restart button to finalize addon installation', yes='Restart', no='Continue') if r: import sys import xbmc if sys.platform in ['linux', 'linux2', 'win32']: xbmc.executebuiltin('RestartApp') else: xbmc.executebuiltin('ShutDown')
def update_addons(): from libs import github_installer quiet = True if kodi.arg('quiet') == 'quiet' else False if not quiet: c = kodi.dialog_confirm("Confirm Update", "Check for updates", yes="Update", no="Cancel") if not c: return github_installer.update_addons(quiet)
def custom_list_menu(): from commoncore import trakt lists = trakt.get_custom_lists() for l in lists['items']: kodi.add_menu_item( { 'mode': '%s_custom_list' % kodi.arg('media'), "api": { "name": "trakt", "method": "get_custom_list", "args": ( l['ids']['slug'], kodi.arg('media'), ) } }, {'title': l['name']}, icon='list.png') kodi.eod(DEFAULT_VIEWS.LIST)
def master_control(): options = [ "Send to Master Control", "Stream with Master Control", "Master Control Queue" ] c = kodi.dialog_select("Master Control Menu", options) if c is False: return if c == 2: kodi.execute_url("plugin://master.control?mode=queue") elif c == 1: from scrapecore import scrapers resolved_url = scrapers.get_scraper_by_name( kodi.args['service']).resolve_url(kodi.args['raw_url']) if not resolved_url: return from mastercontrol import api as master_control stream_url = master_control.get_streaming_url(resolved_url) kodi.play_url(stream_url) elif c == 0: ids = kodi.arg('ids', decode='json') from commoncore import trakt from mastercontrol import api as master_control if kodi.args['media'] == 'movie': media = 'movie' title = "%s (%s)" % (kodi.args['title'], kodi.args['year']) filename = kodi.vfs.clean_file_name(title) destination = '' else: media = 'tvshow' destination = kodi.vfs.join(kodi.args['title'], "Season %s" % kodi.args['season']) title = "%s - S%02dE%02d" % (kodi.args['title'], int(kodi.args['season']), int(kodi.args['episode'])) filename = kodi.vfs.clean_file_name(title) from scrapecore import scrapers resolved_url = scrapers.get_scraper_by_name( kodi.args['service']).resolve_url(kodi.args['raw_url']) if not resolved_url: return video = { "type": media, "filename": filename, "url": resolved_url, "title": title, "addon": kodi.get_id(), "destination": destination, "trakt_id": kodi.args['trakt_id'] } response = master_control.enqueue(video) kodi.log(response) message = 'Failed Adding to Queue %s.' % (title) try: if response['status'] == 200: message = 'Added to Queue %s.' % (title) except: pass kodi.notify(kodi.get_name(), message)
def sub_menu(): if kodi.mode == 'shows_genres': from commoncore.trakt import SHOW_GENRES as GENRES else: from commoncore.trakt import MOVIE_GENRES as GENRES method = "get_trending_%s" % kodi.arg('media') mode = "%s_genre_list" % kodi.arg('media') for genre, slug in GENRES: kodi.add_menu_item( { 'mode': mode, "api": { "name": "trakt", "method": method, "args": ('genres', slug) } }, {'title': genre}, icon='genre.png') kodi.eod(DEFAULT_VIEWS.LIST)
def execute_api(): api = kodi.arg('api', decode='json') if 'confirm' in api and api['confirm']: message = api['message'] if 'message' in api else '' if not kodi.dialog_confirm("Click Yes to proceed.", api['confirm'], message): return response = core.execute_api(globals(), api) if 'notify' in api and api['notify']: kodi.notify('API Response', response) if 'refresh' in api and api['refresh']: kodi.refresh()
def feed_list(): from commoncore.baseapi import CACHABLE_API, EXPIRE_TIMES class FeedAPI(CACHABLE_API): base_url = '' default_return_type = 'xml' try: xml = FeedAPI().request(kodi.arg('url'), cache_limit=EXPIRE_TIMES.EIGHTHOURS) for r in xml.findAll('repository'): name = r.find('name').text username = r.find('username').text desc = r.find('description').text title = "%s: %s" % (name, desc) kodi.add_menu_item({'mode': 'search', 'type': 'username', 'query': username}, {'title': title, 'plot': desc}, icon='null') kodi.eod() except:pass
def install_feed(): if not kodi.dialog_confirm('Install Feed?', "Click YES to proceed."): return from libs.database import DB from libs import github xml = github.install_feed(kodi.arg('url')) try: for f in xml.findAll('feeds'): name = f.find('name').text url = f.find('url').text DB.execute("INSERT INTO feed_subscriptions(name, url) VALUES(?,?)", [name, url]) DB.commit() count = DB.query("SELECT count(1) FROM feed_subscriptions") kodi.set_setting('installed_feeds', str(count[0][0])) kodi.notify("Install Complete",'Feed Installed') except: kodi.notify("Install failed",'Invalid Format.')
def install_feed(): from libs.database import DB from libs import github if kodi.mode == 'install_feed': url = kodi.arg('url') xml = github.install_feed(url) else: url = kodi.dialog_file_browser('Select a feed file', mask='.zip') if not github.re_feed.search(url): return xml = github.install_feed(url, True) if not kodi.dialog_confirm('Install Feed?', "Click YES to proceed."): return try: for f in xml.findAll('feeds'): name = f.find('name').text url = f.find('url').text DB.execute("INSERT INTO feed_subscriptions(name, url) VALUES(?,?)", [name, url]) DB.commit() count = DB.query("SELECT count(1) FROM feed_subscriptions") kodi.set_setting('installed_feeds', str(count[0][0])) kodi.notify("Install Complete",'Feed Installed') except: kodi.notify("Install failed",'Invalid Format.')
def install_batch(): import xbmcgui from libs import github from libs import github_installer if kodi.mode == 'install_batch': url = kodi.arg('url') xml, zip_ref = github.batch_installer(url) else: url = kodi.dialog_file_browser('Select a install file', mask='.zip') if not github.re_installer.search(url): return xml, zip_ref = github.batch_installer(url, True) if not kodi.dialog_confirm('Batch Installer?', "Click YES to proceed.", "This will install a list of addons.", "Some configuration files and settings may be overwritten."): return if not xml: return # Install each addon as instructed installed_list = [] count = 0 for a in xml.findAll('addon'): count +=1 PB = kodi.ProgressBar() PB.new('Batch Installer - Progress', count) for a in xml.findAll('addon'): addon_id = a.find('addon_id') username = a.find('username') if addon_id is None or username is None: continue username = username.text addon_id = addon_id.text PB.next(addon_id) if not kodi.get_condition_visiblity("System.HasAddon(%s)"% addon_id): if PB.is_canceled(): return kodi.log("Batch install " + addon_id) url, filename, full_name, version = github.find_zip(username, addon_id) installed_list += github_installer.GitHub_Installer(addon_id, url, full_name, kodi.vfs.join("special://home", "addons"), quiet=True, batch=True, installed_list=installed_list).installed_list kodi.sleep(1000) # Look for config files. # Need to add error checking for missing config files configs= xml.find('configs') if configs is not None and 'dir' in configs.attrs[0]: config_dir = configs['dir'] for config in configs.findAll('config'): source = config.find('source') destination = config.find('destination') if source is None or destination is None: continue source = source.text destination = destination.text if not kodi.vfs.exists(destination): kodi.vfs.mkdir(destination, True) kodi.vfs.write_file(kodi.vfs.join(destination, source), zip_ref.read(config_dir + '/' + source)) # Now look for individual setting key and value pairs # Set them as instructed settings= xml.find('settings') if settings is not None: for setting in settings.findAll('setting'): if 'addon_id' in setting.attrs[0]: addon_id = setting['addon_id'] k = setting.find('key') v = setting.find('value') if k is None or v is None: continue kodi.set_setting(k.text, v.text, addon_id) builtins= xml.find('builtins') if builtins is not None: for cmd in builtins.findAll('command'): cmd = cmd.text kodi.run_command(cmd) jsonrpc= xml.find('jsonrpc') if jsonrpc is not None: from ast import literal_eval for cmd in jsonrpc.findAll('command'): method = cmd.find('method').text params = literal_eval(cmd.find('params').text) id = cmd.find('id').text kodi.kodi_json_request(method, params, id) # Now clean up zip_ref.close() PB.close() r = kodi.dialog_confirm(kodi.get_name(), 'Click Continue to install more addons or', 'Restart button to finalize addon installation', yes='Restart', no='Continue') if r: import sys import xbmc if sys.platform in ['linux', 'linux2', 'win32']: xbmc.executebuiltin('RestartApp') else: xbmc.executebuiltin('ShutDown')
if results is not None: for result in results: menu = kodi.ContextMenu() menu.add('Search Filter', {"mode": "search_filter"}) menu.add('Delete from search history', {"mode": "history_delete", "id": result['search_id']}) kodi.add_menu_item({'mode': 'search', 'type': kodi.arg('type'), 'query': result['query']}, {'title': result['query']}, menu=menu, icon='null') kodi.eod() @kodi.register('search') def search(): from commoncore.dispatcher import dispatcher from libs.database import DB from libs import github q = kodi.arg('query') if kodi.arg('query') else kodi.dialog_input('Search GitHub') if q in [None, False, '']: return False DB.execute('INSERT OR REPLACE INTO search_history(search_type, query) VALUES(?,?)', [kodi.arg('type'), q]) DB.commit() @dispatcher.register('username') def username(): rtype = 'api' response = github.find_zips(q) if response is None: return for r in github.sort_results(response['items']): url = github.content_url % (r['repository']['full_name'], r['path']) menu = kodi.ContextMenu() if r['is_repository']: menu.add('Browse Repository Contents', {"mode": "browse_repository", "url": url, "file": r['name'], "full_name": "%s/%s" % (q, r['repository']['name'])}) if r['is_feed']: r['display'] = "[COLOR yellow]%s[/COLOR]" % r['name'] kodi.add_menu_item({'mode': 'install_feed', "url": url}, {'title': r['name'], 'display': r['display']}, menu=menu, icon='null')
def search(): from commoncore.dispatcher import dispatcher from libs.database import DB from libs import github from libs.github import get_download_url q = kodi.arg('query') if kodi.arg('query') else kodi.dialog_input('Search GitHub') if q in [None, False, '']: return False DB.execute('REPLACE INTO search_history(search_type, query) VALUES(?,?)', [kodi.arg('type'), q]) DB.commit() @dispatcher.register('username') def username(): rtype = 'api' response = github.find_zips(q) if response is None: return for r in github.sort_results(response['items']): url = get_download_url(r['repository']['full_name'], r['path']) menu = kodi.ContextMenu() if r['is_repository']: menu.add('Browse Repository Contents', {"mode": "browse_repository", "url": url, "file": r['name'], "full_name": "%s/%s" % (q, r['repository']['name'])}) if r['is_feed']: r['display'] = "[COLOR yellow]%s[/COLOR]" % r['name'] kodi.add_menu_item({'mode': 'install_feed', "url": url}, {'title': r['name'], 'display': r['display']}, menu=menu, icon='null') elif r['is_installer']: r['display'] = "[COLOR orange]%s[/COLOR]" % r['name'] kodi.add_menu_item({'mode': 'install_batch', "url": url}, {'title': r['name'], 'display': r['display']}, menu=menu, icon='null') else: kodi.add_menu_item({'mode': 'github_install', "url": url, "user": q, "file": r['name'], "full_name": "%s/%s" % (q, r['repository']['name'])}, {'title': r['name']}, menu=menu, icon='null') @dispatcher.register('repository') def repository(): rtype = 'api' results = github.search(q, 'title') if results is None: return for i in results['items']: user = i['owner']['login'] response = github.find_zips(user) if response is None: continue for r in github.sort_results(response['items']): url = get_download_url(r['repository']['full_name'], r['path']) menu = kodi.ContextMenu() if r['is_repository']: menu.add('Browse Repository Contents', {"mode": "browse_repository", "url": url, "file": r['name'], "full_name": "%s/%s" % (q, r['repository']['name'])}) if r['is_feed']: r['display'] = "[COLOR yellow]%s[/COLOR]" % r['name'] kodi.add_menu_item({'mode': 'install_feed', "url": url}, {'title': r['name']}, menu=menu, icon='null') elif r['is_installer']: r['display'] = "[COLOR orange]%s[/COLOR]" % r['name'] kodi.add_menu_item({'mode': 'install_batch', "url": url}, {'title': r['name'], 'display': r['display']}, menu=menu, icon='null') else: kodi.add_menu_item({'mode': 'github_install', "url": url, "user": q, "file": r['name'], "full_name": "%s/%s" % (q, r['repository']['name'])}, {'title': r['name']}, menu=menu, icon='null') @dispatcher.register('addonid') def addonid(): from commoncore.core import highlight from libs.github import version_sort rtype = 'api' results = github.search(q, 'id') if results is None: return results.sort(key=lambda x:version_sort(x['name']), reverse=True) for i in results: menu = kodi.ContextMenu() r = i['repository'] full_name = r['full_name'] title = highlight("%s/%s" % (full_name, i['name']), q, 'yellow') url = get_download_url(full_name, i['path']) menu.add("Search Username", {'mode': 'search', 'type': 'username', 'query': r['owner']['login']}) kodi.add_menu_item({'mode': 'github_install', "url": url, "file": i['name'], "full_name": full_name}, {'title': title}, menu=menu, icon='null') dispatcher.run(kodi.arg('type')) kodi.eod()
def tv_list(): from commoncore import trakt api = kodi.arg('api', decode='json') if api['method'] == "search": query = core.get_query('Shows', api['args'][0]) api['args'] = (query, 'show') results = core.execute_api(locals(), api) if not results: kodi.handel_error(kodi.get_name(), 'Not results found') @kodi.map_directory(results['items']) def make_show_directory(record): infoLabel = core.make_infolabel('show', record) ids = record['show']['ids'] if 'show' in record else record['ids'] infoLabel['display'] = "%s (%s)" % (infoLabel['title'], infoLabel['year']) menu = kodi.ContextMenu() menu.add( 'Set Default View', { "mode": "set_default_view", "api": { "name": "kodi", "method": "set_default_view", "args": ("show", ) } }) if kodi.mode in ['shows_watchlist', 'shows_custom_list']: menu.add( 'Remove From List', { "mode": "execute_api", "api": { "name": "trakt", "method": "remove_from_list", "args": ("show", api['args'][0], infoLabel['trakt_id']), "refresh": True, "confirm": "Confirm Remove from List?", "message": api['args'][0] } }) else: menu.add( 'Add to List', { "mode": "execute_api", "api": { "name": "trakt", "method": "add_to_list", "args": ("show", infoLabel['trakt_id']) } }) kodi.add_menu_item( { "mode": "list_seasons", "trakt_id": infoLabel['trakt_id'], "ids": ids }, infoLabel, menu=menu, image=infoLabel['poster']) if 'total_pages' in results and results['total_pages'] > 1 and results[ 'current_page'] < results['total_pages']: kodi.add_menu_item( { "mode": kodi.mode, "api": api, "page": results['current_page'] + 1 }, {"title": core.format_color("Next Page >>", 'green')}, icon="next_page.png") kodi.eod(DEFAULT_VIEWS.SHOWS)
def search(): from commoncore.dispatcher import dispatcher from libs.database import DB from libs import github q = kodi.arg('query') if kodi.arg('query') else kodi.dialog_input( 'Search GitHub') if q in [None, False, '']: return False DB.execute('INSERT INTO search_history(search_type, query) VALUES(?,?)', [kodi.arg('type'), q]) DB.commit() @dispatcher.register('username') def username(): rtype = 'api' response = github.find_zips(q) if response is None: return for r in github.sort_results(response['items']): url = github.content_url % (r['repository']['full_name'], r['path']) menu = kodi.ContextMenu() if r['is_repository']: menu.add( 'Browse Repository Contents', { "mode": "browse_repository", "url": url, "file": r['name'], "full_name": "%s/%s" % (q, r['repository']['name']) }) if r['is_feed']: r['display'] = "[COLOR yellow]%s[/COLOR]" % r['name'] kodi.add_menu_item({ 'mode': 'install_feed', "url": url }, { 'title': r['name'], 'display': r['display'] }, menu=menu, icon='null') else: kodi.add_menu_item( { 'mode': 'github_install', "url": url, "user": q, "file": r['name'], "full_name": "%s/%s" % (q, r['repository']['name']) }, {'title': r['name']}, menu=menu, icon='null') @dispatcher.register('repository') def repository(): rtype = 'api' results = github.search(q, 'title') if results is None: return for i in results['items']: user = i['owner']['login'] response = github.find_zips(user) if response is None: continue for r in github.sort_results(response['items']): url = github.content_url % (r['repository']['full_name'], r['path']) menu = kodi.ContextMenu() if r['is_repository']: menu.add( 'Browse Repository Contents', { "mode": "browse_repository", "url": url, "file": r['name'], "full_name": "%s/%s" % (q, r['repository']['name']) }) if r['is_feed']: kodi.add_menu_item({ 'mode': 'install_feed', "url": url }, {'title': r['name']}, menu=menu, icon='null') else: kodi.add_menu_item( { 'mode': 'github_install', "url": url, "user": q, "file": r['name'], "full_name": "%s/%s" % (q, r['repository']['name']) }, {'title': r['name']}, menu=menu, icon='null') @dispatcher.register('addonid') def addonid(): from commoncore.core import highlight from libs.github import re_version, content_url from distutils.version import LooseVersion rtype = 'api' results = github.search(q, 'id') if results is None: return def version_sort(name): v = re_version.search(name) if v: return LooseVersion(v.group(1)) else: return LooseVersion('0.0.0') results.sort(key=lambda x: version_sort(x['name']), reverse=True) for i in results: menu = kodi.ContextMenu() r = i['repository'] full_name = r['full_name'] title = highlight("%s/%s" % (full_name, i['name']), q, 'yellow') url = content_url % (full_name, i['path']) menu.add("Search Username", { 'mode': 'search', 'type': 'username', 'query': r['owner']['login'] }) kodi.add_menu_item( { 'mode': 'github_install', "url": url, "file": i['name'], "full_name": full_name }, {'title': title}, menu=menu, icon='null') dispatcher.run(kodi.arg('type')) kodi.eod()
def search(): from commoncore.dispatcher import dispatcher from libs.database import DB from libs import github q = kodi.arg('query') if kodi.arg('query') else kodi.dialog_input('Search GitHub') if q in [None, False, '']: return False
def movie_list(): from commoncore import trakt from coreplayback import in_progress api = kodi.arg('api', decode='json') if api['method'] == "search": query = core.get_query('Movies', api['args'][0]) api['args'] = (query, 'movie') results = core.execute_api(locals(), api) if not results: kodi.handel_error(kodi.get_name(), 'Not results found') watched = trakt.get_watched_history( 'movies') if trakt.is_authorized() else [] @kodi.map_directory(results['items']) def make_movie_directory(record): ids = record['movie']['ids'] if 'movie' in record else record['ids'] infoLabel = core.make_infolabel('movie', record, watched=watched) infoLabel['display'] = "%s (%s)" % (infoLabel['title'], infoLabel['year']) menu = kodi.ContextMenu() inprogress = in_progress('movie', infoLabel['trakt_id']) menu.add( 'Toggle Watched', { "mode": "toggle_watched", "api": { "name": "trakt", "method": "set_watched_state", "args": ("movie", infoLabel['trakt_id'], infoLabel['playcount'] == 0), "refresh": True } }) if kodi.mode in ['shows_watchlist', 'shows_custom_list']: menu.add( 'Remove From List', { "mode": "execute_api", "api": { "name": "trakt", "method": "remove_from_list", "args": ("movie", api['args'][0], infoLabel['trakt_id']), "refresh": True, "confirm": "Confirm Remove from List?", "message": api['args'][0] } }) else: menu.add( 'Add to List', { "mode": "execute_api", "api": { "name": "trakt", "method": "add_to_list", "args": ("movie", infoLabel['trakt_id']) } }) menu.add( 'Set Default View', { "mode": "set_default_view", "api": { "name": "kodi", "method": "set_default_view", "args": ("movie", ) } }) kodi.add_menu_item( { "mode": "search_streams", "media": "movie", "trakt_id": infoLabel['trakt_id'], "title": infoLabel['title'], "year": infoLabel["year"], "ids": ids }, infoLabel, in_progress=inprogress, menu=menu, image=infoLabel['poster']) if 'total_pages' in results and results['total_pages'] > 1 and results[ 'current_page'] < results['total_pages']: kodi.add_menu_item( { "mode": kodi.mode, "api": api, "page": results['current_page'] + 1 }, {"title": core.format_color("Next Page >>", 'green')}, icon="next_page.png") kodi.eod(DEFAULT_VIEWS.MOVIES)
def list_episodes(): from commoncore import trakt from coreplayback import in_progress ids = kodi.arg('ids', decode='json') show = trakt.get_show_info(ids['trakt']) episodes = trakt.get_season_info(kodi.arg('trakt_id'), kodi.arg('season')) watched = trakt.get_watched_history( 'shows') if trakt.is_authorized() else [] @kodi.map_directory(episodes['items']) def make_episode_directory(episode): infoLabel = core.make_infolabel('episode', episode, show=show, ids=ids, watched=watched) if not infoLabel: return infoLabel['display'] = "%sx%s. %s" % ( infoLabel['season'], infoLabel['episode'], infoLabel['title']) menu = kodi.ContextMenu() menu.add( 'Toggle Watched', { "mode": "toggle_watched", "api": { "name": "trakt", "method": "set_watched_state", "args": ("episode", infoLabel['trakt_id'], infoLabel['playcount'] == 0), "refresh": True } }) menu.add( 'Set Default View', { "mode": "set_default_view", "api": { "name": "kodi", "method": "set_default_view", "args": ("episode", ) } }) if infoLabel['aired']: inprogress = in_progress('episode', infoLabel['trakt_id']) kodi.add_menu_item( { "mode": "search_streams", "media": "episode", "trakt_id": infoLabel['trakt_id'], "title": infoLabel['showtitle'], "episode_title": infoLabel['title'], "year": infoLabel['year'], "season": infoLabel['season'], "episode": infoLabel['episode'], "ids": ids }, infoLabel, in_progress=inprogress, menu=menu, image=infoLabel['poster']) else: infoLabel['display'] = core.format_color(infoLabel['display'], 'maroon') kodi.add_menu_item({"mode": "void"}, infoLabel, menu=menu, image=infoLabel['poster']) kodi.eod(DEFAULT_VIEWS.EPISODES)
def addon_settings(): from scrapecore import scrapers kodi.open_settings(kodi.arg('addon_id'))
def list_seasons(): from commoncore import trakt ids = kodi.arg('ids', decode='json') seasons = trakt.get_show_seasons(kodi.arg('trakt_id')) watched = trakt.get_season_watched( kodi.arg('trakt_id')) if trakt.is_authorized() else [] @kodi.map_directory(seasons['items']) def make_season_directory(season): infoLabel = core.make_season_infolabel(season, ids) if not infoLabel: return if 'aired_episodes' in season and infoLabel[ 'season'] in watched and season['aired_episodes'] == len( watched[infoLabel['season']]): infoLabel['overlay'] = 7 infoLabel['playcount'] = 1 menu = kodi.ContextMenu() menu.add( 'Toggle Watched', { "mode": "toggle_watched", "api": { "name": "trakt", "method": "set_watched_state", "args": ("season", kodi.arg('trakt_id'), season, True), "refresh": True } }) menu.add( 'Set Default View', { "mode": "set_default_view", "api": { "name": "kodi", "method": "set_default_view", "args": ("season", ) } }) menu.add( 'Toggle Watched', { "mode": "toggle_watched", "api": { "name": "trakt", "method": "set_watched_state", "args": ("season", kodi.arg('trakt_id'), True, infoLabel['season']), "refresh": True } }) kodi.add_menu_item( { "mode": "list_episodes", "trakt_id": ids['trakt'], "season": infoLabel['season'], "ids": ids }, infoLabel, menu=menu, image=infoLabel['poster']) kodi.eod(DEFAULT_VIEWS.SEASONS)
def execute_command(): cmd = kodi.arg('xbmc', decode='json') cmd = "%s(%s)" % (cmd['command'], cmd['args']) kodi.run_command(cmd)
def search_streams(): from scrapecore import scrapers results = scrapers.search(kodi.args['media'], kodi.args['title'], episode_title=kodi.arg('episode_title'), year=kodi.arg('year'), season=kodi.arg('season'), episode=kodi.arg('episode'), trakt_id=kodi.arg('trakt_id')) if len(results) == 0: kodi.handel_error(kodi.get_name(), 'Not results found') return ids = kodi.arg('ids', decode='json') ids['season'] = kodi.arg('season') ids['episode'] = kodi.arg('episode') @kodi.map_directory(results) def make_stream_directory(r): menu = kodi.ContextMenu() menu.add( 'Set Default View', { "mode": "set_default_view", "api": { "name": "kodi", "method": "set_default_view", "args": ("stream", ) } }) infoLabel = {"title": r['title'], "display": r['display']} menu.add( 'Master Control', { "mode": "master_control", "media": kodi.args['media'], "raw_url": r['raw_url'], "service": r['service'], "title": kodi.args['title'], "year": kodi.arg('year'), "season": kodi.arg('season'), "episode": kodi.arg('episode'), "trakt_id": kodi.arg('trakt_id') }) if r['torrent']: menu.add( 'Add to Cloud', { "mode": "execute_api", "api": { "name": "premiumize", "method": "create_transfer", "args": (r['raw_url'], ), "notify": True, "confirm": "Add to Premiumize Cloud?", "message": r['title'] } }) kodi.add_video_item( { "mode": "play_stream", "raw_url": r['raw_url'], "title": kodi.args['title'], "service": r['service'], "ids": ids, "media": kodi.args['media'], "trakt_id": kodi.args['trakt_id'] }, infoLabel, menu=menu, icon=r['icon']) kodi.eod(DEFAULT_VIEWS.STREAMS)
def toggle_scraper(): if kodi.get_setting(kodi.arg('service') + '_enable') == 'true': kodi.set_setting(kodi.arg('service') + '_enable', 'false') else: kodi.set_setting(kodi.arg('service') + '_enable', 'true') kodi.refresh()
def in_progress(): import json from commoncore import trakt import coreplayback api = kodi.arg('api', decode='json') results = core.execute_api(locals(), api) if not results: kodi.handel_error(kodi.get_name(), 'Not results found') return def make_show_directory(record): ids = json.loads(record[0]) metadata = json.loads(record[1]) episode = metadata['episode'] show = metadata['show']['items'] infoLabel = metadata['episode'] infoLabel['display'] = "%sx%s. %s - %s" % ( infoLabel['season'], infoLabel['episode'], show['title'], infoLabel['title']) menu = kodi.ContextMenu() menu.add( 'Set Default View', { "mode": "set_default_view", "api": { "name": "kodi", "method": "set_default_view", "args": ("show", ) } }) menu.add( 'Add to List', { "mode": "execute_api", "api": { "name": "trakt", "method": "add_to_list", "args": ("show", infoLabel['trakt_id']) } }) kodi.add_menu_item( { "mode": "search_streams", "media": "episode", "trakt_id": infoLabel['trakt_id'], "title": show['title'], "year": show['year'], "season": infoLabel['season'], "episode": infoLabel['episode'], "ids": ids }, infoLabel, menu=menu, in_progress=True, image=infoLabel['poster']) def make_movie_directory(record): ids = json.loads(record[0]) infoLabel = json.loads(record[1]) infoLabel['display'] = "%s (%s)" % (infoLabel['title'], infoLabel['year']) menu = kodi.ContextMenu() menu.add( 'Set Default View', { "mode": "set_default_view", "api": { "name": "kodi", "method": "set_default_view", "args": ("movie", ) } }) menu.add( 'Add to List', { "mode": "execute_api", "api": { "name": "trakt", "method": "add_to_list", "args": ("movie", infoLabel['trakt_id']) } }) kodi.add_menu_item( { "mode": "search_streams", "media": "movie", "trakt_id": infoLabel['trakt_id'], "title": infoLabel['title'], "year": infoLabel['year'], "ids": ids }, infoLabel, menu=menu, in_progress=True, image=infoLabel['poster']) if kodi.mode == 'shows_inprogress': map(make_show_directory, results) else: map(make_movie_directory, results) kodi.eod(DEFAULT_VIEWS.SHOWS)