emily’s bike stuff
About Archive RSS

Music on Linux

Leaving streaming

I canceled my Apple Music subscription the other day. The reasoning isn’t super important but it was basically like this:

  1. Streaming payouts for artists are extremely low. This means I really want to buy music outright from smaller artists on platforms like Bandcamp.1
  2. Once you have some locally stored music on your filesystem, it’s annoying to have it alongside a streaming service.
  3. I was just playing the same few albums over and over, not exploring new music. Something about streaming services doesn’t encourage me to engage with the world.
  4. Music.app is often hogging CPU on my Macbook for some reason.
  5. I try not to use my phone much because it’s terrible for my brain and my wrists.
  6. I’ve been on Tidal, Apple, Spotify, etc. I wasn’t thinking of switching any time soon but inevitably I probably will and that means my library won’t come with it.2
  7. Some believe we’ve moved from capitalism to technofeudalism and would argue that streaming services extract rent from controlling artist’s access to customers instead of making a profit from song sales. The services have discovery algorithms they control and terms they dictate.
  8. Honestly it’d be cool to just avoid another subscription service.

Music stack on Linux

I’m using these things on Arch for music:

  1. PipeWire to manage audio.
  2. WirePlumber for managing PipeWire sessions.
  3. Music Player Daemon (mpd) as a music server. This maintains a database of all my music and lets clients like rmpc maintain a queue of tracks to play, browse albums, etc.
  4. Rusty Music Player Client (rmpc) as a lightweight mpd client. It’s a TUI! That’s exciting to me. It’s super themable, too.
  5. beets for automatic collection management. This organizes my music files in a consistent folder structure, syncs lyrics and album art, other metadata management, and finds duplicates. If I download a new album I just run beet import /path/to/album and it takes care of everything.
  6. mympd for a web UI to my library when I want that.

I’ve been pleasantly surprised by how nice everything has been to use. I haven’t had this need in a while but it’s even easy to make arbitrary routes between audio sinks and sources.

Sonos

The exception has been Sonos with AirPlay. I’ve been kind of irked at my Sonos device for a while now and intend to sell them and get some used, wired bookshelf speakers. But in the meantime it does work with Arch, it just took some figuring out.

Misc notes in case it’s useful for anyone out there:

  1. I needed to allow incoming UDP 5353, 6001, and 6002 on my firewall (nftables).
  2. extras/pipewire-zeroconf provides libpipewire-module-raop-discover.so .
  3. I copied /usr/share/pipewire/pipewire.conf.avail/50-raop.conf to ~/.config/pipewire/pipewire.conf.d/ and added raop.discovery-local = true; to an args block.
  4. wpctl status is useful to see the sinks.
  5. I’m not sure if I needed this in the end but /var/lib/airconnect/airupnp -Z -i -l 7 -d all might’ve did a trick (this is really vague, most of this went over my head). See AirConnect.

  1. Although, sadly and notably, Bandcamp laid off the whole union bargaining team in 2023. You can buy music from them on Bandcamp Fridays for all proceeds to go to artists. ↩︎

  2. MusicBrainz would probably fix this and I’ve been scrobbling to ListenBrainz. ↩︎

Tags: