Some checks failed
Pipeline: Test, Lint, Build / Get version info (push) Has been cancelled
Pipeline: Test, Lint, Build / Lint Go code (push) Has been cancelled
Pipeline: Test, Lint, Build / Test Go code (push) Has been cancelled
Pipeline: Test, Lint, Build / Test JS code (push) Has been cancelled
Pipeline: Test, Lint, Build / Lint i18n files (push) Has been cancelled
Pipeline: Test, Lint, Build / Check Docker configuration (push) Has been cancelled
Pipeline: Test, Lint, Build / Build (darwin/amd64) (push) Has been cancelled
Pipeline: Test, Lint, Build / Build (darwin/arm64) (push) Has been cancelled
Pipeline: Test, Lint, Build / Build (linux/386) (push) Has been cancelled
Pipeline: Test, Lint, Build / Build (linux/amd64) (push) Has been cancelled
Pipeline: Test, Lint, Build / Build (linux/arm/v5) (push) Has been cancelled
Pipeline: Test, Lint, Build / Build (linux/arm/v6) (push) Has been cancelled
Pipeline: Test, Lint, Build / Build (linux/arm/v7) (push) Has been cancelled
Pipeline: Test, Lint, Build / Build (linux/arm64) (push) Has been cancelled
Pipeline: Test, Lint, Build / Build (windows/386) (push) Has been cancelled
Pipeline: Test, Lint, Build / Build (windows/amd64) (push) Has been cancelled
Pipeline: Test, Lint, Build / Push to GHCR (push) Has been cancelled
Pipeline: Test, Lint, Build / Push to Docker Hub (push) Has been cancelled
Pipeline: Test, Lint, Build / Cleanup digest artifacts (push) Has been cancelled
Pipeline: Test, Lint, Build / Build Windows installers (push) Has been cancelled
Pipeline: Test, Lint, Build / Package/Release (push) Has been cancelled
Pipeline: Test, Lint, Build / Upload Linux PKG (push) Has been cancelled
Close stale issues and PRs / stale (push) Has been cancelled
POEditor import / update-translations (push) Has been cancelled
122 lines
3.7 KiB
Go
122 lines
3.7 KiB
Go
package metadata_test
|
|
|
|
import (
|
|
"encoding/json"
|
|
"os"
|
|
"sort"
|
|
|
|
"github.com/navidrome/navidrome/model"
|
|
"github.com/navidrome/navidrome/model/metadata"
|
|
"github.com/navidrome/navidrome/tests"
|
|
. "github.com/navidrome/navidrome/utils/gg"
|
|
. "github.com/onsi/ginkgo/v2"
|
|
. "github.com/onsi/gomega"
|
|
)
|
|
|
|
var _ = Describe("ToMediaFile", func() {
|
|
var (
|
|
props metadata.Info
|
|
md metadata.Metadata
|
|
mf model.MediaFile
|
|
)
|
|
|
|
BeforeEach(func() {
|
|
_, filePath, _ := tests.TempFile(GinkgoT(), "test", ".mp3")
|
|
fileInfo, _ := os.Stat(filePath)
|
|
props = metadata.Info{
|
|
FileInfo: testFileInfo{fileInfo},
|
|
}
|
|
})
|
|
|
|
var toMediaFile = func(tags model.RawTags) model.MediaFile {
|
|
props.Tags = tags
|
|
md = metadata.New("filepath", props)
|
|
return md.ToMediaFile(1, "folderID")
|
|
}
|
|
|
|
Describe("Dates", func() {
|
|
It("should parse properly tagged dates ", func() {
|
|
mf = toMediaFile(model.RawTags{
|
|
"ORIGINALDATE": {"1978-09-10"},
|
|
"DATE": {"1977-03-04"},
|
|
"RELEASEDATE": {"2002-01-02"},
|
|
})
|
|
|
|
Expect(mf.Year).To(Equal(1977))
|
|
Expect(mf.Date).To(Equal("1977-03-04"))
|
|
Expect(mf.OriginalYear).To(Equal(1978))
|
|
Expect(mf.OriginalDate).To(Equal("1978-09-10"))
|
|
Expect(mf.ReleaseYear).To(Equal(2002))
|
|
Expect(mf.ReleaseDate).To(Equal("2002-01-02"))
|
|
})
|
|
|
|
It("should parse dates with only year", func() {
|
|
mf = toMediaFile(model.RawTags{
|
|
"ORIGINALYEAR": {"1978"},
|
|
"DATE": {"1977"},
|
|
"RELEASEDATE": {"2002"},
|
|
})
|
|
|
|
Expect(mf.Year).To(Equal(1977))
|
|
Expect(mf.Date).To(Equal("1977"))
|
|
Expect(mf.OriginalYear).To(Equal(1978))
|
|
Expect(mf.OriginalDate).To(Equal("1978"))
|
|
Expect(mf.ReleaseYear).To(Equal(2002))
|
|
Expect(mf.ReleaseDate).To(Equal("2002"))
|
|
})
|
|
|
|
It("should parse dates tagged the legacy way (no release date)", func() {
|
|
mf = toMediaFile(model.RawTags{
|
|
"DATE": {"2014"},
|
|
"ORIGINALDATE": {"1966"},
|
|
})
|
|
|
|
Expect(mf.Year).To(Equal(1966))
|
|
Expect(mf.OriginalYear).To(Equal(1966))
|
|
Expect(mf.ReleaseYear).To(Equal(2014))
|
|
})
|
|
DescribeTable("legacyReleaseDate (TaggedLikePicard old behavior)",
|
|
func(recordingDate, originalDate, releaseDate, expected string) {
|
|
mf := toMediaFile(model.RawTags{
|
|
"DATE": {recordingDate},
|
|
"ORIGINALDATE": {originalDate},
|
|
"RELEASEDATE": {releaseDate},
|
|
})
|
|
|
|
Expect(mf.ReleaseDate).To(Equal(expected))
|
|
},
|
|
Entry("regular mapping", "2020-05-15", "2019-02-10", "2021-01-01", "2021-01-01"),
|
|
Entry("legacy mapping", "2020-05-15", "2019-02-10", "", "2020-05-15"),
|
|
Entry("legacy mapping, originalYear < year", "2018-05-15", "2019-02-10", "2021-01-01", "2021-01-01"),
|
|
Entry("legacy mapping, originalYear empty", "2020-05-15", "", "2021-01-01", "2021-01-01"),
|
|
Entry("legacy mapping, releaseYear", "2020-05-15", "2019-02-10", "2021-01-01", "2021-01-01"),
|
|
Entry("legacy mapping, same dates", "2020-05-15", "2020-05-15", "", "2020-05-15"),
|
|
)
|
|
})
|
|
|
|
Describe("Lyrics", func() {
|
|
It("should parse the lyrics", func() {
|
|
mf = toMediaFile(model.RawTags{
|
|
"LYRICS:XXX": {"Lyrics"},
|
|
"LYRICS:ENG": {
|
|
"[00:00.00]This is\n[00:02.50]English SYLT\n",
|
|
},
|
|
})
|
|
var actual model.LyricList
|
|
err := json.Unmarshal([]byte(mf.Lyrics), &actual)
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
expected := model.LyricList{
|
|
{Lang: "eng", Line: []model.Line{
|
|
{Value: "This is", Start: P(int64(0))},
|
|
{Value: "English SYLT", Start: P(int64(2500))},
|
|
}, Synced: true},
|
|
{Lang: "xxx", Line: []model.Line{{Value: "Lyrics"}}, Synced: false},
|
|
}
|
|
sort.Slice(actual, func(i, j int) bool { return actual[i].Lang < actual[j].Lang })
|
|
sort.Slice(expected, func(i, j int) bool { return expected[i].Lang < expected[j].Lang })
|
|
Expect(actual).To(Equal(expected))
|
|
})
|
|
})
|
|
})
|