v0.15.0: ask the song what it is

Right-click → Identify Track… fingerprints the file with Chromaprint's
fpcalc and asks AcoustID who it is, then proposes the tags it found.

The year is the point. A 60s song kept getting stamped with the year its
CD reissue came out, which sorts the library wrong, so every candidate
carries the recording's *original* year — the earliest release across all
of its release groups — including the candidate that proposes a later
greatest-hits as the album. Ranking separately prefers a plain studio
Album over EP/Single over anything wearing a Compilation or Live
secondary type, so the default proposal is the real album as well.

Nothing is written until accepted: the dialog shows each current value
beside an editable proposed one, and a row starts checked only where the
proposal actually differs from what the file already has, so an untouched
field can never quietly blank a tag. Applying goes through
edit_track_fields, which is what buys the tag write, the abort-if-it-fails
rule, artist/album file relocation and one undo step without re-deriving
any of them.

A selection is a queue reviewed one track at a time; a failure is a
status-bar message that moves on rather than ending the batch. fpcalc is
detected at runtime like ffmpeg and the AcoustID key lives in preferences
(so it syncs, and stays out of git) — the round adds no new dependency.

Also fixes a pre-existing round 40 test that used the real tummult mount
point as its stand-in for an unreachable path, so it failed whenever that
drive was plugged in.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NsiFHdyVg1UhBSxDJfTNRm
This commit is contained in:
2026-09-02 15:40:52 -04:00
co-authored by Claude Opus 5
parent 8c097faacc
commit f0d4d1eff2
12 changed files with 946 additions and 2 deletions
+27
View File
@@ -9,6 +9,33 @@ When a round closes, move its finished items to `tasks-done.md`.
- [ ] archive the done tasks in here to another file, this is crufty....
## Round 45 (2026-09-02) — Ask the song what it is: done, see tasks-done.md
Right-click → Identify Track…: Chromaprint fingerprint + AcoustID lookup, a
proposal dialog, oldest-year-wins. Left on the table:
- [ ] **Batch identify without a dialog per track.** The queue reviews one
track at a time, which is right for a handful and tedious for a hundred.
A "fill only what's empty, above 0.9 confidence, no questions asked" pass
would want the `plan_export()`-then-worker split from `export/exporter.py`
(progress on the status bar, a cancel point) rather than the current
one-at-a-time `_identify_next` chain, plus a summary at the end naming
what it changed. Worth doing only if trav actually has a big pile of
badly-tagged files.
- [ ] **Fetch the cover in the same pass.** An identification hands back
MusicBrainz release IDs, and the Cover Art Archive serves art by release
ID — so a confirmed match could offer artwork without the separate
artist/album text search that `art_search.py` does today. Needs
`meta=releaseids` and a second endpoint; keep the deny-by-default
"nothing is written until accepted" shape.
- [ ] **Genre is still untouched.** AcoustID/MusicBrainz return tags, but
they're folksonomy noise (dozens of overlapping user tags per recording)
and iTunes-style genre is a single word. Deliberately skipped; revisit
only with a mapping trav trusts.
- [ ] **Tracks under ~3 seconds can't be fingerprinted** — Chromaprint returns
"Empty fingerprint" and the status bar says so. Fine for music, would
matter if the library ever holds sound effects.
## Round 40 (2026-08-22) — welcoming the newcomers: done, see tasks-done.md
No startup font modal, a first-run music-folder question, and a portable