
Navidrome and Jellyfin are servers for Audio and Video, respectively. They run on Linux (and possibly other operating systems) and have clients that can access them and stream media, provide an organized interface for browsing, etc. They should be accessible to AI agents as well.
Navidrome uses the Subsonic API and has a web interface.
It basically works, and using Symphonium as the front end, there is little to do beside install and setup. Note that the web interface also supports Internet Radios (e.g., SomaFM).
- Navidrome Home Assistant Bridge
- Migrating from Google Music to Navidrome
- How Navidrome finds artwork
Jellyfin for video
Jellyfin on the other hand has a ton of work behind the scenese, from admin utilities, to custom skins, to a myriad of clients, to metadata, subtitles, etc., etc. It is a huge amount of work when compared with Nova Video Player which I've previously used.
Nova is best if all files are local to the device, and no network viewing is needed. It is pretty cool and self-contained that way for a TV 10-foot experience. Sadly that is somewhat difficult to deal with as files need to live and be updated somewhere and a server model is best for that. Basically, Navidrome for audio and Jellyfin for video.
Install and configure Jellyfin
Handy script for Debian and descendents:
curl -s https://repo.jellyfin.org/install-debuntu.sh -O && \
curl -s https://repo.jellyfin.org/install-debuntu.sh.sha256sum -O && \
sha256sum -c install-debuntu.sh.sha256sum
Note: for external drives, use this script on the drive mount root (/media/username not /media/username/mounted-drive).
sudo setfacl -R -d -m u:jellyfin:rx /media/username
Jellyfin clients
- There is the basic web client at
ip-address:8096point a browser and it is there. Also, this is the ip:port that other clients connect over. Note that some clients require the protocol as well as the port, but others can try and guess if given just the address. - For Android there is Findroid
- For Android TV there is Jellywatch, Jellyfin client, and Void
- For Linux there is Jellyfin Desktop:
flatpak install flathub org.jellyfin.JellyfinDesktop
Naming best practices
Basically there are two kinds of video databases, those with television shows and those with movies. And never the twain shall meet. Nor can separate movies be organized (in terms of a directory structure) to show relatedness (for example, all Spider Man movies). And so, our directory structures need to follow these conventions, and different sources are added to a server based on what kind of content is there. I like to also keep animation separate so my root structure looks like:
- anime-movies
- anime-shows
- movies
- shows
For film (movies), the name of the folder and the name of the file are identical with the exception of the filetype extension:
- anime-movies
- Spider man into the spider verse (2018)
- Spider man into the spider verse (2018).mkv
- Spider ham caught in a ham (2019)
- Spider ham caught in a ham (2019).mkv
...
For tv (shows), there is an additional Season nn folder:
- anime-shows
- Hell Mode (2026)
- Season 01
- Hell Mode S01E01.mkv
- Hell Mode S01E02.mkv
...
- Season 02
- Hell Mode S01E01.mkv
- Hell Mode S02E02.mkv
...
Note that there are several metadata databases that can be used to clean up a directory and file structure, though sometimes not in the way intended. More on this later.
- See this valuable resource on naming structure that provides even greater detail.