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() {
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"))
})

View File

@ -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 {

View File

@ -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(""))
})
})
})