def imdb_get_movies(config_path, plex, data): title_ids = data[1] print("| {} Movies found on IMDb".format(len(title_ids))) tmdb = TMDb() tmdb.api_key = config_tools.TMDB(config_path).apikey movie = Movie() imdb_map = {} matched_imdb_movies = [] missing_imdb_movies = [] current_length = 0 current_count = 0 plex_tools.create_cache(config_path) plex_movies = plex.Library.all() for m in plex_movies: current_count += 1 print_display = "| Processing: {}/{} {}".format(current_count, len(plex_movies), m.title) print(adjust_space(current_length, print_display), end="\r") current_length = len(print_display) if 'plex://' in m.guid: item = m # Check cache for imdb_id imdb_id = plex_tools.query_cache(config_path, item.guid, 'imdb_id') if not imdb_id: imdb_id, tmdb_id = plex_tools.alt_id_lookup(plex, item) print(adjust_space(current_length, "| Cache | + | {} | {} | {} | {}".format(item.guid, imdb_id, tmdb_id, item.title))) plex_tools.update_cache(config_path, item.guid, imdb_id=imdb_id, tmdb_id=tmdb_id) elif 'themoviedb://' in m.guid: if not tmdb.api_key == "None": tmdb_id = m.guid.split('themoviedb://')[1].split('?')[0] tmdbapi = movie.details(tmdb_id) imdb_id = tmdbapi.imdb_id if hasattr(tmdbapi, 'imdb_id') else None else: imdb_id = None elif 'imdb://' in m.guid: imdb_id = m.guid.split('imdb://')[1].split('?')[0] else: imdb_id = None if imdb_id and imdb_id in title_ids: imdb_map[imdb_id] = m else: imdb_map[m.ratingKey] = m print(adjust_space(current_length, "| Processed {} Movies".format(len(plex_movies)))) for imdb_id in title_ids: movie = imdb_map.pop(imdb_id, None) if movie: matched_imdb_movies.append(plex.Server.fetchItem(movie.ratingKey)) else: missing_imdb_movies.append(imdb_id) return matched_imdb_movies, missing_imdb_movies
def trakt_get_movies(config_path, plex, data, method): config_tools.TraktClient(config_path) if method == "trakt_trending": max_items = int(data) trakt_list_items = trakt.Trakt['movies'].trending(per_page=max_items) elif method == "trakt_watchlist": trakt_url = data if trakt_url[-1:] == " ": trakt_url = trakt_url[:-1] trakt_list_path = 'users/{}/watchlist'.format(data) trakt_list_items = [ movie for movie in trakt.Trakt[trakt_list_path].movies() ] else: trakt_url = data if trakt_url[-1:] == " ": trakt_url = trakt_url[:-1] trakt_list_path = urlparse(trakt_url).path trakt_list_items = trakt.Trakt[trakt_list_path].items() title_ids = [ m.pk[1] for m in trakt_list_items if isinstance(m, trakt.objects.movie.Movie) ] imdb_map = {} plex_tools.create_cache(config_path) if title_ids: for item in plex.Library.all(): item_type = urlparse(item.guid).scheme.split('.')[-1] if item_type == 'plex': # Check cache for imdb_id imdb_id = plex_tools.query_cache(config_path, item.guid, 'imdb_id') if not imdb_id: imdb_id, tmdb_id = plex_tools.alt_id_lookup(plex, item) print("| Cache | + | {} | {} | {} | {}".format( item.guid, imdb_id, tmdb_id, item.title)) plex_tools.update_cache(config_path, item.guid, imdb_id=imdb_id, tmdb_id=tmdb_id) elif item_type == 'imdb': imdb_id = urlparse(item.guid).netloc elif item_type == 'themoviedb': tmdb_id = urlparse(item.guid).netloc # lookup can sometimes return a list lookup = trakt.Trakt['search'].lookup(tmdb_id, 'tmdb', 'movie') if lookup: lookup = lookup[0] if isinstance(lookup, list) else lookup imdb_id = lookup.get_key('imdb') else: imdb_id = None else: imdb_id = None if imdb_id and imdb_id in title_ids: imdb_map[imdb_id] = item else: imdb_map[item.ratingKey] = item matched_imdb_movies = [] missing_imdb_movies = [] for imdb_id in title_ids: movie = imdb_map.pop(imdb_id, None) if movie: matched_imdb_movies.append( plex.Server.fetchItem(movie.ratingKey)) else: missing_imdb_movies.append(imdb_id) return matched_imdb_movies, missing_imdb_movies else: # No movies return None, None
def tmdb_get_movies(config_path, plex, data, is_list=False): tmdb_id = int(data) t_movs = [] t_movie = Movie() t_movie.api_key = config_tools.TMDB( config_path).apikey # Set TMDb api key for Movie if t_movie.api_key == "None": raise KeyError("Invalid TMDb API Key") tmdb = List() if is_list else Collection() tmdb.api_key = t_movie.api_key t_col = tmdb.details(tmdb_id) if is_list: try: for tmovie in t_col: if tmovie.media_type == "movie": t_movs.append(tmovie.id) except: raise ValueError( "| Config Error: TMDb List: {} not found".format(tmdb_id)) else: try: for tmovie in t_col.parts: t_movs.append(tmovie['id']) except AttributeError: try: t_movie.details(tmdb_id).imdb_id t_movs.append(tmdb_id) except: raise ValueError( "| Config Error: TMDb ID: {} not found".format(tmdb_id)) # Create dictionary of movies and their guid # GUIDs reference from which source Plex has pulled the metadata p_m_map = {} p_movies = plex.Library.all() for m in p_movies: guid = m.guid if "themoviedb://" in guid: guid = guid.split('themoviedb://')[1].split('?')[0] elif "imdb://" in guid: guid = guid.split('imdb://')[1].split('?')[0] elif "plex://" in guid: guid = guid.split('plex://')[1].split('?')[0] else: guid = "None" p_m_map[m] = guid matched = [] missing = [] plex_tools.create_cache(config_path) # We want to search for a match first to limit TMDb API calls # Too many rapid calls can cause a momentary block # If needed in future maybe add a delay after x calls to let the limit reset for mid in t_movs: # For each TMBd ID in TMBd Collection match = False for m in p_m_map: # For each movie in Plex item = m agent_type = urlparse(m.guid).scheme.split('.')[-1] # Plex movie agent if agent_type == 'plex': # Check cache for tmdb_id tmdb_id = plex_tools.query_cache(config_path, item.guid, 'tmdb_id') imdb_id = plex_tools.query_cache(config_path, item.guid, 'imdb_id') if not tmdb_id: imdb_id, tmdb_id = plex_tools.alt_id_lookup(plex, item) print("| Cache | + | {} | {} | {} | {}".format( item.guid, imdb_id, tmdb_id, item.title)) plex_tools.update_cache(config_path, item.guid, imdb_id=imdb_id, tmdb_id=tmdb_id) if int(tmdb_id) == int(mid): match = True break elif agent_type == 'themoviedb': if int(p_m_map[m]) == int(mid): match = True break elif agent_type == 'imdb': imdb_id = t_movie.details(mid).imdb_id for m in p_m_map: if "tt" in p_m_map[m]: if p_m_map[m] == imdb_id: match = True break if match: matched.append(m) else: # Duplicate TMDb call? missing.append(t_movie.details(mid).imdb_id) return matched, missing
def tmdb_get_movies(config_path, plex, data, method): t_movs = [] t_movie = Movie() t_movie.api_key = config_tools.TMDB(config_path).apikey # Set TMDb api key for Movie if t_movie.api_key == "None": raise KeyError("Invalid TMDb API Key") count = 0 if method == "tmdb_discover": discover = Discover() discover.api_key = t_movie.api_key discover.discover_movies(data) total_pages = int(os.environ["total_pages"]) total_results = int(os.environ["total_results"]) limit = int(data.pop('limit')) amount = total_results if total_results < limit else limit print("| Processing {}: {} items".format(method, amount)) for attr, value in data.items(): print("| {}: {}".format(attr, value)) for x in range(total_pages): data["page"] = x + 1 tmdb_movies = discover.discover_movies(data) for tmovie in tmdb_movies: count += 1 t_movs.append(tmovie.id) if count == amount: break if count == amount: break elif method in ["tmdb_popular", "tmdb_top_rated", "tmdb_now_playing", "tmdb_trending_daily", "tmdb_trending_weekly"]: #trending = Trending() #TURNON:Trending #trending.api_key = t_movie.api_key #TURNON:Trending for x in range(int(data / 20) + 1): if method == "tmdb_popular": tmdb_movies = t_movie.popular(x + 1) elif method == "tmdb_top_rated": tmdb_movies = t_movie.top_rated(x + 1) elif method == "tmdb_now_playing": tmdb_movies = t_movie.now_playing(x + 1) #elif method == "tmdb_trending_daily": #TURNON:Trending # tmdb_movies = trending.movie_day(x + 1) #TURNON:Trending #elif method == "tmdb_trending_weekly": #TURNON:Trending # tmdb_movies = trending.movie_week(x + 1) #TURNON:Trending for tmovie in tmdb_movies: count += 1 t_movs.append(tmovie.id) if count == data: break if count == data: break print("| Processing {}: {} Items".format(method, data)) else: tmdb_id = int(data) if method == "tmdb_list": tmdb = List() tmdb.api_key = t_movie.api_key try: t_col = tmdb.details(tmdb_id) tmdb_name = str(t_col) for tmovie in t_col: if tmovie.media_type == "movie": t_movs.append(tmovie.id) except: raise ValueError("| Config Error: TMDb List: {} not found".format(tmdb_id)) elif method == "tmdb_company": tmdb = Company() tmdb.api_key = t_movie.api_key tmdb_name = str(tmdb.details(tmdb_id)) company_movies = tmdb.movies(tmdb_id) for tmovie in company_movies: t_movs.append(tmovie.id) else: tmdb = Collection() tmdb.api_key = t_movie.api_key t_col = tmdb.details(tmdb_id) tmdb_name = str(t_col) try: for tmovie in t_col.parts: t_movs.append(tmovie['id']) except AttributeError: try: t_movie.details(tmdb_id).imdb_id tmdb_name = str(t_movie.details(tmdb_id)) t_movs.append(tmdb_id) except: raise ValueError("| Config Error: TMDb ID: {} not found".format(tmdb_id)) print("| Processing {}: ({}) {}".format(method, tmdb_id, tmdb_name)) # Create dictionary of movies and their guid # GUIDs reference from which source Plex has pulled the metadata p_m_map = {} p_movies = plex.Library.all() for m in p_movies: guid = m.guid if "themoviedb://" in guid: guid = guid.split('themoviedb://')[1].split('?')[0] elif "imdb://" in guid: guid = guid.split('imdb://')[1].split('?')[0] elif "plex://" in guid: guid = guid.split('plex://')[1].split('?')[0] else: guid = "None" p_m_map[m] = guid matched = [] missing = [] plex_tools.create_cache(config_path) # We want to search for a match first to limit TMDb API calls # Too many rapid calls can cause a momentary block # If needed in future maybe add a delay after x calls to let the limit reset for mid in t_movs: # For each TMBd ID in TMBd Collection match = False for m in p_m_map: # For each movie in Plex item = m agent_type = urlparse(m.guid).scheme.split('.')[-1] # Plex movie agent if agent_type == 'plex': # Check cache for tmdb_id tmdb_id = plex_tools.query_cache(config_path, item.guid, 'tmdb_id') imdb_id = plex_tools.query_cache(config_path, item.guid, 'imdb_id') if not tmdb_id: imdb_id, tmdb_id = plex_tools.alt_id_lookup(plex, item) print("| Cache | + | {} | {} | {} | {}".format(item.guid, imdb_id, tmdb_id, item.title)) plex_tools.update_cache(config_path, item.guid, imdb_id=imdb_id, tmdb_id=tmdb_id) if int(tmdb_id) == int(mid): match = True break elif agent_type == 'themoviedb': if int(p_m_map[m]) == int(mid): match = True break elif agent_type == 'imdb': imdb_id = t_movie.details(mid).imdb_id for m in p_m_map: if "tt" in p_m_map[m]: if p_m_map[m] == imdb_id: match = True break if match: matched.append(m) else: # Duplicate TMDb call? missing.append(t_movie.details(mid).imdb_id) return matched, missing