Beets: The music geek's media organizer
beets.io99 points by hyperific 7 hours ago
99 points by hyperific 7 hours ago
I've tried to use beets a number of times and given up each time.
- beets can't delete transcoded files which have been deleted at source.
- beets can't re transcode existing transcoded files when the source has been modified.
- It's impossible to preserve the original directory structure when transcoding because it strips all path separators for "security".
I use a Bash script I've been maintaining for a number of years instead.
A few people commenting that some of their collection "doesn't exist in any DB", the best way to fix it is to add it to Musicbrainz[0] yourself!
I have found that adding things to Musicbrainz is actually pretty easy (and if you are so inclined like me, pretty rewarding and fun).
Streaming releases (and Bandcamp) you simply drop the release URL into Harmony[1] and it does most of the work for you.
Musicbrainz can represent nearly everything musically related and its all freely licensed, a very cool thing to exist.
Most (non-destructive) edits are auto-applied, whilst the rest go through a 7 day voting period (they are still applied by default unless someone votes against). The barrier to entry is very low.
I spent a truly obnoxious amount of time importing my music library into beets. It took a couple of weeks to get to 95% imported, and got so bogged down in the last 5% that I never completed the import and never switched over.
This isn't necessarily a fault with beets, really, but a model mismatch. The model of beets is very, very strongly tied to associating each imported item to one well-known, commercial release. While it's possible to stray from that, it takes tons of time and experimentation to cram some things into its model.
Purchased, popular albums are a breeze; they import nicely and make sense. I struggled differing amounts with:
* brand new indie label releases (bandcamp)
* commercial albums variants missing from musicbrainz/discogs
* non-commercial albums (self-released CDRs)
* fan-recorded concerts
* fan-recorded festivals (a special case, a true nightmare)
* fan edits/remixes of commercial releases
* playlists & mix tapes
* mixed media releases
Each was eventually possible, but sometimes it took hours to figure out how to import a specific folder. Worse, after doing one festival it didn't necessarily make it easier to do the next festival. Even if I get to 100% imported, additional imports will still take thought.
This isn't an argument against it, I still think it's a fantastic tool. Just understand that the farther you stray from collecting commercial releases, the more of a struggle it is.
> * brand new indie label releases (bandcamp)
> * commercial albums variants missing from musicbrainz/discogs
I fixed those two by adding the missing releases to the database beets uses as its data source (musicbrainz.org), and importing the album in Beets afterwards. I still get notifications for edits to entries I contributed over a decade ago!
There is a Bandcamp auto-tagging plugin for beets which should at least help with the first point: https://github.com/snejus/beetcamp
Can I ask what you choose to manage your library with today? I feel like streaming has made me stray so far from the joy (and pain) of library curation, and I’d really like to get back to it, I just don’t know what folks are using these days.
Fan recordings/edits/anything that shouldn't be on Musicbrainz just gets imported as-is, with maybe some metadata additions/tweaks.
> * brand new indie label releases (bandcamp)
> * commercial albums variants missing from musicbrainz/discogs
This is a great opportunity to fill in those blanks for those services :) I didn't have much to contribute to MB but did have a few albums to add.
>Fan recordings/edits/anything that shouldn't be on Musicbrainz
Those should be on MusicBrainz. There's even a bootleg release type for fan recordings/illegal copies, and official style guides for live bootlegs.
https://musicbrainz.org/doc/Style/Specific_types_of_releases...
If you're using Navidrome or similar to stream your music then check out beets-alternatives [0]. It lets you sync (and optionally convert) your library or a subset of it to another location, in my case my music storage mounted with Rclone. It's especially useful if you need to have a different naming structure in your target directory for whatever reason. I like to keep each disc of a multi-disc album in in its own subdirectory but most streaming servers seem to prefer all tracks of an album to be in the same directory. With Beets-alternatives I can have a different naming structure for each collection vs. having to rename my primary collection to suit whatever streaming server I happen to be using.
One of my favorite beets projects is beets-flask.
It lets you set up fully or partially automated import pipelines with a nice web UI to manage any manual steps needed.
Importing is usually as simple as dropping a zip in a folder and the rest is managed automatically.
Tried Beets once because it pairs well with Navidrome, it's pretty feature packed and exhaustive in what it does. Though after fiddling with it and realizing that it's more effort for my use case than I'd like I ditched it and now I don't really bother tagging. I hope to do the same thing for Navidrome too and find something to replace it with similar to KDE Elisa which makes it easy to make playlists on the fly and organize music around folders instead of tags.
Different strokes for different folks, that's not to say that Navidrome and Beets aren't amazing pieces of kit.
I currently use OneTagger https://onetagger.github.io
It's more for adding tags before you add them to your collection. You can setup shortcuts to often used tags. Of course it can also rename and move files based on tags.
I then can auto create playlists based on those tags (with a different program)
I spent a couple of nights working out how to configure beets to my liking and have loved it ever since. My “workflow” is now:
- buy album on Bandcamp
- download zip
- beet import {zip file name}
And beets extracts the zip, matches the album to musicbrainz, updates any metadata, and drops the files into the directory structure that I like (naming the files how I like them, too).
Very rarely an album will need some more attention, in which case I use Picard to fix it before using beets to import it.
A very similar workflow on my end, both beets as the main tagger/organizer and Picard to pick up whatever can't be processed through beets. Beets is amazing!
Isn't beets going to just overwrite whatever you did in Picard?
No, you can tell it to use the metadata as-is.
Sometimes there’s just weirdness though - for example recently I bought an album and the band included all the tracks from their previous album as bonus tracks. So I used Picard to split them into the 2 “proper” albums.
Well, one might use picard to find a musicbrainz release id, so that beetz has something to grab on to when importing.
I mean, you can just do that in the browser too. "Enter ID" allows you to enter the MusicBrainz UUID (or just full URL). You can even do in the command itself.
beet import "Iron Maiden.zip" -S 4500ad36-5f92-4e4c-bb24-3a9a57faf550I organize everything into Mixxx.
It is tagged not only by genre, crates, some songs belong into more than one crate.
Also by mood, which I tag with colours.
And how much I like the song, which is by stars.
I tried Beets and it was very underwhelming in comparison =)
Correct me if I'm wrong, but different target users here :) Beets seems to be for consumers who want to organize their music collection, and while Mixxx can help with that too, it's mainly for music connoisseurs who play for others (AKA DJs). I'm not sure how well someone looking for the first could use Mixxx, the interface isn't exactly the epitome of user-friendliness if you just wanna organize then press play :)
I love beets - the one thing I can't figure out is how to set the genre very wide.
I like having a small number of broad genres - Rock, Hip-Hop, Jazz etc - but the tagging comes up with hundreds of distinct genres :(
I assume lastgenre with canonicalization[0] enabled is what you need, along with count=1 if multiple genres are an issue.
[0] https://beets.readthedocs.io/en/stable/plugins/lastgenre.htm...
I have this problem too. I find it completely useless to have tags like genre=Post Rock Jazz Fusion" or whatever with basically one band in each genre.
The other thing I've never quite got right is how to deal with classical music and popular music with multiple pressings. A lot of the tagging structure seems oriented around popular music with just one pressing. But I have like 10 different recordings of The Planets and several versions of Red Hot Chili Pepper's Californication, for example.
I recently looked into beets, but it seems it’s focused on automation, is that correct? I often buy stuff that has just been released, and that’s not yet in any database, so no automation works.
My current workflow is download, unzip and manually tag (mainly genres, sometimes badly named artists/albums) with MusicBee (which gives me autocomplete for genres so I can reuse existing ones), and then copy the files to the server for Navidrome to pick them up.
Throwing this out here to see if beets would actually work well with what I want after all.
You can use the current tags in the media files and not use any metadata database. I have a simple scheme for organizing my collection, and can correct my metadata rather quickly, but these days, so I don’t even use beets.
Looks like a general case. I do the same a lot with Picard and Foobar, but beats can also auto tag based on file name and populate musicbrainz. Set library directory to that of navidrome so it will be coppied there on import.
If you add a lot of new stuff to your library, you'll often need to add them to MusicBrainz yourself. I use beets and I currently have added 2697 releases (2543 release groups) to MusicBrainz.
Beets is what got me into MusicBrainz. It's an incredible resource. To be fair it's not the easiest of things to get started with and the usability could be better (release drafts, anyone?) but it's efficient once you get the hang of it.
First: Thank you! Secondly: I wish more people did this. If you end up needing to manually enter the data, at least if you add it to a public database more people can benefit, which also makes it feel less frustrating.
I'm in the midst of a major music library overhaul and would not know how I'd ever get it done without Beets. For example, it's clearing out embedded images, fetching new hi-res artwork and verifying FLAC integrity, as I go through artist by artist.
If you are into that, that’s good, but that’s the exact opposite of making my life easier ;)
Auto-tagging is nice to have but it will screw up verification checksums. I would prefer having metadata in a separate DB and keep the files as is, unless I explicitly request exporting the metadata to the original files.
Beets can do this too!
The -C option to avoid copying files and the -W option to prevent writing tags (or set it in the config file)
It will still attempt to match and store the results in its DB for later writing to files, or moving, or querying.
For the data to be most useful, you will need a client that connect to Beets to get the data though, Im not sure how prevelant those are. You can use the web-ui plugin though.
> Beets can do this too!
This is the best summary of beets. It's wildly flexible and configurable.
It's a good tool. However, last I checked, it was not possible to run it in a one-shot stateless fashion, like, passing it a list of music files so it auto-fetches album art, lyrics and updates the very same input files.
> Relatedly, the -q (quiet) option can help with large imports by autotagging without ever bothering to ask for user input. Whenever the normal autotagger mode would ask for confirmation, the quiet mode performs a fallback action that can be configured using the quiet_fallback configuration or --quiet-fallback CLI option. By default it pessimistically skips the file. Alternatively, it can be used as is, by configuring asis.
Been using this for several years now. It's definitely not for the average user. But nothing is quite so flexible.
Well yes, it's not that hard to use but then even using the terminal for an average user is complicated.
There is a webpage on beets website where they list all the functions and explain what it does. Very useful when you go back after half a year and can't remember how it works.
I've loved beets (and MusicBrainz Picard) for years. This bit from the beets docs has always stuck with me when organizing my library.
"An Apology and a Brief Interlude
I would like to sincerely apologize that the autotagger in beets is so fussy. It asks you a lot of complicated questions, insecurely asking that you verify nearly every assumption it makes. This means importing and correcting the tags for a large library can be an endless, tedious process. I’m sorry for this.
Maybe it will help to think of it as a tradeoff. By carefully examining every album you own, you get to become more familiar with your library, its extent, its variation, and its quirks. People used to spend hours lovingly sorting and resorting their shelves of LPs. In the iTunes age, many of us toss our music into a heap and forget about it. This is great for some people. But there’s value in intimate, complete familiarity with your collection. So instead of a chore, try thinking of correcting tags as quality time with your music collection. That’s what I do."
Thanks. I was looking for something like this.
Whatever happened to MusicBrainz Picard?
> MusicBrainz Picard
I don't think it can be used as a CLI tool. It's mainly a GUI app. I've tested it in the past and it works fine too.
Been using with Claude via MCP to tag a bunch of old ripped CDs - fun with mixed results.