On local music streaming, and the grass not always being greener

Since the early 2000s, we’ve maintained a local music collection - back then, really low quality WMAs ripped from parents’ CD collections, fighting for limited hard drive space.

That collection grew, and grew, and right now occupies a decent chunk of our NAS; space that we’re happy to dedicate to it. A collection that still grows with every passing Bandcamp Friday - as much as we aren’t a fan of the new owners, it’s still right now the best way we know to make sure money goes to the artist that made the album.

The benefits of a local media collection have been discussed at length in other places (to maintain control of your library, to give artists a little more of what they’re worth, to avoid streaming services raising prices or getting rid of artists or changing terms), and it isn’t something we see ourselves ever giving up.

But there are some problems in comparison. Discoverability is harder. 1 You’re responsible for storage, backup, metadata. Some larger artists are now skipping CD releases and aren’t on Bandcamp, so it’s a case of finding the best deals on the MP3s. And then there’s the question of portability.

Satellites

The capacity of portable players has never matched the library; from the meagre storage available while dragging and dropping files on the PlayStation Portable, to more carefully managing files on our Zune 30GB, to our modern use of Smart Playlists to keep a lot of music on our iPhone at a time when mobile data was a lot more expensive.

This arrangement worked, for a long time. We still buy a bit more storage on the phone than we necessarily need; there will always be something we at least like on shuffle. Our entire collection would still always be available on desktop; a double click away from opening in Foobar2000 or whatever other audio player we were using at the time.

But with the move to the NAS, that brought up a question: shouldn’t we be able to access any song in our library, from any device on our local network? 2 Our particular combination of neurodivergence means that we will quite happily listen to the same song (or variations and remixes of it) a lot of times in a row. It’s annoying to have to sync things for just one song.

Solar Plexus

I forget when we installed Plex, but it served double duty in terms of being able to catalogue the library of ripped DVDs as well. It was the big one that everyone had heard of. Why wouldn’t we enjoy it?

But as someone(s) that just want to access our collection of our things on the local network, Plex has always felt not quite the right fit. They push for their own streaming service, to allow remote access, to subscribe to have functionality in some of their clients. They will change default settings to sharing your activity with friends just for engagement. If it gets something wrong about metadata, it can be difficult to recover. 3

Despite all this, what made us stick with Plex was Prism, a third party app with a reasonable one time payment to unlock all functionality; a snappy interface for quickly finding songs, making it trivial to queue up anything that hadn’t had its metadata mangled (and also assuming the Plex package for Synology hadn’t stopped itself, as it does frequently).

Screenshots of Prism

But we’ve still had a vague feeling for a while that if nothing else, it’s good to check out what else is there - in case Plex as a company does do something that makes it no longer tenable to use their product.

Something in the Water

Jellyfin is an open source media streaming app that competes with Plex.

Our hesitance over installing it can pretty much entirely be described as “what if the music streaming apps aren’t as good as Prism”… and yeah, we were kind of right to be worried.

Jellyfin’s main web UI seems to do an OK job at other things from the limited amount we’ve seen, but it also seems pretty slow at searching for music in particular. Perhaps that’s just an artefact of it being installed on our NAS and our NAS being relatively slow as they go - maybe Jellyfin uses up more system resources - but it also doesn’t bode well for the client apps.

Screenshot of Jellyfin's main UI
Jellyfin's main UI
Screenshot of Jellyfin's playlist view, playing the theme from Furality Aqua.
Get it, Jellyfin, Aqua...

Additionally, it also doesn’t handle some metadata situations very well. If, for example, you stick singles in one folder, they might end up in Jellyfin as one album, with the album artist of one and the art of another.

(jaws theme)

So, onto the client apps.

Fintunes is a music player very clearly designed for iOS. (And only iOS, there’s no iPad support).

It also features a number of “interesting” design decisions - for example, searching for a song instead bringing you to the album listing. There’s no “play next” option, so anything you add is going straight to the back of the queue - and the add to queue button is only available from within album view.

And also, when you open an album’s page, the playback order is alphabetical rather than by track number. Which I’m sure appeals to some, but I can only see it as bizarre.

This was the most applicable thing when I searched 'jaws'.

Finamp is an app that works a lot more like you’d expect a music app to work - but while aesthetics aren’t usually a big factor in our appreciation of an app, this is an Android app that hasn’t been adapted very well. It feels out of place. And it still has weird problems getting stuff to load, sometimes.

It really fails to whip the llama's ass.

I gave it a minute, and then it gave up on the search and then just displayed the general album listing. Then it failed to load the track until hitting the play button a few times.

Let’s see what other options are available.

Drome Home

Navidrome is an open source media streaming server focused on music. It implements the open source Airsonic API, which is compatible with the paid Subsonic API - allowing a wide variety of clients to hook in.

It is also one of the most… frustratingly open source apps I’ve seen in terms of an install guide. Like, I know we only moved to the Mac in 2020, but this is the first time we’ve ever seen “you need to manually create a .plist”.

Screenshot of Navidrome's Mac install instructions, detailing the creation of a plist file.
Just in case you think we're joking...

If you’re not comfortable at least following instructions on the command line or in parts of your system that you’d never normally touch, you’re basically locked out of this as an option, which feels surprising to see in 2024.

There is no package for our NAS, and I think our NAS is too slow for Docker. For Mac use, there’s no homebrew package either. I take one look at the instructions and decide that there is no way we’re installing this without an easy way to recover the configuration should something go wrong - but thankfully, we’ve read through all of Ansible for DevOps and want to put some of that knowledge into practice at some point, since Ansible is only going to become more important for our job at some point. And there’s even an Ansible role for installing Navidrome on Ubuntu!

It is at this point we made a rather significant mistake. But that isn’t Navidrome’s fault, so we’ve put it in an appendix.

So then we wrote our own playbook to install on a Mac mini (which we also fucked up a bit initially, but oh well).

The official documentation says to change the data folder. We did not do this initially, and after a power outage, restarted the Mac to find that a. Navidrome wouldn’t start properly, and b. when we started it manually rather than via launchctl, the database effectively started again from scratch, including asking to set up the admin user again as well as rescanning all media. Fixed it up with a new data directory and everything is now working as it should, but still, not great.

Navidrome provides a very… functional web interface. It’s there. It doesn’t look the prettiest, but It’s Fine. It also has a party trick.

Right round, baby, right round…

Big Sub, Small Device

Because Navidrome implements the Subsonic API, that means any client app implementing it will just work.

iSub is an app that appears to have fallen out of time. It feels nostalgic to use, the rare relic of mobile design that has been updated to still function with modern versions of iOS after the death of 32-bit apps.

I was going to look for other songs about time but then it decided to not want to load more search results.

It’s neat to see. But for an app that I want to be one of the main ways we listen to music at home… there is a reason why apps aren’t designed like this now. Interactions that may have felt smooth originally now feel clunky.

(I will praise the fact it has lyrics support built in, but also how many tracks have embedded lyrics? I’ve found a handful of tracks in my collection from Bandcamp that have them - but even stuff that has lyrics on the site doesn’t always have them in iSub)

Screenshot of iSub, showing the lyrics for the song Anthologized by Cherry Red, by Spray
For example, other releases from Spray also from Bandcamp don't seem to have them.

I was going to pony up £5 for play:sub, but doing another search for “Subsonic”, I lucked into finding substreamer.

And substreamer just works.

As something designed to also play podcasts, songs for some reason have a playback speed toggle, which can be fun to play round with for 5 seconds.

It feels modern and fast, and designed well for iOS. It has a search box that searches everything rather than manually having to choose the type afterwards (this is a specific pet peeve).

And that’s exactly what we’re looking for.

A Song in Your Heart

The grass isn’t always greener - but sometimes it’s still worth checking out other fields in case you have to move in a hurry.

Now that Navidrome is configured properly, I think it should be more reliable than Plex is (again, NAS likes to randomly stop Plex’s service), and when I’m on desktop, I like it more as a web interface for playing music specifically than Plex’s (and Prism has to run in iPad compatibility mode, which introduces its own quirks).

Navidrome (and therefore substreamer) not ignoring our metadata about tracks means there’s greater incentive to go through at some point and fill in missing metadata - as opposed to how Plex would sometimes reject our reality and substitute its own.

And if you haven’t started your own local music collection yet, don’t let this article scare you off from giving it a try. You don’t need all these fancy things to start with; your phone’s built in music app plus however you sync files to it are great ways to get started.

Still undecided about what we’ll do about locally streaming video; to keep or fully ditch Plex for that in favour of Jellyfin. Thankfully we do that a lot less than audio.

Asides and Appendices

The Mistake

Our main mistake was hearing “Navidrome is lightweight enough that it can run on a Raspberry Pi Zero” and deciding to test that theory.

Maybe it’s possible with a Pi Zero dedicated to Navidrome and nothing else. However, our Pi Zero is also responsible for Homebridge (not too essential, basically just there to sometimes control the base stations for the Valve Index), and Pi-Hole, providing DNS services - and that one is something where if it breaks, there’s more than just us affected.

Navidrome uses quite a lot of resources (for a Pi Zero) when it’s scanning the library - and so we woke after leaving it overnight to find DNS not working, and ssh unusable. This caused a lot of issues.

Screenshot of htop showing very high resource usage.
Before the Pi became completely unresponsive to ssh

Rebooted via pulling power cord (which you’re not meant to do), and it seemed OK again initially… but then the same thing happened a few hours later. (DNS breaking in the middle of a work day while working from home isn’t great)

Rebooted it again via power cord, and before it could really get going again, stopped the Navidrome service and uninstalled it.

Footnotes

  1. There’s a reason our wishlists tend to get a boost whenever a new Forza Horizon is released; a convenient source of licensed tracks that become familiar throughout hours of hearing them. 

  2. We aren’t that interested in opening holes into our home network for media streaming. With that said, we have thought about maybe setting up Tailscale or something at some point. 

  3. For some reason it reads all Various Artists tracks as being by someone that only made one album, and nothing we’ve tried to fix this has worked.