def search_menu(): from commoncore import trakt kodi.add_menu_item( { 'mode': '%s_search_results' % kodi.args['media'], "api": { "name": "trakt", "method": "search", "args": ('', ) } }, {'title': "*** New Search ***"}, icon='search.png') history = trakt.get_search_history(kodi.args['media']) for h in history: kodi.add_menu_item( { 'mode': '%s_search_results' % kodi.args['media'], "api": { "name": "trakt", "method": "search", "args": h } }, {'title': h[0]}, icon='search.png') kodi.eod(DEFAULT_VIEWS.LIST)
def main(): menu = kodi.ContextMenu() menu.add( 'Set Default View', { "mode": "set_default_view", "api": { "name": "kodi", "method": "set_default_view", "args": ("list", ) } }) kodi.add_menu_item({'mode': 'tv_menu'}, {'title': "Shows"}, menu=menu, icon='shows.png') kodi.add_menu_item({'mode': 'movie_menu'}, {'title': "Movies"}, menu=menu, icon='movies.png') kodi.add_menu_item( { 'mode': 'execute_api', "api": { "name": "kodi", "method": "go_to_url", "args": ("plugin://plugin.video.scrapecore.bowser", ) } }, {'title': "Bowser"}, menu=menu, icon='bowser.png', visible=kodi.get_condition_visiblity( 'System.HasAddon(plugin.video.scrapecore.bowser)') == 1) kodi.add_menu_item({'mode': 'settings_menu'}, {'title': "Settings and Tools"}, menu=menu, icon='settings.png') kodi.eod(DEFAULT_VIEWS.LIST)
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 list_modules(): from scrapecore import scrapecore for r in scrapecore.get_installed_resources(): kodi.add_menu_item({ 'mode': 'void', }, {'title': r['name']}, icon='') kodi.eod()
def feed_menu(): from libs.database import DB kodi.add_menu_item({'mode': 'new_feed'}, {'title': "*** New Search Feed ***"}, icon='null') feeds = DB.query_assoc( "SELECT feed_id, name, url, enabled FROM feed_subscriptions") for feed in feeds: menu = kodi.ContextMenu() name = feed['name'] if feed['name'] else feed['url'] if not feed['enabled']: title = "[COLOR darkred]%s[/COLOR]" % name else: title = name menu.add('Delete Feed', { "mode": "delete_feed", "title": title, "id": feed['feed_id'] }) kodi.add_menu_item({ 'mode': 'list_feed', 'url': feed['url'] }, {'title': title}, menu=menu, icon='null') kodi.eod()
def browse_service(): from scrapecore import scrapers if kodi.args['media'] == 'shows': shows = scrapers.list_shows(kodi.args['service']) for show in shows: image = show['image'] if 'image' in show else '' kodi.add_menu_item( { 'mode': 'browse_show', "service": kodi.args['service'], "url": show['url'] }, {'title': show['title']}, image=image) else: movies = scrapers.list_movies(kodi.args['service']) for movie in movies: image = movie['image'] if 'image' in movie else '' kodi.add_menu_item( { 'mode': 'play_direct', "service": kodi.args['service'], "url": movie['url'] }, {'title': movie['title']}, image=image) kodi.eod()
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 realdebrid_torrents(): from commoncore import realdebrid from scrapecore.scrapers.common import BaseScraper s = BaseScraper() torrents = realdebrid.list_torrents() for t in torrents: menu = kodi.ContextMenu() icon = '' quality = s.test_quality(t['filename']) size = core.format_size(t['bytes']) display = "RealDebrid | %s | %s" % (core.format_color( size, 'blue'), t['filename']) kodi.add_video_item( { "mode": "realdebrid_direct", "name": t['filename'], "type": "stream", "url": t['links'][0] }, { "title": t['filename'], "display": display }, icon=icon, menu=menu) kodi.eod(DEFAULT_VIEWS.STREAMS)
def movies_standard_menu(): menu = kodi.ContextMenu() menu.add( 'Set Default View', { "mode": "set_default_view", "api": { "name": "kodi", "method": "set_default_view", "args": ("list", ) } }) kodi.add_menu_item( { 'mode': 'movies_trending', "api": { "name": "trakt", "method": "get_trending_movies" } }, {'title': "Trending Movies"}, icon='trending.png') kodi.add_menu_item( { 'mode': 'movies_popular', "api": { "name": "trakt", "method": "get_popular_movies" } }, {'title': "Popular Movies"}, icon='popular.png') kodi.add_menu_item( { 'mode': 'movies_recommended', "api": { "name": "trakt", "method": "get_recommended_movies" } }, {'title': "Recommended Movies"}, icon='recommended.png') kodi.add_menu_item( { 'mode': 'movies_anticipated', "api": { "name": "trakt", "method": "get_anticipated_movies" } }, {'title': "Anticipated Movies"}, icon='anticipated.png') kodi.add_menu_item( { 'mode': 'movies_genres', 'media': 'movies', "api": { "name": "trakt", "method": "get_genres", "args": ("movies", ) } }, {'title': "Genres"}, icon='genres.png') kodi.eod(DEFAULT_VIEWS.LIST)
def main(): show_about() kodi.add_menu_item({'mode': 'search_menu', 'type': "username", 'title': "Search by GitHub Username"}, {'title': "Search by GitHub Username"}, icon='username.png') kodi.add_menu_item({'mode': 'search_menu', 'type': "repository", 'title': "Search by GitHub Repository Title"}, {'title': "Search by GitHub Repository Title [COLOR red](Advanced)[/COLOR]"}, icon='repository.png') kodi.add_menu_item({'mode': 'search_menu', 'type': "addonid",'title': "Search by Addon ID"}, {'title': "Search by Addon ID [COLOR red](Advanced)[/COLOR]"}, icon='addonid.png') kodi.add_menu_item({'mode': 'feed_menu'}, {'title': "Search Feeds"}, icon='search_feeds.png') kodi.add_menu_item({'mode': 'installer_menu'}, {'title': "Batch Installers"}, icon='batch_installer.png') kodi.add_menu_item({'mode': 'about'}, {'title': "About GitHub Installer"}, icon='about.png') kodi.add_menu_item({'mode': 'settings_menu'}, {'title': "Tools and Settings"}, icon='settings.png') kodi.eod()
def main(): show_about() kodi.add_menu_item({'mode': 'search_menu', 'type': "username", 'title': "Search by GitHub Username"}, {'title': "Search by GitHub Username"}, icon='username.png') kodi.add_menu_item({'mode': 'search_menu', 'type': "repository", 'title': "Search by GitHub Repository Title"}, {'title': "Search by GitHub Repository Title [COLOR red](Advanced)[/COLOR]"}, icon='repository.png') kodi.add_menu_item({'mode': 'search_menu', 'type': "addonid",'title': "Search by Addon ID"}, {'title': "Search by Addon ID [COLOR red](Advanced)[/COLOR]"}, icon='addonid.png') kodi.add_menu_item({'mode': 'feed_menu'}, {'title': "Search Feeds"}, icon='search_feeds.png', visible=feed_count()>0) kodi.add_menu_item({'mode': 'update_addons'}, {'title': "Check for Updates [COLOR red](Advanced)[/COLOR]"}, icon='update.png', visible=kodi.get_setting('enable_updates') == 'true') kodi.add_menu_item({'mode': 'about'}, {'title': "About GitHub Installer"}, icon='about.png') kodi.add_menu_item({'mode': 'addon_settings'}, {'title': "Tools and Settings"}, icon='settings.png') kodi.eod()
def scraper_list(): for s in scrapecore.get_scrapers(): if kodi.get_setting(s['service'] + '_enable') == 'true': title = format_color(s['name'], 'green') else: title = format_color(s['name'], 'maroon') kodi.add_menu_item({ 'mode': 'toggle_scraper', "service": s['service'] }, {'title': title}, icon='') kodi.eod()
def main(): kodi.add_menu_item({ "mode": "browse_menu", "media": "shows" }, {"title": "TV Shows"}) kodi.add_menu_item({ "mode": "browse_menu", "media": "movies" }, {"title": "Movies"}) kodi.add_menu_item({"mode": "list_modules"}, {"title": "List Resource Modules"}) kodi.eod()
def browse_menu(): from scrapecore import scrapers services = scrapers.get_browsable_scrapers(kodi.args['media']) for service, name in services: kodi.add_menu_item( { 'mode': 'browse_service', "service": service, "media": kodi.args['media'] }, {'title': "Browse: %s" % name}, icon='png') kodi.eod()
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 browse_show(): from scrapecore import scrapers episodes = scrapers.list_episodes(kodi.args['service'], kodi.args['url']) for episode in episodes: image = episode['image'] if 'image' in episode else '' kodi.add_video_item( { 'mode': 'play_direct', "service": kodi.args['service'], "raw_url": episode['url'] }, {'title': episode['title']}, random_url=False, image=image) kodi.eod()
def feed_menu(): from libs.database import DB kodi.add_menu_item({'mode': 'install_local_feed'}, {'title': "*** Local Search Feed File ***"}, icon='install_feed_local.png') #kodi.add_menu_item({'mode': 'search', 'query': 'gitbrowser.feed', 'type': 'addonid'}, {'title': "*** Search for Feeds ***"}, icon='null') feeds = DB.query_assoc("SELECT feed_id, name, url, enabled FROM feed_subscriptions") for feed in feeds: menu = kodi.ContextMenu() name = feed['name'] if feed['name'] else feed['url'] if not feed['enabled']: title = "[COLOR darkred]%s[/COLOR]" % name else: title = name menu.add('Delete Feed', {"mode": "delete_feed", "title": title, "id": feed['feed_id']}) kodi.add_menu_item({'mode': 'list_feed', 'url': feed['url']}, {'title': title}, menu=menu, icon='null') kodi.eod()
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 main(): kodi.add_menu_item({'mode': 'scraper_list'}, {'title': "Scrapers"}, icon='') kodi.add_menu_item({'mode': 'resource_list'}, {'title': "Installed Scraper Resources"}, icon='') kodi.add_menu_item({'mode': 'auth_realdebrid'}, {'title': "Authorize RealDebrid"}, icon='settings.png') kodi.add_menu_item({'mode': 'rebuild_settings'}, {'title': "Rebuild Settings File"}, icon='settings.png') kodi.add_menu_item({'mode': 'prune_cache'}, {'title': "Prune Cache"}, icon='settings.png') kodi.add_menu_item({'mode': 'addon_settings'}, {'title': "Settings"}, icon='settings.png') kodi.eod()
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 realdebrid_menu(): menu = kodi.ContextMenu() menu.add( 'Set Default View', { "mode": "set_default_view", "api": { "name": "kodi", "method": "set_default_view", "args": ("list", ) } }) kodi.add_menu_item({'mode': 'auth_realdebrid'}, {'title': "Authorize RealDebrid"}, icon='authorize.png') kodi.add_menu_item({'mode': 'realdebrid_torrents'}, {'title': "Browse Torrent Cloud"}, icon='cloud.png') kodi.eod(DEFAULT_VIEWS.LIST)
def premiumize_menu(): menu = kodi.ContextMenu() menu.add( 'Set Default View', { "mode": "set_default_view", "api": { "name": "kodi", "method": "set_default_view", "args": ("list", ) } }) kodi.add_menu_item({'mode': 'premiumize_transfers'}, {'title': "Torrent Transfer List"}, icon='cloud.png') kodi.add_menu_item({'mode': 'premiumize_folders'}, {'title': "Browse Torrent Cloud"}, icon='cloud.png') kodi.eod(DEFAULT_VIEWS.LIST)
def settings_menu(): menu = kodi.ContextMenu() menu.add( 'Set Default View', { "mode": "set_default_view", "api": { "name": "kodi", "method": "set_default_view", "args": ("list", ) } }) kodi.add_menu_item( {'mode': 'realdebrid_menu'}, {'title': "RealDebrid"}, icon='realdebrid.png', visible=kodi.get_setting('realdebrid_enable', 'script.module.scrapecore') == 'true') kodi.add_menu_item( {'mode': 'premiumize_menu'}, {'title': "Premiumize Cloud"}, icon='cloud.png', visible=kodi.get_setting('premiumize_enable', 'script.module.scrapecore') == 'true') kodi.add_menu_item( { 'mode': 'scrapecore_settings', "api": { "name": "kodi", "method": "open_settings", "args": ("script.module.scrapecore", ) } }, {'title': "ScrapeCore Settings"}, icon='settings.png') kodi.add_menu_item( { 'mode': 'open_settings', 'addon_id': 'service.fanart.proxy' }, {'title': "Fanart Proxy Settings"}, icon='settings.png', visible=kodi.has_addon('service.fanart.proxy')) kodi.add_menu_item({'mode': 'commoncore_settings'}, {'title': "CommonCore Settings"}, icon='settings.png') kodi.add_menu_item({'mode': 'addon_settings'}, {'title': "Addon Settings"}, icon='settings.png') kodi.eod(DEFAULT_VIEWS.LIST)
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 scraper_list(): for s in scrapecore.get_scrapers(): if kodi.get_setting(s['service'] + '_enable') == 'true': title = format_color(s['name'], 'green') else: title = format_color(s['name'], 'maroon') menu = kodi.ContextMenu() menu.add( 'Uninstall Scraper', { "mode": "uninstall_scraper", "service": s['service'], "name": s['name'] }) kodi.add_menu_item({ 'mode': 'toggle_scraper', "service": s['service'] }, {'title': title}, icon='', menu=menu) kodi.eod()
def scraper_browser(): if 'media' not in kodi.args: kodi.add_menu_item({ 'mode': 'scraper_browser', 'media': "shows" }, {'title': "Browse Shows"}, icon='') kodi.add_menu_item({ 'mode': 'scraper_browser', 'media': "movies" }, {'title': "Browse Movies"}, icon='') else: from lib.scrapecore import scrapers services = scrapers.get_browsable_scrapers(kodi.args['media']) for service, name in services: kodi.add_menu_item( { 'mode': 'browse_service', "service": service, "media": kodi.args['media'] }, {'title': "Browse: %s" % name}, icon='browse.png') kodi.eod()
def installer_menu(): kodi.add_menu_item({'mode': 'browse_local'}, {'title': "*** Install From Local File ***"}, icon='install_batch_local.png') #kodi.add_menu_item({'mode': 'search', 'query': 'gitbrowser.installer', 'type': 'addonid'}, {'title': "*** Search for Batch Installers ***"}, icon='null') kodi.eod()
def resource_list(): for r in scrapecore.get_installed_resources(): kodi.add_menu_item({ 'mode': 'void', }, {'title': r['name']}, icon='') kodi.eod()
def settings_menu(): kodi.add_menu_item({'mode': 'update_addons'}, {'title': "Check for Updates [COLOR red](Advanced)[/COLOR]"}, icon='update.png', visible=kodi.get_setting('enable_updates') == 'true') kodi.add_menu_item({'mode': 'addon_settings'}, {'title': "Addon Settings"}, icon='settings.png') kodi.eod()
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() @kodi.register('search_filter') def search_filter(): from commoncore.core import format_color options = display =['None', 'Repository', 'Feed', 'Music Plugin', 'Video Plugin', 'Script'] filter = kodi.get_property('search.filter') if filter in options: index = options.index(filter) display[index] = format_color(display[index], 'yellow') else: display[0] = format_color(display[0], 'yellow') c = kodi.dialog_select("Filter Results by:", display) if c is not False: if c is 0:
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 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()