Beispiel #1
0
def index():
    return [
        {
            "label": "Search",
            "icon": path.join(plugin.addon.getAddonInfo('path'), 'resources', 'icons', 'Search.png'),
            "thumbnail": path.join(plugin.addon.getAddonInfo('path'), 'resources', 'icons', 'Search.png'),
            "path": plugin.url_for("search")
        },
        {
            "label": "Browse by Genre",
            "icon": path.join(plugin.addon.getAddonInfo('path'), 'resources', 'icons', 'Genres.png'),
            "thumbnail": path.join(plugin.addon.getAddonInfo('path'), 'resources', 'icons', 'Genres.png'),
            "path": plugin.url_for("genres")
        },
        {
            "label": "Most Popular",
            "icon": path.join(plugin.addon.getAddonInfo('path'), 'resources', 'icons', 'Top.png'),
            "thumbnail": path.join(plugin.addon.getAddonInfo('path'), 'resources', 'icons', 'Top.png'),
            "path": plugin.url_for("movies", sort_by="seeds", order="desc", quality="all", page=1, limit=MOVIES_PER_PAGE)
        },
        {
            "label": "Best Rated",
            "icon": path.join(plugin.addon.getAddonInfo('path'), 'resources', 'icons', 'Top.png'),
            "thumbnail": path.join(plugin.addon.getAddonInfo('path'), 'resources', 'icons', 'Top.png'),
            "path": plugin.url_for("movies", sort_by="rating", order="desc", quality="all", page=1, limit=MOVIES_PER_PAGE)
        },
        {
            "label": "Most Recent",
            "icon": path.join(plugin.addon.getAddonInfo('path'), 'resources', 'icons', 'Recently.png'),
            "thumbnail": path.join(plugin.addon.getAddonInfo('path'), 'resources', 'icons', 'Recently.png'),
            "path": plugin.url_for("movies", sort_by="date", order="desc", quality="all", page=1, limit=MOVIES_PER_PAGE)
        },
    ]
Beispiel #2
0
def search():
    query = plugin.request.args.get("query")
    if query:
        query = query[0]
    else:
        query = plugin.keyboard("", "KODI Popcorn Time - Search")
    if query:
        plugin.redirect(plugin.url_for("search_query", query_term=query, quality="all", page=1, limit=MOVIES_PER_PAGE))
Beispiel #3
0
def search():
    query = plugin.request.args.get("query")
    if query:
        query = query[0]
    else:
        query = plugin.keyboard("", "KODI Popcorn Time - Search")
    if query:
        plugin.redirect(
            plugin.url_for("search_query",
                           query_term=query,
                           quality="all",
                           page=1,
                           limit=MOVIES_PER_PAGE))
Beispiel #4
0
def genres():
    for genre in GENRES:
        yield {
            "label":
            genre,
            "path":
            plugin.url_for("genre",
                           genre=genre,
                           sort_by="seeds",
                           order="desc",
                           quality="all",
                           page=1,
                           limit=MOVIES_PER_PAGE),
        }
Beispiel #5
0
 def _fn(*a, **kwds):
     items = fn(*a, **kwds)
     if items is not None:
         for item in items:
             if item.get("is_playable"):
                 label = item["label"].encode("utf-8")
                 item.setdefault("context_menu", []).extend(
                     [
                         (
                             "Add to Movies",
                             "XBMC.RunPlugin(%s)" % plugin.url_for("library_add", label=label, href=item["path"]),
                         )
                     ]
                 )
             yield item
Beispiel #6
0
def show_data(callback):
    import xbmc
    import xbmcgui
    from contextlib import nested, closing
    from itertools import izip, chain
    from concurrent import futures
    from kodipopcorntime.scrapers import tmdb, yifysubs
    from kodipopcorntime.utils import url_get_json, SafeDialogProgress

    plugin.set_content("movies")
    args = dict((k, v[0]) for k, v in plugin.request.args.items())

    current_page = int(args["page"])
    limit = int(args["limit"])

    with closing(SafeDialogProgress(delay_close=0)) as dialog:
        dialog.create(plugin.name)
        dialog.update(percent=0, line1="Fetching movie information...", line2="", line3="")

        try:
            search_result = url_get_json("%s/api/v2/list_movies.json" % BASE_URL, params=args, headers=HEADERS)
        except:
            plugin.notify("Unable to connect to %s." % BASE_URL)
            raise
        movies = search_result.get("data").get("movies") or []
        movie_count = int(search_result.get("data")["movie_count"])

        if not movies:
            return

        state = {"done": 0}
        def on_movie(future):
            data = future.result()
            state["done"] += 1
            dialog.update(
                percent=int(state["done"] * 100.0 / len(movies)),
                line2=data.get("title") or data.get("MovieTitleClean") or "",
            )

        with futures.ThreadPoolExecutor(max_workers=2) as pool_tmdb:
            tmdb_list = [pool_tmdb.submit(tmdb.get, movie["imdb_code"]) for movie in movies]
            [future.add_done_callback(on_movie) for future in tmdb_list]
            while not all(job.done() for job in tmdb_list):
                if dialog.iscanceled():
                    return
                xbmc.sleep(100)

        tmdb_list = map(lambda job: job.result(), tmdb_list)
        for movie, tmdb_meta in izip(movies, tmdb_list):
            if tmdb_meta:
                sub = yifysubs.get_sub_items(movie["imdb_code"])
                if sub == None:
                    sub = ["none", ""]

                for torrent in movie["torrents"]:
                    item = tmdb.get_list_item(tmdb_meta)

                    if args.get("quality") == "all" and torrent["quality"] != "720p":
                        item["label"] = "%s (%s)" % (item["label"], torrent["quality"])

                    if item.get("info").get("duration") == 0:
                        item["info"]["duration"] = movie["runtime"]

                    item.update({
                        "path": plugin.url_for("play", sub=sub[0], uri=from_meta_data(torrent["hash"], movie["title_long"], torrent["quality"])),
                        "is_playable": True,
                    })

                    item.setdefault("info", {}).update({
                        "code": movie["imdb_code"],
                        "size": torrent["size_bytes"],
                    })

                    width = 1920
                    height = 1080
                    if torrent["quality"] == "720p":
                        width = 1280
                        height = 720
                    item.setdefault("stream_info", {}).update({
                        "video": {
                            "codec": "h264",
                            "width": width,
                            "height": height,
                        },
                        "audio": {
                            "codec": "aac",
                            "language": "en",
                        },
                        "subtitle": {
                            "language": sub[1],
                        },
                    })

                    yield item

        if current_page < (movie_count / limit):
            next_args = args.copy()
            next_args["page"] = int(next_args["page"]) + 1
            yield {
                "label": ">> Next page",
                "path": plugin.url_for(callback, **next_args),
            }
Beispiel #7
0
def genres():
    for genre in GENRES:
        yield {
            "label": genre,
            "path": plugin.url_for("genre", genre=genre, sort_by="seeds", order="desc", quality="all", page=1, limit=MOVIES_PER_PAGE),
        }
Beispiel #8
0
def index():
    return [
        {
            "label":
            "Search",
            "icon":
            path.join(plugin.addon.getAddonInfo('path'), 'resources', 'icons',
                      'Search.png'),
            "thumbnail":
            path.join(plugin.addon.getAddonInfo('path'), 'resources', 'icons',
                      'Search.png'),
            "path":
            plugin.url_for("search")
        },
        {
            "label":
            "Browse by Genre",
            "icon":
            path.join(plugin.addon.getAddonInfo('path'), 'resources', 'icons',
                      'Genres.png'),
            "thumbnail":
            path.join(plugin.addon.getAddonInfo('path'), 'resources', 'icons',
                      'Genres.png'),
            "path":
            plugin.url_for("genres")
        },
        {
            "label":
            "Most Popular",
            "icon":
            path.join(plugin.addon.getAddonInfo('path'), 'resources', 'icons',
                      'Top.png'),
            "thumbnail":
            path.join(plugin.addon.getAddonInfo('path'), 'resources', 'icons',
                      'Top.png'),
            "path":
            plugin.url_for("movies",
                           sort_by="seeds",
                           order="desc",
                           quality="all",
                           page=1,
                           limit=MOVIES_PER_PAGE)
        },
        {
            "label":
            "Best Rated",
            "icon":
            path.join(plugin.addon.getAddonInfo('path'), 'resources', 'icons',
                      'Top.png'),
            "thumbnail":
            path.join(plugin.addon.getAddonInfo('path'), 'resources', 'icons',
                      'Top.png'),
            "path":
            plugin.url_for("movies",
                           sort_by="rating",
                           order="desc",
                           quality="all",
                           page=1,
                           limit=MOVIES_PER_PAGE)
        },
        {
            "label":
            "Most Recent",
            "icon":
            path.join(plugin.addon.getAddonInfo('path'), 'resources', 'icons',
                      'Recently.png'),
            "thumbnail":
            path.join(plugin.addon.getAddonInfo('path'), 'resources', 'icons',
                      'Recently.png'),
            "path":
            plugin.url_for("movies",
                           sort_by="date",
                           order="desc",
                           quality="all",
                           page=1,
                           limit=MOVIES_PER_PAGE)
        },
    ]
Beispiel #9
0
def show_data(callback):
    import xbmc
    import xbmcgui
    from contextlib import nested, closing
    from itertools import izip, chain
    from concurrent import futures
    from kodipopcorntime.scrapers import tmdb, yifysubs
    from kodipopcorntime.utils import url_get_json, SafeDialogProgress

    plugin.set_content("movies")
    args = dict((k, v[0]) for k, v in plugin.request.args.items())

    current_page = int(args["page"])
    limit = int(args["limit"])

    with closing(SafeDialogProgress(delay_close=0)) as dialog:
        dialog.create(plugin.name)
        dialog.update(percent=0,
                      line1="Fetching movie information...",
                      line2="",
                      line3="")

        try:
            search_result = url_get_json("%s/api/v2/list_movies.json" %
                                         BASE_URL,
                                         params=args,
                                         headers=HEADERS)
        except:
            plugin.notify("Unable to connect to %s." % BASE_URL)
            raise
        movies = search_result.get("data").get("movies") or []
        movie_count = int(search_result.get("data")["movie_count"])

        if not movies:
            return

        state = {"done": 0}

        def on_movie(future):
            data = future.result()
            state["done"] += 1
            dialog.update(
                percent=int(state["done"] * 100.0 / len(movies)),
                line2=data.get("title") or data.get("MovieTitleClean") or "",
            )

        with futures.ThreadPoolExecutor(max_workers=2) as pool_tmdb:
            tmdb_list = [
                pool_tmdb.submit(tmdb.get, movie["imdb_code"])
                for movie in movies
            ]
            [future.add_done_callback(on_movie) for future in tmdb_list]
            while not all(job.done() for job in tmdb_list):
                if dialog.iscanceled():
                    return
                xbmc.sleep(100)

        tmdb_list = map(lambda job: job.result(), tmdb_list)
        for movie, tmdb_meta in izip(movies, tmdb_list):
            if tmdb_meta:
                sub = yifysubs.get_sub_items(movie["imdb_code"])
                if sub == None:
                    sub = ["none", ""]

                for torrent in movie["torrents"]:
                    item = tmdb.get_list_item(tmdb_meta)

                    if args.get("quality"
                                ) == "all" and torrent["quality"] != "720p":
                        item["label"] = "%s (%s)" % (item["label"],
                                                     torrent["quality"])

                    if item.get("info").get("duration") == 0:
                        item["info"]["duration"] = movie["runtime"]

                    item.update({
                        "path":
                        plugin.url_for("play",
                                       sub=sub[0],
                                       uri=from_meta_data(
                                           torrent["hash"],
                                           movie["title_long"],
                                           torrent["quality"])),
                        "is_playable":
                        True,
                    })

                    item.setdefault("info", {}).update({
                        "code":
                        movie["imdb_code"],
                        "size":
                        torrent["size_bytes"],
                    })

                    width = 1920
                    height = 1080
                    if torrent["quality"] == "720p":
                        width = 1280
                        height = 720
                    item.setdefault("stream_info", {}).update({
                        "video": {
                            "codec": "h264",
                            "width": width,
                            "height": height,
                        },
                        "audio": {
                            "codec": "aac",
                            "language": "en",
                        },
                        "subtitle": {
                            "language": sub[1],
                        },
                    })

                    yield item

        if current_page < (movie_count / limit):
            next_args = args.copy()
            next_args["page"] = int(next_args["page"]) + 1
            yield {
                "label": ">> Next page",
                "path": plugin.url_for(callback, **next_args),
            }