diff --git a/model/metadata/map_mediafile.go b/model/metadata/map_mediafile.go index 4415d8ed6..b46174c59 100644 --- a/model/metadata/map_mediafile.go +++ b/model/metadata/map_mediafile.go @@ -135,7 +135,7 @@ func (md Metadata) mapGain(rg, r128 model.TagName) *float64 { } func (md Metadata) mapLyrics() string { - rawLyrics := md.rawPairs(model.TagLyrics) + rawLyrics := md.Pairs(model.TagLyrics) lyricList := make(model.LyricList, 0, len(rawLyrics)) diff --git a/model/metadata/metadata.go b/model/metadata/metadata.go index c62f33776..48928f989 100644 --- a/model/metadata/metadata.go +++ b/model/metadata/metadata.go @@ -70,7 +70,6 @@ func New(filePath string, info Info) Metadata { return Metadata{ filePath: filePath, fileInfo: info.FileInfo, - rawTags: lowerTags(info.Tags), tags: clean(filePath, info.Tags), audioProps: info.AudioProperties, hasPicture: info.HasPicture, @@ -80,7 +79,6 @@ func New(filePath string, info Info) Metadata { type Metadata struct { filePath string fileInfo FileInfo - rawTags model.Tags tags model.Tags audioProps AudioProperties hasPicture bool @@ -116,14 +114,6 @@ func (md Metadata) Pairs(key model.TagName) []Pair { values := md.tags[key] return slice.Map(values, func(v string) Pair { return Pair(v) }) } -func (md Metadata) rawPairs(key model.TagName) []Pair { - mapping, ok := model.TagMappings()[key] - if !ok { - return nil - } - values := filterDuplicatedOrEmptyValues(processPairMapping(key, mapping, md.rawTags)) - return slice.Map(values, func(v string) Pair { return Pair(v) }) -} func (md Metadata) first(key model.TagName) string { if v, ok := md.tags[key]; ok && len(v) > 0 { return v[0] diff --git a/model/metadata/metadata_test.go b/model/metadata/metadata_test.go index 350731b89..7573ac34a 100644 --- a/model/metadata/metadata_test.go +++ b/model/metadata/metadata_test.go @@ -105,7 +105,7 @@ var _ = Describe("Metadata", func() { props.Tags = model.RawTags{ "Title": {strings.Repeat("a", 2048)}, "Comment": {strings.Repeat("a", 8192)}, - "lyrics:xxx": {strings.Repeat("a", 60000)}, + "lyrics:xxx": {strings.Repeat("a", 2_000_000)}, } md = metadata.New(filePath, props) @@ -116,9 +116,21 @@ var _ = Describe("Metadata", func() { Expect(pair).To(HaveLen(1)) Expect(pair[0].Key()).To(Equal("xxx")) + // Lyrics keep a much larger cap so word-timed karaoke survives. // Note: a total of 6 characters are lost from maxLength from - // the key portion and separator - Expect(pair[0].Value()).To(HaveLen(32762)) + // the key portion and separator. + Expect(pair[0].Value()).To(HaveLen(1048570)) + }) + + It("keeps embedded lyrics that exceed the old 32KB cap", func() { + props.Tags = model.RawTags{ + "lyrics:xxx": {strings.Repeat("a", 60000)}, + } + md = metadata.New(filePath, props) + + pair := md.Pairs(model.TagLyrics) + Expect(pair).To(HaveLen(1)) + Expect(pair[0].Value()).To(HaveLen(60000)) }) It("should split multiple values", func() { diff --git a/resources/mappings.yaml b/resources/mappings.yaml index 16dddd504..2e4570e16 100644 --- a/resources/mappings.yaml +++ b/resources/mappings.yaml @@ -110,7 +110,9 @@ main: lyrics: # Note, @lyr and wm/lyrics have been removed. Taglib somehow appears to always populate `lyrics:xxx` aliases: [ uslt:description, lyrics, unsyncedlyrics ] - maxLength: 32768 + # Generous cap: word-timed TTML/Enhanced-LRC karaoke for a full song can run + # well past the previous 32KB limit. Still bounded to guard against pathological tags. + maxLength: 1048576 type: pair # ex: lyrics:eng, lyrics:xxx comment: aliases: [ comm:description, comment, ©cmt, description, icmt ]