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.
Related¶
- Lidarr — does the routine import; beets is the post-import cleanup pass
- slskd — Soulseek client (source of the mojibake'd tags that beets fixes)
- Arrstack — host VM and full compose context
- Music acquisition bringup runbook — Phase 6D context