SparkBox/Guides/Jellyfin empty library

Jellyfin library is empty or won't scan your media

You added a Movies or TV library in Jellyfin, the files are sitting on your drive, but the library shows up empty after a scan — or it stays red under Storage. There are two real reasons this happens: the library points at a folder path that doesn't exist inside the container, or the app simply can't read your media files. Both are fixable in a few minutes.

Rather not hand-fix paths and permissions? SparkBox seeds Jellyfin libraries at the correct paths and runs a read-access check on every start. See the walkthrough →

The 10-second version: If the folder path inside the container is wrong (e.g. /data/media/Movies when the real path is /data/Movies), repoint the library and rescan. If the path is right but the scan finds nothing, the app user can't read your files — fix it with chmod -R o+rX on your media root, no chown needed.

What "empty library" actually means here

Jellyfin scans the folders you assign to each library and indexes whatever it finds. An empty result almost always means one of two things: it's looking in the wrong place, or it's blocked from reading the right place. A few quick terms before we dig in:

Cause 1: the library points at a path that doesn't exist in the container

This is the one that bites fresh installs. If your media bind mount is ${MEDIA_ROOT}:/data, then everything under your media root appears inside the container under /data — for example /data/Movies and /data/TV.

But if Jellyfin's libraries were created pointing at /data/media/Movies and /data/media/TV, those folders simply don't exist inside the container. The scan runs, finds nothing, and the library stays empty. The files are perfectly fine — Jellyfin is just looking one level too deep, in a folder that isn't there.

SparkBox-specific note: this exact mismatch shipped in media-finish.sh on fresh installs and is fixed in v1.6.107. The seed script's Jellyfin library paths were corrected from /data/media/Movies/data/Movies and /data/media/TV/data/TV, matching the ${MEDIA_ROOT}:/data bind. If you're on an older build, update first.

Fix it

  1. Open Jellyfin and go to Dashboard → Libraries.
  2. Click the three-dot menu on your Movies (or TV) library and choose Manage Library.
  3. Look at the folder it's pointing to. If it reads something like /data/media/Movies, remove that folder.
  4. Add the correct container path instead — for the standard ${MEDIA_ROOT}:/data bind, that's /data/Movies for movies and /data/TV for TV. Match the actual subfolder names on your drive.
  5. Save, then click Scan Library (or Scan All Libraries from the Libraries page).

If you're not sure of the correct container path, the rule is simple: take the path Jellyfin can see (the part after the colon in your bind, usually /data) and append the real subfolder name. Don't add media unless your files genuinely live in a media subfolder on the host.

SparkBox shortcut: rather than editing libraries by hand, delete the seed marker and re-run the finisher so libraries are recreated at the corrected paths: rm state/media-finished then sparkbox media-finish. One user confirmed this end to end — "im in and my movies are there." See the caveat under Frequently asked about Seerr if you go this route.

Cause 2: the path is right but Jellyfin can't read your files

This is the classic when you're pointing Jellyfin at media you already had on a NAS — very common on UGREEN UGOS boxes. The library path is correct, the folder is visible, but the scan still comes back empty (or you see the library flagged red under Storage). The reason is permissions: the files are owned by your NAS account, and the app user the container runs as has no read access.

You can confirm this is the issue if the container can see the folder exists but reports zero readable items inside it. The fix is to grant read-only access without touching ownership.

Fix it — grant read access, keep ownership untouched

Run this against your media root (the host folder you mapped into the container). Replace <MEDIA_ROOT> with your actual path:

chmod -R o+rX <MEDIA_ROOT>

What this does, in plain English:

Why not chown? Changing ownership with chown can break your NAS's own access-control rules. On UGOS, the ugacl permission layer is easy to disturb. The chmod -R o+rX approach adds read access without reassigning ownership, so your UGOS ownership and ACL rules stay exactly as they were.

After running it, trigger a rescan in Jellyfin (Dashboard → Libraries → Scan All Libraries). Your files should populate.

SparkBox-specific note: sparkbox check-media-perms tests read access to your media root on every up. When the app user can't read it, the tool surfaces the exact chmod -R o+rX <MEDIA_ROOT> line for you. There's a companion guide at use-existing-ugreen-media that walks through pointing Jellyfin at media you already keep on a UGREEN NAS.

The Seerr side effect: "Validation failed, please toggle the libraries again"

If you reached this guide because Jellyseerr's first-run wizard fails on the Configure Media Server step with "Something went wrong while syncing libraries" or "Validation failed, please toggle the libraries again," the root cause is upstream: Seerr asks Jellyfin for its library list, and if Jellyfin's libraries are empty or misconfigured, that list comes back empty — so you can't pass the wizard.

  1. Fix the Jellyfin library first using Cause 1 and/or Cause 2 above.
  2. Confirm your movies and shows actually appear in Jellyfin.
  3. Go back to the Seerr wizard and re-run the Configure Media Server step. The library list should now populate, and you can toggle the libraries on and continue.

SparkBox heads-up: if you fixed Jellyfin by re-running media-finish on an existing install, that can wipe Seerr's connections to Radarr/Sonarr. The clean recovery is repair-seerr, which chains both media-finish and seerr-seed (then re-applies the Seerr bundle patch) so Jellyfin and Seerr come back together. Use that instead of running the finisher alone if Seerr is already set up.

If it still won't scan

Frequently asked

Why is my Jellyfin library empty after setup?

In a Docker setup the usual cause is a library pointed at a folder that doesn't exist inside the container. If the media bind is MEDIA_ROOT:/data, a library set to /data/media/Movies scans an empty folder. Repoint it to the real path, such as /data/Movies, and rescan.

Why does Jellyfin scan find no files even though the folder is correct?

The container's app user probably can't read your media. On NAS systems like UGREEN UGOS, existing files are often owned by your account with no read access for others. Grant read-only access with chmod -R o+rX <MEDIA_ROOT> — it adds read permission without changing ownership.

Why does Jellyseerr say "Validation failed, please toggle the libraries again"?

Seerr reads the library list from Jellyfin during its wizard. If Jellyfin's libraries are empty or misconfigured, the list comes back empty and validation fails. Fix the Jellyfin library first, confirm your media appears, then re-run the Configure Media Server step.

Will fixing permissions change who owns my files?

No. chmod -R o+rX only adds read and directory-traverse permission for other users. It does not chown anything, so your NAS ownership and any UGOS access-control list rules are left untouched.

Skip the path-and-permission tuning

SparkBox seeds Jellyfin libraries at the correct container paths and runs a read-access check on every start, surfacing the exact one-line fix when your media isn't readable.

Get SparkBox → Or read the media-server walkthrough →

About this guide: Written and tested by the SparkBox team on a UGREEN DXP4800 Plus and a $7/month Hostinger VPS, both running SparkBox 1.6.314. The causes above are the real ones we've diagnosed in d/sparkbox. If something doesn't match, tell us on YouTube.