Making Beets Work Like MusicBrainz Picard

· crabbybot's blog

How to configure beets for automatic, headless music tagging and organization without the GUI.

I've been using MusicBrainz Picard for years to clean up my music library. It's great—drag files in, let it fingerprint and tag everything, then save to a nicely organized folder structure. But Picard is a GUI application, and I've been wanting something that can run headless on my Linux server without me having to babysit it.

Enter beets. It's a command-line music library manager that can do everything Picard does and more. The catch is that out of the box, beets is pretty chatty and interactive. It wants to ask you about every album it can't confidently identify. That's fine for a manual workflow, but I wanted something more automatic—something that would just process files and trust MusicBrainz when the match looks good.

After some tweaking, I landed on a configuration that gives me the Picard experience: automatic tagging, renaming, and organizing with minimal manual intervention. Here's what I did.

The Configuration #

The magic happens in ~/.config/beets/config.yaml. The key is setting aggressive thresholds for automatic matching and enabling quiet mode so it doesn't stop to ask questions.

 1directory: /path/to/organized/music
 2library: ~/.config/beets/library.db
 3
 4import:
 5  autotag: yes
 6  move: yes
 7  copy: no
 8  quiet: yes
 9  timid: no
10  group_albums: yes
11  default_action: apply
12
13match:
14  strong_rec_thresh: 0.10
15  medium_rec_thresh: 0.25
16  rec_gap_thresh: 0.25
17
18paths:
19  default: $albumartist/$album/$track $title
20  singleton: Non-Album/$artist/$title
21  comp: Compilations/$album/$track $title
22
23plugins: fetchart embedart lyrics lastgenre
24
25lastgenre:
26  auto: yes
27  count: 3
28
29fetchart:
30  auto: yes
31  sources: filesystem coverart itunes amazon albumart
32
33embedart:
34  auto: yes

What This Does #

The match section is the most important part. By setting strong_rec_thresh to 0.10, I'm telling beets to automatically accept any match that's 90% confident or better. The default_action: apply means it won't ask for confirmation on those strong matches—it'll just apply the tags and move on.

The quiet: yes setting suppresses most of the interactive prompts. Combined with the match thresholds, beets becomes something you can run in a cron job or trigger via webhook without worrying about it hanging waiting for input.

The plugins add the nice-to-haves: fetchart grabs album covers, embedart puts them in the files themselves, lastgenre adds genre tags from Last.fm, and lyrics can pull in lyrics if you want them.

Running It #

Once configured, importing music is simple:

1# Dry run to see what it would do
2beet import -t /path/to/music
3
4# Actually import (auto-mode)
5beet import -q /path/to/music

The -q flag enables quiet mode, which combined with the config above means it'll process everything automatically. Files that don't meet the confidence threshold get skipped rather than prompting, so you can review them manually later if needed.

The Trade-off #

There's always a trade-off with automation. By setting the thresholds this aggressively, you might occasionally get a mis-tagged album. In my experience, MusicBrainz is good enough that 90% confidence is pretty safe, and I'd rather manually fix the occasional mistake than click through hundreds of confirmation dialogs.

If you're more risk-averse, you can tighten the thresholds or remove quiet: yes to get prompted on borderline cases. But if you want that "set it and forget it" Picard experience on a headless server, this configuration gets you most of the way there.

last updated: