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:
@@ -18,6 +18,7 @@ package api
|
||||
|
||||
import (
|
||||
"git.fabledsword.com/bvandeusen/minstrel/internal/db/dbq"
|
||||
"git.fabledsword.com/bvandeusen/minstrel/internal/library"
|
||||
syncpkg "git.fabledsword.com/bvandeusen/minstrel/internal/sync"
|
||||
)
|
||||
|
||||
@@ -49,9 +50,14 @@ type albumSyncView struct {
|
||||
ReleaseDate *string `json:"release_date"`
|
||||
CoverArtPath *string `json:"cover_art_path"`
|
||||
Mbid *string `json:"mbid"`
|
||||
// AlbumGain and AlbumPeak are the album's ReplayGain 2.0 values (#4997):
|
||||
// dB to the -18 LUFS reference, and a linear peak. Null until every track
|
||||
// on the album is measured.
|
||||
AlbumGain *float32 `json:"album_gain"`
|
||||
AlbumPeak *float32 `json:"album_peak"`
|
||||
}
|
||||
|
||||
func toAlbumSyncView(a dbq.Album) albumSyncView {
|
||||
func toAlbumSyncView(a dbq.Album, g library.ReplayGain) albumSyncView {
|
||||
var releaseDate *string
|
||||
if a.ReleaseDate.Valid {
|
||||
s := a.ReleaseDate.Time.Format("2006-01-02")
|
||||
@@ -65,6 +71,8 @@ func toAlbumSyncView(a dbq.Album) albumSyncView {
|
||||
ReleaseDate: releaseDate,
|
||||
CoverArtPath: a.CoverArtPath,
|
||||
Mbid: a.Mbid,
|
||||
AlbumGain: g.AlbumGain,
|
||||
AlbumPeak: g.AlbumPeak,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -92,9 +100,14 @@ type trackSyncView struct {
|
||||
// track is playable, which is a yes/no. The "gone since" clock is an
|
||||
// operator concern and lives on the admin surface.
|
||||
Missing bool `json:"missing"`
|
||||
// TrackGain and TrackPeak are the track's ReplayGain 2.0 values (#4997).
|
||||
// Null until the track is measured. The album's pair rides on the album
|
||||
// view, since it changes when the album does, not when this track does.
|
||||
TrackGain *float32 `json:"track_gain"`
|
||||
TrackPeak *float32 `json:"track_peak"`
|
||||
}
|
||||
|
||||
func toTrackSyncView(t dbq.Track) trackSyncView {
|
||||
func toTrackSyncView(t dbq.Track, g library.ReplayGain) trackSyncView {
|
||||
return trackSyncView{
|
||||
ID: syncpkg.FormatUUID(t.ID),
|
||||
AlbumID: syncpkg.FormatUUID(t.AlbumID),
|
||||
@@ -107,6 +120,8 @@ func toTrackSyncView(t dbq.Track) trackSyncView {
|
||||
FileFormat: t.FileFormat,
|
||||
Genre: t.Genre,
|
||||
Missing: t.MissingSince.Valid,
|
||||
TrackGain: g.TrackGain,
|
||||
TrackPeak: g.TrackPeak,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user