Create Plex Collection based on IMDB List
Hi,
here i have a short Python script (Tested with python 2.7 on a qnap x64 plex installation)
For this script to work you need to get a plex token and fill in the first few lines.
This Script retrieves the IMDB CSV Export of a List and matches the entries to a Plex Library and Tags the Entries in the library
#!/usr/bin/python
# -*- coding: utf-8 -*-
import requests
from math import ceil
from plexapi.server import PlexServer
from lxml.html import parse
import re
import csv
import urllib2
### Plex server details ###
PLEX_URL = 'http://127.0.0.1:32400'
PLEX_TOKEN = ''
### Existing movie library details ###
MOVIE_LIBRARY_NAME = 'EN_Movies'
LIST_ID = 'ls074285945'
IMDB_LIST_URL = 'https://www.imdb.com/list/{}/export'.format(LIST_ID)
IMDB_COLLECTION_NAME = 'Hallmark'
def add_collection(library_key, rating_key):
headers = {"X-Plex-Token": PLEX_TOKEN}
params = {"type": 1,
"id": rating_key,
"collection[0].tag.tag": IMDB_COLLECTION_NAME,
"collection.locked": 1
}
url = "{base_url}/library/sections/{library}/all".format(base_url=PLEX_URL, library=library_key)
r = requests.put(url, headers=headers, params=params)
def find_imdb_id(imdb_url):
"""Extract id from imdb_url"""
re1 = '.*?'
re2 = '(\\d+)'
regex = re.compile(re1 + re2, re.IGNORECASE|re.DOTALL)
match = regex.search(imdb_url)
if not match:
return False
imdb_id = "tt" + match.group(1)
return imdb_id
def run_imdb_list():
try:
plex = PlexServer(PLEX_URL, PLEX_TOKEN)
except:
print("No Plex server found at: {base_url}".format(base_url=PLEX_URL))
print("Exiting script.")
return [], 0
# Get the IMDB list
print("Retrieving the IMDB list...")
i = 1
list_picture_ids = []
list_picture_titles = []
list_picture_years = []
title_lookup = {}
response = urllib2.urlopen(IMDB_LIST_URL)
reader = csv.reader(response)
titles = reader.next()
reader = csv.DictReader(response, titles)
for row in reader:
imdburl = row['URL']
imdb_id = find_imdb_id(imdburl)
if imdb_id:
list_picture_ids.append(imdb_id)
list_picture_titles.append(row['Title'])
list_picture_years.append(row['Year'])
title_lookup[imdb_id] = row['Title'] + " (" + row['Year'] + ")"
else:
print "ERROR: Unable to find IMDB ID for %s" % (row['Title'])
continue
response.close()
# Get list of movies from the Plex server
print("Retrieving a list of movies from the '{library}' library in Plex...".format(library=MOVIE_LIBRARY_NAME))
try:
movie_library = plex.library.section(MOVIE_LIBRARY_NAME)
movie_library_key = movie_library.key
all_movies = movie_library.all()
except:
print("The '{library}' library does not exist in Plex.".format(library=MOVIE_LIBRARY_NAME))
print("Exiting script.")
return
# Create a dictionary of {imdb_id: movie}
imdb_map = {}
for m in all_movies:
if 'imdb://' in m.guid:
imdb_id = m.guid.split('imdb://')[1].split('?')[0]
if imdb_id in list_picture_ids:
imdb_map[imdb_id] = m
print("Setting the collection for the '{}' library...".format(MOVIE_LIBRARY_NAME))
in_library_idx = []
for i, imdb_id in enumerate(list_picture_ids):
movie = imdb_map.pop(imdb_id, None)
if movie:
add_collection(movie_library_key, movie.ratingKey)
in_library_idx.append(i)
return len(list_picture_ids)
if __name__ == "__main__":
print("===================================================================")
import time
print time.strftime("%d/%m/%Y")
print("===================================================================\n")
list_count = run_imdb_list()
# raw_input("Press Enter to finish...")
Hope this helps you.
The Script is based on the following but modified to Download the CSV instead of parsing the HTML. Here the source