A Python application to automate the management of cover art, posters, and fanart for your Jellyfin libraries.
Primarily made for Posters from ThePosterDB and Mediux
- Comprehensive Image Management: Handles posters, backdrops, and other art for movies, TV shows, seasons, and episodes.
- Batch Processing: Supports
.zipfiles from sources like ThePosterDB and MediUX for easy bulk imports. - Automated Matching: Automatically processes and matches artwork to the correct media items. Includes a system for managing unmatched content for later reprocessing.
- Multi-Language Support: Utilizes the TMDb API to recognize titles in multiple languages.
- Content Change Detection: Monitors your Jellyfin libraries for new or modified content and triggers updates automatically.
- Mediux Downloader: Directly downloads Mediux sets by adding a link to
mediux.txt. - Webhook Triggers: An optional webhook to manually trigger poster updates via a POST request.
- Python 3.12+ (for local installation)
- Docker and Docker Compose (recommended)
- A running Jellyfin server
- A TMDb API key
The recommended method is to use Docker.
-
Create a
docker-compose.ymland configure it with your environment variables.services: jellyfinupdateposter: image: iceshadow/jellyfinupdateposter:latest container_name: jellyfinupdateposter restart: unless-stopped environment: - JELLYFIN_URL=http://jellyfin:8096 - JELLYFIN_API_KEY=your-jellyfin-api-key - TMDB_API_KEY=your-tmdb-api-key - INCLUDE_EPISODES=false - TZ=Europe/Berlin - ENABLE_WEBHOOK=false - SCHEDULED_TIMES=06:00,12:00,18:00 # Optional volumes: - ./your-local-path:/mount ports: - "8080:8080" # Required only if ENABLE_WEBHOOK=true
-
Start the container.
docker compose up -d
- Clone the repository and install dependencies.
git clone https://github.com/Iceshadow1404/JellyfinUpdatePoster cd JellyfinUpdatePoster pip install -r requirements.txt - Create a
.envfile in the root directory and add your configuration variables (see below). - Run the script. To force an update, use the
--forceflag.python main.py
JELLYFIN_URL: Required. The URL of your Jellyfin server.JELLYFIN_API_KEY: Required. Your Jellyfin API key.TMDB_API_KEY: Required. Your TMDb API key.INCLUDE_EPISODES: Set totrueorfalseto manage episode images. Defaults tofalse.ENABLE_WEBHOOK: Set totrueto enable the webhook trigger. Defaults tofalse.IGNORE_CONTENT_CHANGED: Set totrueto disable content change detection and always skip processing Defaults tofalse.SCHEDULED_TIMES: Optional comma-separated list ofHH:MMtimes to run scheduled updates.TZ: Optional timezone for scheduling, e.g.,America/New_York.
The primary workflow is to place your image files or .zip archives into the RawCover directory. The application processes them automatically based on the file naming conventions.
- Movie Poster:
MovieName (Year)/poster.ext - TV Show Poster:
ShowName (Year)/poster.ext - Season Poster:
ShowName (Year)/Season01.ext - Episode Image:
ShowName (Year)/S01E02.ext - Collection Poster:
poster.ext - Backdrop:
backdrop.ext(placed in the same folder as a poster)
The application creates and uses the following directory structure inside your mounted volume (/mount):
.
├── RawCover/ # Drop new image files and ZIPs here
├── Cover/ # Processed and organized artwork
├── Consumed/ # Source files are moved here after processing
└── Replaced/ # Old artwork is archived here when updated
For questions or help, you can message iceshadow_ on Discord or create an issue.
This project is licensed under the MIT License.