How to migrate from Spotify to self-hosted Navidrome

How to migrate from Spotify to self-hosted Navidrome

Soooo... you saw the news that Spotify was increasing prices again and have had enough. Me too.

Here's how I migrated out of it, into my self-hosted equivalent. Obviously, I already have a server running 24/7 so I had that part taken care of already. If you don't want a server running 24/7 I can't really help you. I guess you could run all these services while your regular computer is on, just not 24/7.

Eitherway, we are going to use a few different pieces of software/services:

  • Exportify - we will use this to export our playlists from Spotify into plain CSV files. Do this now before Spotify starts preventing this! (I actually have no idea if they will block Exportify, but I can't imagine they are happy about it)
    • If you want to export your Liked songs playlist, just copy all of the songs and paste them into a new public playlist, and export that.
  • Beets - we will use this to organize our messy music files. It is up to you how anal and OCD you are. The more effort you put into organizing your music with Beets, the better the results will be.
  • rsgain - we will use this to calculate ReplayGain on our library, so audio levels are nice and even. I made my own Docker image that runs it periodically on my library.
  • Navidrome - this is the magic. This is what we will use to get music from our server to our phone or computer. It's basically self-hosted Spotify.
    • Navidrome does not modify your files at all. It is "read only" so to speak, so do all your organization with Beets
    • Navidrome does support Last.fm scrobbling, which is super important to me
  • Phone app - I use an iPhone, and have settled on Arpeggi. It's in beta, but is very nice so far, with active development.
  • Desktop app - Since I use a Macbook primarily, I can run Arpeggi here too through the macOS iOS emulation thing. On my Windows computer I use Aonsoku, but I'm not sure if it's in development anymore. Worst case scenario, you can use the Navidrome web client. It ain't pretty, but it's solid.

Okay, so here's all you need to do:

  1. Export your playlists using Exportify.
    1. I used grabbed my Liked songs and 1 other playlist, but export whatever you want or think you might need
  2. Acquire music.
    1. Society sucks, so I cannot tell you how to do this, but if you google for stuff like spotdl you might find things that can help you. Be careful though, I got shadow banned from YouTube for a day 😇
    2. Ideally you go out and get CD's and make FLAC rips. This is my preferred method, but for the random single tracks, something that can automatically get them for you is convenient
  3. Run your music through Beets.
    1. This is the most annoying step, and takes forever (I'm still not done!)
    2. It is important, because your music will be matched with MusicBrainz, and will be tagged with an ISRC, which will become important soon!
  4. Run rsgain on your library
    1. As I said I have my own docker image that runs it periodically, so I never think about it
  5. Set up Navidrome and point it at your organized Music folder
    1. To access it remotely, you can either use a VPN (such as Tailscale) or buy a domain (or just use something like DuckDNS, but in my experience DuckDNS is down quite frequently) and do some Nginx Reverse Proxy stuff, it's not that difficult
  6. Tada! You can now log into your Navidrome instance from anywhere, and there is all your music.

Converting Spotify CSV to M3U playlists

To get your playlists, you can write a simple script that matches the ISRC tags from your exported CSV file, to your actual tagged music files. This is why running them through Beets is important!

Here's the Python script I cobbled together in 5 minutes to do this. It's pretty rough, but it worked good enough for me.

You will end up with an m3u file. You can just drop this into the same folder Navidrome is looking for music in, and voila:

Here's what Aonsoku looks like on my Macbook:

And here's what Arpeggi looks like on my iPhone:

The nice thing about Navidrome is that it's based on a standard called Subsonic I believe, so if you hate these apps, well, just go make your own or grab one of the million alternatives!

Once you have the initial import done, adding new music in the future is much less of a hassle.

Good luck!