From 9a051967f654c9e38dc9be7d1ffc1e8310efc211 Mon Sep 17 00:00:00 2001 From: Deluan Date: Fri, 16 Feb 2024 18:44:58 -0500 Subject: [PATCH] Handle "Infinity" values for ReplayGain. Fix #2862 --- scanner/metadata/metadata.go | 12 ++++------ scanner/metadata/metadata_internal_test.go | 28 ++++++++++++++++++++++ server/initial_setup.go | 4 +++- 3 files changed, 36 insertions(+), 8 deletions(-) diff --git a/scanner/metadata/metadata.go b/scanner/metadata/metadata.go index 273fa0fd..54d37982 100644 --- a/scanner/metadata/metadata.go +++ b/scanner/metadata/metadata.go @@ -223,7 +223,8 @@ func (t Tags) BirthTime() time.Time { return time.Now() } -// Replaygain Properties +// ReplayGain Properties + func (t Tags) RGAlbumGain() float64 { return t.getGainValue("replaygain_album_gain") } func (t Tags) RGAlbumPeak() float64 { return t.getPeakValue("replaygain_album_peak") } func (t Tags) RGTrackGain() float64 { return t.getGainValue("replaygain_track_gain") } @@ -232,15 +233,12 @@ func (t Tags) RGTrackPeak() float64 { return t.getPeakValue("replaygain_track_pe func (t Tags) getGainValue(tagName string) float64 { // Gain is in the form [-]a.bb dB var tag = t.getFirstTagValue(tagName) - if tag == "" { return 0 } - tag = strings.TrimSpace(strings.Replace(tag, "dB", "", 1)) - var value, err = strconv.ParseFloat(tag, 64) - if err != nil { + if err != nil || value == math.Inf(-1) || value == math.Inf(1) { return 0 } return value @@ -249,8 +247,8 @@ func (t Tags) getGainValue(tagName string) float64 { func (t Tags) getPeakValue(tagName string) float64 { var tag = t.getFirstTagValue(tagName) var value, err = strconv.ParseFloat(tag, 64) - if err != nil { - // A default of 1 for peak value resulds in no changes + if err != nil || value == math.Inf(-1) || value == math.Inf(1) { + // A default of 1 for peak value results in no changes return 1 } return value diff --git a/scanner/metadata/metadata_internal_test.go b/scanner/metadata/metadata_internal_test.go index 44967f9f..3b2b198b 100644 --- a/scanner/metadata/metadata_internal_test.go +++ b/scanner/metadata/metadata_internal_test.go @@ -101,4 +101,32 @@ var _ = Describe("Tags", func() { Expect(t.Bpm()).To(Equal(142)) }) }) + + Describe("ReplayGain", func() { + DescribeTable("getGainValue", + func(tag string, expected float64) { + md := &Tags{} + md.Tags = map[string][]string{"replaygain_track_gain": {tag}} + Expect(md.RGTrackGain()).To(Equal(expected)) + + }, + Entry("0", "0", 0.0), + Entry("1.2dB", "1.2dB", 1.2), + Entry("Infinity", "Infinity", 0.0), + Entry("Invalid value", "INVALID VALUE", 0.0), + ) + DescribeTable("getPeakValue", + func(tag string, expected float64) { + md := &Tags{} + md.Tags = map[string][]string{"replaygain_track_peak": {tag}} + Expect(md.RGTrackPeak()).To(Equal(expected)) + + }, + Entry("0", "0", 0.0), + Entry("0.5", "0.5", 0.5), + Entry("Invalid dB suffix", "0.7dB", 1.0), + Entry("Infinity", "Infinity", 1.0), + Entry("Invalid value", "INVALID VALUE", 1.0), + ) + }) }) diff --git a/server/initial_setup.go b/server/initial_setup.go index 39f6f388..b399041f 100644 --- a/server/initial_setup.go +++ b/server/initial_setup.go @@ -5,6 +5,7 @@ import ( "fmt" "time" + "github.com/Masterminds/squirrel" "github.com/google/uuid" "github.com/navidrome/navidrome/conf" "github.com/navidrome/navidrome/consts" @@ -36,9 +37,10 @@ func initialSetup(ds model.DataStore) { }) } +// If the Dev Admin user is not present, create it func createInitialAdminUser(ds model.DataStore, initialPassword string) error { users := ds.User(context.TODO()) - c, err := users.CountAll() + c, err := users.CountAll(model.QueryOptions{Filters: squirrel.Eq{"user_name": consts.DevInitialUserName}}) if err != nil { panic(fmt.Sprintf("Could not access User table: %s", err)) }