PMM Image Sets is a set of pre-defined files to work in conjunction with Plex Meta Manager
Image Sets allow you to easily apply our curated set of Posters and Title Cards to your libraries, skipping the need to manually download and apply individual posters to your media.
Image Sets can be called out in your Plex Meta Manager config file as follows:
libraries:
Movies: # must match a library in your Plex server
image_sets:
- pmm: movies # name of the image set
template_variables:
use_all: true # this is false by default, meaning you need to manually specify which sets you want
TV Shows: # must match a library in your Plex server
image_sets:
- pmm: shows # name of the image set
template_variables:
use_starwars: true # will only use the images that are part of the `starwars` set, no other sets will be used.This repo and many of the files in it are created using an automated Python 3.11 script in the repo set_update.py.
This script is automatically run whenever a change is pushed to the repo and once daily to check for new missing items.
For the purpose of this walkthrough, we will be adding a marvel Image Set.
If you're unsure how to construct a YAML file please read this guide.
set_update.py can either be run using GitHub Actions whenever you push a change or run locally using Python 3.11, but either way you'll need to provide some keys so it can connect to TMDb and Trakt.
To run set_update.py the code needs to connect to TMDb and Trakt with access keys provided by you.
You can either "daily run" a forked repository which has the automation built in (Option 1) or run the script locally on your own host (Option 2)
The automation works fine for the main repo but if you create your own fork of the repo then you'll need to add the correct secrets to the repo for the automation to work.
The automation is only required if you want an "active" fork that has automation built-in (such as you wanting to "daily run" your own fork rather than the main repo). If you are only creating a fork so that you can submit Pull Requests, this is not a mandatory step as the main repo will run automation when any Pull Request is accepted
- First have your
TMDb V3 API Key,Trakt Client ID, andTrakt Access Tokenat hand.TMDb V3 API Key: TMDb V3 API Key. InstructionsTrakt Client ID:client_idin trakt PMM Authorization. Authorization InstructionsTrakt Access Token:access_tokenin trakt PMM Authorization. Authorization Instructions
- Next you need to add the above keys into you fork on GitHub, on GitHub.com on your fork's main page open your fork's
Settingspage. Then clickSecrets and variables->Actionsin theSecuritysection of the left menu. - Now add your
TMDb V3 API Keyas a secret by clickingNew repositroy secretin the top right and for Name useTMDBAPIand for Secret use yourTMDb V3 API Keyand then ClickAdd secret. - Now add your
Trakt Client IDas a secret by clickingNew repositroy secretin the top right and for Name useTRAKT_IDand for Secret use yourTrakt Client IDand then ClickAdd secret. - Now add your
Trakt Access Tokenas a secret by clickingNew repositroy secretin the top right and for Name useTRAKT_TOKENand for Secret use yourTrakt Access Tokenand then ClickAdd secret.
If you want to run set_update.py locally, you need to either set up the Environment Variables TMDBAPI, TRAKT_ID, and TRAKT_TOKEN or use the run arguments --tmdbapi, --trakt_id, and trakt_token.
We recommend using Environment Variables as these are stored in a file rather than having to be typed in a command on each run. To do this, open up .env.example and enter your TMDB/Trakt keys, then rename the file to .env
If you prefer using the run arguments, an example run command would be python set_update.py --tmdbapi 123456 --trakt_id 1a2bc3 --trakt_token 9z8y7x
There is a process/workflow that you should have a high-level understanding of in order to understand where each piece of the puzzle fits together.
The Set Index File is used to define and create each of the Image Sets that exist. The Set Index File is normally split into library type (movies, shows, kids movies, kids shows, etc), with an exception being made for movie/show universes such as Marvel Cinematic Universe which can contain a multitude of mini-collections within it.
The Image Set File is used to list each of the movies/shows that are part of the Image Set, utilizing Builders to populate the movies/shows list.
An Image Style is a way of applying different poster sets to the same Image Set. We normally use the poster author's name (and a meaningful description if they have more than one style), commonly found Image Styles are diiivoy_neon and redheadjedi
The Image Style File lists all of the movies/shows that are part of the Image Style, and maps each movie/show to a poster URL (normally by theposterdatabase ID, or any other direct URL link)
The Set Index File is used to define and create each of the Image Sets that exist. The Set Index File is normally split by library type (movies, shows, kids movies, kids shows, etc), with the exception of universes such as Marvel Cinematic Universe which can contain a multitude of mini-collections within it.
You should only create a new Image Set if your images does not fall into an already existing Image Set.
To add a new Image Set edit sets.yml and add the set_key you want to use as the mapping name and give it the attributes title and description (These will end up on the readme page).
sets:
movies:
title: Sets - Movies
description: Movie Posters
mcu: # Image Set Key
title: Marvel Properties # Image Set Title
description: Images for all Marvel Properties # Image Set DescriptionThen either push your changes or run set_update.py locally to initialize the set and create the initial Image Set file at mcu/set.yml which to start will just have sections:.
To edit the title or description just change the value in the sets file.
If you want to change the set_key simply add set_key under the old new and give it the new key. DO NOT CHANGE THE MAPPING NAME
sets:
movies: # Image Set Key
title: Sets - Movies # Image Set Title
description: Movie Posters # Image Set Description
mcu:
title: Marvel Properties
description: Images for all Marvel Properties
set_key: marvel # This will change this set's key from `mcu` to `marvel`Then either push your changes or run set_update.py locally to edit the set sections.
The Image Set File is used to list each of the movies/shows that are part of the Image Set.
Most Image Set Files will utilize Sections to split the file into smaller pieces, allowing each section to have its own properties. For example, an Image Set File for the Marvel Cinematic Universe can be split into sections in different ways:
- Sections for Iron Man, Thor, Captain America, etc.
- Sections for Phase 1, Phase 2, Phase 3, etc.
- Sections for Infinity Saga, Multiverse Saga, etc.
Regardless of how you split the Image Set File, each Section will utilize builders to specify all the movies/shows that belong in that section, and their TMDb ID (For Movies) or TVDb ID (For Shows).
This allows Plex Meta Manager to compare your library against the movies/shows in the Image Set to see what items you have.
Following the creation of our new marvel Image Set File, we are going to split Marvel Cinematic Universe into character-based sections. Open marvel/set.yml
To add a new section to the Image Set File, edit the set.yml and add the Section Key. The Section Key can be named anything, but should logically explain what the section is. We will use ironman and thor for this example.
sections:
ironman: # adding the ironman section key
thor: # adding the thor sectionThen either push your changes or run set_update.py locally to initialize the sections.
Now each Section will have an auto generated title, a blank builders attribute, and a blank styles attribute:
sections:
ironman:
title: Ironman
builders:
styles:
thor:
title: Thor
builders:
styles:Now that we have an ironman and thor section, it's time to start filling in the attributes, starting with builders.
In simple terms, Builders define how Plex Meta Manager is going to know what movies/shows are part of the Section. This is most commonly done using TMDb Collections, Trakt Lists or any other builder from the below table:
| Builder | Description |
|---|---|
tmdb_collection |
TMDb Collection ID or URL. Can take multiple values as a comma separated string or a list. |
tmdb_movie |
TMDb Movie ID or URL. Can take multiple values as a comma separated string or a list. |
tmdb_show |
TMDb Show ID or URL. Can take multiple values as a comma separated string or a list. |
tvdb_show |
TVDb Show ID or URL. Can take multiple values as a comma separated string or a list. |
imdb_id |
IMDb ID or URL. Can take multiple values as a comma separated string or a list. |
tmdb_list |
TMDb List ID or URL. Can take multiple values only as a list. |
imdb_list |
IMDb List URL or IMDb Search URL. Can take multiple values only as a list. |
trakt_list |
Trakt List URL. Can take multiple values only as a list. |
mdblist_list |
MdbList URL. Can take multiple values only as a list. |
We are going to give each section a tmdb_collection builder with their respective TMDb Collection ID (Found by searching TMDb) to initialize the movies and shows lists.
sections:
ironman:
title: Ironman
builders:
tmdb_collection: 131292 # https://www.themoviedb.org/collection/131292
styles:
thor:
title: Thor
builders:
tmdb_collection: 131296 # https://www.themoviedb.org/collection/131296
styles:Then either push your changes or run set_update.py locally to initialize the movies and shows lists.
Your output should look like the below:
sections:
ironman:
title: Ironman
builders:
tmdb_collection: 131292
styles:
collections:
"Iron Man Collection":
- "Iron Man"
movies:
"Iron Man (2008)": 1726
"Iron Man 2 (2010)": 10138
"Iron Man 3 (2013)": 68721
thor:
title: Thor
builders:
tmdb_collection: 131296
styles:
collections:
"Thor Collection":
- "Thor"
movies:
"Thor (2011)": 10195
"Thor: The Dark World (2013)": 76338
"Thor: Ragnarok (2017)": 284053
"Thor: Love and Thunder (2022)": 616037There was two new attributes added to each section, collections and movies (If the builder had a show then shows would also be added).
collections is auto generated based on the TMDb Collection called but more can be added if desired. The list under the collection is a list of alternative collection names to also apply that poster too.
Custom collections can be added to the collections list as well as custom alternative collection names can be added to any list.
movies and its tv counterpart shows are where the ID mappings go. These lists must be auto generated from the builders aside from editions.
It may be possible that a single Builder doesn't contain every item that you want to be part of the Section. We can use multiple Builders to resolve this.
As an example of this, we will add one of the Marvel One-Shots to the Thor collection by utilizing tmdb_collection and tmdb_movie builders:
sections:
ironman:
title: Ironman
builders:
tmdb_collection: 131292
styles:
thor:
title: Thor
builders:
tmdb_collection: 131296
tmdb_movie: 76535 # We have now added https://www.themoviedb.org/movie/76535
styles:Then either push your changes or run set_update.py locally to initialize the movies and shows lists.
Your output should look like the below:
sections:
ironman:
title: Ironman
builders:
tmdb_collection: 131292
styles:
collections:
"Iron Man Collection":
- "Iron Man"
movies:
"Iron Man (2008)": 1726
"Iron Man 2 (2010)": 10138
"Iron Man 3 (2013)": 68721
thor:
title: Thor
builders:
tmdb_collection: 131296
styles:
collections:
"Thor Collection":
- "Thor"
movies:
"Thor (2011)": 10195
"Thor: The Dark World (2013)": 76338
"Thor: Ragnarok (2017)": 284053
"Thor: Love and Thunder (2022)": 616037
"Marvel One-Shot: A Funny Thing Happened on the Way to Thor's Hammer (2011)": 76535 # This has now been addedNow if you want to edit the Image Set File open the file in question and change the value you wish to change. Then either push your changes or run set_update.py locally to update the associated files.
You can change the title, add/remove builders, add/remove styles, add/remove collections, add/remove collection alternative names, and add/remove editions.
The title attribute should always be legible in Plain English, as it is the title that will appear in the documentation, so shouldn't be "code":
sections:
ironman:
title: Iron Man # changed the title from Ironman to Iron Man
builders:
styles:
thor:
title: Thor
builders:
styles:An Image Style is used to define a style of posters which should apply to movies within the Section.
We usually name the styles after the image author/creator, and append a meaningful description when the author has more than one style which can apply to the items.
For example, one of the commonly used poster styles for Kids Movies is diiivoy_neon
Each Section within an Image Set File can have any number of different Styles, these files are what defines them.
First we need to initialize the style file by adding a Style Key under styles.
For this example we will use my_style_key as the key.
sections:
ironman:
title: Iron Man
builders:
tmdb_collection: 131292
styles:
my_style_key: # Added the Style Key here ending with `:`
collections:
"Iron Man Collection":
- "Iron Man"
movies:
"Iron Man (2008)": 1726
"Iron Man 2 (2010)": 10138
"Iron Man 3 (2013)": 68721
thor:
title: Thor
builders:
tmdb_collection: 131296
styles:
my_style_key: # Added the Style Key here ending with `:`
collections:
"Thor Collection":
- "Thor"
movies:
"Thor (2011)": 10195
"Thor: The Dark World (2013)": 76338
"Thor: Ragnarok (2017)": 284053
"Thor: Love and Thunder (2022)": 616037
"Marvel One-Shot: A Funny Thing Happened on the Way to Thor's Hammer (2011)": 76535Then either push your changes or run set_update.py locally to initialize styles.
The Image Set file won't change, but you'll now have three new files at marvel/missing.yml, marvel/styles/ironman/my_style_key.yml and marvel/styles/thor/my_style_key.yml.
marvel/missing.yml: Is the missing file for this Image Set.marvel/styles/ironman/my_style_key.yml: The Image Style File for themy_style_keyStyle Key in theironmanSection of the Image Set Filemarvel.marvel/styles/thor/my_style_key.yml: The Image Style File for themy_style_keyStyle Key in thethorSection of the Image Set Filemarvel.
See more on these Files at Edit Image Style Files
Image Style Files are used to map images to each of the movies/shows within the Style.
You can edit Image Style Files by either editing that Style in the Section's Missing File (marvel/missing.yml) or by editing the Image Style File directly.
If you are adding new items, we recommend updating the Missing file for the Image Set (i.e. marvel/missing.yml). If you are editing existing items, you must use the Style file (i.e. marvel/styles/thor/my_style_key.yml)
If you've followed the steps above up till this point your Section's Missing File should look like this.
ironman:
my_style_key:
info:
style_author:
style_image:
style_link:
collections:
"Iron Man Collection": {tpdb_poster: null, url_poster: null}
movies:
"Iron Man (2008)": {tpdb_poster: null, url_poster: null}
"Iron Man 2 (2010)": {tpdb_poster: null, url_poster: null}
"Iron Man 3 (2013)": {tpdb_poster: null, url_poster: null}
thor:
my_style_key:
info:
style_author:
style_image:
style_link:
collections:
"Thor Collection": {tpdb_poster: null, url_poster: null}
movies:
"Thor (2011)": {tpdb_poster: null, url_poster: null}
"Thor: The Dark World (2013)": {tpdb_poster: null, url_poster: null}
"Thor: Ragnarok (2017)": {tpdb_poster: null, url_poster: null}
"Thor: Love and Thunder (2022)": {tpdb_poster: null, url_poster: null}
"Marvel One-Shot: A Funny Thing Happened on the Way to Thor's Hammer (2011)": {tpdb_poster: null, url_poster: null}Open the Missing file (marvel/missing.yml) and fill in the Style Info attributes.
At a minimum. we recommend you to complete style_author, style_image, style_link
| Info Attribute | Description |
|---|---|
style_author |
Image Style Author's Name. This will show on the Read Me page for this Image Set. |
style_image |
Direct link to an example image of what will be applied. This will show on the Read Me page for this Image Set. |
style_link |
Link to Image Style Page (such as the TPDB Set page). This will be linked on the Read Me page for this Image Set. |
complete |
Auto Generated attribute that means the set has all its Images. Must be either true or false |
track_seasons |
Will Track Seasons in this Image Style and add them to the Missing File. Must be either true or false |
track_episodes |
Will Track Episode Title Cards in this Image Style and add them to the Missing File. Must be either true or false |
track_backgrounds |
Will Track Backgrounds in this Image Style and add them to the Missing File. Must be either true or false |
track_editions |
Will Track Editions from the Image Set in this Image Style and add them to the Missing File. Must be either true or false |
Then either push your changes or run set_update.py locally.
These attributes should now disappear from the Missing file and will be added to the Image Style File
If you need to edit the attribute or add any other attribute, you should edit the Image Style File and add it there.
Open the Missing file (marvel/missing.yml)
To add a poster simply change the null after either tpdb_poster (with ThePosterDB Poster ID as its value) or url_poster (with a specific url directly to the image as its value).
"Thor (2011)": {tpdb_poster: 9777, url_poster: null} # points to https://theposterdb.com/api/assets/9777
"Thor: Love and Thunder (2022)": {tpdb_poster: null, url_poster: "https://alternativemovieposters.com/wp-content/uploads/2022/07/SamDunn_Thor.jpg"}Optionally, you can remove any null attributes. This has no effect on the end-result but can be visually easier to understand:
"Thor (2011)": {tpdb_poster: 9777}
"Thor: Love and Thunder (2022)": {url_poster: "https://alternativemovieposters.com/wp-content/uploads/2022/07/SamDunn_Thor.jpg"}You can also add backgrounds by adding the attribute to the item. These will only be tracked if track_backgrounds: true is under info.
"Thor: Love and Thunder (2022)": {tpdb_poster: null, url_poster: "https://alternativemovieposters.com/wp-content/uploads/2022/07/SamDunn_Thor.jpg", url_background: "https://www.themoviedb.org/t/p/original/htAwfLn5kmrWeedoNregdIB9BKX.jpg"}The above example YAML code can also be written in the following format. Either way is valid and will result in the same output, this is purely a visual change:
"Thor: Love and Thunder (2022)":
url_poster: "https://www.themoviedb.org/t/p/original/38S1zYsObBIlGZR31RNUxJ1sAaj.jpg"
url_background: "https://www.themoviedb.org/t/p/original/htAwfLn5kmrWeedoNregdIB9BKX.jpg"Then either push your changes or run set_update.py locally.
These attributes will disappear from the Missing File and be added to the Image Style File.
Quite often, users will have multiple editions of the same movie/show within their library, such as Extended Edition or Director's Cut. Image Sets allow you to set different posters depending on the edition of the movie/show.
To add an edition first the original edition of the movie/show must be already found by the builder and listed under movies/shows. Then a new entry will need to be added to the list.
For Example, lets say there's a "Thunder Edition" of "Thor: Love and Thunder" and we want to add it to the above thor section.
-
Copy the existing
"Thor: Love and Thunder (2022)": 616037line and then change the mapping name. The mapping name needs to be unique, but should make logical sense to explain what it is:thor: title: Thor builders: tmdb_collection: 131296 styles: my_style: collections: "Thor Collection": - "Thor" movies: "Thor (2011)": 10195 "Thor: The Dark World (2013)": 76338 "Thor: Ragnarok (2017)": 284053 "Thor: Love and Thunder (2022)": 616037 "Marvel One-Shot: A Funny Thing Happened on the Way to Thor's Hammer (2011)": 76535 "Thor: Love and Thunder (2022) Thunder Edition": 616037 # New line added with unique mapping name
-
remove the end TMDb ID and add it as the
mapping_idattribute."Marvel One-Shot: A Funny Thing Happened on the Way to Thor's Hammer (2011)": 76535 "Thor: Love and Thunder (2022) Thunder Edition": # Removed TMDb ID here mapping_id: 616037 # Added the TMDb ID here as mapping_id
-
Add either
edition_filteroredition_containsto the Edition.
-
edition_filter: The edition must match this value exactly. -
edition_contains: The edition must contain this string."Marvel One-Shot: A Funny Thing Happened on the Way to Thor's Hammer (2011)": 76535 "Thor: Love and Thunder (2022) Thunder Edition": mapping_id: 616037 edition_contains: Thunder # edition must contain the word "Thunder"
Then either push your changes or run set_update.py locally to initialize the edition.
The script will auto generate the name it wants to use for the edition as well as set up the original to look for a blank edition.
movies:
"Thor: Love and Thunder (2022) (Thunder)":
mapping_id: 616037
edition_contains: Thunder
"Thor: Love and Thunder (2022)":
mapping_id: 616037
blank_edition: true