Improved Means for Achieving Deteriorated Ends
An Overcomplicated Music Setup
Intro
Some friends encouraged me to write up my system for managing my music collection so here we go. Let's start by going over my goals and hardware:
- No dependence on cloud services to listen to my music.
- Be able to listen via laptop, phone, or turntable.
- Be able to share music with friends easily via Library and Radio.
- Pay the damn artists.
It isn't very relevant but since many people share their listening setups, I'll briefly summarize that:
- For headphones I mostly use the AKG K371
- On the go, I listen to Opus files via an Android Phone or Flacs using my beloved Tangara
- On my laptop, I listen to Flacs via Emacs (using EMMS, not great but good enough)
- In the garage, I listen to records using a U-turn Orbit turntable hooked up to a ZED-10 mixer shared with the desktop that go out to Frontier Output speakers. It is unnecessary but lovely.
If it isn't already clear, Fuck Spotify in my opinion.
An Aside on Film
Why the hell isn't there a bandcamp for film? Seriously. I've recently started trying to build up a physical media collection for film and I would love to primarily buy from independent vendors or just not Amazon!
It would be wonderful to have a service where I could buy DRM-free digital copies in addition to steelbooks and follow studios or directors I know I like. If you have a place you like to buy films, by all means send word. I'm aware of Orbit and Diabolik but there's a lot not on either store.
The Process
One thing I'll freely admit is not great with my setup is discovery. I read a few online publications, am subscribed to a few substacks, and use nitter to check some X feeds without sending traffic to that hellhole. Acquisition is very well covered between Bandcamp and Discogs. I'm okay to rely on those services for buying music though like all SaaS they are at constant risk of enshittification.
I won't cover discovery as part of this article. I just want to talk through the wildness that is my library process. Alright, so we've found an album worth grabbing, maybe on bandcamp or maybe on discogs. We'll assume bandcamp since you automatically get free Flacs with physical media purchases. Okay, it goes like this.
- Run
beets importto copy the Flacs into the music library.- beets is very good. It normalizes the folder and file naming, standardizes the tags based on what is in musicbrainz, and ensures album art is present. Brilliant.
- Copy normalized flacs to the tangara, add them to emacs with M-x
emms-add-directory.- My kingdom for EMMS to support filesystem watching my music directory.
- Run
beets convertto create opus files and load them on the phone. - Add the new album to records.dat
- This is a goofy S-expression based list of my record collection that lives in my emacs config and powers the bandcamp embedding and album art on radio.
- One annoying part is getting the bandcamp release IDs, running this on the
album page will do the trick:
JSON.parse($("[name='bc-page-properties']")[0].content)['item_id'] - At some point I'll extend this to support youtube embeds also.
- Run the covers.lisp script and
collards deployto make the album available on radio.
I won't claim that this process isn't a headache. I won't claim this is something that reasonable people should want to do. I am happy with it for my needs. And there are upsides.
- I own all my music.
- I can listen to my music at any time, on any device I own, with or without network access.
- I can easily share my music with my friends, write about it, and let folks browse my library.
- It would be pretty easy to set up self-hosted streaming using jellyfin or funkwhale and tailscale, I just don't need to.
Beets config
import:
log: beet-import.log
copy: yes
write: yes
resume: ask
languages: en
incremental: yes
paths:
default: $albumartist - $album ($original_year)/$track - $title
comp: Compilations/$album ($original_year)/$track - $title
plugins: convert fetchart mbcollection missing
convert:
format: opus
never_convert_lossy_files: yes
embed: no
copy_album_art: yes
fetchart:
minwidth: 500
maxwidth: 700
missing:
count: yes
musicbrainz:
user: somefin
pass: LOL,NO