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) }, ]
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))
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))
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), }
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
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), }
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), }
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) }, ]
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), }