After the Rip: Auto-Naming a Home Media Library for Jellyfin with Python, TMDB, and ffprobe
Getting video off a disc is the part everyone talks about. The part that actually eats your evenings is everything after: a folder full of title_t00.mkv, disc1/, C3_t01.mkv files that mean nothing to a media server. Jellyfin wants very specific names and folder layouts, and if you don’t give them to it, you get “Unknown Movie,” mismatched episodes, and bonus features scattered as phantom entries.
So I extended a post-processing step into a proper Python pipeline that takes whatever came out of my ripping setup and turns it into a Jellyfin-perfect library: correct movie names with IMDb IDs, TV episodes matched to the right SxxExx, extras bucketed into the folders Jellyfin recognizes, then rsynced to the NAS and scanned in — with an ntfy ping at the end. This post is about that pipeline. It is deliberately not about disc decryption — it starts the moment you have plain .mkv files.
jf-barcode-search: Scanning Barcodes to Query Jellyfin — and a Checklist for Open-Sourcing a Homelab Repo
Here’s a problem specific to people who rip their own discs: you’re standing in a thrift store holding a $3 Blu-ray, and you genuinely cannot remember whether it’s already in your library. Pull out your phone, squint at a media app, type the title, hope you spelled it like the metadata does… by which point you’ve put it back.
So I built jf-barcode-search: point your phone camera at the barcode on the case, and it tells you instantly whether that title is already in your Jellyfin library. It’s a small Flask app, and this post covers both what it does and — because I decided to open-source it — the pre-flight review that makes a homelab repo safe to publish, which is a checklist worth having regardless of what you’re releasing.
Aiming an OTA Antenna With Data: Prometheus + Grafana on an HDHomeRun FLEX 4K
Aiming an over-the-air TV antenna is traditionally a two-person job with a lot of yelling: one person on the roof rotating the mast, one inside shouting “better… worse… BETTER… no, worse again.” The feedback loop is slow, the signal bar in the tuner’s web UI updates lazily, and you can never quite tell whether that last nudge helped.
I wanted a tight feedback loop: a live graph, updating every few seconds, of the exact signal metrics that matter — so I could rotate the antenna and watch a line move in real time. My tuner is an HDHomeRun FLEX 4K, and it turns out you can scrape per-tuner signal quality straight into Prometheus and chart it in Grafana. This post is how I built that, the one exporter that actually does the job, and the surprise ending where the data explained a “broken” channel that wasn’t broken at all.