Last active
October 10, 2024 13:53
-
-
Save JonnyWong16/b0e6b2761f8649d811f51866e682464b to your computer and use it in GitHub Desktop.
Selects the default TMDB poster for movies in a Plex library if the current poster is from Gracenote.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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 | |
* By default locked posters are skipped. To update locked posters: | |
python select_tmdb_poster.py --library "Movies" --include_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, include_locked=False): | |
for item in library.all(includeGuids=False): | |
# Only reload for fields | |
item.reload(**{k: 0 for k, v in item._INCLUDES.items()}) | |
select_tmdb_poster_item(item, include_locked=include_locked) | |
def select_tmdb_poster_item(item, include_locked=False): | |
if item.isLocked('thumb') and not include_locked: # PlexAPI 4.5.10 | |
print(f"Locked poster for {item.title}. Skipping.") | |
return | |
posters = item.posters() | |
selected_poster = next((p for p in posters if p.selected), None) | |
if selected_poster is None: | |
print(f"WARNING: No poster selected for {item.title}.") | |
else: | |
skipping = ' Skipping.' if selected_poster.provider != 'gracenote' else '' | |
print(f"Poster provider is '{selected_poster.provider}' for {item.title}.{skipping}") | |
if posters and (selected_poster is None or selected_poster.provider == 'gracenote'): | |
# 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('--include_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.include_locked) | |
elif opts.library: | |
library = plex.library.section(opts.library) | |
select_tmdb_poster_library(library, opts.include_locked) | |
else: | |
print("No --rating_key or --library specified. Exiting.") |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
@shorshiii There is nothing in this script unique to movies, it also works for tv shows.
@SSauliusB You can remove the check for Gracenote in the script.