How I Stream Music

I use a few programs for my music workflow.

Navidrome

An image of Navidrome, showing multiple albums

I've settled on Navidrome, which is available here. Prior to this, I used Gonic.

The reasons I prefer Navidrome are largely that it's configuration is much smoother and much can be done from the UI. I ran Gonic on a hosted server and found it difficult to do some of the things that I wanted since I could not control things like env variables to declare certain settings. Navidrome also provides a web client for listening to music and supports pulling metadata. It's also a tag-based organizer (compared to Gonic which goes by folder location).

I use the docker compose file available on the offical website.

One setting I enable is ND_SCANNER_GROUPALBUMRELEASES=true.

services:
  navidrome:
    image: deluan/navidrome:latest
    container_name: navidrome
    user: 1000:1000
    ports:
      - "4533:4533"
    restart: unless-stopped
    environment:
      ND_SCANSCHEDULE: 10m
      ND_SCANNER_GROUPALBUMRELEASES: true
      ND_SPOTIFY_ID: [[spotify_id]]       # So navidrome can grab artist art
      ND_SPOTIFY_SECRET: [[spotify_secret]]
      ND_LISTENBRAINZ_ENABLED: true       # For scrobbling
    volumes:
      - "./data:/data"
      - "/home/panda/music_master/music:/music:ro"

Beets/Puddletag

The two tools that I use for managing my music metadata are:

  • Beets, a command line music-management tool built in Python
  • Puddletag, a graphical music tagger application

Generally speaking, the following command will work to add music to my library in 95% of instances:

beet import path/to/folder

Beets will scan the files, identify any existing metadata, attempt to match it against the musicbrainz database to identify the item. If it's a high degree certain it has the right item (like 98% or so) it'll just apply all the tags automatically and then copy the files to my music library. If it's not, it'll ask me to select a musicbrainz entry to apply or give me the option to provide my own identifier. As a last resort, it will simply move the files to my library 'as-is'.

Puddletag is useful for when I need to manually edit tags as I find it easier to work in a GUI in that instance. An example of when I might need this is with non-English albums - I have a lot of JRock/JPop/Anime songs I've acquired over the years and while you can ask beets/musicbrainz to provide the english translation of the artist, you can't often do that for the tracks as many of the albums have never seen official western releases. So in those instances, I edit the kanji/katakana to be romaji because having the former in the title tag renders the song un-searchable to me.

Tagging quirks

Description of the image

Occasionally I'll get a single song, but not an entire album. Maybe it's a song from a Youtube video or it's just one song out of an album I otherwise dislike. Rather than having these orphan tracks each with their own individual album entries, I do a bit of cheating with the tags:

  • I set the Album Artist tag to "Assorted Artists"
  • I set the Album to Assorted [$YEAR]
  • I set the compilation tag to 1

I do something similar with Anime opening/endings. Rarely do I find myself interested in listening to an anime's full soundtrack so I do a bit of similar trickery:

  • I set the Album Artist tag to "$NAME OF ANIME"
  • I set the Album Tag to "$NAME OF ANIME"
  • I set the compilation tag to 1

Between those three tag changes and the above ND_SCANNER_GROUPALBUMRELEASES=true setting, Navidrome displays these orphan tracks as part of adhoc compilations that are either named after the current year or named after the anime the songs are from. That way I don't have a lot of incomplete albums cluttering up my album view.

It's probably not the way they would teach me to do it at library school, but I would counter that an information system is only as good as its findability and this is meant to be a personal collection, not a complete archive.

I do these tasks quickly with fish functions (think like bash scripts/aliases but for fish shell).

Acquiring Music

  • I check out CDs from my local library and rip them using Asunder. It's a bit of an old looking program, but it does the job. This lets me explore new music too as I make a point of alternating between "this CD/band I recognize" and "this CD/band I do not". My library's access to inter-library loans throughout the entire state of California means I can get access to a lot of albums.
  • I purchase DRM-free music when available from Bandcamp or the artist directly.
  • Occasionally, a song is only available on Youtube. I use a self-hosted MeTube instance to get audio files.
  • Soulseek
Soulseek Clients

I use two clients. Nicotine+ and slskd. The former is more of a straight-forward client for the network. The latter is a docker image that I run on my server. They each have their pros and cons. Nicotine+ allows for easier browsing of people's shares and is much simpler. slskd runs in a web-browser from any of my computers and allows me to queue up searches from basically anywhere. I run Nicotine+ in a VM and it's sometimes a pain to get that running to search for something, but slskd struggles a bit when a search has a lot of results and can sometimes crash.

Slskd runs in a Wireguard container.

Playing Music

On Android, I use the program Symfonium. It's an incredible music player, its developer is constantly working on it and it's, quite honestly, one of the best phone-based music players I've ever used. I make heavy use of the Album Mix feature for long rides.

On my Linux desktop, it's not quite so clearcut. I prefer minimalistic clients on the desktop but ones that A) work, B) allow for MPRIS control, and C) stream from Navidrome seem few and far between. The desktop music player ecosystem seems dominated by players that are attempting to mimic Spotify in both looks and features. At the moment I use Supersonic. Prior, I used Strawberry but I found that that would take an annoyingly long time to update content from the server.

Storing It All

I basically just dump it all in a folder on my NAS and point Navidrome at it. The folders are on a SAMBA share that I used systemd-automount units to incorporate into my local file system so things like my fish scripts and beets can work on them.

I prefer FLAC as far as formats go, but Navidrome is set to transcode to AAC when streaming to Symfonium. I still have some MP3s that I've gathered over the years in the system as well.

Tying it all together

I run all my machines on Tailscale and use that to communicate between them. Does the job, simple to manage than dealing with tunneling, forwarding, and proxying.

There. How I music.