feat(api): deliver loudness gains to every client (M464 #4997)
release / web (push) Successful in 1m44s
release / go (push) Successful in 2m12s
release / govulncheck (push) Successful in 40s
release / android (push) Successful in 5m28s
release / Build signed APK (releases and dev) (push) Successful in 4m42s
release / integration (push) Successful in 15m33s
release / Attach APK to the Release (tag releases only) (push) Skipped
release / Build + push container image (push) Successful in 1m21s
release / Verify release artifacts (tag releases only) (push) Skipped
release / web (push) Successful in 1m44s
release / go (push) Successful in 2m12s
release / govulncheck (push) Successful in 40s
release / android (push) Successful in 5m28s
release / Build signed APK (releases and dev) (push) Successful in 4m42s
release / integration (push) Successful in 15m33s
release / Attach APK to the Release (tag releases only) (push) Skipped
release / Build + push container image (push) Successful in 1m21s
release / Verify release artifacts (tag releases only) (push) Skipped
ReplayGain 2.0 values (gain to -18 LUFS, linear peak) derived from the stored track and album loudness: - Web: GET /api/tracks/replay-gain?ids=... (up to 200), a lookup the player calls for its queue, rather than a field on every TrackRef surface. - Android: track_gain/track_peak and album_gain/album_peak on the sync views, so cached tracks level offline. Storing a measurement logs a track change, and an album's values moving logs an album change, both before the write (#2704), so caches pick the gains up. - OpenSubsonic: replayGain on every song (album, getSong, search3, starred), as a JSON object and an XML element. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -11,6 +11,7 @@ import (
|
||||
"testing"
|
||||
|
||||
"git.fabledsword.com/bvandeusen/minstrel/internal/db/dbq"
|
||||
syncpkg "git.fabledsword.com/bvandeusen/minstrel/internal/sync"
|
||||
)
|
||||
|
||||
// TestLoudnessBackfill_Integration pins which tracks a pass measures, what it
|
||||
@@ -130,6 +131,18 @@ func TestLoudnessBackfill_Integration(t *testing.T) {
|
||||
gotLUFS, gotPeak, gotHist, gotStart, gotVersion)
|
||||
}
|
||||
|
||||
// Each stored measurement told the sync feed, so caching clients re-read
|
||||
// the track and pick up its gain (#4997).
|
||||
var logged int
|
||||
if err := pool.QueryRow(ctx, `SELECT count(*) FROM library_changes
|
||||
WHERE entity_type = 'track' AND op = 'upsert' AND entity_id = $1`,
|
||||
syncpkg.FormatUUID(stale.ID)).Scan(&logged); err != nil {
|
||||
t.Fatalf("count sync changes: %v", err)
|
||||
}
|
||||
if logged != 1 {
|
||||
t.Errorf("re-measuring stale.mp3 logged %d track changes, want 1", logged)
|
||||
}
|
||||
|
||||
// 2. A pass after a complete one is a no-op.
|
||||
res, err = w.pass(ctx)
|
||||
if err != nil {
|
||||
|
||||
Reference in New Issue
Block a user