From 2867cebd55b42f44b0e814de7c0acf6879b5da6a Mon Sep 17 00:00:00 2001 From: Deluan Date: Sat, 7 Jun 2025 12:42:16 -0400 Subject: [PATCH] fix(scanner): normalize attribute strings and add edge case tests for PID calculation Relates to https://github.com/navidrome/navidrome/issues/4183#issuecomment-2952729458 Signed-off-by: Deluan --- model/metadata/persistent_ids.go | 1 + model/metadata/persistent_ids_test.go | 33 +++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/model/metadata/persistent_ids.go b/model/metadata/persistent_ids.go index a71749e8..0a1451cf 100644 --- a/model/metadata/persistent_ids.go +++ b/model/metadata/persistent_ids.go @@ -24,6 +24,7 @@ type hashFunc = func(...string) string func createGetPID(hash hashFunc) func(mf model.MediaFile, md Metadata, spec string) string { var getPID func(mf model.MediaFile, md Metadata, spec string) string getAttr := func(mf model.MediaFile, md Metadata, attr string) string { + attr = strings.TrimSpace(strings.ToLower(attr)) switch attr { case "albumid": return getPID(mf, md, conf.Server.PID.Album) diff --git a/model/metadata/persistent_ids_test.go b/model/metadata/persistent_ids_test.go index 6903abc0..d07b3633 100644 --- a/model/metadata/persistent_ids_test.go +++ b/model/metadata/persistent_ids_test.go @@ -61,6 +61,7 @@ var _ = Describe("getPID", func() { }) }) }) + Context("calculated attributes", func() { BeforeEach(func() { DeferCleanup(configtest.SetupConfig()) @@ -114,4 +115,36 @@ var _ = Describe("getPID", func() { }) }) }) + + Context("edge cases", func() { + When("the spec has spaces between groups", func() { + It("should return the pid", func() { + spec := "albumartist| Album" + md.tags = map[model.TagName][]string{ + "album": {"album name"}, + } + Expect(getPID(mf, md, spec)).To(Equal("(album name)")) + }) + }) + When("the spec has spaces", func() { + It("should return the pid", func() { + spec := "albumartist, album" + md.tags = map[model.TagName][]string{ + "albumartist": {"Album Artist"}, + "album": {"album name"}, + } + Expect(getPID(mf, md, spec)).To(Equal("(Album Artist\\album name)")) + }) + }) + When("the spec has mixed case fields", func() { + It("should return the pid", func() { + spec := "albumartist,Album" + md.tags = map[model.TagName][]string{ + "albumartist": {"Album Artist"}, + "album": {"album name"}, + } + Expect(getPID(mf, md, spec)).To(Equal("(Album Artist\\album name)")) + }) + }) + }) })