From b4815ecee58ed6ee3814c6004d00d0f99c4a60f2 Mon Sep 17 00:00:00 2001 From: Andrew Katsikas Date: Tue, 26 Dec 2023 18:39:15 -0500 Subject: [PATCH] Add TAK support (#2745) * bug(consts/mime_types): tak-support - 2514 Add tak to mime_types audioFormats Signed-off-by: apkatsikas * bug(scanner): tak-support - 2514 Add tak test fixture file and add fixes for tag_scanner and walk_dir_tree tests Signed-off-by: apkatsikas * Remove comment --------- Signed-off-by: apkatsikas --- consts/mime_types.go | 1 + scanner/tag_scanner_test.go | 3 ++- scanner/walk_dir_tree_test.go | 2 +- tests/fixtures/test.tak | Bin 0 -> 17339 bytes 4 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 tests/fixtures/test.tak diff --git a/consts/mime_types.go b/consts/mime_types.go index c05a0863..225e1857 100644 --- a/consts/mime_types.go +++ b/consts/mime_types.go @@ -33,6 +33,7 @@ var audioFormats = map[string]format{ ".dsf": {typ: "audio/dsd", lossless: true}, ".wv": {typ: "audio/x-wavpack", lossless: true}, ".wvp": {typ: "audio/x-wavpack", lossless: true}, + ".tak": {typ: "audio/tak", lossless: true}, ".mka": {typ: "audio/x-matroska"}, } var imageFormats = map[string]string{ diff --git a/scanner/tag_scanner_test.go b/scanner/tag_scanner_test.go index 5629d221..dc1e4575 100644 --- a/scanner/tag_scanner_test.go +++ b/scanner/tag_scanner_test.go @@ -10,11 +10,12 @@ var _ = Describe("TagScanner", func() { It("return all audio files from the folder", func() { files, err := loadAllAudioFiles("tests/fixtures") Expect(err).ToNot(HaveOccurred()) - Expect(files).To(HaveLen(11)) + Expect(files).To(HaveLen(12)) Expect(files).To(HaveKey("tests/fixtures/test.aiff")) Expect(files).To(HaveKey("tests/fixtures/test.flac")) Expect(files).To(HaveKey("tests/fixtures/test.m4a")) Expect(files).To(HaveKey("tests/fixtures/test.mp3")) + Expect(files).To(HaveKey("tests/fixtures/test.tak")) Expect(files).To(HaveKey("tests/fixtures/test.ogg")) Expect(files).To(HaveKey("tests/fixtures/test.wav")) Expect(files).To(HaveKey("tests/fixtures/test.wma")) diff --git a/scanner/walk_dir_tree_test.go b/scanner/walk_dir_tree_test.go index 45b0dff5..bfe94300 100644 --- a/scanner/walk_dir_tree_test.go +++ b/scanner/walk_dir_tree_test.go @@ -34,7 +34,7 @@ var _ = Describe("walk_dir_tree", func() { Expect(collected[baseDir]).To(MatchFields(IgnoreExtras, Fields{ "Images": BeEmpty(), "HasPlaylist": BeFalse(), - "AudioFilesCount": BeNumerically("==", 12), + "AudioFilesCount": BeNumerically("==", 13), })) Expect(collected[filepath.Join(baseDir, "artist", "an-album")]).To(MatchFields(IgnoreExtras, Fields{ "Images": ConsistOf("cover.jpg", "front.png", "artist.png"), diff --git a/tests/fixtures/test.tak b/tests/fixtures/test.tak new file mode 100644 index 0000000000000000000000000000000000000000..4ed8bb84309be456c041bc17ea79c556f633fbb1 GIT binary patch literal 17339 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