Ejemplo n.º 1
0
 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))
Ejemplo n.º 2
0
	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))
Ejemplo n.º 3
0
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
Ejemplo n.º 4
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)
Ejemplo n.º 5
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)
Ejemplo n.º 6
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)
Ejemplo n.º 7
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)