Jellyfin Media Server
Jellyfin is the media server running on the home NAS, serving the movie and TV show library recovered from the old Buffalo NAS drives. Part of the broader TrueNAS SCALE Setup.
GPU Transcoding
The RX 6800 XT (RDNA 2) stayed in the NAS specifically for this. TrueNAS SCALE exposes the GPU as a VAAPI render node (/dev/dri/renderD128), which gets passed into the Jellyfin Docker container via the GPU configuration section of the app settings.
RDNA 2 supports H.264, HEVC, and AV1 decode, plus H.264/HEVC encode via VAAPI. In practice this handles multiple simultaneous 1080p streams without putting meaningful load on the 5600G. The iGPU alone would become a bottleneck quickly with any real concurrent usage.
Media Library
The library came primarily from two Buffalo NAS drives that had been sitting unused for roughly eight years. The raw data was first cloned to /tank/buffalo via robocopy as part of the TrueNAS setup, then the media was moved into /tank/media/movies and /tank/media/shows.
The problem was naming. Files came from a variety of sources with no consistent naming conventions, and Jellyfin’s automatic metadata parser made a lot of mistakes on the raw filenames. I wrote a Python script that:
- Reads the existing filename and any embedded metadata
- Queries the TMDB API to find the best match by title and year
- Renames the file to Jellyfin’s expected format —
Movie Title (Year)/Movie Title (Year).extfor movies,Show Name/Season XX/Show Name S01E01.extfor episodes
After running the script and rescanning the library, the match rate went from poor to near-perfect. The remaining mismatches were edge cases that Jellyfin’s manual correction handles fine.
Remote Access
Jellyfin is accessible publicly at jellyfin.harrisonsmith.me via Cloudflare tunnel. Jellyfin’s native user accounts handle authentication — no additional auth layer needed. Friends and family can be given accounts with whatever library access makes sense.
For anything that doesn’t work well over the tunnel, Tailscale provides a direct path to the NAS.
Tasks
- Set up user accounts for family sharing medium
- Fine-tune transcoding profiles low
- Deploy Jellyfin from TrueNAS app catalog high
- Configure GPU passthrough (VAAPI / RX 6800 XT) high
- Mount /tank/media into Jellyfin container high
- Write TMDB API script to rename files to Jellyfin conventions high
- Run metadata scan and verify library high
- Configure Cloudflare tunnel (jellyfin.harrisonsmith.me) high
Milestones
- Jellyfin accessible on local network
- GPU transcoding verified
- Full library scanned and metadata matched
- Accessible publicly via Cloudflare tunnel
- Family accounts configured
Dev Log
TMDB renaming script — library fully matched
Wrote a Python script using the TMDB API to rename all media files to Jellyfin conventions. After a rescan, metadata match rate went from poor to near-perfect.
The library scan yesterday was a mess. Jellyfin’s automatic metadata parser relies on filenames following a specific pattern (Movie Title (Year) for movies, Show Name S01E01 for episodes). The Buffalo NAS files had been accumulated over many years from various sources and the names were all over the place.
The problem
Examples of what I was dealing with:
- Movies named by scene release group tags:
Movie.Title.2019.1080p.BluRay.x264-GROUP.mkv - Shows with episode numbers but no show name in the filename
- Duplicates with slightly different filenames that Jellyfin treated as separate entries
- Foreign titles with no year information
Jellyfin’s built-in “fix incorrect match” tool works but doing it manually for hundreds of titles wasn’t realistic.
TMDB script
Wrote a Python script that processes each file:
- Extracts a best-guess title and year from the existing filename (stripping release group tags, quality indicators, etc.)
- Queries the TMDB Search API with that title and year
- Takes the top result if the confidence is high enough, otherwise flags the file for manual review
- Renames the file (and its parent folder) to Jellyfin’s expected format
For movies: Movie Title (Year)/Movie Title (Year).mkv
For episodes: Show Name/Season 01/Show Name S01E01.mkv
The TMDB API has a generous free tier — no issues hitting rate limits even with a large batch.
Results
Ran the script, then triggered a full library rescan in Jellyfin. The match rate went from roughly 60% (lots of wrong metadata, missing posters, incorrect episode numbers) to near-perfect. The flagged files that needed manual review were a small subset — maybe 15–20 items — mostly obscure foreign films or very old content not in TMDB.
Library is in good shape now. Set up the Cloudflare tunnel access and tested a few streams remotely — everything working as expected.
Jellyfin deployed with GPU transcoding confirmed
Jellyfin up from the TrueNAS app catalog with the RX 6800 XT passed through for VAAPI hardware transcoding. First test streams are working.
The Buffalo data transfer completed yesterday and the media is reorganized under /tank/media. Time to get Jellyfin running.
Deployment
Deployed Jellyfin from the TrueNAS app catalog. The catalog version handles most of the Docker configuration — just needed to point the library path at /tank/media and configure the GPU passthrough.
GPU passthrough
The RX 6800 XT shows up in TrueNAS’s GPU configuration dropdown. Selecting it in the Jellyfin app settings passes /dev/dri/renderD128 (the VAAPI render node) into the container, along with the correct render group GID.
Verified hardware transcoding is working in the Jellyfin dashboard — the active stream shows VAAPI in the transcoder column rather than software. CPU usage stays low during playback. The 5600G iGPU would have struggled with this; having RDNA 2 in there makes a real difference for simultaneous streams.
Library
Pointed at /tank/media/movies and /tank/media/shows. Initial scan ran and picked up everything, but the metadata matching is messy — lots of incorrect or missing titles because the filenames don’t follow Jellyfin’s expected format. That’s the next problem to solve.