Import, tag, and organize music files using beets; enforce consistent folder structure, metadata, and MusicBrainz tagging across the local music library.
79%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Low
Low-risk findings worth noting
Fix and improve this skill with Tessl
tessl review fix ./skills/music-library-organizer/SKILL.mdAutomate music file tagging and library organization using beets. Ingests raw downloads, applies MusicBrainz-backed metadata, enforces directory structure, deduplicates, and prepares files for streaming via Subsonic/Navidrome.
Deep beets mechanics live in
beets-lossless-automation(sibling skill): version-specific config traps, the fpcalc fingerprint capture loop, ORM bulk-injection patterns, full config template, and the 1.6.0→2.x upgrade playbook. This skill stays instance-focused (CT 101 workflow); go there for anything version-fragile or mechanical.
beet import -A means asis — beets imports WITHOUT MusicBrainz lookup (opposite of auto-tag). For MusicBrainz-backed tagging run plain beet import (interactive) or beet import -q after confirming config; never assume -A tags anything.Library/Artist/Year - Album/Track - Title.ext.beet duplicates and resolve conflicts (keep highest quality).subsonic-media-server to rescan library after import completes.homelab-logbook.beet CLI.slskd-mcp for end-to-end acquisition-to-library pipeline.duplicates:
keys: albumartist album title # BARE STRING — a YAML list [albumartist album title] silently matches nothing
tiebreak:
items: [quality_rank, bitdepth, samplerate, bitrate] # must nest under items:/albums: — flat mapping is silently ignored
types:
quality_rank: intwith lib.transaction(): for item in lib.items(): item.attr = x; item.store() — 13,318 items in 2.5s. Row-by-row stores without a wrapping transaction = one fsync per item = hours of D-state disk storm on a 5400 RPM HDD.WAVE, not WAV — rank mappings must match both or the WAV tier silently sinks to the bottom.from beets.library import Library needs that path on PYTHONPATH (here: /usr/share/beets).beet ls -f '$attr' (beets' own read path), not raw SQLite — the two views can disagree after external writes.pgrep -f "beet.*import" self-matches any script whose source contains from beets.library import — use pgrep -af and eyeball the output.fpcalc, not the chroma plugin during import. Chroma during import does a per-file AcoustID API round-trip (measured: 46s for 2 files → ~10 days for a 19k-track library). Local fpcalc runs ~2.5/sec offline; bulk-inject the results into the beets DB afterwards.beet duplicates is the native dedup engine. Set keys [acoustid_fingerprint, albumartist album title]. Quality order (idols' explicit policy): WAV > FLAC > MP3, all bitrates within a tier equal, then bit depth → sample rate → bitrate as fidelity proxy. Gotcha: the plugin sorts tiebreak fields lexically, so raw format ranks WAV below FLAC — use a computed rank field (e.g. a field plugin exposing quality_rank: WAV=3, FLAC=2, MP3=1) and tiebreak [quality_rank, bitdepth, samplerate, bitrate]. Verify which item the plugin keeps with a scratch-library test before any real --move. Use --move into a quarantine dir + --log for the report.ssh root@192.168.2.242; beets 1.6.0 / Python 3.11.2; DB /root/.musiclibrary.db/opt/homelab/navidrome/music (590 GiB, watch free space)/root/.config/beets/config.yaml — autotag: no, write: no, copy: no, move: no (asis import, zero file mutation); chroma configured with idols' AcoustID key.staging-YYYYMMDD/ (hidden); rollback snapshot pre-dedup-YYYYMMDD on PVElsof/fuser (use /proc/*/fd scanning); no ffprobe (beets DB already stores bitrate/depth/rate)nice -n 19 ionice -c3, single-worker, with an flock lockfile so relaunches can't stackpvnkmnk/homelab-proxmox-ansible → docs/findings/2026-09-18-homelab-music-library-cleanup.md and docs/LIBRARY_CLEANUP_WORKSTREAM.md (canonical). Deep beets mechanics live in the beets-lossless-automation skill.slskd-media-acquisition — source of new music filessubsonic-media-server — streaming target after organizationdj-library-curator — curation layer on top of organized libraryhomelab-logbook — import event loggingpvnkmnk/AgenticSelfHostSkills
ff4471e
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.