-
-
Save JonnyWong16/b0e6b2761f8649d811f51866e682464b to your computer and use it in GitHub Desktop.
#!/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.") |
Hello, I'm having trouble with the script notifier if you can help. It tries to start, but gives this error after playing
Tautulli Notifiers :: Script returned:
No --rating_key or --library specified. Exiting.
Greetings!
Thanks for sharing just an awesome script! Has saved me a world of headache.
One thing I have noticed however is when I do a --library "Movies" within Tautulli everything works great, see it processing content however; not sure exactly when but the script will stop running leaving the later half of my collection unchanged.
Wondering if there is away to make sure the script continues to run until everything has been touched or maybe I'm just overlooking something simple. Thanks again
-Cheers!
Hi, this tool has been fantastic for me! thanks a lot!
Is there anything like this for shows?
thank you!
I just wanna say how much I appreciate this. Thank you. The homemade posters that plex is adding by default now are truly awful.
Thank you for providing this script. It's very useful.
Thank you for very useful script, using it for a while now.
I notices that posters for movies in tmdb website change, not constantly but now and then.
Now script is skipping poster if its already tmdb.
Is it possible to change the script for it to update already selected tmdb poster for the new one that is default at tmdb website?
Hi, this tool has been fantastic for me! thanks a lot!
Is there anything like this for shows?
thank you!
@shorshiii There is nothing in this script unique to movies, it also works for tv shows.
Thank you for very useful script, using it for a while now. I notices that posters for movies in tmdb website change, not constantly but now and then. Now script is skipping poster if its already tmdb. Is it possible to change the script for it to update already selected tmdb poster for the new one that is default at tmdb website?
@SSauliusB You can remove the check for Gracenote in the script.
Hey, I ran into the following issue when trying to set this up to be triggered from Tautulli
I tracked it down to
/opt/Tautulli/lib/requests/compat.py
which substitutes 'charset_normalizer as chardet' if a try fails.In my test that only contains one line
Tautulli logs show
If I rename
/opt/Tautulli/lib/charset_normalizer
, the output is:I'm running Python 3.10.12 and Tautulli v2.14.2