def movieset(self, db_id, include_set_movies_fields=""): '''get movieset from kodi db''' if include_set_movies_fields: optparams = [("setid", try_parse_int(db_id)), ("movies", {"properties": include_set_movies_fields})] else: optparams = ("setid", try_parse_int(db_id)) return self.get_json("VideoLibrary.GetMovieSetDetails", returntype="", fields=["title", "art", "playcount"], optparam=optparams)
def album(self, db_id): '''get albumdetails from kodi db''' album = self.get_json("AudioLibrary.GetAlbumDetails", returntype="albumdetails", fields=FIELDS_ALBUMS, optparam=("albumid", try_parse_int(db_id))) # override type as the kodi json api is returning the album type instead of mediatype album["type"] = "album" return album
def tvshow(self, db_id): '''get tvshow from kodi db''' tvshow = self.get_json("VideoLibrary.GetTvShowDetails", returntype="tvshowdetails", fields=FIELDS_TVSHOWS, optparam=("tvshowid", try_parse_int(db_id))) return self.tvshow_watchedcounts(tvshow)
def episodes(self, sort=None, filters=None, limits=None, filtertype=None, tvshowid=None): '''get episodes from kodi db''' if tvshowid: params = ("tvshowid", try_parse_int(tvshowid)) else: params = None return self.get_json("VideoLibrary.GetEpisodes", sort=sort, filters=filters, fields=FIELDS_EPISODES, limits=limits, returntype="episodes", filtertype=filtertype, optparam=params)
def search_movies(self, title, year=""): ''' Search tmdb for a specific movie, returns a list of all closest matches parameters: title: (required) the title of the movie to search for year: (optional) the year of the movie to search for (enhances search result if supplied) ''' params = {"query": title, "language": KODI_LANGUAGE} if year: params["year"] = try_parse_int(year) return self.get_data("search/movie", params)
def search_tvshows(self, title, year=""): ''' Search tmdb for a specific tvshow, returns a list of all closest matches parameters: title: (required) the title of the tvshow to search for year: (optional) the first air date year of the tvshow to search for (enhances search result if supplied) ''' params = {"query": title, "language": KODI_LANGUAGE} if year: params["first_air_date_year"] = try_parse_int(year) return self.get_data("search/tv", params)
def search_tvshows(self, title, year=""): ''' Search tmdb for a specific tvshow, returns a list of all closest matches parameters: title: (required) the title of the tvshow to search for year: (optional) the first air date year of the tvshow to search for (enhances search result if supplied) ''' params = {"query": title, "language": KODI_LANGUAGE} if year: params["first_air_date_year"] = try_parse_int(year) return self.get_data("search/tv", params)
def search_movies(self, title, year=""): ''' Search tmdb for a specific movie, returns a list of all closest matches parameters: title: (required) the title of the movie to search for year: (optional) the year of the movie to search for (enhances search result if supplied) ''' params = {"query": title, "language": KODI_LANGUAGE} if year: params["year"] = try_parse_int(year) return self.get_data("search/movie", params)
def score_image(item): '''score item based on number of likes and the language''' score = 0 item["url"] = item["url"].replace(" ", "%20") score += try_parse_int(item["likes"]) if "lang" in item: if item["lang"] == KODI_LANGUAGE: score += 1000 elif item["lang"] == "en": score += 500 item["score"] = score return item
def handle_command(self, command): if command == "q" or command == "-q" or command == "quit" or command == "exit": # quit exit(0) return idx = try_parse_int(command) if idx is not None: if not self.is_valid_search_result_idx(idx): print("Invalid index") print() return self.open_search_result(idx) exit(0) return if command == "-r": # repeat last query last_results = history.get_last_query_results() if last_results is None: print("There is no last results to show.") print() else: self.search_results = last_results self.print_search_results() return if command.startswith("-a "): # append to last query last_search_query = history.get_last_search_query() search_query = last_search_query + command[len("-a"):] print("Fetching search results for: \"%s\"" % search_query) print() self.fetch_search_results(search_query) self.print_search_results() return if command == "-b": # go back one search result if len(self.search_result_history) == 0: print("Can't go back") print() return self.search_results = self.search_result_history.pop() print("Showing search results for: \"%s\"" % self.search_results.query) print() self.print_search_results() history.write_last_query(self.search_results) return self.fetch_search_results(command) self.print_search_results()
def get_top250_db(self): ''' get the top250 listing for both movies and tvshows as dict with imdbid as key uses 7 day cache to prevent overloading the server ''' results = {} for listing in [("top", "chttp_tt_"), ("toptv", "chttvtp_tt_")]: html = requests.get("http://www.imdb.com/chart/%s" % listing[0], headers={'User-agent': 'Mozilla/5.0'}, timeout=20) soup = BeautifulSoup.BeautifulSoup(html.text) for table in soup.findAll('table'): if table.get("class") == "chart full-width": for td_def in table.findAll('td'): if td_def.get("class") == "titleColumn": a_link = td_def.find("a") if a_link: url = a_link["href"] imdb_id = url.split("/")[2] imdb_rank = url.split(listing[1])[1] results[imdb_id] = try_parse_int(imdb_rank) return results
def map_details(data): """helper method to map the details received from trakt to kodi compatible format""" result = {} ytb_plgn = 'plugin://plugin.video.youtube/?action=play_video&videoid=' if sys.version_info.major == 3: for key, value in data.items(): # filter the N/A values if value in ["N/A", "None"] or not value: continue if key == "title": result["title"] = value elif key == "year": try: result["year"] = try_parse_int(value.split("-")[0]) except Exception: result["year"] = value elif key == "genre": result["genre"] = value.split(", ") elif key == "country": result["country"] = value elif key == "votes": result["votes.trakt"] = value elif key == "rating": result["rating.trakt"] = value elif key == "trailer": trakttr = value.split("=")[1] result["trakt.trailer"] = '%s%s' % (ytb_plgn, trakttr) elif key == "country": result["country"] = value elif key == "status": result["status"] = value elif key == "overview": result["trakt.plot"] = value elif key == "tagline": result["trakt.tagline"] = value elif key == "aired_episodes": result["aired.episodes"] = value return result
def get_top250_db(self): ''' get the top250 listing for both movies and tvshows as dict with imdbid as key uses 7 day cache to prevent overloading the server ''' results = {} for listing in [("top", "chttp_tt_"), ("toptv", "chttvtp_tt_")]: html = requests.get( "http://www.imdb.com/chart/%s" % listing[0], headers={ 'User-agent': 'Mozilla/5.0'}, timeout=20) soup = BeautifulSoup.BeautifulSoup(html.text) for table in soup.findAll('table'): if table.get("class") == "chart full-width": for td_def in table.findAll('td'): if td_def.get("class") == "titleColumn": a_link = td_def.find("a") if a_link: url = a_link["href"] imdb_id = url.split("/")[2] imdb_rank = url.split(listing[1])[1] results[imdb_id] = try_parse_int(imdb_rank) return results
def get_user_to_pick_a_result(self, promt_msg): if self._get_num_items() == 0: print("No results to choose from...") return False self._set_user_input_mode_to_allow_input(True) self._display_page() user_picked_something = False self.user_has_quit = False while not user_picked_something: user_input = input() handled_input = self._check_and_handle_page_input(user_input) if handled_input: if self.user_has_quit: return False continue # Check to make sure we have an integer user_idx = utils.try_parse_int(user_input) if user_idx is False: utils.print_error( "\"{}\" is not a valid option.".format(user_input)) continue # Check if the integer is an index on the page if user_idx < 0 or user_idx >= self.num_items_per_page: print("Must select a menu option between (0 and {})".format( self.num_items_per_page - 1)) continue # We have a valid index at this point # Now get the actual index in the list user_picked_something = True return self._get_item_idx_for_item_in_page_idx(user_idx)
def episode(self, db_id): '''get episode from kodi db''' return self.get_json("VideoLibrary.GetEpisodeDetails", returntype="episodedetails", fields=FIELDS_EPISODES, optparam=("episodeid", try_parse_int(db_id)))
def movie(self, db_id): '''get moviedetails from kodi db''' return self.get_json("VideoLibrary.GetMovieDetails", returntype="moviedetails", fields=FIELDS_MOVIES, optparam=("movieid", try_parse_int(db_id)))
def channel(self, db_id): '''get pvr channel from kodi db''' return self.get_json("PVR.GetChannelDetails", returntype="channeldetails", fields=FIELDS_CHANNELS, optparam=("channelid", try_parse_int(db_id)))
def recording(self, db_id): '''get pvr recording from kodi db''' return self.get_json("PVR.GetRecordingDetails", returntype="recordingdetails", fields=FIELDS_RECORDINGS, optparam=("recordingid", try_parse_int(db_id)))
def artist(self, db_id): '''get artistdetails from kodi db''' return self.get_json("AudioLibrary.GetArtistDetails", returntype="artistdetails", fields=FIELDS_ARTISTS, optparam=("artistid", try_parse_int(db_id)))
def map_details(data): '''helper method to map the details received from omdb to kodi compatible format''' result = {} for key, value in data.iteritems(): # filter the N/A values if value in ["N/A", "NA"] or not value: continue if key == "Title": result["title"] = value elif key == "Year": try: result["year"] = try_parse_int(value.split("-")[0]) except Exception: result["year"] = value elif key == "Year": result["year"] = value if key == "Rated": result["mpaa"] = value.replace("Rated", "") elif key == "Title": result["title"] = value elif key == "Released": date_time = arrow.get(value, "DD MMM YYYY") result["premiered"] = date_time.strftime( xbmc.getRegion("dateshort")) try: result["premiered.formatted"] = date_time.format( 'DD MMM YYYY', locale=KODI_LANGUAGE) except Exception: result["premiered.formatted"] = value elif key == "Runtime": result["runtime"] = try_parse_int(value.replace(" min", "")) * 60 elif key == "Genre": result["genre"] = value.split(", ") elif key == "Director": result["director"] = value.split(", ") elif key == "Writer": result["writer"] = value.split(", ") elif key == "Country": result["country"] = value.split(", ") elif key == "Awards": result["awards"] = value elif key == "Poster": result["thumbnail"] = value result["art"] = {} result["art"]["thumb"] = value elif key == "imdbVotes": result["votes.imdb"] = value result["votes"] = try_parse_int(value.replace(",", "")) elif key == "Ratings": for rating_item in value: if rating_item["Source"] == "Internet Movie Database": rating = rating_item["Value"] result["rating.imdb.text"] = rating rating = rating.split("/")[0] result["rating.imdb"] = rating result["rating"] = float(rating) result["rating.percent.imdb"] = "%s" % (try_parse_int( float(rating) * 10)) elif rating_item["Source"] == "Rotten Tomatoes": rating = rating_item["Value"] result["rottentomatoes.rating.percent"] = rating rating = rating.replace("%", "") # this should be a dedicated rt rating instead of the meter result["rottentomatoes.rating"] = rating result["rating.rt"] = rating result["rottentomatoes.meter"] = rating result["rottentomatoesmeter"] = rating rating = int(rating) if rating < 60: result["rottentomatoes.rotten"] = rating result["rottentomatoes.image"] = "rotten" else: result["rottentomatoes.fresh"] = rating result["rottentomatoes.image"] = "fresh" elif rating_item["Source"] == "Metacritic": rating = rating_item["Value"] result["rating.mc.text"] = rating rating = rating.split("/")[0] result["metacritic.rating"] = rating result["rating.mc"] = rating result["metacritic.rating.percent"] = "%s" % rating elif key == "imdbID": result["imdbnumber"] = value elif key == "BoxOffice": result["boxoffice"] = value elif key == "DVD": date_time = arrow.get(value, "DD MMM YYYY") result["dvdrelease"] = date_time.format('YYYY-MM-DD') result["dvdrelease.formatted"] = date_time.format( 'DD MMM YYYY', locale=KODI_LANGUAGE) elif key == "Production": result["studio"] = value.split(", ") elif key == "Website": result["homepage"] = value # rotten tomatoes - will probably never work again (OMDBAPI doesnt't provide them anymore) elif key == "tomatoReviews": result["rottentomatoes.reviews"] = formatted_number(value) elif key == "tomatoConsensus": result["rottentomatoes.consensus"] = value elif key == "tomatoUserMeter": result["rottentomatoes.usermeter"] = value elif key == "tomatoUserRating": result["rottentomatoes.userrating"] = value result["rottentomatoes.userrating.percent"] = "%s" % ( try_parse_int(float(value) * 10)) elif key == "tomatoUserReviews": result["rottentomatoes.userreviews"] = int_with_commas(value) elif key == "tomatoURL": result["rottentomatoes.url"] = value return result
def map_details(data): """helper method to map the details received from omdb to kodi compatible format""" result = {} if sys.version_info.major == 3: for key, value in data.items(): # filter the N/A values if value in ["N/A", "NA"] or not value: continue if key == "title": result["title"] = value elif key == "year": try: result["year"] = try_parse_int(value.split("-")[0]) except Exception: result["year"] = value elif key == "rated": result["mpaa"] = value.replace("Rated", "") elif key == "released": date_time = arrow.get(value, "DD MMM YYYY") result["premiered"] = date_time.strftime( xbmc.getRegion("dateshort")) try: result["premiered.formatted"] = date_time.format( 'DD MMM YYYY', locale=KODI_LANGUAGE) except Exception: result["premiered.formatted"] = value elif key == "runtime": result["runtime"] = try_parse_int(value.replace( " min", "")) * 60 elif key == "genre": result["genre"] = value.split(", ") elif key == "director": result["director"] = value.split(", ") elif key == "writer": result["writer"] = value.split(", ") elif key == "country": result["country"] = value.split(", ") result["country.0"] = value.split(", ")[0] elif key == "awards": result["awards"] = value elif key == "poster": result["thumbnail"] = value result["art"] = {} result["art"]["thumb"] = value elif key == "imdbVotes": result["votes.imdb"] = value result["votes"] = try_parse_int(value.replace(",", "")) elif key == "imdbRating": result["rating.imdb"] = value result["rating"] = float(value) result["rating.percent.imdb"] = "%s" % (try_parse_int( float(value) * 10)) elif key == "metascore": result["metacritic.rating"] = value result["metacritic.rating.percent"] = "%s" % value elif key == "imdbID": result["imdbnumber"] = value elif key == "BoxOffice": result["boxoffice"] = value elif key == "DVD": date_time = arrow.get(value, "DD MMM YYYY") result["dvdrelease"] = date_time.format('YYYY-MM-DD') result["dvdrelease.formatted"] = date_time.format( 'DD MMM YYYY', locale=KODI_LANGUAGE) elif key == "Production": result["studio"] = value.split(", ") elif key == "Website": result["homepage"] = value elif key == "plot": result["plot"] = value result["imdb.plot"] = value elif key == "type": if value == "series": result["type"] = "tvshow" else: result["type"] = value result["media_type"] = result["type"] # rotten tomatoes elif key == "tomatoMeter": result["rottentomatoes.meter"] = value result["rottentomatoesmeter"] = value elif key == "tomatoImage": result["rottentomatoes.image"] = value elif key == "tomatoRating": result["rottentomatoes.rating"] = value result["rottentomatoes.rating.percent"] = "%s" % ( try_parse_int(float(value) * 10)) result["rating.rt"] = value elif key == "tomatoReviews": result["rottentomatoes.reviews"] = formatted_number(value) elif key == "tomatoFresh": result["rottentomatoes.fresh"] = value elif key == "tomatoRotten": result["rottentomatoes.rotten"] = value elif key == "tomatoConsensus": result["rottentomatoes.consensus"] = value elif key == "tomatoUserMeter": result["rottentomatoes.usermeter"] = value elif key == "tomatoUserRating": result["rottentomatoes.userrating"] = value result["rottentomatoes.userrating.percent"] = "%s" % ( try_parse_int(float(value) * 10)) elif key == "tomatoUserReviews": result["rottentomatoes.userreviews"] = int_with_commas( value) elif key == "tomatoeURL": result["rottentomatoes.url"] = value else: for key, value in data.iteritems(): # filter the N/A values if value in ["N/A", "NA"] or not value: continue if key == "title": result["title"] = value elif key == "Year": try: result["year"] = try_parse_int(value.split("-")[0]) except Exception: result["year"] = value elif key == "rated": result["mpaa"] = value.replace("Rated", "") elif key == "released": date_time = arrow.get(value, "DD MMM YYYY") result["premiered"] = date_time.strftime( xbmc.getRegion("dateshort")) try: result["premiered.formatted"] = date_time.format( 'DD MMM YYYY', locale=KODI_LANGUAGE) except Exception: result["premiered.formatted"] = value elif key == "runtime": result["runtime"] = try_parse_int(value.replace( " min", "")) * 60 elif key == "genre": result["genre"] = value.split(", ") elif key == "director": result["director"] = value.split(", ") elif key == "writer": result["writer"] = value.split(", ") elif key == "country": result["country"] = value.split(", ") elif key == "awards": result["awards"] = value elif key == "poster": result["thumbnail"] = value result["art"] = {} result["art"]["thumb"] = value elif key == "imdbVotes": result["votes.imdb"] = value result["votes"] = try_parse_int(value.replace(",", "")) elif key == "imdbRating": result["rating.imdb"] = value result["rating"] = float(value) result["rating.percent.imdb"] = "%s" % (try_parse_int( float(value) * 10)) elif key == "metascore": result["metacritic.rating"] = value result["metacritic.rating.percent"] = "%s" % value elif key == "imdbID": result["imdbnumber"] = value elif key == "BoxOffice": result["boxoffice"] = value elif key == "DVD": date_time = arrow.get(value, "DD MMM YYYY") result["dvdrelease"] = date_time.format('YYYY-MM-DD') result["dvdrelease.formatted"] = date_time.format( 'DD MMM YYYY', locale=KODI_LANGUAGE) elif key == "Production": result["studio"] = value.split(", ") elif key == "Website": result["homepage"] = value elif key == "plot": result["plot"] = value result["imdb.plot"] = value elif key == "type": if value == "series": result["type"] = "tvshow" else: result["type"] = value result["media_type"] = result["type"] # rotten tomatoes elif key == "tomatoMeter": result["rottentomatoes.meter"] = value result["rottentomatoesmeter"] = value elif key == "tomatoImage": result["rottentomatoes.image"] = value elif key == "tomatoRating": result["rottentomatoes.rating"] = value result["rottentomatoes.rating.percent"] = "%s" % ( try_parse_int(float(value) * 10)) result["rating.rt"] = value elif key == "tomatoReviews": result["rottentomatoes.reviews"] = formatted_number(value) elif key == "tomatoFresh": result["rottentomatoes.fresh"] = value elif key == "tomatoRotten": result["rottentomatoes.rotten"] = value elif key == "tomatoConsensus": result["rottentomatoes.consensus"] = value elif key == "tomatoUserMeter": result["rottentomatoes.usermeter"] = value elif key == "tomatoUserRating": result["rottentomatoes.userrating"] = value result["rottentomatoes.userrating.percent"] = "%s" % ( try_parse_int(float(value) * 10)) elif key == "tomatoUserReviews": result["rottentomatoes.userreviews"] = int_with_commas( value) elif key == "tomatoeURL": result["rottentomatoes.url"] = value return result
def musicvideo(self, db_id): '''get musicvideo from kodi db''' return self.get_json("VideoLibrary.GetMusicVideoDetails", returntype="musicvideodetails", fields=FIELDS_MUSICVIDEOS, optparam=("musicvideoid", try_parse_int(db_id)))
def map_details(self, data, media_type): '''helper method to map the details received from tmdb to kodi compatible formatting''' if not data: return {} details = {} details["tmdb_id"] = data["id"] details["rating"] = data["vote_average"] details["votes"] = data["vote_count"] details["rating.tmdb"] = data["vote_average"] details["votes.tmdb"] = data["vote_count"] details["popularity"] = data["popularity"] details["popularity.tmdb"] = data["popularity"] details["plot"] = data["overview"] details["genre"] = [item["name"] for item in data["genres"]] details["homepage"] = data["homepage"] details["status"] = data["status"] details["cast"] = [] details["castandrole"] = [] details["writer"] = [] details["director"] = [] details["media_type"] = media_type # cast if "credits" in data: if "cast" in data["credits"]: for cast_member in data["credits"]["cast"]: cast_thumb = "" if cast_member["profile_path"]: cast_thumb = "http://image.tmdb.org/t/p/original%s" % cast_member["profile_path"] details["cast"].append({"name": cast_member["name"], "role": cast_member["character"], "thumbnail": cast_thumb}) details["castandrole"].append((cast_member["name"], cast_member["character"])) # crew (including writers and directors) if "crew" in data["credits"]: for crew_member in data["credits"]["crew"]: cast_thumb = "" if crew_member["profile_path"]: cast_thumb = "http://image.tmdb.org/t/p/original%s" % crew_member["profile_path"] if crew_member["job"] in ["Author", "Writer"]: details["writer"].append(crew_member["name"]) if crew_member["job"] in ["Producer", "Executive Producer"]: details["director"].append(crew_member["name"]) if crew_member["job"] in ["Producer", "Executive Producer", "Author", "Writer"]: details["cast"].append({"name": crew_member["name"], "role": crew_member["job"], "thumbnail": cast_thumb}) # artwork details["art"] = {} if data.get("images"): if data["images"].get("backdrops"): fanarts = self.get_best_images(data["images"]["backdrops"]) details["art"]["fanarts"] = fanarts details["art"]["fanart"] = fanarts[0] if fanarts else "" if data["images"].get("posters"): posters = self.get_best_images(data["images"]["posters"]) details["art"]["posters"] = posters details["art"]["poster"] = posters[0] if posters else "" if not details["art"].get("poster") and data.get("poster_path"): details["art"]["poster"] = "http://image.tmdb.org/t/p/original%s" % data["poster_path"] if not details["art"].get("fanart") and data.get("backdrop_path"): details["art"]["fanart"] = "http://image.tmdb.org/t/p/original%s" % data["backdrop_path"] # movies only if media_type == "movie": details["title"] = data["title"] details["originaltitle"] = data["original_title"] if data["belongs_to_collection"]: details["set"] = data["belongs_to_collection"].get("name", "") if data.get("release_date"): details["premiered"] = data["release_date"] details["year"] = try_parse_int(data["release_date"].split("-")[0]) details["tagline"] = data["tagline"] if data["runtime"]: details["runtime"] = data["runtime"] * 60 details["imdbnumber"] = data["imdb_id"] details["budget"] = data["budget"] details["budget.formatted"] = int_with_commas(data["budget"]) details["revenue"] = data["revenue"] details["revenue.formatted"] = int_with_commas(data["revenue"]) if data.get("production_companies"): details["studio"] = [item["name"] for item in data["production_companies"]] if data.get("production_countries"): details["country"] = [item["name"] for item in data["production_countries"]] if data.get("keywords"): details["tag"] = [item["name"] for item in data["keywords"]["keywords"]] # tvshows only if media_type == "tvshow": details["title"] = data["name"] details["originaltitle"] = data["original_name"] if data.get("created_by"): details["director"] += [item["name"] for item in data["created_by"]] if data.get("episode_run_time"): details["runtime"] = data["episode_run_time"][0] * 60 if data.get("first_air_date"): details["premiered"] = data["first_air_date"] details["year"] = try_parse_int(data["first_air_date"].split("-")[0]) if "last_air_date" in data: details["lastaired"] = data["last_air_date"] if data.get("networks"): details["studio"] = [item["name"] for item in data["networks"]] if "origin_country" in data: details["country"] = data["origin_country"] if data.get("external_ids"): details["imdbnumber"] = data["external_ids"].get("imdb_id", "") details["tvdb_id"] = data["external_ids"].get("tvdb_id", "") if "results" in data["keywords"]: details["tag"] = [item["name"] for item in data["keywords"]["results"]] # trailer for video in data["videos"]["results"]: if video["site"] == "YouTube" and video["type"] == "Trailer": details["trailer"] = 'plugin://plugin.video.youtube/?action=play_video&videoid=%s' % video["key"] break return details
def map_details(data): '''helper method to map the details received from omdb to kodi compatible format''' result = {} for key, value in data.iteritems(): # filter the N/A values if value in ["N/A", "NA"] or not value: continue if key == "Title": result["title"] = value elif key == "Year": try: result["year"] = try_parse_int(value.split("-")[0]) except Exception: result["year"] = value elif key == "rated": result["mpaa"] = value.replace("Rated", "") elif key == "title": result["title"] = value elif key == "released": date_time = arrow.get(value, "DD MMM YYYY") result["premiered"] = date_time.strftime( xbmc.getRegion("dateshort")) try: result["premiered.formatted"] = date_time.format( 'DD MMM YYYY', locale=KODI_LANGUAGE) except Exception: result["premiered.formatted"] = value elif key == "runtime": result["runtime"] = try_parse_int(value.replace(" min", "")) * 60 elif key == "genre": result["genre"] = value.split(", ") elif key == "director": result["director"] = value.split(", ") elif key == "writer": result["writer"] = value.split(", ") elif key == "country": result["country"] = value.split(", ") elif key == "awards": result["awards"] = value elif key == "poster": result["thumbnail"] = value result["art"] = {} result["art"]["thumb"] = value elif key == "imdbVotes": result["votes.imdb"] = value result["votes"] = try_parse_int(value.replace(",", "")) elif key == "tomatoUserMeter": result["rottentomatoes.audience"] = value elif key == "metascore": rating = value result["rating.mc.text"] = rating rating = rating.split("/")[0] result["metacritic.rating"] = rating result["rating.mc"] = rating result["metacritic.rating.percent"] = "%s" % rating elif key == "tomatoMeter": rating = value result["rottentomatoes.rating.percent"] = rating rating = rating.replace("%", "") # this should be a dedicated rt rating instead of the meter result["rottentomatoes.rating"] = rating result["rating.rt"] = rating result["rottentomatoes.meter"] = rating result["rottentomatoesmeter"] = rating rating = int(rating) if rating < 60: result["rottentomatoes.rotten"] = rating result["rottentomatoes.image"] = "rotten" else: result["rottentomatoes.fresh"] = rating result["rottentomatoes.image"] = "fresh" elif key == "imdbID": result["imdbnumber"] = value elif key == "BoxOffice": result["boxoffice"] = value elif key == "DVD": date_time = arrow.get(value, "DD MMM YYYY") result["dvdrelease"] = date_time.format('YYYY-MM-DD') result["dvdrelease.formatted"] = date_time.format( 'DD MMM YYYY', locale=KODI_LANGUAGE) elif key == "Production": result["studio"] = value.split(", ") elif key == "Website": result["homepage"] = value elif key == "plot": result["plot"] = value result["imdb.plot"] = value elif key == "Type": if value == "series": result["type"] = "tvshow" else: result["type"] = value result["media_type"] = result["type"] return result
def song(self, db_id): '''get songdetails from kodi db''' return self.get_json("AudioLibrary.GetSongDetails", returntype="songdetails", fields=FIELDS_SONGS, optparam=("songid", try_parse_int(db_id)))
def map_details(self, data, media_type): '''helper method to map the details received from tmdb to kodi compatible formatting''' if not data: return {} details = {} details["tmdb_id"] = data["id"] details["rating"] = data["vote_average"] details["votes"] = data["vote_count"] details["rating.tmdb"] = data["vote_average"] details["votes.tmdb"] = data["vote_count"] details["popularity"] = data["popularity"] details["popularity.tmdb"] = data["popularity"] details["plot"] = data["overview"] details["genre"] = [item["name"] for item in data["genres"]] details["homepage"] = data["homepage"] details["status"] = data["status"] details["cast"] = [] details["castandrole"] = [] details["writer"] = [] details["director"] = [] details["media_type"] = media_type # cast if "credits" in data: if "cast" in data["credits"]: for cast_member in data["credits"]["cast"]: cast_thumb = "" if cast_member["profile_path"]: cast_thumb = "http://image.tmdb.org/t/p/original%s" % cast_member[ "profile_path"] details["cast"].append({ "name": cast_member["name"], "role": cast_member["character"], "thumbnail": cast_thumb }) details["castandrole"].append( (cast_member["name"], cast_member["character"])) # crew (including writers and directors) if "crew" in data["credits"]: for crew_member in data["credits"]["crew"]: cast_thumb = "" if crew_member["profile_path"]: cast_thumb = "http://image.tmdb.org/t/p/original%s" % crew_member[ "profile_path"] if crew_member["job"] in ["Author", "Writer"]: details["writer"].append(crew_member["name"]) if crew_member["job"] in [ "Producer", "Executive Producer" ]: details["director"].append(crew_member["name"]) if crew_member["job"] in [ "Producer", "Executive Producer", "Author", "Writer" ]: details["cast"].append({ "name": crew_member["name"], "role": crew_member["job"], "thumbnail": cast_thumb }) # artwork details["art"] = {} if data.get("images"): if data["images"].get("backdrops"): fanarts = self.get_best_images(data["images"]["backdrops"]) details["art"]["fanarts"] = fanarts details["art"]["fanart"] = fanarts[0] if fanarts else "" if data["images"].get("posters"): posters = self.get_best_images(data["images"]["posters"]) details["art"]["posters"] = posters details["art"]["poster"] = posters[0] if posters else "" if not details["art"].get("poster") and data.get("poster_path"): details["art"][ "poster"] = "http://image.tmdb.org/t/p/original%s" % data[ "poster_path"] if not details["art"].get("fanart") and data.get("backdrop_path"): details["art"][ "fanart"] = "http://image.tmdb.org/t/p/original%s" % data[ "backdrop_path"] # movies only if media_type == "movie": details["title"] = data["title"] details["originaltitle"] = data["original_title"] if data["belongs_to_collection"]: details["set"] = data["belongs_to_collection"].get("name", "") if data.get("release_date"): details["premiered"] = data["release_date"] details["year"] = try_parse_int( data["release_date"].split("-")[0]) details["tagline"] = data["tagline"] if data["runtime"]: details["runtime"] = data["runtime"] * 60 details["imdbnumber"] = data["imdb_id"] details["budget"] = data["budget"] details["budget.formatted"] = int_with_commas(data["budget"]) details["revenue"] = data["revenue"] details["revenue.formatted"] = int_with_commas(data["revenue"]) if data.get("production_companies"): details["studio"] = [ item["name"] for item in data["production_companies"] ] if data.get("production_countries"): details["country"] = [ item["name"] for item in data["production_countries"] ] if data.get("keywords"): details["tag"] = [ item["name"] for item in data["keywords"]["keywords"] ] # tvshows only if media_type == "tvshow": details["title"] = data["name"] details["originaltitle"] = data["original_name"] if data.get("created_by"): details["director"] += [ item["name"] for item in data["created_by"] ] if data.get("episode_run_time"): details["runtime"] = data["episode_run_time"][0] * 60 if data.get("first_air_date"): details["premiered"] = data["first_air_date"] details["year"] = try_parse_int( data["first_air_date"].split("-")[0]) if "last_air_date" in data: details["lastaired"] = data["last_air_date"] if data.get("networks"): details["studio"] = [item["name"] for item in data["networks"]] if "origin_country" in data: details["country"] = data["origin_country"] if data.get("external_ids"): details["imdbnumber"] = data["external_ids"].get("imdb_id", "") details["tvdb_id"] = data["external_ids"].get("tvdb_id", "") if "results" in data["keywords"]: details["tag"] = [ item["name"] for item in data["keywords"]["results"] ] # trailer for video in data["videos"]["results"]: if video["site"] == "YouTube" and video["type"] == "Trailer": details[ "trailer"] = 'plugin://plugin.video.youtube/?action=play_video&videoid=%s' % video[ "key"] break return details
def map_details(data): '''helper method to map the details received from omdb to kodi compatible format''' result = {} for key, value in data.iteritems(): # filter the N/A values if value in ["N/A", "NA"] or not value: continue if key == "Title": result["title"] = value elif key == "Year": try: result["year"] = try_parse_int(value.split("-")[0]) except Exception: result["year"] = value elif key == "Year": result["year"] = value if key == "Rated": result["mpaa"] = value.replace("Rated", "") elif key == "Title": result["title"] = value elif key == "Released": date_time = arrow.get(value, "DD MMM YYYY") result["premiered"] = date_time.strftime(xbmc.getRegion("dateshort")) try: result["premiered.formatted"] = date_time.format('DD MMM YYYY', locale=KODI_LANGUAGE) except Exception: result["premiered.formatted"] = value elif key == "Runtime": result["runtime"] = try_parse_int(value.replace(" min", "")) * 60 elif key == "Genre": result["genre"] = value.split(", ") elif key == "Director": result["director"] = value.split(", ") elif key == "Writer": result["writer"] = value.split(", ") elif key == "Country": result["country"] = value.split(", ") elif key == "Awards": result["awards"] = value elif key == "Poster": result["thumbnail"] = value result["art"] = {} result["art"]["thumb"] = value elif key == "imdbVotes": result["votes.imdb"] = value result["votes"] = try_parse_int(value.replace(",", "")) elif key == "Ratings": for rating_item in value: if rating_item["Source"] == "Internet Movie Database": rating = rating_item["Value"] result["rating.imdb.text"] = rating rating = rating.split("/")[0] result["rating.imdb"] = rating result["rating"] = float(rating) result["rating.percent.imdb"] = "%s" % (try_parse_int(float(rating) * 10)) elif rating_item["Source"] == "Rotten Tomatoes": rating = rating_item["Value"] result["rottentomatoes.rating.percent"] = rating rating = rating.replace("%", "") # this should be a dedicated rt rating instead of the meter result["rottentomatoes.rating"] = rating result["rating.rt"] = rating result["rottentomatoes.meter"] = rating result["rottentomatoesmeter"] = rating rating = int(rating) if rating < 60: result["rottentomatoes.rotten"] = rating result["rottentomatoes.image"] = "rotten" else: result["rottentomatoes.fresh"] = rating result["rottentomatoes.image"] = "fresh" elif rating_item["Source"] == "Metacritic": rating = rating_item["Value"] result["rating.mc.text"] = rating rating = rating.split("/")[0] result["metacritic.rating"] = rating result["rating.mc"] = rating result["metacritic.rating.percent"] = "%s" % rating elif key == "imdbID": result["imdbnumber"] = value elif key == "BoxOffice": result["boxoffice"] = value elif key == "DVD": date_time = arrow.get(value, "DD MMM YYYY") result["dvdrelease"] = date_time.format('YYYY-MM-DD') result["dvdrelease.formatted"] = date_time.format('DD MMM YYYY', locale=KODI_LANGUAGE) elif key == "Production": result["studio"] = value.split(", ") elif key == "Website": result["homepage"] = value # rotten tomatoes - will probably never work again (OMDBAPI doesnt't provide them anymore) elif key == "tomatoReviews": result["rottentomatoes.reviews"] = formatted_number(value) elif key == "tomatoConsensus": result["rottentomatoes.consensus"] = value elif key == "tomatoUserMeter": result["rottentomatoes.usermeter"] = value elif key == "tomatoUserRating": result["rottentomatoes.userrating"] = value result["rottentomatoes.userrating.percent"] = "%s" % (try_parse_int(float(value) * 10)) elif key == "tomatoUserReviews": result["rottentomatoes.userreviews"] = int_with_commas(value) elif key == "tomatoURL": result["rottentomatoes.url"] = value return result