Ignore invalid MBIDs (ex: discogs IDs)

This commit is contained in:
Deluan 2020-10-20 17:45:32 -04:00
parent 173dd52fe1
commit b5e20c1934
3 changed files with 70 additions and 29 deletions

View File

@ -54,32 +54,29 @@ var _ = Describe("ffmpegExtractor", func() {
Context("extractMetadata", func() { Context("extractMetadata", func() {
It("extracts MusicBrainz custom tags", func() { It("extracts MusicBrainz custom tags", func() {
const output = ` 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: Metadata:
title : X ALBUM : Forever Classics
artist : Saara Saara ARTIST : Ludwig van Beethoven
composer : Servio Tulio & Raul Rachid TITLE : Symphony No. 5 in C minor, Op. 67: I. Allegro con brio
album : Colt 45 - Underground Post-Punk, Tropical Tapes, Lo Fi Electronics And Others Sounds From Brazil (1983 - 1993) Selected By Tetine MUSICBRAINZ_ALBUMSTATUS: official
genre : Alternative MUSICBRAINZ_ALBUMTYPE: album
MusicBrainz Release Group Id: 0 MusicBrainz_AlbumComment: MP3
MusicBrainz Album Artist Id: 194 Musicbrainz_Albumid: 71eb5e4a-90e2-4a31-a2d1-a96485fcb667
MusicBrainz Artist Id: 200455 musicbrainz_trackid: ffe06940-727a-415a-b608-b7e45737f9d8
MusicBrainz Album Release Country: Unknown Musicbrainz_Artistid: 1f9df192-a621-4f54-8850-2c5373b7eac9
MusicBrainz Album Id: 11406732 Musicbrainz_Albumartistid: 89ad4ac3-39f7-470e-963a-56509c546377
MusicBrainz Track Id: 11406732-6 Musicbrainz_Releasegroupid: 708b1ae1-2d3d-34c7-b764-2732b154f5b6
Label : Slum Dunk Music musicbrainz_releasetrackid: 6fee2e35-3049-358f-83be-43b36141028b
publisher : Slum Dunk Music CatalogNumber : PLD 1201
MusicBrainz Album Type: Compilation
MusicBrainz Album Comment: MP3
CATALOGNUMBER : SLUM DUNK MUSIC 009
` `
md, _ := extractMetadata("tests/fixtures/test.mp3", output) md, _ := e.extractMetadata("tests/fixtures/test.mp3", output)
Expect(md.CatalogNum()).To(Equal("SLUM DUNK MUSIC 009")) Expect(md.CatalogNum()).To(Equal("PLD 1201"))
Expect(md.MbzTrackID()).To(Equal("11406732-6")) Expect(md.MbzTrackID()).To(Equal("ffe06940-727a-415a-b608-b7e45737f9d8"))
Expect(md.MbzAlbumID()).To(Equal("11406732")) Expect(md.MbzAlbumID()).To(Equal("71eb5e4a-90e2-4a31-a2d1-a96485fcb667"))
Expect(md.MbzArtistID()).To(Equal("200455")) Expect(md.MbzArtistID()).To(Equal("1f9df192-a621-4f54-8850-2c5373b7eac9"))
Expect(md.MbzAlbumArtistID()).To(Equal("194")) Expect(md.MbzAlbumArtistID()).To(Equal("89ad4ac3-39f7-470e-963a-56509c546377"))
Expect(md.MbzAlbumType()).To(Equal("Compilation")) Expect(md.MbzAlbumType()).To(Equal("album"))
Expect(md.MbzAlbumComment()).To(Equal("MP3")) Expect(md.MbzAlbumComment()).To(Equal("MP3"))
}) })

View File

@ -11,6 +11,7 @@ import (
"github.com/deluan/navidrome/conf" "github.com/deluan/navidrome/conf"
"github.com/deluan/navidrome/log" "github.com/deluan/navidrome/log"
"github.com/google/uuid"
) )
type Extractor interface { type Extractor interface {
@ -96,16 +97,16 @@ func (m *baseMetadata) DiscSubtitle() string {
} }
func (m *baseMetadata) CatalogNum() string { return m.getTag("catalognumber") } func (m *baseMetadata) CatalogNum() string { return m.getTag("catalognumber") }
func (m *baseMetadata) MbzTrackID() string { 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 { 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 { 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 { 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 { func (m *baseMetadata) MbzAlbumType() string {
return m.getTag("musicbrainz_albumtype", "musicbrainz album type") return m.getTag("musicbrainz_albumtype", "musicbrainz album type")
@ -158,6 +159,20 @@ func (m *baseMetadata) parseYear(tags ...string) int {
return 0 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 { func (m *baseMetadata) getTag(tags ...string) string {
for _, t := range tags { for _, t := range tags {
if v, ok := m.tags[t]; ok { if v, ok := m.tags[t]; ok {

View File

@ -6,7 +6,7 @@ import (
) )
var _ = Describe("ffmpegMetadata", func() { var _ = Describe("ffmpegMetadata", func() {
Context("parseYear", func() { Describe("parseYear", func() {
It("parses the year correctly", func() { It("parses the year correctly", func() {
var examples = map[string]int{ var examples = map[string]int{
"1985": 1985, "1985": 1985,
@ -31,4 +31,33 @@ var _ = Describe("ffmpegMetadata", func() {
Expect(md.Year()).To(Equal(0)) 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(""))
})
})
}) })