Exemplo n.º 1
0
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')
Exemplo n.º 2
0
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()
Exemplo n.º 3
0
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()
Exemplo n.º 4
0
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))
Exemplo n.º 5
0
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))
Exemplo n.º 6
0
 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'])
Exemplo n.º 7
0
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()
Exemplo n.º 8
0
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()
Exemplo n.º 9
0
 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'])
Exemplo n.º 10
0
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)
Exemplo n.º 11
0
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
Exemplo n.º 12
0
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)
Exemplo n.º 13
0
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')
Exemplo n.º 14
0
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)
Exemplo n.º 15
0
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)
Exemplo n.º 16
0
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)
Exemplo n.º 17
0
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)
Exemplo n.º 18
0
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)
Exemplo n.º 19
0
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()
Exemplo n.º 20
0
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
Exemplo n.º 21
0
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.')	
Exemplo n.º 22
0
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.')	
Exemplo n.º 23
0
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.')	
Exemplo n.º 24
0
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')
Exemplo n.º 25
0
	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')
Exemplo n.º 26
0
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')
Exemplo n.º 27
0
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()
Exemplo n.º 28
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()
Exemplo n.º 29
0
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)
Exemplo n.º 30
0
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()
Exemplo n.º 31
0
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
Exemplo n.º 32
0
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()
Exemplo n.º 33
0
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)
Exemplo n.º 34
0
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)
Exemplo n.º 35
0
def addon_settings():
    from scrapecore import scrapers
    kodi.open_settings(kodi.arg('addon_id'))
Exemplo n.º 36
0
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)
Exemplo n.º 37
0
def execute_command():
    cmd = kodi.arg('xbmc', decode='json')
    cmd = "%s(%s)" % (cmd['command'], cmd['args'])
    kodi.run_command(cmd)
Exemplo n.º 38
0
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)
Exemplo n.º 39
0
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()
Exemplo n.º 40
0
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)