From b5e20c1934142d51a1b6fb2162720a4a509d3761 Mon Sep 17 00:00:00 2001 From: Deluan Date: Tue, 20 Oct 2020 17:45:32 -0400 Subject: [PATCH] Ignore invalid MBIDs (ex: discogs IDs) --- scanner/metadata/ffmpeg_test.go | 45 +++++++++++++++---------------- scanner/metadata/metadata.go | 23 +++++++++++++--- scanner/metadata/metadata_test.go | 31 ++++++++++++++++++++- 3 files changed, 70 insertions(+), 29 deletions(-) diff --git a/scanner/metadata/ffmpeg_test.go b/scanner/metadata/ffmpeg_test.go index 5a6afbe2..0ccc8ca6 100644 --- a/scanner/metadata/ffmpeg_test.go +++ b/scanner/metadata/ffmpeg_test.go @@ -54,32 +54,29 @@ var _ = Describe("ffmpegExtractor", func() { Context("extractMetadata", func() { It("extracts MusicBrainz custom tags", func() { const output = ` -Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'Colt 45 - Underground Post-Punk, Tropical Tapes, Lo Fi Electronics And Others Sounds From Brazil (1983 - 1993) Selected By Tetine/01-06 X.m4a': +Input #0, ape, from './Capture/02 01 - Symphony No. 5 in C minor, Op. 67 I. Allegro con brio - Ludwig van Beethoven.ape': Metadata: - title : X - artist : Saara Saara - composer : Servio Tulio & Raul Rachid - album : Colt 45 - Underground Post-Punk, Tropical Tapes, Lo Fi Electronics And Others Sounds From Brazil (1983 - 1993) Selected By Tetine - genre : Alternative - MusicBrainz Release Group Id: 0 - MusicBrainz Album Artist Id: 194 - MusicBrainz Artist Id: 200455 - MusicBrainz Album Release Country: Unknown - MusicBrainz Album Id: 11406732 - MusicBrainz Track Id: 11406732-6 - Label : Slum Dunk Music - publisher : Slum Dunk Music - MusicBrainz Album Type: Compilation - MusicBrainz Album Comment: MP3 - CATALOGNUMBER : SLUM DUNK MUSIC 009 + ALBUM : Forever Classics + ARTIST : Ludwig van Beethoven + TITLE : Symphony No. 5 in C minor, Op. 67: I. Allegro con brio + MUSICBRAINZ_ALBUMSTATUS: official + MUSICBRAINZ_ALBUMTYPE: album + MusicBrainz_AlbumComment: MP3 + Musicbrainz_Albumid: 71eb5e4a-90e2-4a31-a2d1-a96485fcb667 + musicbrainz_trackid: ffe06940-727a-415a-b608-b7e45737f9d8 + Musicbrainz_Artistid: 1f9df192-a621-4f54-8850-2c5373b7eac9 + Musicbrainz_Albumartistid: 89ad4ac3-39f7-470e-963a-56509c546377 + Musicbrainz_Releasegroupid: 708b1ae1-2d3d-34c7-b764-2732b154f5b6 + musicbrainz_releasetrackid: 6fee2e35-3049-358f-83be-43b36141028b + CatalogNumber : PLD 1201 ` - md, _ := extractMetadata("tests/fixtures/test.mp3", output) - Expect(md.CatalogNum()).To(Equal("SLUM DUNK MUSIC 009")) - Expect(md.MbzTrackID()).To(Equal("11406732-6")) - Expect(md.MbzAlbumID()).To(Equal("11406732")) - Expect(md.MbzArtistID()).To(Equal("200455")) - Expect(md.MbzAlbumArtistID()).To(Equal("194")) - Expect(md.MbzAlbumType()).To(Equal("Compilation")) + md, _ := e.extractMetadata("tests/fixtures/test.mp3", output) + Expect(md.CatalogNum()).To(Equal("PLD 1201")) + Expect(md.MbzTrackID()).To(Equal("ffe06940-727a-415a-b608-b7e45737f9d8")) + Expect(md.MbzAlbumID()).To(Equal("71eb5e4a-90e2-4a31-a2d1-a96485fcb667")) + Expect(md.MbzArtistID()).To(Equal("1f9df192-a621-4f54-8850-2c5373b7eac9")) + Expect(md.MbzAlbumArtistID()).To(Equal("89ad4ac3-39f7-470e-963a-56509c546377")) + Expect(md.MbzAlbumType()).To(Equal("album")) Expect(md.MbzAlbumComment()).To(Equal("MP3")) }) diff --git a/scanner/metadata/metadata.go b/scanner/metadata/metadata.go index b9a4585a..2bd6883a 100644 --- a/scanner/metadata/metadata.go +++ b/scanner/metadata/metadata.go @@ -11,6 +11,7 @@ import ( "github.com/deluan/navidrome/conf" "github.com/deluan/navidrome/log" + "github.com/google/uuid" ) type Extractor interface { @@ -96,16 +97,16 @@ func (m *baseMetadata) DiscSubtitle() string { } func (m *baseMetadata) CatalogNum() string { return m.getTag("catalognumber") } func (m *baseMetadata) MbzTrackID() string { - return m.getTag("musicbrainz_trackid", "musicbrainz track id") + return m.getMbzID("musicbrainz_trackid", "musicbrainz track id") } func (m *baseMetadata) MbzAlbumID() string { - return m.getTag("musicbrainz_albumid", "musicbrainz album id") + return m.getMbzID("musicbrainz_albumid", "musicbrainz album id") } func (m *baseMetadata) MbzArtistID() string { - return m.getTag("musicbrainz_artistid", "musicbrainz artist id") + return m.getMbzID("musicbrainz_artistid", "musicbrainz artist id") } func (m *baseMetadata) MbzAlbumArtistID() string { - return m.getTag("musicbrainz_albumartistid", "musicbrainz album artist id") + return m.getMbzID("musicbrainz_albumartistid", "musicbrainz album artist id") } func (m *baseMetadata) MbzAlbumType() string { return m.getTag("musicbrainz_albumtype", "musicbrainz album type") @@ -158,6 +159,20 @@ func (m *baseMetadata) parseYear(tags ...string) int { return 0 } +func (m *baseMetadata) getMbzID(tags ...string) string { + var value string + for _, t := range tags { + if v, ok := m.tags[t]; ok { + value = v + break + } + } + if _, err := uuid.Parse(value); err != nil { + return "" + } + return value +} + func (m *baseMetadata) getTag(tags ...string) string { for _, t := range tags { if v, ok := m.tags[t]; ok { diff --git a/scanner/metadata/metadata_test.go b/scanner/metadata/metadata_test.go index 876abc3b..f41134eb 100644 --- a/scanner/metadata/metadata_test.go +++ b/scanner/metadata/metadata_test.go @@ -6,7 +6,7 @@ import ( ) var _ = Describe("ffmpegMetadata", func() { - Context("parseYear", func() { + Describe("parseYear", func() { It("parses the year correctly", func() { var examples = map[string]int{ "1985": 1985, @@ -31,4 +31,33 @@ var _ = Describe("ffmpegMetadata", func() { Expect(md.Year()).To(Equal(0)) }) }) + + Describe("getMbzID", func() { + It("return a valid MBID", func() { + md := &baseMetadata{} + md.tags = map[string]string{ + "musicbrainz_trackid": "8f84da07-09a0-477b-b216-cc982dabcde1", + "musicbrainz_albumid": "f68c985d-f18b-4f4a-b7f0-87837cf3fbf9", + "musicbrainz_artistid": "89ad4ac3-39f7-470e-963a-56509c546377", + "musicbrainz_albumartistid": "ada7a83c-e3e1-40f1-93f9-3e73dbc9298a", + } + Expect(md.MbzTrackID()).To(Equal("8f84da07-09a0-477b-b216-cc982dabcde1")) + Expect(md.MbzAlbumID()).To(Equal("f68c985d-f18b-4f4a-b7f0-87837cf3fbf9")) + Expect(md.MbzArtistID()).To(Equal("89ad4ac3-39f7-470e-963a-56509c546377")) + Expect(md.MbzAlbumArtistID()).To(Equal("ada7a83c-e3e1-40f1-93f9-3e73dbc9298a")) + }) + It("return empty string for invalid MBID", func() { + md := &baseMetadata{} + md.tags = map[string]string{ + "musicbrainz_trackid": "11406732-6", + "musicbrainz_albumid": "11406732", + "musicbrainz_artistid": "200455", + "musicbrainz_albumartistid": "194", + } + Expect(md.MbzTrackID()).To(Equal("")) + Expect(md.MbzAlbumID()).To(Equal("")) + Expect(md.MbzArtistID()).To(Equal("")) + Expect(md.MbzAlbumArtistID()).To(Equal("")) + }) + }) })