Files
minstrel/internal/db/migrations/0097_requeue_short_track_prints.up.sql
T
bvandeusenandClaude Opus 5.5 cb1f619a21
release / govulncheck (push) Successful in 16s
release / web (push) Successful in 1m26s
release / go (push) Successful in 1m43s
release / integration (push) Successful in 5m14s
release / android (push) Successful in 5m15s
release / Build signed APK (releases and dev) (push) Successful in 5m20s
release / Attach APK to the Release (tag releases only) (push) Skipped
release / Build + push container image (push) Successful in 1m18s
release / Verify release artifacts (tag releases only) (push) Skipped
fix: a track shorter than the fingerprint span keeps its print (#6178)
The image's fpcalc 1.5.1 exits 3 with "Error decoding audio frame (End
of file)" whenever it reaches the end of a file before -length, at any
length, so every track under two minutes failed both the AcoustID lookup
print and the duplicate-detection print: 471 lookups and all 1,979
present short tracks' chromaprints.

- runFingerprintTool returns the tool's stdout beside a toolExitError.
- fpcalcReadToEnd keeps a partial exit whose stderr is the end of file
  and whose declared DURATION is within the span asked for. A damaged
  file that stops early declares more than it read, and still fails.
- Migration 0097 clears the stored failures so the lookup worker and
  the fingerprint backfill take those tracks again.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 11:01:23 -04:00

21 lines
1.0 KiB
SQL

-- #6178: the image's fpcalc exits 3 ("Error decoding audio frame (End of
-- file)") on every file shorter than the span it is asked for, so every track
-- under two minutes failed both prints. The failure was stored as a verdict,
-- and a verdict is not retried until the file changes. fpcalcReadToEnd now
-- keeps those prints; clear the failures so the workers take them again.
-- The AcoustID lookup's queue takes a track with no lookup row.
DELETE FROM track_acoustid_lookups
WHERE state = 'failed'
AND detail LIKE '%Error decoding audio frame (End of file)%';
-- The fingerprint backfill's queue takes a track with no fingerprint row. A
-- NULL chromaprint is always a verdict (an inconclusive attempt stores
-- nothing), and on a track no longer than the span it was taken at it is this
-- failure. A track that is damaged fails again and is stamped again.
DELETE FROM track_fingerprints f
USING tracks t
WHERE f.track_id = t.id
AND f.chromaprint IS NULL
AND t.duration_ms <= f.chromaprint_length_sec * 1000;