nas-media-pipeline
Four stages between a download and a Jellyfin library
This started as a fix for a chore. Getting public-domain film and TV from the Internet Archive into a Jellyfin library meant downloading by hand, checking the files were what they claimed to be, copying them to the NAS, and then renaming everything into the folder structure Jellyfin can actually scrape. Four annoying steps, so it became four scripts that each do one of them and nothing else.
The stage I care most about is the guard. Anything staged for the NAS gets scanned by extension and by content sniff, so an executable wearing a .mp4 extension or a symlink pointing at a binary gets quarantined before it reaches shared storage. The sync stage is similarly paranoid: it verifies parity before it reclaims any local space, and it will never delete something on the remote side. Those two rules exist because the failure mode I actually worry about is silent, not loud.
There is an optional monitor on top that watches the sources I track and writes a report of what is new before anything gets fetched. Nothing downloads until I approve the batch, which arrives as a notification rather than something I have to remember to check. It is all bash and standard-library Python. No framework, no database, and the only real dependency is the Internet Archive CLI.
Built with