From 8de1f8bfffad65d21c065826c68f9f91b76926c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrik=20Wallstr=C3=B6m?= Date: Sun, 15 Mar 2026 01:17:53 +0100 Subject: [PATCH] Added SongsByFolder filter MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Patrik Wallström --- server/subsonic/filter/filter_suite_test.go | 17 +++++++++++ server/subsonic/filter/filters.go | 7 +++++ server/subsonic/filter/filters_test.go | 32 +++++++++++++++++++++ 3 files changed, 56 insertions(+) create mode 100644 server/subsonic/filter/filter_suite_test.go create mode 100644 server/subsonic/filter/filters_test.go diff --git a/server/subsonic/filter/filter_suite_test.go b/server/subsonic/filter/filter_suite_test.go new file mode 100644 index 000000000..e78726182 --- /dev/null +++ b/server/subsonic/filter/filter_suite_test.go @@ -0,0 +1,17 @@ +package filter_test + +import ( + "testing" + + "github.com/navidrome/navidrome/log" + "github.com/navidrome/navidrome/tests" + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +func TestFilter(t *testing.T) { + tests.Init(t, false) + log.SetLevel(log.LevelFatal) + RegisterFailHandler(Fail) + RunSpecs(t, "Subsonic Filter Suite") +} diff --git a/server/subsonic/filter/filters.go b/server/subsonic/filter/filters.go index 8ba4f0ff9..17cb32d41 100644 --- a/server/subsonic/filter/filters.go +++ b/server/subsonic/filter/filters.go @@ -90,6 +90,13 @@ func SongsByAlbum(albumId string) Options { }) } +func SongsByFolder(folderID string) Options { + return addDefaultFilters(Options{ + Filters: Eq{"folder_id": folderID}, + Sort: "path", + }) +} + func SongsByRandom(genre string, fromYear, toYear int) Options { options := Options{ Sort: "random", diff --git a/server/subsonic/filter/filters_test.go b/server/subsonic/filter/filters_test.go new file mode 100644 index 000000000..83e764333 --- /dev/null +++ b/server/subsonic/filter/filters_test.go @@ -0,0 +1,32 @@ +package filter_test + +import ( + sq "github.com/Masterminds/squirrel" + . "github.com/navidrome/navidrome/server/subsonic/filter" + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +var _ = Describe("SongsByFolder", func() { + It("sets sort to path", func() { + opts := SongsByFolder("folder-1") + Expect(opts.Sort).To(Equal("path")) + }) + + It("filters by the given folder ID", func() { + opts := SongsByFolder("folder-1") + Expect(opts.Filters).To(Equal(sq.And{sq.Eq{"missing": false}, sq.Eq{"folder_id": "folder-1"}})) + }) + + It("uses a different folder ID per call", func() { + opts := SongsByFolder("folder-2") + Expect(opts.Filters).To(Equal(sq.And{sq.Eq{"missing": false}, sq.Eq{"folder_id": "folder-2"}})) + }) + + It("excludes missing files via default filter", func() { + opts := SongsByFolder("any-folder") + filters, ok := opts.Filters.(sq.And) + Expect(ok).To(BeTrue()) + Expect(filters).To(ContainElement(sq.Eq{"missing": false})) + }) +})