From d00dd4a840d8f69c4d225710b202a78f35639186 Mon Sep 17 00:00:00 2001 From: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com> Date: Sun, 18 Feb 2024 12:20:21 -0800 Subject: [PATCH] Add utility/select_tmdb_poster.py --- utility/select_tmdb_poster.py | 110 ++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 utility/select_tmdb_poster.py diff --git a/utility/select_tmdb_poster.py b/utility/select_tmdb_poster.py new file mode 100644 index 0000000..4a8512e --- /dev/null +++ b/utility/select_tmdb_poster.py @@ -0,0 +1,110 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +''' +Description: Selects the default TMDB poster if no poster is selected + or the current poster is from Gracenote. +Author: /u/SwiftPanda16 +Requires: plexapi +Usage: + * Change the posters for an entire library: + python select_tmdb_poster.py --library "Movies" + + * Change the poster for a specific item: + python select_tmdb_poster.py --rating_key 1234 + + * Ignore locked posters: + python select_tmdb_poster.py --library "Movies" --ignore_locked + +Tautulli script trigger: + * Notify on recently added +Tautulli script conditions: + * Filter which media to select the poster. Examples: + [ Media Type | is | movie ] +Tautulli script arguments: + * Recently Added: + --rating_key {rating_key} +''' + +import argparse +import os +import plexapi.base +from plexapi.server import PlexServer +plexapi.base.USER_DONT_RELOAD_FOR_KEYS.add('fields') + + +# ## OVERRIDES - ONLY EDIT IF RUNNING SCRIPT WITHOUT TAUTULLI ## + +PLEX_URL = '' +PLEX_TOKEN = '' + +# Environmental Variables +PLEX_URL = PLEX_URL or os.getenv('PLEX_URL', PLEX_URL) +PLEX_TOKEN = PLEX_TOKEN or os.getenv('PLEX_TOKEN', PLEX_TOKEN) + + +def select_tmdb_poster_library(library, ignore_locked=False): + for item in library.all(includeGuids=False): + # Only reload for fields + item.reload( + checkFiles=0, + includeAllConcerts=0, + includeBandwidths=0, + includeChapters=0, + includeChildren=0, + includeConcerts=0, + includeExternalMedia=0, + includeExtras=0, + includeFields=1, + includeGeolocation=0, + includeLoudnessRamps=0, + includeMarkers=0, + includeOnDeck=0, + includePopularLeaves=0, + includePreferences=0, + includeRelated=0, + includeRelatedCount=0, + includeReviews=0, + includeStations=0 + ) + select_tmdb_poster_item(item, ignore_locked=ignore_locked) + + +def select_tmdb_poster_item(item, ignore_locked=False): + posters = item.posters() + selected_poster = next((p for p in posters if p.selected), None) + + if selected_poster is None or not item.isLocked('thumb'): + print(f"WARNING: No poster selected for {item.title}") + select_tmdb_poster(item, posters) + elif not ignore_locked and item.isLocked('thumb'): + print(f"Poster is locked for {item.title}. Skipping.") + elif selected_poster.provider == 'gracenote': + select_tmdb_poster(item, posters) + + +def select_tmdb_poster(item, posters): + # Fallback to first poster if no TMDB posters are available + tmdb_poster = next((p for p in posters if p.provider == 'tmdb'), posters[0]) + # Selecting the poster automatically locks it + tmdb_poster.select() + print(f"Selected {tmdb_poster.provider} poster for {item.title}") + + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('--rating_key', type=int) + parser.add_argument('--library') + parser.add_argument('--ignore_locked', action='store_true') + opts = parser.parse_args() + + plex = PlexServer(PLEX_URL, PLEX_TOKEN) + + if opts.rating_key: + item = plex.fetchItem(opts.rating_key) + select_tmdb_poster_item(item, opts.ignore_locked) + elif opts.library: + library = plex.library.section(opts.library) + select_tmdb_poster_library(library, opts.ignore_locked) + else: + print("No --rating_key or --library specified. Exiting.")