Merge pull request #366 from whipper-team/feature/issue-200-add-more-musicbrainz-identifiers
Add Track, Release Group, and Work MBIDs to ripped files
This commit is contained in:
@@ -52,6 +52,8 @@ class TrackMetadata(object):
|
||||
mbid = None
|
||||
sortName = None
|
||||
mbidArtist = None
|
||||
mbidRecording = None
|
||||
mbidWorks = []
|
||||
|
||||
|
||||
class DiscMetadata(object):
|
||||
@@ -75,6 +77,7 @@ class DiscMetadata(object):
|
||||
releaseType = None
|
||||
|
||||
mbid = None
|
||||
mbidReleaseGroup = None
|
||||
mbidArtist = None
|
||||
url = None
|
||||
|
||||
@@ -144,6 +147,19 @@ class _Credit(list):
|
||||
joinString=";")
|
||||
|
||||
|
||||
def _getWorks(recording):
|
||||
"""Get "performance of" works out of a recording."""
|
||||
works = []
|
||||
valid_work_rel_types = [
|
||||
u'a3005666-a872-32c3-ad06-98af558e99b0', # "Performance"
|
||||
]
|
||||
if 'work-relation-list' in recording:
|
||||
for work in recording['work-relation-list']:
|
||||
if work['type-id'] in valid_work_rel_types:
|
||||
works.append(work['work']['id'])
|
||||
return works
|
||||
|
||||
|
||||
def _getMetadata(releaseShort, release, discid, country=None):
|
||||
"""
|
||||
@type release: C{dict}
|
||||
@@ -165,7 +181,7 @@ def _getMetadata(releaseShort, release, discid, country=None):
|
||||
|
||||
discMD = DiscMetadata()
|
||||
|
||||
discMD.releaseType = releaseShort.get('release-group', {}).get('type')
|
||||
discMD.releaseType = release['release-group']['type']
|
||||
discCredit = _Credit(release['artist-credit'])
|
||||
|
||||
# FIXME: is there a better way to check for VA ?
|
||||
@@ -188,6 +204,7 @@ def _getMetadata(releaseShort, release, discid, country=None):
|
||||
discMD.release = release['date']
|
||||
|
||||
discMD.mbid = release['id']
|
||||
discMD.mbidReleaseGroup = release['release-group']['id']
|
||||
discMD.mbidArtist = discCredit.getIds()
|
||||
discMD.url = 'https://musicbrainz.org/release/' + release['id']
|
||||
|
||||
@@ -229,7 +246,9 @@ def _getMetadata(releaseShort, release, discid, country=None):
|
||||
track.mbidArtist = trackCredit.getIds()
|
||||
|
||||
track.title = t['recording']['title']
|
||||
track.mbid = t['recording']['id']
|
||||
track.mbid = t['id']
|
||||
track.mbidRecording = t['recording']['id']
|
||||
track.mbidWorks = _getWorks(t['recording'])
|
||||
|
||||
# FIXME: unit of duration ?
|
||||
track.duration = int(t['recording'].get('length', 0))
|
||||
@@ -304,7 +323,9 @@ def musicbrainz(discid, country=None, record=False):
|
||||
|
||||
res = musicbrainzngs.get_release_by_id(
|
||||
release['id'], includes=["artists", "artist-credits",
|
||||
"recordings", "discids", "labels"])
|
||||
"recordings", "discids", "labels",
|
||||
"recording-level-rels", "work-rels",
|
||||
"release-groups"])
|
||||
_record(record, 'release', release['id'], res)
|
||||
releaseDetail = res['release']
|
||||
formatted = json.dumps(releaseDetail, sort_keys=False, indent=4)
|
||||
|
||||
@@ -386,6 +386,7 @@ class Program:
|
||||
releaseArtist = self.metadata.artist
|
||||
disc = self.metadata.title
|
||||
mbidRelease = self.metadata.mbid
|
||||
mbidReleaseGroup = self.metadata.mbidReleaseGroup
|
||||
mbidReleaseArtist = self.metadata.mbidArtist
|
||||
|
||||
if number > 0:
|
||||
@@ -393,8 +394,10 @@ class Program:
|
||||
track = self.metadata.tracks[number - 1]
|
||||
trackArtist = track.artist
|
||||
title = track.title
|
||||
mbidRecording = track.mbid
|
||||
mbidRecording = track.mbidRecording
|
||||
mbidTrack = track.mbid
|
||||
mbidTrackArtist = track.mbidArtist
|
||||
mbidWorks = track.mbidWorks
|
||||
except IndexError as e:
|
||||
logger.error('no track %d found, %r', number, e)
|
||||
raise
|
||||
@@ -420,10 +423,14 @@ class Program:
|
||||
tags['DATE'] = self.metadata.release
|
||||
|
||||
if number > 0:
|
||||
tags['MUSICBRAINZ_RELEASETRACKID'] = mbidTrack
|
||||
tags['MUSICBRAINZ_TRACKID'] = mbidRecording
|
||||
tags['MUSICBRAINZ_ARTISTID'] = mbidTrackArtist
|
||||
tags['MUSICBRAINZ_ALBUMID'] = mbidRelease
|
||||
tags['MUSICBRAINZ_RELEASEGROUPID'] = mbidReleaseGroup
|
||||
tags['MUSICBRAINZ_ALBUMARTISTID'] = mbidReleaseArtist
|
||||
if len(mbidWorks) > 0:
|
||||
tags['MUSICBRAINZ_WORKID'] = mbidWorks
|
||||
|
||||
# TODO/FIXME: ISRC tag
|
||||
|
||||
|
||||
@@ -182,6 +182,10 @@ class MetadataTestCase(unittest.TestCase):
|
||||
self.assertEqual(track1.mbidArtist,
|
||||
u'38bfaa7f-ee98-48cb-acd0-946d7aeecd76'
|
||||
';4b462375-c508-432a-8c88-ceeec38b16ae')
|
||||
self.assertEqual(track1.mbid,
|
||||
u'1cc96e78-28ed-3820-b0b6-614c35b121ac')
|
||||
self.assertEqual(track1.mbidRecording,
|
||||
u'fde5622c-ce23-4ebb-975d-51d4a926f901')
|
||||
|
||||
track2 = metadata.tracks[1]
|
||||
|
||||
@@ -190,3 +194,54 @@ class MetadataTestCase(unittest.TestCase):
|
||||
self.assertEqual(track2.mbidArtist,
|
||||
u'38bfaa7f-ee98-48cb-acd0-946d7aeecd76'
|
||||
';4b462375-c508-432a-8c88-ceeec38b16ae')
|
||||
self.assertEqual(track2.mbid,
|
||||
u'f16db4bf-9a34-3d5a-a975-c9375ab7a2ca')
|
||||
self.assertEqual(track2.mbidRecording,
|
||||
u'5f19758e-7421-4c71-a599-9a9575d8e1b0')
|
||||
|
||||
def testAllAvailableMetadata(self):
|
||||
"""Check that all possible metadata gets assigned."""
|
||||
# Using: David Rovics - The Other Side
|
||||
# https://musicbrainz.org/release/6109ceed-7e21-490b-b5ad-3a66b4e4cfbb
|
||||
filename = 'whipper.release.6109ceed-7e21-490b-b5ad-3a66b4e4cfbb.json'
|
||||
path = os.path.join(os.path.dirname(__file__), filename)
|
||||
handle = open(path, "rb")
|
||||
response = json.loads(handle.read())
|
||||
handle.close()
|
||||
discid = "cHW1Uutl_kyWNaLJsLmTGTe4rnE-"
|
||||
|
||||
metadata = mbngs._getMetadata({}, response['release'], discid)
|
||||
self.assertEqual(metadata.artist, u'David Rovics')
|
||||
self.assertEqual(metadata.sortName, u'Rovics, David')
|
||||
self.assertFalse(metadata.various)
|
||||
self.assertIsInstance(metadata.tracks, list)
|
||||
self.assertEqual(metadata.release, u'2015')
|
||||
self.assertEqual(metadata.releaseTitle, u'The Other Side')
|
||||
self.assertEqual(metadata.releaseType, u'Album')
|
||||
self.assertEqual(metadata.mbid,
|
||||
u'6109ceed-7e21-490b-b5ad-3a66b4e4cfbb')
|
||||
self.assertEqual(metadata.mbidReleaseGroup,
|
||||
u'99850b41-a06e-4fb8-992c-75c191a77803')
|
||||
self.assertEqual(metadata.mbidArtist,
|
||||
u'4d56eb9f-13b3-4f05-9db7-50195378d49f')
|
||||
self.assertEqual(metadata.url,
|
||||
u'https://musicbrainz.org/release'
|
||||
'/6109ceed-7e21-490b-b5ad-3a66b4e4cfbb')
|
||||
self.assertEqual(metadata.catalogNumber, u'[none]')
|
||||
self.assertEqual(metadata.barcode, u'700261430249')
|
||||
|
||||
self.assertEqual(len(metadata.tracks), 16)
|
||||
|
||||
track1 = metadata.tracks[0]
|
||||
self.assertEqual(track1.artist, u'David Rovics')
|
||||
self.assertEqual(track1.title, u'Waiting for the Hurricane')
|
||||
self.assertEqual(track1.duration, 176320)
|
||||
self.assertEqual(track1.mbid,
|
||||
u'4116eea3-b9c2-452a-8d63-92f1e585b225')
|
||||
self.assertEqual(track1.sortName, u'Rovics, David')
|
||||
self.assertEqual(track1.mbidArtist,
|
||||
u'4d56eb9f-13b3-4f05-9db7-50195378d49f')
|
||||
self.assertEqual(track1.mbidRecording,
|
||||
u'b191794d-b7c6-4d6f-971e-0a543959b5ad')
|
||||
self.assertEqual(track1.mbidWorks,
|
||||
[u'90d5be68-0b29-45a3-ba01-c27ad78e3625'])
|
||||
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user