from tmdbv3api import TMDb, Discover tmdb = TMDb() tmdb.api_key = '' discover = Discover() # What are the most popular TV shows? show = discover.discover_tv_shows({'sort_by': 'popularity.desc'}) for p in show: print(p.name) print(p.overview)
--file="<path to file>" To handle a single file. --verbose Prints all informations got from TMDB --cleanup Removes all files generated by this tool. Example: python TMDB_fetcher.py "E:\Videos" -k=abcdef python TMDB_fetcher.py "D:\" -k=abcdef --file="D:\Avatar.mp4" python TMDB_fetcher.py "E:\Videos" --cleanup """ # TMDB API, see : https://pypi.org/project/tmdbv3api/ # see the json schemas here : https://developers.themoviedb.org/3/movies/get-movie-details from tmdbv3api import TMDb # $ pip install tmdbv3api TMDB = TMDb() from tmdbv3api import Movie MOVIE = Movie() import json import argparse from docopt import docopt # pip install docopt import os import sys import re import textwrap import logging import datetime import wget # pip install wget VERSION = 1.0
def main(argv): configFile = '' dumpFile = '' try: opts, args = getopt.getopt(argv, "hc:d:", ["configfile=", "dumpfile"]) except getopt.GetoptError: printHelp() sys.exit(2) for opt, arg in opts: if opt == '-h': printHelp() sys.exit(0) elif opt in ("-c", "--configfile"): configFile = arg elif opt in ("-d", "--dumpfile"): dumpFile = arg if configFile == '': printHelp() sys.exit(0) config = dict() with open(configFile, "r") as readFile: config = json.load(readFile) TMDb().language = getConfigParam(config, ['language']) TMDb().api_key = 'e24fcd17eff0cfe0064fa7b5cb05b97d' overwrite = bool(getConfigParam(config, ["overwrite_files"])) showEnabled = bool(getConfigParam(config, ["tv_show_mode", "enable"])) movieEnabled = bool(getConfigParam(config, ["movie_mode", "enable"])) tmpFolder = getConfigParam(config, ["tmp_folder"]) saveDump = bool(getConfigParam(config, ["dump_data"])) autoRename = bool(getConfigParam(config, ["auto_rename"])) showDump = None movieDump = None if showEnabled: showDump = createShowDump(config, dumpFile) showDump.determineRenaming() if movieEnabled: movieDump = createMovieDump(config, dumpFile) movieDump.determineRenaming() if saveDump and showDump != None: arr = [] for show in showDump.tvShows.keys(): arr.append(show.serialize()) if not os.path.exists(tmpFolder): os.makedirs(tmpFolder) with open(tmpFolder + "/tv_shows.json", "w") as writeFile: json.dump(arr, writeFile, indent=4) if saveDump and movieDump != None: arr = [] for movie in movieDump.movieData.keys(): arr.append(movie.serialize()) with open(tmpFolder + "/movies.json", "w") as writeFile: json.dump(arr, writeFile, indent=4) if autoRename and showDump != None: showDump.moveFiles(overwrite) if autoRename and movieDump != None: movieDump.moveFiles(overwrite) sys.exit(0)
def run_imdb_sync(): try: plex = PlexServer(PLEX_URL, PLEX_TOKEN) except: print("No Plex server found at: {base_url}".format( base_url=PLEX_URL)) print("Please check that config.ini exists, and is correct.") print( "If the URL displayed is correct, your token may be incorrect." ) input("Press Enter to exit") sys.exit() # Get list of movies from the Plex server all_movies = [] for movie_lib in MOVIE_LIBRARIES: try: print( "Retrieving a list of movies from the '{library}' library in Plex." .format(library=movie_lib)) movie_library = plex.library.section(movie_lib) library_language = movie_library.language # IMDB will use language from last library in list all_movies.extend(movie_library.all()) except: print("The '{library}' library does not exist in Plex.".format( library=movie_lib)) print("Please check that config.ini exists, and is correct.") input("Press Enter to exit") sys.exit() # Get the requested imdb list print( "Retrieving movies from selected IMDB list. Depending on the amount of pages selected this might take a few minutes." ) maxpages = int(PAGE_NUMBERS) + 1 title_name = [] title_years = [] title_ids = [] for i in range(1, maxpages): url = IMDB_URL + '?page={}'.format(i) r = requests.get(url, headers={'Accept-Language': library_language}) tree = html.fromstring(r.content) title_name.extend( tree.xpath( "//div[contains(@class, 'lister-item-content')]//h3[contains(@class, 'lister-item-header')]//a/text()" )) title_years.extend( tree.xpath( "//div[contains(@class, 'lister-item-content')]//h3[contains(@class, 'lister-item-header')]//span[contains(@class, 'lister-item-year')]/text()" )) title_ids.extend( tree.xpath( "//div[contains(@class, 'lister-item-image')]//a/img//@data-tconst" )) # Convert TMDB to IMDB ID and create a dictionary of {imdb_id: movie} print( "Matching IMDB IDs to Library. For large Libraries using TMDB agent this step can take a long time." ) reqcount = 0 tmdb = TMDb() tmdb.api_key = parser.get('tmdb', 'apikey') movie = Movie() imdb_map = {} for m in all_movies: if 'themoviedb://' in m.guid: if reqcount >= 10: time.sleep(2.5) reqcount = 0 if tmdb.api_key: try: tmdb_id = m.guid.split('themoviedb://')[1].split( '?')[0] tmdbapi = movie.details(tmdb_id) imdb_id = tmdbapi.imdb_id reqcount += 1 except AttributeError: imdb_id = None reqcount += 1 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 # Add movies to the selected collection print("Adding the collection '{}' to matched movies.".format( IMDB_COLLECTION_NAME)) in_library_idx = [] for i, imdb_id in enumerate(title_ids): movie = imdb_map.pop(imdb_id, None) if movie: add_collection(movie.librarySectionID, movie.ratingKey) in_library_idx.append(i) # Get list of missing movies from selected list missing_imdb_movies = [ (idx, imdb) for idx, imdb in enumerate(zip(title_ids, title_name, title_years)) if idx not in in_library_idx ] return missing_imdb_movies, len(title_ids)