Jellyfin has no report for the problems that pile up in a library: the same movie added twice as two separate titles, movies it never matched, files that went missing, got damaged or were only half copied. Library Doctor finds them, shows what each one costs in disk space and lets you fix them without ever deleting a file.
What it does
- Duplicates: the same movie or the same episode (same series, season and episode number) in separate items. Movies are matched by their TMDb or IMDb id; movies without either id are matched by their title (ignoring case, accents and punctuation) and year, and those groups are marked by title and year — check, because two different movies can share a title and a year. Each group shows the versions side by side — resolution, HDR, codec, bitrate and size — with the best one first and the space you would reclaim by keeping only that one. Two actions: Group as versions keeps every file and shows them as versions of one title (Jellyfin's own version grouping), and Quarantine moves a weaker version out of the way.
- Unmatched movies: movies with no metadata id at all, which usually means a wrong title, year or poster and a movie missing from collections and recommendations. Each one links to the movie, where Jellyfin's Identify fixes it.
- Missing, broken or truncated files: a background check of every movie and episode file with jellyfin-ffmpeg's ffprobe and ffmpeg. It reports files that are missing from disk, cannot be read (with the error), have no real video track (only an image, for example a file of random bytes in which ffprobe guesses a picture), have no duration (a broken header), have zero duration, or are truncated: the last 3 seconds of the video are decoded, and a file whose end cannot be decoded is reported as an incomplete download or copy.
- Space report: the total, then the space by library, by resolution (4K, 1080p, 720p, SD) and by video codec, and the 20 largest files that no user has watched.
- Quarantine instead of deletion: see below. The plugin never deletes anything.
- In English and Romanian.
The quarantine: nothing is deleted
When you click Quarantine on a version (and confirm), the plugin moves the video file and the files next to it that share its name — subtitles, .nfo, images such as Movie.srt, Movie.en.srt, Movie.nfo, Movie-poster.jpg — into a folder named .medialab-de-sters (Romanian for “to delete”) at the root of the library folder that holds them, keeping their sub-folders. Because the folder is inside the same library folder, it is normally on the same disk and the move is instant. Jellyfin then rescans the library.
The move is recorded before any file is touched. If a file cannot be moved (for example because of permissions), the files already moved are put back and no copy is left behind in .medialab-de-sters; if putting them back is not possible either, the entry stays in the quarantine list so you can restore it.
The Quarantine list shows every moved title with its original location and size. Restore moves the files back exactly where they were and rescans; it refuses, without touching anything, if a file is both in quarantine and back at its original path. The plugin never overwrites or deletes a file: once you are sure, you delete the .medialab-de-sters folder from disk yourself.
Files outside the library folders, and files already in a .medialab-de-sters folder, are refused. Group as versions moves no file at all.
Requirements
- Jellyfin Server 12.2 or newer.
- For the file check: ffprobe and ffmpeg, which come with jellyfin-ffmpeg (the plugin uses the paths Jellyfin uses for transcoding).
- For the quarantine: the Jellyfin user needs write access to the library folders (to create
.medialab-de-stersat the root of the library folder and to move files out of their folders). In Docker, the media volumes must not be mounted read-only. Without write access all the reports work; only the quarantine cannot move files.
Frequently asked
Can it delete my movies? No. There is no delete function in the plugin. The quarantine only moves files inside the same library folder, and they come back with Restore.
Why is the same movie listed twice in Jellyfin? Usually two files of the same movie sit in different folders, so Jellyfin makes two items. Library Doctor finds them by their TMDb or IMDb id (or by title and year when they have no id) and lets you group them as versions or quarantine the weaker one. See the guide.
Can it find every damaged file? It finds files that are missing, unreadable, without a real video track or without a duration, and files whose end cannot be decoded. A file cut off very close to its end (for example at about 98%) can still have decodable frames in its last seconds and pass the check, and damage in the middle of a file is not looked for.
What it sends where
- No external contact besides the licensing client. No online metadata lookups: duplicates and unmatched titles are computed from the ids (TMDb/IMDb…) the server already stores.
- Indirectly: after a quarantine move or restore, the plugin starts the regular library scan, which may contact the metadata providers configured on the server (server behavior, not the plugin's). "Group as versions" uses the server's native function.
- The file check (on demand only) runs the server's ffprobe on each movie/episode, locally. No scheduled scans.
- Plus the licensing client, the same in every plugin: see Licensing and privacy in our plugins.
Stored locally:
- Quarantine deletes nothing: the file and its companions (subtitles, nfo, images) are moved to
<library root>/.medialab-de-sters/; permanent deletion is up to you. state/quarantine.json: title, date, original and quarantine paths, size.- File-check results are kept in memory only. The plugin reads from the library whether any user has watched a title (for "largest unwatched"), without storing it.
Client compatibility
- Admin page only: Jellyfin Web / medialab Server ✅. Features run on the server, so clients (apps, TVs) only see the effect (titles moved/grouped).
- Tests: API-level end-to-end (16/16), end-of-file check on 400/400 real files with no false positive.
- Limitations: the server needs write access to library folders for quarantine; a truncated
.tscannot be detected (no stored duration).
Legend: ✅ verified (end-to-end or on-device test) · 🟢 server-side, works with any client (by design, no client-specific test) · ➖ not applicable · ❔ not tested.
Licensing
The plugin is open source (GPL-3.0). The ready-to-install builds are public, like the source code. What you buy is the subscription: the license to use the plugin on one Jellyfin server, the updates your plan includes, and support: every update while the subscription is active, through your private plugin repository, and help when something does not work. The plugin checks the subscription key once a day; without a valid subscription it stops until you renew (nothing is deleted). Monthly, yearly or lifetime (lifetime includes one year of updates), or included in the Jellyfin bundle. 30-day free trial.
Source code. For every release, the complete corresponding source code is public, next to the build, in the changelog, and also in your account (Account → Licenses, Source code); each archive contains the full GPL-3.0 text (LICENSE). If you need the source of a version you can no longer download, ask us and we send it. See section 10 of the EULA.
