def handel_error(self, error, response, request_args, request_kwargs): if response.status_code == 401: traceback.print_stack() kodi.close_busy_dialog() raise githubException("Unauthorized: %s" % error) elif response.status_code == 403 and 'X-RateLimit-Reset' in response.headers: import time retry = int(response.headers['X-RateLimit-Reset']) - int( time.time()) for delay in range(retry, 0, -1): kodi.notify("API Rate limit exceeded", "Retry in %s seconds(s)" % delay, timeout=1000) kodi.sleep(1000) return self.request(*request_args, **request_kwargs) elif response.status_code == 422 and 'Only the first 1000' in response.text: kodi.handel_error('Result count exceeds API limit.', 'Try different search or result filter.') kodi.close_busy_dialog() traceback.print_stack() else: kodi.close_busy_dialog() traceback.print_stack() raise githubException("Status %s: %s" % (response.status_code, response.text))
def handel_error(self, error, response, request_args, request_kwargs): if response.status_code == 401: traceback.print_stack() kodi.close_busy_dialog() raise githubException("Unauthorized: %s" % error) elif response.status_code == 403 and 'X-RateLimit-Reset' in response.headers: import time retry = int(response.headers['X-RateLimit-Reset']) - int(time.time()) for delay in range(retry, 0, -1): kodi.notify("API Rate limit exceeded", "Retry in %s seconds(s)" % delay, timeout=1000) kodi.sleep(1000) return self.request(*request_args, **request_kwargs) elif response.status_code == 422 and 'Only the first 1000' in response.text: kodi.handel_error('Result count exceeds API limit.', 'Try different search or result filter.') kodi.close_busy_dialog() traceback.print_stack() else: kodi.close_busy_dialog() traceback.print_stack() raise githubException("Status %s: %s" % (response.status_code, response.text))
def download(url, full_name, addon_id, destination, unzip=False, quiet=False, verify_hash=True): version = None filename = addon_id + ".zip" r = requests.get(url, stream=True) kodi.log("Download: %s" % url) if r.status_code == requests.codes.ok: temp_file = kodi.vfs.join(kodi.get_profile(), "downloads") if not kodi.vfs.exists(temp_file): kodi.vfs.mkdir(temp_file, recursive=True) temp_file = kodi.vfs.join(temp_file, filename) try: total_bytes = int(r.headers["Content-Length"]) except: total_bytes = 0 block_size = 1000 cached_bytes = 0 if not quiet: pb = xbmcgui.DialogProgress() pb.create("Downloading", filename, " ", " ") kodi.sleep(150) start = time.time() is_64bit = sys.maxsize > 2**32 with open(temp_file, "wb") as f: for chunk in r.iter_content(chunk_size=block_size): if chunk: if not quiet and pb.iscanceled(): raise downloaderException("Download Aborted") return False cached_bytes += len(chunk) shutil.copyfileobj(functionIO(chunk), f, 8096) if total_bytes > 0: delta = int(time.time() - start) if delta: bs = int(cached_bytes / (delta)) else: bs = 0 if not quiet: percent = int(cached_bytes * 100 / total_bytes) pb.update( percent, "Downloading", filename, format_status(cached_bytes, total_bytes, bs), ) if not quiet: pb.close() if verify_hash: local_sha = hash_func(temp_file, "sha1") remote_sha = get_sha(full_name, url) if remote_sha != local_sha: kodi.close_busy_dialog() kodi.handel_error("Download Error", "Checksum mismatch!") if unzip: if is_64bit: zip_ref = zipfile.ZipFile(temp_file, "r") else: with open(temp_file, "rb") as zip_file: zip_ref = zip_file.ZipFile(functionIO(zip_file.read())) zip_ref.extractall(destination) zip_ref.close() kodi.vfs.rm(temp_file, quiet=True) try: xml = kodi.vfs.read_file( kodi.vfs.join(destination, kodi.vfs.join(addon_id, "addon.xml")), soup=True, ) version = get_version_by_xml(xml) if not version: version = get_version_by_name(filename) except: kodi.log( "Unable to fine version from addon.xml for addon: %s" % addon_id) else: kodi.vfs.mv(temp_file, kodi.vfs.join(destination, filename)) else: kodi.close_busy_dialog() raise downloaderException(r.status_code) return version
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 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 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)
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)