Skip to content

Setting up beets

Bryan Speelman edited this page Sep 8, 2026 · 1 revision

RipDoctor does not tag or file anything itself. It hands finished tracks to beets, which matches them against MusicBrainz, writes the tags, fetches cover art, computes ReplayGain and decides the path each file goes to.

beets needs its own configuration file, and a fresh install has none. Without one it runs with no plugins — no cover art, no ReplayGain — and files records into ~/Music rather than your library. The import still appears to work, which is what makes this worth checking.

Where beets keeps it

beet config -p

prints the path beets expects. If you already have a beets setup somewhere else, point RipDoctor's process at it with BEETSDIR rather than writing a second configuration.

A configuration that covers what RipDoctor needs

directory: /srv/music          # where finished albums go
plugins: fetchart embedart replaygain

import:
  move: yes                    # move out of review/ rather than copying

fetchart:
  auto: yes
  minwidth: 500
embedart:
  auto: yes
replaygain:
  backend: ffmpeg
  auto: yes
  albums: yes                  # album mode

directory must equal RipDoctor's library setting.

ripdoctor doctor reports when the two disagree, which plugins beets will actually load, and prints a starter configuration if there is none.

The plugins, and what you lose without each

Plugin Without it
fetchart no cover art is fetched
embedart cover art is not written into the tracks, only the folder
replaygain no ReplayGain, so playback level jumps between albums
chroma no acoustic fingerprinting when matching

None of these stop an import. The audio is filed either way.

Album-mode ReplayGain (albums: yes) is the setting that matters most on vinyl, where a side is mastered as one piece and a short quiet track scored on its own comes out far louder than the rest.

What RipDoctor adds on top

RipDoctor runs beets with three settings layered over yours, and changes nothing else:

import:
  quiet: no
  timid: no
  move: yes

Your directory, paths, plugins and everything else are beets' business and are left alone.

Running it as a service

A service does not inherit the environment of your shell. If beets keeps its configuration somewhere non-default, BEETSDIR has to be set in the unit file — otherwise beets finds nothing, runs with no plugins, and imports quietly produce no cover art and no ReplayGain while still filing the audio correctly.

packaging/ripdoctor.service in the repository is a unit to copy and edit.

Checking it took

ripdoctor doctor

The beets plugins line reports what beets loaded, not what it was told to load. A plugin whose own dependency is missing is configured and absent.

Clone this wiki locally