Configuration

All settings live on Dashboard → Plugins → Jellyfin Enricherr, grouped the same way as below. Defaults are chosen to be safe for a first run.

Statistics

Not a setting — shows the outcome of the last run (date, duration, how it ended) with a Details toggle for the full per-run breakdown: how many were scanned, already had a trailer, downloaded, upgraded, or not found, plus why a run stopped early if it did.

Below that, a table with two tabs:

Last runMovies and TV series as two rows, from that run's own numbers.
OverallOne row per library on the server - always every library, regardless of which ones are currently selected under Libraries above - showing how many of its movies/series actually have a trailer or theme song right now. Recomputed fresh each time the page loads, not cached.

Scanning

Librariesdefault: all libraries

Which libraries to scan, listed live from your server. Leave everything unchecked to scan every library; check specific ones to scope each run to just those. Applies to both movies and TV series — only libraries that actually contain them are useful here.

Trigger a library scan after changesdefault: on

Runs a Jellyfin library scan immediately after a run downloads a trailer or moves a movie, so the change shows up right away instead of waiting for the next scheduled scan.

Maximum trailer duration (seconds)default: 300

Search results longer than this are assumed to be a full movie, compilation, or unrelated video — not a trailer — and rejected.

Audio/Video

Resolution and audio preference apply to every search, including an item's very first one — a fresh search keeps trying further sources for a better result until it meets the target, rather than settling for the first one found. Update existing trailers below additionally makes a trailer you already have eligible for the same treatment, on top of new ones already getting it.

Video: minimum resolutiondefault: 720p (HD)

The minimum acceptable trailer resolution, chosen from 480p (SD) up to 2160p (4K).

Audiodefault: Preferred language

Which matters more. Preferred language (default) searches in the item's own language first, the same as any other search (see How It Works) — but the search stops at the first successful download regardless of resolution, so it can settle for a mediocre same-language result without ever trying English, which often has a genuinely higher-quality upload available. Best quality skips the native-language search stage, going straight to English/best-available — prioritizing resolution over language match.

Update existing trailersdefault: off

Also re-checks trailers you already have against the resolution and audio preference above, searching for a better replacement if one falls short. The existing file is only ever replaced by a genuine improvement — both are probed and compared after the new attempt completes, so a re-attempt that can't beat it leaves the original untouched.

Off by default: turning it on means re-running the full search/download flow for every under-quality trailer on every run until it clears the bar, not just once — meaningfully more requests to YouTube, and so more exposure to rate limiting, until your library catches up. Worth turning on for a pass or two after a big library import, then switching back off.

Organisation

Rename original movie filesdefault: off

Renames the movie file itself to match its resolved title, e.g. Movie Name (Year).ext.

Rename series foldersdefault: off

Renames a TV series' own top-level folder to match its resolved title, e.g. Series Name (Year), and its season subfolders to Jellyfin's own canonical Season NN naming (Specials for season 0) — based on Jellyfin's own resolved season number for each (its Season entity's own index, the same reliable matching that already finds the right trailer), not parsed from the subfolder's own name. A release-style folder name (tags, resolution, season ranges, ...) can still resolve to the right trailer via search — Jellyfin's own provider matching is forgiving enough for that — but the folder names themselves are what drive Jellyfin's own poster match in the collection/list view and displayed title, which the search step never touches. Episode files themselves are never renamed or moved.

Migrate movies into their own folderdefault: Disabled

Jellyfin only recognizes a local trailer file when the movie has its own dedicated folder (jellyfin/jellyfin#10077) — a correctly named trailer sitting in a folder shared by other movies is silently ignored. Three modes:

DisabledNever move any movie. A movie that doesn't already have its own folder is skipped entirely rather than downloading a trailer Jellyfin could never recognize — see Troubleshooting.
Only movies with a trailerMove only movies that already have, or just got, a trailer. The rest of a flat library is left untouched.
Every movieMove every movie encountered, regardless of trailer status.

Theme Songs

Fetch theme songsdefault: off

Also downloads a local theme song (theme.mp3) for each movie/series, looked up on ThemerrDB by TMDb id - the same community-curated database the Themerr-jellyfin plugin uses, so an item only gets a theme song here if Themerr would have offered one too. Only the lookup is shared with Themerr; the download itself goes through this plugin's own yt-dlp pipeline (see How It Works) instead of Themerr's downloader, which fails outright on plenty of videos yt-dlp handles fine.

An item with no TMDb id, no ThemerrDB entry, or not in its own dedicated folder is silently skipped - this never touches an existing theme.mp3, whether user-provided or already downloaded by Themerr.

Network

Cookies filedefault: none

A Netscape-format cookies.txt, used by yt-dlp for authenticated/ age-restricted YouTube access. Export one with a browser extension like "Get cookies.txt LOCALLY" while signed in to a YouTube account that's passed age verification, then upload it here. Saved immediately on upload, separately from the Save button for everything else.

Delay between requests (seconds)default: 3

Minimum wait before each individual yt-dlp request. A large library can add up to many separate requests with no pacing between them, which can trip YouTube's own rate limiting — see rate-limit handling. Lower this only if you're confident it won't happen; 0 disables the delay entirely.

Retry once if rate-limiteddefault: on

If YouTube rate-limits the session anyway, wait then retry the rest of the run exactly once instead of stopping immediately. See How It Works for the full behavior.

Rate-limit retry delay (minutes)default: 65

How long to wait before that single retry. Defaults to a bit past YouTube's own stated "up to an hour" ceiling. Only used (and only editable) when Retry once if rate-limited above is on.

Debugging and Testing

Dry rundefault: off

Logs what a run would do — what it would search for, download, rename, or move — without actually downloading, renaming, or moving anything. Safe to run any time to preview the effect of a configuration change.

Verbose loggingdefault: off

Logs each rejected search candidate's specific reason (title mismatch, duration too long, missing trailer keyword, ...). Off by default since a movie/series needing several fallback searches can generate dozens of these lines, burying what actually matters for a normal run. Turn on when diagnosing why a specific movie/series isn't finding a trailer it should — see Troubleshooting.