Leaving Spotify, Reclaiming Music
The Impetus Link to heading
Honestly, Spotify hasn’t been cutting it.
It’s been feeling worse by the day in concrete ways: the audio quality leaves something to be desired, vendor lock-in is ever-pervasive and most importantly: my library no longer feels like mine. Not like it did in the days of toting my iPod around loaded with my music.
This discontent had been building for a while, this has been bugging me. I’d been working to inch towards getting some media autonomy by setting up a Jellyfin server, but it’s been slow and piecemeal going. This was pre-proof of concept even, just tinkering and puttering around, not close to a real alternative.
Then, bereft of a project to work on near the New Year, I was going near-feral. I habitually do side projects to keep sharp and need that. So I asked my partner for a problem worth solving.
Requirements Gathering Link to heading
They were so ready.
They said to me, “hey, I’ve been venting to a friend about what I need in my music playing experience and how Spotify has been lacking.” Well, not in those exact words, but you get the point. I was eager to hear some pain points, the genesis of good projects, and to help out my partner.
As we spoke, my “requirements doc”, informally, emerged organically.
The Requirements Link to heading
- Better listening quality and a better overall experience, especially on mobile
- Support for robust, flexible playlist management
- More than anything, an escape from Spotify lock-in’s limitations in not actually owning your own media
All of this resonated with me as well, and felt like it could be worked in. It did, however, suggest this wouldn’t be a quick fix and wouldn’t just be tweaking Spotify.
A Side Note: Social Music Discovery Link to heading
Secondary to that, we did discuss several other topics that I may touch on in the future, because our conversations tend to sprawl expansively. One topic that kept resurfacing that’s worth noting is the death of social music discovery. We talked about how hard it is to find music through other people and how discovery we’ve offloaded to opaque and often poorly performing algorithms.
I did find out last.fm is still around though! That’s pretty cool, I haven’t checked it out much since. This reminded me that this particular problem space used to be very different, and feel more solved, before it shifted. I won’t be solving that problem here, but I keep thinking on it.
Scope and Constraints Link to heading
This was originally an evening sort of project, so I balked initially at all the ways it could sprawl like our discussions did. I had to be honest about what not to start into or try to do.
I wasn’t up for trying to design an mp3 player(hardware or software) from scratch. That was, however, an enticing project for some day down the line. A rabbit hole for another day and another me.
I also already had a bias and starting point: I had some music(well, a few thousand tracks) on a Jellyfin server running on a Macbook, via a Proxmox Ubuntu VM in my homelab. Not great, definitely not pretty. But it works as a proof of concept, and I’d been meaning to do more with that setup.
So integration mattered for this project. I was going in on Jellyfin, and whatever I chose had to work well with it.
Surveying the Landscape(What I explored and Learned) Link to heading
Rather than immediately jumping to a direction, I started looking at what already existed. Why build from scratch if you can buy or borrow ideas? I didn’t do anything like a comprehensive review, but I wanted to understand some related tools in and around the ecosystem.
Tanagra Link to heading
This is an odd one to start with: an open source, open hardware MP3 player! This looked compelling, but not the direction I was focusing on(I had already scoped this out as a software problem/experiment.) As well, it was panned on Reddit and I couldn’t find too much info on it.
Anagnorisis Link to heading
This project deserves a callout, a little spotlight.
It caught my eye as a self-hosted, privacy-postured, recommendation engine-based data management solution.
However, it is immature/early in development and has a ways to go. It has a heavy container footprint(45GB!) and expected a quality GPU to run it. That didn’t match up with my specs, it wasn’t a fit for this migration.
That said,the idea of taking some of the ideas of Big Tech around data and personalization and making it your own in a “take back your data” sort of way is super exciting! I’m rooting for it. Check out Anagorisis here.
Jellyfin and its ecosystem Link to heading
I decided pretty quickly to be pragmatic: keep Jellyfin as the hub and find a compatible client that was “Spotify-like”(ideally “Spotify but better”) for daily use.
Tools I considered in this orbit:
- Navidrome and the OpenSubsonic Ecosystem: {detail here, note that it would mean a shift with server compatibility}
- Feishin: This is a great project, but desktop/web-centric and lacks a mobile option, making it not an option or at least out of scope for this project.
- Tempo: This one stood out as an elegant app, but seemed to be Subsonic-focused and didn’t look like it would play well with Jellyfin in particular.
In the end, I landed on Symfonium as the client for Jellyfin.
Why Symfonium? Link to heading
Well, Symfonium supports Jellyfin directly, has a clean and thoroughly designed UI, and has lots of interesting features(many that I admittedly haven’t played around with much.) The feature that really sold me, was that it has “smart” playlists and mix modes as potential killer features to replicate or better a Spotify-like experience.
Honestly, there’s tradeoffs to all this, and I want to highlight one already: it doesn’t replace the (attempted) social/community layer of Spotify. I say attempted because jams, sharing and collaborative playlists don’t fully solve solve the problem either.
What Came Next Link to heading
Streaming means you don’t have files. In the future you will own nothing and you will be annoyed about being tricked into it.
Jokes and references aside, owning or acquiring music at scale is real, complicated work, and I started (and am still, spoilers) searching for practical ways forward.
To complicate things further, I had a brutal use case in front of me, staring me down. My partner had 100+ playlists, many quite large, and I suspected that might be a problem. It was, but not exactly in the ways I expected.
A real blocker turned out to be effectively getting usable playlist inputs such as URLs , IDs or anything that would go into a download workflow and then executing that workflow reliably. I still haven’t gotten there, but I’m getting there.
That’s a story for the next post, the story in fact.
What I Accomplished Link to heading
So far, I’d accomplished more than I credited myself for at the time as I was pretty heads-down and grinding away at researching ecosystems and options. I was researching in looking into, testing and discarding options. In hindsight, I’d made some real progress.
I had a target architecture: Jellyfin server + Symfonium client.
That was big. As well, I had a migration plan that was realistic if surely going to be a pain: begint to move from Spotify by getting the appropriate music(the music from the playlists, to start) onto Jellyfin.
That’s where I moved forward from.
What’s Next? Link to heading
Part 2 will be the extraction/download pipeline details and story. That’s how I got music “out of” Spotify and into Jellyfin.
Part 3 will detail what remains after that. That’s what remains hard along with what I’d improve once Spotify stopped being the necessary evil go-to option. That’s where I’ll go into what ideas and philosophical musings I thought of along the way.