the beguinage

digital music library

written 2025-05-29 0:56, edited 2025-05-28 0:56

After many months of putting this off, I've started working on my digital music library. That's a separate journey of negotiating between lossless and lossy formats and buying a few artists' discographies, but I'm here to talk about playback, organization, and scrobbling. Yes, to Last.fm, which must be one of the longest-living social music websites around. I started scrobbling from Spotify about a year ago after noticing people certainly younger than me using it, mostly K-pop fans.

mpd

Music Player Daemon is old hat among Linux users, but I've never set it up until now in part because I first tried when my laptop was running Alpine Linux and I kept running into weirdness with OpenRC and mpd.service. I was also an idiot who kept insisting my output was ALSA when I've used Pipewire the entire time I've messed with Linux because I record music.

My config file is only a few lines:

music_directory		"~/m/mus"
playlist_directory	"~/.config/mpd/playlists"
db_file			"~/.config/mpd/database"
auto_update		"yes"
pid_file		"~/.config/mpd/pid"
state_file		"~/.local/state/mpd"
audio_output	{
	type		"pipewire"
	name		"PipeWire Sound Server"
}
decoder	{
	plugin	        "wildmidi"
	enabled	        "no"
}

I enabled it as a service on both Debian 12 and Arch Linux with the systemd command systemctl --user enable mpd. If I don't specify "--user," it tries to write the runtime file to /run/user.

WildMIDI is its default MIDI decoder. Since I don't plan to play MIDI files, I just disabled decoding without installing WildMIDI. If you don't, mpd will search for WildMIDI on startup and freak out if you don't have it.

beets

beets is what I dreamed of when I was 14 painstakingly typing metadata for musical theater cast albums I got off 4shared into Windows Vista using a combination of the Broadway DB and, I shit you not, .pdf conductor's scores. beets is a Python program that matches music files to MusicBrainz metadata. While I don't plan to pirate any cast recordings this time around, beets soothes me. Call it my Virgo moon.

directory: ~/m/mus
library: ~/m/lib.db
asciify_paths: yes
plugins: fetchart
fetchart:
  auto: yes

Unless I've torrented an entire discography batch, I opt for beet import -m which moves instead of copying the original files in order to save space. I will move whole discographies that I picked and chose from to my external hard drive just because of sunk cost and indecision.

ncmpcpp

I love Curses, I must confess, which I first used with pinentry-curses for pass. Besides trying to divest from streaming, I started being interested in terminal music players out of hair-ripping frustration with various Spotify front ends due to Spotify deprecating implicit OAuth grant this year.

But before all that, my favorite Spotify TUI was ncspot. ncmpcpp is a classic mpd front-end that I don't think I have anything to add to, except that I have a bindings file with vim motions, which happily don't interfere with other ncmpcpp shortcuts.

YAMScrobbler

There's not much to say about YAMScrobbler besides it doesn't store your Last.fm username or password. Love that. It's another Python program that I installed with pipx on both Debian and Arch.