From b4b0823f735ff004f37b33ef4228b5cf689698c2 Mon Sep 17 00:00:00 2001 From: Patrick Speiser Date: Mon, 28 May 2012 09:25:05 +0200 Subject: [PATCH] Changed getReleaseGroup to use the musicbrainzngs library, compatible but NOT identical output (the musicbrainz database returns slightly different data (additional or missing ASIN etc.) for the v2 protocol, can't do anything about it. (old musicbrainz 2 library is deprecated and broken) --- headphones/mb.py | 111 +++++++++++++++++++++++------------------------ 1 file changed, 55 insertions(+), 56 deletions(-) diff --git a/headphones/mb.py b/headphones/mb.py index d02e4ed8..28b668c3 100644 --- a/headphones/mb.py +++ b/headphones/mb.py @@ -266,7 +266,6 @@ def getReleaseGroup(rgid): releaselist = [] - inc = ws.ReleaseGroupIncludes(releases=True, artist=True) releaseGroup = None attempt = 0 @@ -275,47 +274,42 @@ def getReleaseGroup(rgid): while attempt < 5: try: - releaseGroup = q.getReleaseGroupById(rgid, inc) + releaseGroup = musicbrainzngs.get_release_group_by_id(rgid,["artists","releases","media","discids",])['release-group'] break except WebServiceError, e: logger.warn('Attempt to retrieve information from MusicBrainz for release group "%s" failed (%s)' % (rgid, str(e))) attempt += 1 time.sleep(5) - + if not releaseGroup: return False + time.sleep(sleepytime) + # I think for now we have to make separate queries for each release, in order # to get more detailed release info (ASIN, track count, etc.) - for release in releaseGroup.releases: - - inc = ws.ReleaseIncludes(tracks=True, releaseEvents=True) + for release in releaseGroup['release-list']: releaseResult = None attempt = 0 - while attempt < 5: - try: - releaseResult = q.getReleaseById(release.id, inc) + releaseResult = musicbrainzngs.get_release_by_id(release['id'],["recordings","media"])['release'] break - except WebServiceError, e: + except WebServiceError, e: #UPDATE THIS logger.warn('Attempt to retrieve release information for %s from MusicBrainz failed (%s)' % (releaseResult.title, str(e))) attempt += 1 - time.sleep(5) - + time.sleep(5) + if not releaseResult: continue - # Release filter for non-official live albums - types = releaseResult.getTypes() - if any('Live' in type for type in types): - if not any('Official' in type for type in types): + if releaseGroup['type'] == 'live' and releaseResult['status'] != 'Official': logger.debug('%s is not an official live album. Skipping' % releaseResult.name) continue - + time.sleep(sleepytime) - + formats = { '2xVinyl': '2', 'Vinyl': '2', @@ -325,68 +319,73 @@ def getReleaseGroup(rgid): 'Digital Media': '0' } - country = { + countries = { 'US': '0', - 'GB': '1', + + 'GB': '1', 'JP': '2', } - - try: - format = int(replace_all(u.extractFragment(releaseResult.releaseEvents[0].format), formats)) + format = int(formats[releaseResult['medium-list'][0]['format']]) except: - format = 3 + format = 3 #this is the same number 'Cassette' uses above, change it ? try: - country = int(replace_all(releaseResult.releaseEvents[0].country, country)) + country = int(countries[releaseResult['country']]) except: country = 3 - + totalTracks = 0 + tracks = [] + for medium in releaseResult['medium-list']: + for track in medium['track-list']: + tracks.append({ + 'number': totalTracks + 1, + 'title': unicode(track['recording']['title']), + 'id': unicode(track['recording']['id']), + 'url': u"http://musicbrainz.org/track/" + track['recording']['id'], + 'duration': int(track['recording']['length']) + }) + totalTracks += 1 + + release_dict = { - 'hasasin': bool(releaseResult.asin), - 'asin': releaseResult.asin, - 'trackscount': len(releaseResult.getTracks()), - 'releaseid': u.extractUuid(releaseResult.id), - 'releasedate': releaseResult.getEarliestReleaseDate(), + 'hasasin': bool(releaseResult.get('asin')), + 'asin': unicode(releaseResult.get('asin')) if 'asin' in releaseResult else None, + 'trackscount': totalTracks, + 'releaseid': unicode(releaseResult.get('id')), + 'releasedate': unicode(releaseResult.get('date')), 'format': format, 'country': country } - - tracks = [] - - i = 1 - for track in releaseResult.tracks: - - tracks.append({ - 'number': i, - 'title': track.title, - 'id': u.extractUuid(track.id), - 'url': track.id, - 'duration': track.duration - }) - i += 1 - - release_dict['tracks'] = tracks - + release_dict['tracks'] = tracks releaselist.append(release_dict) + #necessary to make dates that miss the month and/or day show up after full dates + def getSortableReleaseDate(releaseDate): + if releaseDate.count('-') == 2: + return releaseDate + elif releaseDate.count('-') == 1: + return releaseDate + '32' + else: + return releaseDate + '13-32' + + releaselist.sort(key=lambda x:getSortableReleaseDate(x['releasedate'])) + average_tracks = sum(x['trackscount'] for x in releaselist) / float(len(releaselist)) - for item in releaselist: item['trackscount_delta'] = abs(average_tracks - item['trackscount']) - a = multikeysort(releaselist, ['-hasasin', 'country', 'format', 'trackscount_delta']) - + release_dict = {'releaseid' :a[0]['releaseid'], - 'releasedate' : releaselist[0]['releasedate'], + 'releasedate' : unicode(releaselist[0]['releasedate']), 'trackcount' : a[0]['trackscount'], 'tracks' : a[0]['tracks'], 'asin' : a[0]['asin'], 'releaselist' : releaselist, - 'artist_name' : releaseGroup.artist.name, - 'artist_id' : u.extractUuid(releaseGroup.artist.id), - 'title' : releaseGroup.title, - 'type' : u.extractFragment(releaseGroup.type) + 'artist_name' : unicode(releaseGroup['artist-credit'][0]['artist']['name']), + 'artist_id' : unicode(releaseGroup['artist-credit'][0]['artist']['id']), + 'title' : unicode(releaseGroup['title']), + 'type' : unicode(releaseGroup['type']) } return release_dict