This PowerShell script automates generating images for your Plex, Jellyfin, or Emby library by using media info like titles, seasons, and episodes. It fetches artwork from Fanart.tv, TMDB, TVDB, Plex, and IMDb, focusing on specific languages - defaulting to textless images and falling back to English if unavailable. Users can choose between textless or text posters. The script supports both automatic bulk downloads and manual mode (interactive) for custom artwork that can’t be retrieved automatically.
Note
Posterizarr is cross-platform ready, meaning it can run on Linux, Docker (Alpine Base Image), unRAID and on Windows operating systems.
Supported Poster Types:
- Movie/Show Posters
- Movie/Show Backgrounds
- Season Posters
- TitleCards
- Collections are NOT supported
Important
Requirements:
Before you begin, make sure you have:
- A media server (Plex, Jellyfin, or Emby)
- TMDB API Read Access Token
- Obtain TMDB API Token -> NOTE the TMDB API Read Access Token is the really, really long one
- Fanart Personal API Key
- TVDB API Key
- Obtain TVDB API Key -> Do not use
"Legacy API Key"
, it only works with a Project Api Key.- ImageMagick (already integrated in container)
- Version 7.x is required - The script handles downloading and using a portable version of ImageMagick for all platforms. (You may need to run the Script as Admin on first run). If you prefer to reference your own installation or prefer to download and install it yourself, goto: Download ImageMagick
- Powershell Version (already integrated in container)
- 5.x or higher.
- FanartTv Powershell Module (already integrated in container)
- This module is required, goto: Install Module
Tip
Here is an installation walkthrough
Important
Do not enable more then one media server.
Warning
- The
temp
Folder gets cleared on every Script run, so do not put files into it. - Apprise integration only works in docker container, please use discord on other platforms (discord also works on docker).
- Windows Users: Please start the script as Admin on first run, otherwise the script is not able to install the prerequisites.
Note
At first run, the script takes time compiling data. Later runs only create posters missing from the AssetPath, skipping existing ones. To replace unwanted artwork, delete it from AssetPath and rerun the script to restore missing images.
-
Open
config.example.json
located in the script directory. -
Update the following variables with your API keys and preferences my personal config:
ApiPart
tvdbapi
: Your TVDB Project API key.- If you are a TVDB subscriber, you can append your PIN to the end of your API key in the format
YourApiKey#YourPin
. (It is important to include a#
between the API key and the PIN.)
- If you are a TVDB subscriber, you can append your PIN to the end of your API key in the format
tmdbtoken
: Your TMDB API Read Access Token.FanartTvAPIKey
: Your Fanart personal API key.PlexToken
: Your Plex token (Leave empty if not applicable).JellyfinAPIKey
: Your Jellyfin API key. (You can create an API key from inside Jellyfin at Settings > Advanced > Api Keys.)EmbyAPIKey
: Your Emby API key. (You can create an API key from inside Emby at Settings > Advanced > Api Keys.)FavProvider
: Set your preferred provider (default istmdb
).-
possible values are:
tmdb
(recommended)fanart
tvdb
plex
(Not recommended)- if you prefer textless, do not set plex as fav provider as i cannot query if it has text or not.
- that beeing said, plex should act as last resort like IMDB does for Movies and not as fav provider.
-
WidthHeightFilter
: If set totrue
, an additional resolution filter will be applied to Posters/Backgrounds (TMDB and TVDB) and Titlecards (only on TMDB) searches.PosterMinWidth
: Minimum poster width filter—greater than or equal to:2000
(default value)PosterMinHeight
: Minimum poster height filter—greater than or equal to:3000
(default value)BgTcMinWidth
: Minimum background/titlecard width filter—greater than or equal to:3840
(default value)BgTcMinHeight
: Minimum background/titlecard height filter—greater than or equal to:2160
(default value)tmdb_vote_sorting
: Picture sorting via TMDB api, either byvote_average
,vote_count
or byprimary
(Default value is:vote_average
).primary
= default tmdb view (like on the website)
PreferredLanguageOrder
: Specify language preferences. Default isxx,en,de
(xx
is Textless). Example configurations can be found in the config file. 2-digit language codes can be found here: ISO 3166-1 Lang Codes.- If you set it to
xx
you tell the script it should only search for textless, posters with text will be skipped.
- If you set it to
PreferredSeasonLanguageOrder
: Specify language preferences for seasons. Default isxx,en,de
(xx
is Textless). Example configurations can be found in the config file. 2-digit language codes can be found here: ISO 3166-1 Lang Codes.PreferredBackgroundLanguageOrder
: Specify language preferences for backgrounds. Default isPleaseFillMe
( It will take your poster lang order /xx
is Textless). Example configurations can be found in the config file. 2-digit language codes can be found here: ISO 3166-1 Lang Codes.- If you set it to
xx
you tell the script it should only search for textless, posters with text will be skipped.
- If you set it to
PlexPart
LibstoExclude
: Libraries, by name, to exclude from processing.PlexUrl
: Plex server URL (i.e. "http://192.168.1.1:32400" or "http://myplexserver.com:32400").UsePlex
: If set totrue
, you tell the script to use a Plex Server (Default value is:true
)UploadExistingAssets
: If set totrue
, the script will check local assets and upload them to Plex, but only if Plex does not already have EXIF data from Posterizarr, Kometa, or TCM for the artwork being uploaded.
JellyfinPart
LibstoExclude
: Libraries, by local folder name, to exclude from processing.JellyfinUrl
: Jellyfin server URL (i.e. "http://192.168.1.1:8096" or "http://myplexserver.com:8096").UseJellyfin
: If set totrue
, you tell the script to use a Jellyfin Server (Default value is:false
)- Also have a look at the hint: Jellyfin CSS
UploadExistingAssets
: If set totrue
, the script will check local assets and upload them to Jellyfin, but only if Jellyfin does not already have EXIF data from Posterizarr, Kometa, or TCM for the artwork being uploaded.ReplaceThumbwithBackdrop
: If set totrue
(Default value is: false), the script will replace theThumb
picture with thebackdrop
image. This will only occur ifBackgroundPosters
is also set totrue
.
EmbyPart
LibstoExclude
: Libraries, by local folder name, to exclude from processing.EmbyUrl
: Emby server URL (i.e. "http://192.168.1.1:8096/emby" or "http://myplexserver.com:8096/emby").UseEmby
: If set totrue
, you tell the script to use a Emby Server (Default value is:false
)UploadExistingAssets
: If set totrue
, the script will check local assets and upload them to Emby, but only if Emby does not already have EXIF data from Posterizarr, Kometa, or TCM for the artwork being uploaded.ReplaceThumbwithBackdrop
: If set totrue
(Default value is: false), the script will replace theThumb
picture with thebackdrop
image. This will only occur ifBackgroundPosters
is also set totrue
.
Notification
SendNotification
: Set totrue
if you want to send notifications via discord or apprise, elsefalse
.AppriseUrl
: Only possible on Docker -Url for apprise provider -> See Docs.Discord
: Discord Webhook Url.DiscordUserName
: Username for the discord webhook, default isPosterizarr
UptimeKumaUrl
: Uptime-Kuma Webhook Url.UseUptimeKuma
: Set totrue
if you want to send webhook to Uptime-Kuma.
PrerequisitePart
-
AssetPath
: Path to store generated posters. -
BackupPath
: Path to store/download Plex posters when using the backup switch. -
ManualAssetPath
: If assets are placed in this directory with the exact naming convention, they will be preferred. (it has to follow the same naming convention as you have in/assets
) -
SkipAddText
: If set totrue
, Posterizarr will skip adding text to the poster if it is flagged as aPoster with text
by the provider. -
FollowSymlink
: If set totrue
, Posterizarr will follow symbolic links in the specified directories during hashtable creation, allowing it to process files and folders pointed to by the symlinks. This is useful if your assets are organized with symlinks instead of duplicating files. -
PlexUpload
: If set totrue
, Posterizarr will directly upload the artwork to Plex (handy if you do not use Kometa). -
ForceRunningDeletion
: If set totrue
, Posterizarr will automatically delete the Running File.- Warning: This may result in multiple concurrent runs sharing the same temporary directory, potentially causing image artifacts or unexpected behavior during processing.
-
AutoUpdatePosterizarr
: If set totrue
, Posterizarr will update itself to latest version. (Only for non docker systems). -
show_skipped
: If set totrue
, verbose logging of already created assets will be displayed; otherwise, they will be silently skipped - On large libraries, this may appear as if the script is hanging. -
magickinstalllocation
: The path to the ImageMagick installation wheremagick.exe
is located. (If you prefer using a portable version, leave the value as"./magick"
.)- The container manages this automatically, so you can leave the default value in the configuration.
-
maxLogs
: Number of Log folders you want to keep inRotatedLogs
Folder (Log History). -
logLevel
: Sets the verbosity of logging. 1 logs Warning/Error messages. Default is 2 which logs Info/Warning/Error messages. 3 captures Info/Warning/Error/Debug messages and is the most verbose. -
font
: Font file name. -
RTLfont
: RTL Font file name. -
backgroundfont
: Background font file name. -
overlayfile
: Overlay file name. -
seasonoverlayfile
: Season overlay file name. -
backgroundoverlayfile
: Background overlay file name. -
titlecardoverlayfile
: Title Card overlay file name. -
poster4k
: 4K Poster overlay file name. (overlay has to match the Poster dimensions 2000x3000) -
Poster1080p
: 1080p Poster overlay file name. (overlay has to match the Poster dimensions 2000x3000) -
Background4k
: 4K Background overlay file name. (overlay has to match the Background dimensions 3840x2160) -
Background1080p
: 1080p Background overlay file name. (overlay has to match the Background dimensions 3840x2160) -
TC4k
: 4K TitleCard overlay file name. (overlay has to match the Poster dimensions 3840x2160) -
TC1080p
: 1080p TitleCard overlay file name. (overlay has to match the Poster dimensions 3840x2160) -
UsePosterResolutionOverlays
: Set totrue
to apply specific overlay with resolution for 4k/1080p posters 4K Example/1080p Example.- if you only want 4k just add your default overlay file also for
Poster1080p
.
- if you only want 4k just add your default overlay file also for
-
UseBackgroundResolutionOverlays
: Set totrue
to apply specific overlay with resolution for 4k/1080p posters 4K Example/1080p Example.- if you only want 4k just add your default overlay file also for
Background1080p
.
- if you only want 4k just add your default overlay file also for
-
UseTCResolutionOverlays
: Set totrue
to apply specific overlay with resolution for 4k/1080p posters 4K Example/1080p Example.- if you only want 4k - add your default (without an resolution) overlay file for
TC1080p
.
- if you only want 4k - add your default (without an resolution) overlay file for
-
LibraryFolders
: Set tofalse
for asset structure in one flat folder ortrue
to split into library media folders like Kometa needs it. -
Posters
: Set totrue
to create movie/show posters. -
NewLineOnSpecificSymbols
: Set totrue
to enable automatic insertion of a newline character at each occurrence of specific symbols inNewLineSymbols
within the title text. -
NewLineSymbols
: A list of symbols that will trigger a newline insertion whenNewLineOnSpecificSymbols
is set totrue
. Separate each symbol with a comma (e.g., " - ", ":"). -
SeasonPosters
: Set totrue
to also create season posters. -
BackgroundPosters
: Set totrue
to also create background posters. -
TitleCards
: Set totrue
to also create title cards. -
SkipTBA
: Set totrue
to skip TitleCard creation if the Titletext isTBA
. -
SkipJapTitle
: Set totrue
to skip TitleCard creation if the Titletext isJap or Chinese
. -
AssetCleanup
: Set totrue
to cleanup Assets that are no longer in Plex.- !! IMPORTANT !! - Risk of Data Loss from excluded Libraries: When you exclude libraries, any assets within these locations may be inadvertently deleted. This happens because the script interprets these assets as "not needed anymore" during its execution since they are not found or listed as part of the active scan. Ensure that all active asset libraries are included when using that setting on true to prevent unintended deletions.
-
AutoUpdateIM
: Set totrue
to AutoUpdate Imagemagick Portable Version (Does not work with Docker/Unraid).- Doing this could break things, cause you then uses IM Versions that are not tested with Posterizarr.
-
DisableHashValidation
: Set totrue
to skip hash validation (Default value is: false).- Note: This may produce bloat, as every item will be re-uploaded to the media servers.
-
DisableOnlineAssetFetch
: Set totrue
to skip all online lookups and use only locally available assets. (Default value is: false).
OverlayPart
ImageProcessing
: Set totrue
if you want the ImageMagick part (text, overlay and/or border); iffalse
, it only downloads the posters.outputQuality
: Image output quality, default is92%
if you set it to100%
the image size gets doubled.
PosterOverlayPart
fontAllCaps
: Set totrue
for all caps text, elsefalse
.AddBorder
: Set totrue
to add a border to the image.AddText
: Set totrue
to add text to the image.AddTextStroke
: Set totrue
to add stroke to text.strokecolor
: Color of text stroke.strokewidth
: Stroke width.AddOverlay
: Set totrue
to add the defined overlay file to the image.fontcolor
: Color of font text.bordercolor
: Color of border.minPointSize
: Minimum size of text in poster.maxPointSize
: Maximum size of text in poster.borderwidth
: Border width.MaxWidth
: Maximum width of text box.MaxHeight
: Maximum height of text box.text_offset
: Text box offset from the bottom of the picture.lineSpacing
: Adjust the height between lines of text (Default is0
)TextGravity
: Specifies the text alignment within the textbox (Default issouth
)
SeasonPosterOverlayPart
ShowFallback
: Set totrue
if you want to fallback to show poster if no season poster was found.fontAllCaps
: Set totrue
for all caps text, elsefalse
.AddBorder
: Set totrue
to add a border to the image.AddText
: Set totrue
to add text to the image.AddTextStroke
: Set totrue
to add stroke to text.strokecolor
: Color of text stroke.strokewidth
: Stroke width.AddOverlay
: Set totrue
to add the defined overlay file to the image.fontcolor
: Color of font text.bordercolor
: Color of border.minPointSize
: Minimum size of text in poster.maxPointSize
: Maximum size of text in poster.borderwidth
: Border width.MaxWidth
: Maximum width of text box.MaxHeight
: Maximum height of text box.text_offset
: Text box offset from the bottom of the picture.lineSpacing
: Adjust the height between lines of text (Default is0
)TextGravity
: Specifies the text alignment within the textbox (Default issouth
)
ShowTilteOnSeasonPosterPart
fontAllCaps
: Set totrue
for all caps text, elsefalse
.AddShowTitletoSeason
: if set totrue
it will add show title to season poster (Default Value is:false
)AddTextStroke
: Set totrue
to add stroke to text.strokecolor
: Color of text stroke.strokewidth
: Stroke width.fontcolor
: Color of font text.minPointSize
: Minimum size of text in poster.maxPointSize
: Maximum size of text in poster.MaxWidth
: Maximum width of text box.MaxHeight
: Maximum height of text box.text_offset
: Text box offset from the bottom of the picture.lineSpacing
: Adjust the height between lines of text (Default is0
)TextGravity
: Specifies the text alignment within the textbox (Default issouth
)
BackgroundOverlayPart
fontAllCaps
: Set totrue
for all caps text, elsefalse
.AddBorder
: Set totrue
to add a border to the background image.AddText
: Set totrue
to add text to the background image.AddTextStroke
: Set totrue
to add stroke to text.strokecolor
: Color of text stroke.strokewidth
: Stroke width.AddOverlay
: Set totrue
to add the defined background overlay file to the background image.fontcolor
: Color of font text.bordercolor
: Color of border.minPointSize
: Minimum size of text in background image.maxPointSize
: Maximum size of text in background image.borderwidth
: Border width.MaxWidth
: Maximum width of text box in background image.MaxHeight
: Maximum height of text box in background image.text_offset
: Text box offset from the bottom of the background image.lineSpacing
: Adjust the height between lines of text (Default is0
)TextGravity
: Specifies the text alignment within the textbox (Default issouth
)
TitleCardOverlayPart
UseBackgroundAsTitleCard
: Set totrue
if you prefer show background as TitleCard, default isfalse
where it uses episode image as TitleCard.BackgroundFallback
: Set tofalse
if you want to skip Background fallback for TitleCard images if no TitleCard was found.AddOverlay
: Set totrue
to add the defined TitleCard overlay file to the TitleCard image.AddBorder
: Set totrue
to add a border to the TitleCard image.borderwidth
: Border width.bordercolor
: Color of border.
TitleCardTitleTextPart
AddEPTitleText
: Set totrue
to add episode title text to the TitleCard image.AddTextStroke
: Set totrue
to add stroke to text.strokecolor
: Color of text stroke.strokewidth
: Stroke width.fontAllCaps
: Set totrue
for all caps text, elsefalse
.fontcolor
: Color of font text.minPointSize
: Minimum size of text in TitleCard image.maxPointSize
: Maximum size of text in TitleCard image.MaxWidth
: Maximum width of text box in TitleCard image.MaxHeight
: Maximum height of text box in TitleCard image.text_offset
: Text box offset from the bottom of the TitleCard image.lineSpacing
: Adjust the height between lines of text (Default is0
)TextGravity
: Specifies the text alignment within the textbox (Default issouth
)
TitleCardEpisodeTextPart
SeasonTCText
: You can Specify the default text forSeason
that appears on TitleCard.- Example:
STAFFEL 1 • EPISODE 5
or"SÄSONG 1 • EPISODE 1"
- Example:
EpisodeTCText
: You can Specify the default text forEpisode
that appears on TitleCard.- Example:
SEASON 1 • EPISODE 5
or"SEASON 1 • AVSNITT 1"
- Example:
fontAllCaps
: Set totrue
for all caps text, elsefalse
.AddEPText
: Set totrue
to add episode text to the TitleCard image.AddTextStroke
: Set totrue
to add stroke to text.strokecolor
: Color of text stroke.strokewidth
: Stroke width.fontcolor
: Color of font text.minPointSize
: Minimum size of text in TitleCard image.maxPointSize
: Maximum size of text in TitleCard image.MaxWidth
: Maximum width of text box in TitleCard image.MaxHeight
: Maximum height of text box in TitleCard image.text_offset
: Text box offset from the bottom of the TitleCard image.lineSpacing
: Adjust the height between lines of text (Default is0
)TextGravity
: Specifies the text alignment within the textbox (Default issouth
)
-
Rename the config file to
config.json
. -
Place the
overlay.png
, or whatever file you defined earlier inoverlayfile
, andRocky.ttf
font, or whatever font you defined earlier infont
files in the same directory as Posterizarr.ps1 which is$ScriptRoot
.
- Automatic Mode: Execute the script without any parameters to generate posters for your entire Plex library.
- Testing Mode: Run the script with the
-Testing
switch to create Test posters before you start using it. - Manual Mode: Run the script with the
-Manual
switch to create custom posters manually (Interactive). - Backup Mode: Run the script with the
-Backup
switch to download every artwork from plex (only those what are set totrue
in config) - Poster reset Mode: Run the script with the
-PosterReset -LibraryToReset "Test Lib"
switch to reset every artwork from a specifc plex lib. - Sync Modes: Run the script with the
-SyncJelly or -SyncEmby
switch to sync every artwork you have in Plex to Jelly/Emby.
Note
- Ensure PowerShell execution policy allows script execution.
- Bugs or issues encountered during usage can be reported for resolution.
Feature | Description |
---|---|
Kometa Integration | -Tip: For users of Kometa (formerly PMM), Posterizarr organizes assets using the Kometa-compatible folder structure required for seamless integration: Assets Documentation. - Example Config: See Kometa-Configs repo for sample configuration to streamline asset management. |
Direct Upload to Media Servers | - Posterizarr can directly upload artwork to media servers: - Plex: Uploads artwork if Kometa isn’t used. - Jellyfin: Directly uploads artwork. - Emby: Similarly, uploads artwork directly. |
Upload Existing Assets | - Configure whether to upload pre-existing assets to Plex, Jellyfin, or Emby, saving time by skipping redundant uploads for libraries with complete artwork. |
Backup Functionality | - Facilitates artwork backup by downloading all assets from Plex to a specified backup share. - Supports the Kometa folder structure for organized storage. |
Manual Asset Path (Local Assets) | - Local Asset Preference: Prioritizes assets from a manual asset path if present. Skips download if local assets are available. - Path Configuration: Specify the folder structure in the configuration, saving time and bandwidth by using pre-existing images. |
Resizing | - Automatically resizes all poster images to 2000x3000 for optimized media server use. |
Preferred Language Selection | - Configure language preferences for media metadata, supporting multi-language ordering. - Season-specific language preferences allow finer control over metadata for localized season information. |
Poster and Background Minimum Size | - Set minimum dimensions for posters (2000x3000) and backgrounds/title cards (3840x2160), ensuring only high-quality images are used. |
Overlay Effects | - Applies optional overlays to downloaded images: - Borders: Adds polished framing. - Text: Customizable title text. - Gradient Overlay: Stylish gradient effect (custom options via gradient pack). |
Automatic Library Search | - Autonomously scans Plex, Jellyfin, or Emby server for libraries, simplifying setup. |
Handling Multiple Versions | - Manages multiple versions of movies/shows (e.g., theatrical cuts, director’s cuts), ensuring complete coverage for all available versions. |
CSV Export | - Generates a CSV file with queried movie/show data: - Plex: $ScriptRoot\logs\PlexLibexport.csv - Other Media Servers (Jellyfin/Emby): $ScriptRoot\logs\OtherMediaServerLibExport.csv |
Logging Capabilities | - Creates logs for troubleshooting and analysis: - General script log: $ScriptRoot\logs\Scriptlog.log - ImageMagick commands log: $ScriptRoot\logs\ImageMagickCommands.log - Choices log: ImageChoices.csv |
Uptime-Kuma | - Sends notifications to Uptime Kuma to monitor script activity for success and failure. |
Notifications | - Sends notifications about script activity using Apprise or Discord. - Example Images: View sample images here. |
Cross-Platform Compatibility | - Runs on Linux, Docker, and Windows (Plex, Jellyfin, and Emby compatible), ensuring versatile usage in various environments. |
Poster/Background/TitleCard Creation | - Searches for high-quality artwork from Fanart, TMDb, TVDb, Plex (fallback: IMDb). - Resizes to: - 3840x2160 for backgrounds and title cards. - 2000x3000 for posters. |
Library Exclusions | - Specify libraries to exclude from processing on Plex, Jellyfin, and Emby servers, helping to avoid unnecessary processing for selected content categories (e.g., YouTube, Audiobooks). |
Skip Items in Libraries | - Exclude items from processing by adding the "skip_posterizarr" label/tag to any item, preventing downloads and uploads for those items. |
Auto-Update Options | - Supports auto-update settings for both Posterizarr and ImageMagick, keeping tools up to date with minimal manual intervention. (Not on Docker) |
Asset Cleanup | - Automatic asset cleanup removes Posterizarr-created assets when corresponding media is deleted from the media server, ensuring storage efficiency. |
RTL (Right-to-Left) Font Support | - Supports right-to-left (RTL) fonts for media titles, making it more accessible for non-Latin-based languages such as Arabic or Hebrew. |
New Line on Specific Symbols | - Automatically adds a new line on specific symbols (e.g., hyphen or colon) within text to enhance visual aesthetics on overlays. |
Fallback Options for Title Cards | - Uses background images as title cards if title-specific artwork is unavailable. |
Overlay Reset | - Reset all posters in a library of your choice to the Plex default. |
Run the script without any parameters:
.\Posterizarr.ps1
On docker this way:
docker exec -it posterizarr pwsh /app/Posterizarr.ps1
This will generate posters for your entire Plex library based on the configured settings.
The posters are all placed in AssetPath\...
. This can then be mounted in Kometa to use as the assets folder.
Tip
Have a look at the docker-compose.yml there is an example of the /assets
Volume, you either can mount the Kometa Assets dir to Posterizarr or vice versa, its up to you.
Its important that you update the containerpath you specified in your docker-compose.yml in your config.json, in my example it is /assets
.
Assuming you made the config like i did, Posterizarr will now create the Posters directly in Kometa´s Asset dir.
If you use Kometa make sure to set this settings on each Library in Kometa Config:
libraries:
4K TV Shows:
settings:
asset_directory: /assets/4K TV Shows
prioritize_assets: true
operations:
assets_for_all: true
Important
Naming must follow these rules, including proper case sensitivity (uppercase and lowercase) in file/folder names; otherwise, the asset will not be picked up.
If you have Library Folders set to true
, it will look like this:
Asset | Naming |
---|---|
Poster | poster.* |
Season | Season01.* Season02.* ..... |
Season Special | Season00.* |
TitleCard | S01E01.* S01E02.* ..... |
Background | background.* |
├───Anime Shows
│ └───Solo Leveling (2024) [tvdb-389597]
│ poster.jpg
│ S01E01.jpg
│ Season01.jpg
│ background.jpg
If you have Library Folders set to false
, it will look like this:
Asset | Naming |
---|---|
Poster | Solo Leveling (2024) [tvdb-389597].* |
Season | Solo Leveling (2024) [tvdb-389597]_Season01.* Solo Leveling (2024) [tvdb-389597]_Season02.* ..... |
Season Special | Solo Leveling (2024) [tvdb-389597]_Season00.* |
TitleCard | Solo Leveling (2024) [tvdb-389597]_S01E01.* Solo Leveling (2024) [tvdb-389597]_S01E02.* ..... |
Background | Solo Leveling (2024) [tvdb-389597]_background.* |
├───Anime Shows
│ Solo Leveling (2024) [tvdb-389597].jpg
│ Solo Leveling (2024) [tvdb-389597]_S01E01.jpg
│ Solo Leveling (2024) [tvdb-389597]_Season01.jpg
│ Solo Leveling (2024) [tvdb-389597]_background.jpg
Important
Tautulli and Posterizarr must run as a container in Docker
Note
If Discord is configured it will send a Notification on each trigger.
In this mode we use Tautulli to trigger Posterizarr for an specific item in Plex, like a new show, movie or episode got added.
To use it we need to configure a script in Tautulli, please follow these instructions.
- Make sure that you mount the
Posterizarr
directory to tautulli, cause the script needs the Path/posterizarr
volumes: - "/opt/appdata/posterizarr:/posterizarr:rw"
- Download the trigger.py from the GH and place it in the Tautulli Script dir -> Tautulli-Wiki
- You may have to set
chmod +x
to the file.
- You may have to set
- Open Tautulli and go to Settings ->
NOTIFICATION AGENTS
- Click on
Add a new notification agent
and selectScript
- Specify the script folder where you placed the script and select the script file.
- You can specify a
Description
at the bottom like i did.
- You can specify a
- Go to
Triggers
, scroll down and selectRecently Added
. - Go to
Conditions
, you can now specify when the script should get called.- In my case i specified the Media Type:
episode, movie, show and season
- I also excluded the Youtube Lib cause the videos i have there - do not have an
tmdb,tvdb or fanart ID
.- This is an recommended setting, either exclude such libs or include only those libs where Posterizarr should create art for.
- In my case i specified the Media Type:
- Next go to Arguments -> Unfold
Recently Added
Menu and paste the following Argument, after that you can save it.- Please do not change the Argument otherwise the script could fail.
<movie>RatingKey "{rating_key}" mediatype "{media_type}"</movie><show>RatingKey "{rating_key}" mediatype "{media_type}"</show><season>parentratingkey "{parent_rating_key}" mediatype "{media_type}"</season><episode>RatingKey "{rating_key}" parentratingkey "{parent_rating_key}" grandparentratingkey "{grandparent_rating_key}" mediatype "{media_type}"</episode>
Note
If Discord is configured it will send a Notification on each trigger.
In this mode we use Tautulli to trigger Posterizarr for an specific item in Plex, like a new show, movie or episode got added.
- Open Tautulli and go to Settings ->
NOTIFICATION AGENTS
- Click on
Add a new notification agent
and selectScript
- Specify the script folder of Posterizarr and select the script file.
- Set the script timeout to
0
, which is unlimited. (The default is30
, which would kill the script before it finishes.) - You can specify a
Description
at the bottom like i did.
- Set the script timeout to
- Go to
Triggers
, scroll down and selectRecently Added
. - Go to
Conditions
, you can now specify when the script should get called.- In my case i specified the Media Type:
episode, movie, show and season
- I also excluded the Youtube Lib cause the videos i have there - do not have an
tmdb,tvdb or fanart ID
.- This is an recommended setting, either exclude such libs or include only those libs where Posterizarr should create art for.
- In my case i specified the Media Type:
- Next go to Arguments -> Unfold
Recently Added
Menu and paste the following Argument, after that you can save it.- Please do not change the Argument otherwise the script could fail.
<movie>RatingKey "{rating_key}" mediatype "{media_type}"</movie><show>RatingKey "{rating_key}" mediatype "{media_type}"</show><season>parentratingkey "{parent_rating_key}" mediatype "{media_type}"</season><episode>RatingKey "{rating_key}" parentratingkey "{parent_rating_key}" grandparentratingkey "{grandparent_rating_key}" mediatype "{media_type}"</episode>
Run the script with the -Testing
flag. In this mode, the script will create pink posters/backgrounds with short, medium, and long texts (also in CAPS), using the values specified in the config.json
file.
These test images are placed in the script root under the ./test
folder.
Tip
This is handy for testing your configuration before applying it en masse to the actual posters. You can see how and where the text would be applied, as well as the size of the textbox.
.\Posterizarr.ps1 -Testing
On docker this way:
docker exec -it posterizarr pwsh /app/Posterizarr.ps1 -Testing
Important
Source picture gets edited by script and is then moved to desired asset location.
Run the script with the -Manual
switch:
.\Posterizarr.ps1 -Manual
On docker this way:
docker exec -it posterizarr pwsh /app/Posterizarr.ps1 -Manual
Follow the prompts to enter the source picture path (Container needs Access to it), media folder name, and movie/show title to manually create a custom poster.
Posterizarr Input Prompts
Enter local path or URL to source picture:
- Paste the image URL or provide the full local path to the image file you want to use as the poster source. This is the image that Posterizarr will base the new poster on.
Enter Media Folder Name (as seen by Plex):
- The name of the local movie or show folder where the .mkv (or other media) file is stored. This should match the folder structure Plex recognizes.
Enter Movie/Show Title:
- The title that will be displayed on the generated poster.
Create Season Poster? (y/n):
- Type
y
if you're generating a season poster, otherwisen
.
Create TitleCard? (y/n):
- Type
y
if you also want to create a title card, otherwisen
.
Enter Plex Library Name:
- Enter the name of the Plex (or Jellyfin) library, e.g., "Movies" or "TV Shows".
All inputs are entered step-by-step interactively, simply type or paste each value and press Enter to continue.
Run the script with the -Backup
flag. In this mode, the script will download every artwork you have in plex, using the values specified in the config.json
file.
Tip
This is handy for creating a backup or if you want an second assetfolder with kometa/tcm EXIF data for jellyfin/emby.
.\Posterizarr.ps1 -Backup
On docker this way:
docker exec -it posterizarr pwsh /app/Posterizarr.ps1 -Backup
Run the script with the -PosterReset -LibraryToReset "Test Lib"
flag. In this mode, posterizarr will reset every artwork from a specifc plex lib.
.\Posterizarr.ps1 -PosterReset -LibraryToReset "Test Lib"
On docker this way:
docker exec -it posterizarr pwsh /app/Posterizarr.ps1 -PosterReset -LibraryToReset "Test Lib"
Tip
Note: This operation does not delete any artwork. It simply sets each item's poster to the first available poster from Plex’s metadata. This action cannot be undone, so proceed with caution.
Important
The script requires that library names in Plex and Emby/Jellyfin match exactly for the sync to work. It calculates the hash of the artwork from both servers to determine if there are differences, and only syncs the artwork if the hashes do not match.
Run the script with the -SyncJelly
flag. In this mode, the script will sync every artwork you have in plex to jellyfin.
.\Posterizarr.ps1 -SyncJelly
On docker this way:
docker exec -it posterizarr pwsh /app/Posterizarr.ps1 -SyncJelly
Run the script with the -SyncEmby
flag. In this mode, the script will sync every artwork you have in plex to emby.
.\Posterizarr.ps1 -SyncEmby
On docker this way:
docker exec -it posterizarr pwsh /app/Posterizarr.ps1 -SyncEmby
Tip
This is handy if you want to run the sync after a kometa run, then you have kometa ovlerayed images in jelly/emby
-
- Change
RUN_TIME
in yaml to your needs - You need to use 24H Time Format- The Script gets executed on the Times you specified
- Before starting the scheduled run it checks if another Posterizarr process is running, if yes - the scheduled run will be skipped.
- If set to
disabled
, the script will not run on a schedule but will still watch for file triggers and respond to manual triggers.
- Change
volume
andnetwork
to fit your environment (Make sure you have the same network as your plex container when you use local IP of plex) - Change
TimeZone
to yours, otherwise it will get scheduled to a different time you may want it to. - You may also have to change
user: "1000:1000"
(PUID/PGID)
If you manually want to run the Script you can do it this way:
Automatic Mode:
docker exec -it posterizarr pwsh /app/Posterizarr.ps1
Testing Mode:
docker exec -it posterizarr pwsh /app/Posterizarr.ps1 -Testing
Manual Mode (Interactive):
docker exec -it posterizarr pwsh /app/Posterizarr.ps1 -Manual
Backup Mode:
docker exec -it posterizarr pwsh /app/Posterizarr.ps1 -Backup
SyncJelly Mode:
docker exec -it posterizarr pwsh /app/Posterizarr.ps1 -SyncJelly
SyncEmby Mode:
docker exec -it posterizarr pwsh /app/Posterizarr.ps1 -SyncEmby
Poster reset Mode:
docker exec -it posterizarr pwsh /app/Posterizarr.ps1 -PosterReset -LibraryToReset "Test Lib"
- Change
Tip
If you did not used pwsh
on docker exec you can do it this way.
Inside your Unraid
or Bash
or Sh
console:
pwsh /app/Posterizarr.ps1
pwsh /app/Posterizarr.ps1 -Manual
pwsh /app/Posterizarr.ps1 -Testing
pwsh /app/Posterizarr.ps1 -Backup
pwsh /app/Posterizarr.ps1 -SyncEmby
pwsh /app/Posterizarr.ps1 -SyncJelly
pwsh /app/Posterizarr.ps1 -PosterReset -LibraryToReset "Test Lib"
Tip
If you are an unRAID user, just use the Community app from @nwithan8 it is listed in Store.
- Change
RUN_TIME
to your needs - You need to use 24H Time Format- Example:
06:00
or06:00,14:00
.....
- Example:
- AssetPath in config needs to be
/assets
not the path you entered.
📝Posterizarr Excel Creation using Module1.bas [click to unfold]
-
Open Excel: First, open Microsoft Excel on your computer. You can do this by clicking on the Excel icon in your applications menu or by searching for "Excel" in your computer's search bar and selecting it from the results.
-
Access the Visual Basic for Applications (VBA) Editor:
- While in Excel, press
Alt + F11
on your keyboard. This keyboard shortcut will open the VBA editor window.
- While in Excel, press
-
Import Module:
- In the VBA editor window, you'll see a menu bar at the top.
- Right-click on any existing module or in the project explorer (usually located on the left-hand side).
- From the dropdown menu, select
Import File...
. - A file explorer window will open. Navigate to the location where you saved the
Module1.bas
file. - Select the
Module1.bas
file and clickOpen
.
-
Run the Macro:
- Now, go back to the Excel window.
- Look for the
View
tab at the top of the Excel window. - Click on the
View
tab. - Within the
Macros
group, you'll find a button labeledMacros
. Click on it. - In the dropdown menu, select
View Macros
. - A Macros dialog box will appear, listing all available macros.
- In the list, you should see the
PromptUser
macro. - Select
PromptUser
from the list. - Finally, click the
Run
button.
Following these steps will allow you to import the Module1.bas
file containing the VBA code into Excel and then run the PromptUser
macro.
In order to view the 16:9
episode posters without getting cropped to 3:2
, you need to set a css.
#itemDetailPage .listItemImage-large{
width:16vw;
height:9vw;
}
🖼️Assets after Posterizarr run [click to unfold]
Tip
- It was made using this Posterizarr config.
Tip
- It was made using this Kometa config.
🔍Movie Poster & Background [click to unfold]
If TMDB
is your fav Provider
- TMDB
- FANART
- TVDB
- PLEX (Not for Textless only
xx
) - IMDB (Movies only/Not for Textless only
xx
)
If TVDB
is your fav Provider
- TVDB
- TMDB
- FANART
- PLEX (Not for Textless only
xx
) - IMDB (Movies only/Not for Textless only
xx
)
If FANART
is your fav Provider
- FANART
- TMDB
- TVDB
- PLEX (Not for Textless only
xx
) - IMDB (Movies only/Not for Textless only
xx
)
🔍Show Poster & Background [click to unfold]
If TMDB
is your fav Provider
- TMDB
- FANART
- TVDB
- PLEX (Not for Textless only
xx
)
If FANART
is your fav Provider
- FANART
- TMDB
- TVDB
- PLEX (Not for Textless only
xx
)
If TVDB
is your fav Provider
- TVDB
- TMDB
- FANART
- PLEX (Not for Textless only
xx
)
🔍Show Season Poster [click to unfold]
If TMDB
is your fav Provider
- TMDB
- FANART
- TVDB
- PLEX (Not for Textless only
xx
)
If FANART
is your fav Provider
- FANART
- TMDB
- TVDB
- PLEX (Not for Textless only
xx
)
If TVDB
is your fav Provider
- TVDB
- TMDB
- FANART
- PLEX (Not for Textless only
xx
)
🔍Show TC with Background Poster [click to unfold]
If TMDB
is your fav Provider
- TMDB
- TVDB
- FANART
- PLEX (Not for Textless only
xx
)
Else
- TVDB
- TMDB
- FANART
- PLEX (Not for Textless only
xx
)
🔍Show TC Poster [click to unfold]
If TMDB
is your fav Provider
- TMDB
- TVDB
- PLEX (Not for Textless only
xx
)
Else
- TVDB
- TMDB
- PLEX (Not for Textless only
xx
)
Feel free to customize the script further to meet your specific preferences or automation requirements.
Important
- Adjust on each PR the version number in script on Line 15
$CurrentScriptVersion = "1.9.7"
- Adjust the version number in Release.txt to match the one in script.
- this is required because the script checks against this file if a newer version is available.
- Do not include images on a PR.