PlexAutoCollectionUpdater/PlexAutoCollectionUpdater.py
2021-12-08 22:39:56 +01:00

96 lines
4.1 KiB
Python

from plexapi.server import PlexServer
from config.config import Config
from models.movie import UpdatedMovie
from tmdbv3api import TMDb, Movie
import os
from datetime import datetime as dt
import yaml, os, urllib.request
# Instantiate Tmdb object
tmdb = TMDb()
tmdb.api_key = Config.tmdbApiKey
tmdb.language = Config.tmdbLanguage
# Connect to Plex Server
baseurl = Config.plexBaseUrl
token = Config.plexToken
plex = PlexServer(baseurl, token)
plexMoviesLibrary = plex.library.section('Movies')
MoviesList = []
print(f":: {dt.now().strftime('%d-%m-%Y %H:%M:%S')} :: CollectionUpdater :: Retrieving Movies from Plex and Updating TMDb information...")
for item in plexMoviesLibrary.search():
movie = UpdatedMovie()
tmdbMovie = Movie()
movie.PlexTitle = item.title
for guid in item.guids:
if "tmdb://" in guid.id:
movie.TMDbId = guid.id[7:]
elif "imdb://" in guid.id:
movie.ImdbId = guid.id[7:]
# Search for the movie on TMDb
try:
tmdbMovieDetails = tmdbMovie.details(movie_id=movie.TMDbId)
except:
print(f":: {dt.now().strftime('%d-%m-%Y %H:%M:%S')} :: CollectionUpdater :: Cannot get details of {movie.PlexTitle} from TMDb")
if tmdbMovieDetails['belongs_to_collection']:
movie.MovieTMDbCollectionName = tmdbMovieDetails['belongs_to_collection'].name[:len(tmdbMovieDetails['belongs_to_collection'].name) - 7]
movie.MovieTMDbCollectionTMDbId = tmdbMovieDetails['belongs_to_collection'].id
movie.MovieTMDbCollectionPosterPath = tmdbMovieDetails['belongs_to_collection'].poster_path
movie.TMDbTitle = tmdbMovieDetails.title
# Add movie to the list of Movies
if movie.MovieTMDbCollectionTMDbId:
MoviesList.append(movie)
print(f":: {dt.now().strftime('%d-%m-%Y %H:%M:%S')} :: CollectionUpdater :: Retrieved Movies from Plex and Updated TMDb information for {len(MoviesList)} movies...")
i = 0
count = 0
MovieListFinal = []
ExistingCollectionId = []
while i < len(MoviesList):
for movie in MoviesList:
if MoviesList[i].MovieTMDbCollectionTMDbId == movie.MovieTMDbCollectionTMDbId:
count += 1
if count > 2:
if not MoviesList[i].MovieTMDbCollectionTMDbId in ExistingCollectionId:
ExistingCollectionId.append(MoviesList[i].MovieTMDbCollectionTMDbId)
MovieListFinal.append(MoviesList[i])
i += 1
count = 0
with open(Config.PlexAutoCollectionConfigFilePath, 'r') as f:
try:
currentYaml = yaml.safe_load(f)
except yaml.YAMLError as exc:
print(exc)
currentYamlCollections = []
for movies in currentYaml['collections']:
currentYamlCollections.append(movies)
for collection in MovieListFinal:
if collection.MovieTMDbCollectionName not in currentYamlCollections:
with open(Config.PlexAutoCollectionConfigFilePath, 'r') as f:
new_coll = {f'{collection.MovieTMDbCollectionName}': {'sync_mode': 'sync', 'tmdb_collection': collection.MovieTMDbCollectionTMDbId, 'tmdb_summary': collection.MovieTMDbCollectionTMDbId}}
currentYaml['collections'].update(new_coll)
if currentYaml:
print(f":: {dt.now().strftime('%d-%m-%Y %H:%M:%S')} :: CollectionUpdater :: Adding new collection: {collection.MovieTMDbCollectionName} to Yaml file...")
with open(Config.PlexAutoCollectionConfigFilePath, 'w') as f:
yaml.safe_dump(currentYaml, f)
if not os.path.exists(Config.PlexAutoCollectionConfigFileImagesPath + f"/{collection.MovieTMDbCollectionName}"):
print(f":: {dt.now().strftime('%d-%m-%Y %H:%M:%S')} :: CollectionUpdater :: Download poster for new collection {collection.MovieTMDbCollectionName}...")
os.mkdir(Config.PlexAutoCollectionConfigFileImagesPath + f"/{collection.MovieTMDbCollectionName}")
urllib.request.urlretrieve(Config.tmdbImgUrl + f"{collection.MovieTMDbCollectionPosterPath}", Config.PlexAutoCollectionConfigFileImagesPath + f"/{collection.MovieTMDbCollectionName}/poster.jpeg")
print(f":: {dt.now().strftime('%d-%m-%Y %H:%M:%S')} :: CollectionUpdater :: All steps are completed...")