Skip to content

beets

Music library tagger and organizer. Runs on-demand (not in the Lidarr import pipeline) as a sanity-pass tool for cleaning up tags, fixing mojibake from Soulseek peers, and re-organizing files when needed. Pairs well with Discogs / MusicBrainz / AcoustID for fingerprint-based tagging.

Web UI: http://192.168.1.252:8337/ (LAN-only) — minimal browser interface for viewing the library DB

Phase 6D complete — 2026-05-16

Installed alongside Lidarr + slskd on arrstack VM 101. No mandatory configuration applied at install — defaults generated on first boot. Used on-demand via docker exec CLI commands for tag cleanup tasks (e.g., fixing the Soulseek mojibake issue captured in the music-acquisition-bringup lessons).

Service details

Property Value
Host arrstack VM 101 (192.168.1.252) — see Arrstack
Image lscr.io/linuxserver/beets:latest
Container name beets
Network arr Docker bridge
Web port 8337 (LAN-only)
Config dir /opt/mediaserver/beets/config (contains config.yaml + musiclibrary.blb SQLite DB)
Library mount /stash/rodneystash/Music/music (read-write)
Usage pattern On-demand via docker exec; NOT in the Lidarr import pipeline

Usage pattern

beets is not wired into Lidarr's import flow — that's a deliberate choice to avoid two systems fighting over the same staging dir. Lidarr imports files into the library with their original tags + filenames; beets gets run manually when a cleanup pass is needed.

Typical commands (run from the arrstack VM):

# Inspect current beets config
docker exec -it beets beet config

# Import an artist or album dir into beets's library DB (asks for tag confirmation)
docker exec -it beets beet import /music/Gotye/Making\ Mirrors

# Re-read tags from disk into beets's library DB (after external changes)
docker exec -it beets beet update

# Find duplicates
docker exec -it beets beet duplicates

# List tracks matching a query
docker exec -it beets beet list artist:Gotye

For tag fixes (e.g., the Soulseek-mojibake issue where apostrophes get UTF-8-as-Latin-1 corrupted):

# Use the modify command to overwrite tags on matching tracks
docker exec -it beets beet modify -a 'artist:Gotye' \
  album:'Making Mirrors' --query 'title:Donât'

Deferred configuration

These are reasonable additions when you actually need them — not configured at install time:

  • Discogs plugin — high-quality tagging source (better than MusicBrainz for some genres). Requires a Discogs API token.
  • MusicBrainz Picard-style album consistency — group tracks by MusicBrainz release ID at tag time.
  • Auto-tagger config — confidence thresholds, default actions for ambiguous matches.
  • ReplayGain plugin — loudness normalization tagging.
  • Acousticbrainz / AcoustID — audio fingerprint matching for the unfortunate cases where tags are missing entirely.

All configurable in /opt/mediaserver/beets/config.yaml on the arrstack VM.