
beets
Contributing back to the app and plugins that make managing a DJ's music collection possible at scale
- Goal
- Fix bugs and add features to my favorite music tagger
- My role
- Collaborator
- Status
- Active
- Started
- Python
- GitHub Actions
A DJ’s music collection gives a tagger plenty of awkward cases: featured artists, compilations, remixes, and several versions of the same track. Beets is my favorite tool for managing that collection, and contributing fixes upstream saves me from repeating the cleanup or carrying local workarounds between upgrades. My merged work spans Beets itself, Filetote, and Beatport4:
- Normalize featured-artist credits on compilations and guest-artist tracks, handle parenthesized credits, and place features before remix and version qualifiers.
- Keep featured-artist formatting consistent during imports, manual cleanup, and metadata refreshes with
mbsync. - Restore TIDAL searches after an API change and recover from malformed Discogs search responses with a bounded retry.
- Keep Filetote compatible with changes to Beets’ path-format helpers and multidisc detection, while retaining support for older versions.
- Update Beatport4 to use the metadata-source interface, redact account credentials from configuration output, and align its Python requirements with Beets.
Getting a title formatted correctly is only half the job if the next metadata refresh undoes it. I connected ftintitle to Beets’ metadata-received events so track and album information is normalized before mbsync applies it. Imports and the manual command use the same rewriting logic, tested against artist credits, cached metadata properties, empty titles, and configurations that should leave the data alone. For Filetote, compatibility meant using the newer multidisc pattern collection when available and reconstructing it from older constants otherwise, then testing against the affected Beets versions.
These are contributions to established community projects. For changes better suited to an optional extension, I maintain my own Beets plugins; docker-beets assembles the environment where I use them. They address different parts of the same job: keeping a large music library manageable without making every upgrade a new cleanup project.