From afe5a5b32a448ef8db7d45f4a14334c72338cdf3 Mon Sep 17 00:00:00 2001 From: Deluan Date: Tue, 22 Sep 2020 14:42:36 -0400 Subject: [PATCH] Fix extracting tags with spaces in the tagname ("Ex: Album Artist") --- scanner/metadata/ffmpeg.go | 4 ++-- scanner/metadata/ffmpeg_test.go | 10 ++++++++++ scanner/metadata/metadata.go | 16 +++++++++------- 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/scanner/metadata/ffmpeg.go b/scanner/metadata/ffmpeg.go index c34925de8..94097059d 100644 --- a/scanner/metadata/ffmpeg.go +++ b/scanner/metadata/ffmpeg.go @@ -51,7 +51,7 @@ var ( inputRegex = regexp.MustCompile(`(?m)^Input #\d+,.*,\sfrom\s'(.*)'`) // TITLE : Back In Black - tagsRx = regexp.MustCompile(`(?i)^\s{4,6}([\w-]+)\s*:(.*)`) + tagsRx = regexp.MustCompile(`(?i)^\s{4,6}([\w\s-]+)\s*:(.*)`) // Duration: 00:04:16.00, start: 0.000000, bitrate: 995 kb/s` durationRx = regexp.MustCompile(`^\s\sDuration: ([\d.:]+).*bitrate: (\d+)`) @@ -114,7 +114,7 @@ func (m *ffmpegMetadata) parseInfo(info string) { } match := tagsRx.FindStringSubmatch(line) if len(match) > 0 { - tagName := strings.ToLower(match[1]) + tagName := strings.TrimSpace(strings.ToLower(match[1])) tagValue := strings.TrimSpace(match[2]) // Skip when the tag was previously found diff --git a/scanner/metadata/ffmpeg_test.go b/scanner/metadata/ffmpeg_test.go index c5d36ec82..1b2a91f3b 100644 --- a/scanner/metadata/ffmpeg_test.go +++ b/scanner/metadata/ffmpeg_test.go @@ -213,6 +213,16 @@ Input #0, mp3, from '/Users/deluan/Downloads/椎名林檎 - 加爾基 精液 栗 Expect(md.SortArtist()).To(Equal("Shiina, Ringo")) Expect(md.SortAlbumArtist()).To(Equal("Shiina, Ringo")) }) + + It("parses tags with spaces in the name", func() { + const output = ` +Input #0, mp3, from '/Users/deluan/Music/Music/Media/_/Wyclef Jean - From the Hut, to the Projects, to the Mansion/10 - The Struggle (interlude).mp3': + Metadata: + ALBUM ARTIST : Wyclef Jean +` + md, _ := e.extractMetadata("tests/fixtures/test.mp3", output) + Expect(md.AlbumArtist()).To(Equal("Wyclef Jean")) + }) }) It("creates a valid command line", func() { diff --git a/scanner/metadata/metadata.go b/scanner/metadata/metadata.go index 86d3af49f..14b559bbd 100644 --- a/scanner/metadata/metadata.go +++ b/scanner/metadata/metadata.go @@ -65,13 +65,15 @@ type baseMetadata struct { tags map[string]string } -func (m *baseMetadata) Title() string { return m.getTag("title", "sort_name", "titlesort") } -func (m *baseMetadata) Album() string { return m.getTag("album", "sort_album", "albumsort") } -func (m *baseMetadata) Artist() string { return m.getTag("artist", "sort_artist", "artistsort") } -func (m *baseMetadata) AlbumArtist() string { return m.getTag("album_artist", "albumartist") } -func (m *baseMetadata) SortTitle() string { return m.getSortTag("", "title", "name") } -func (m *baseMetadata) SortAlbum() string { return m.getSortTag("", "album") } -func (m *baseMetadata) SortArtist() string { return m.getSortTag("", "artist") } +func (m *baseMetadata) Title() string { return m.getTag("title", "sort_name", "titlesort") } +func (m *baseMetadata) Album() string { return m.getTag("album", "sort_album", "albumsort") } +func (m *baseMetadata) Artist() string { return m.getTag("artist", "sort_artist", "artistsort") } +func (m *baseMetadata) AlbumArtist() string { + return m.getTag("album_artist", "album artist", "albumartist") +} +func (m *baseMetadata) SortTitle() string { return m.getSortTag("", "title", "name") } +func (m *baseMetadata) SortAlbum() string { return m.getSortTag("", "album") } +func (m *baseMetadata) SortArtist() string { return m.getSortTag("", "artist") } func (m *baseMetadata) SortAlbumArtist() string { return m.getSortTag("tso2", "albumartist", "album_artist") }