diff --git a/model/metadata/metadata.go b/model/metadata/metadata.go index 1372d0034..00ddcb2a6 100644 --- a/model/metadata/metadata.go +++ b/model/metadata/metadata.go @@ -250,7 +250,15 @@ func processPairMapping(name model.TagName, mapping model.TagConf, lowered model id3Base := parseID3Pairs(name, lowered) if len(aliasValues) > 0 { - id3Base = append(id3Base, parseVorbisPairs(aliasValues)...) + // For lyrics, don't use parseVorbisPairs as parentheses in lyrics content + // should not be interpreted as language keys (e.g. "(intro)" is not a language) + if name == model.TagLyrics { + for _, v := range aliasValues { + id3Base = append(id3Base, NewPair("xxx", v)) + } + } else { + id3Base = append(id3Base, parseVorbisPairs(aliasValues)...) + } } return id3Base } diff --git a/model/metadata/metadata_test.go b/model/metadata/metadata_test.go index 82afd8657..663e306c4 100644 --- a/model/metadata/metadata_test.go +++ b/model/metadata/metadata_test.go @@ -246,6 +246,18 @@ var _ = Describe("Metadata", func() { metadata.NewPair("eng", "Lyrics"), )) }) + + It("should preserve lyrics starting with parentheses from alias tags", func() { + props.Tags = model.RawTags{ + "LYRICS": {"(line one)\nline two\nline three"}, + } + md = metadata.New(filePath, props) + + Expect(md.All()).To(HaveKey(model.TagLyrics)) + Expect(md.Strings(model.TagLyrics)).To(ContainElements( + metadata.NewPair("xxx", "(line one)\nline two\nline three"), + )) + }) }) Describe("ReplayGain", func() {