def get_basic_release(mbid): """ Make sure release and its dependencies are present and contain required data. @param mbid: a string containing a MusicBrainz ID of an artist @return: a CachedReleaseGroup object containing required minimal data set """ release_group = CachedReleaseGroup.view('artists/releases',include_docs=True, key=mbid).one() if not release_group: # TODO: optimize? its just one additional request on rare ocassions tho.. try: t = mmda_logger('mb','request','artist mbid of release',mbid) mb_release = mb_query.getReleaseById(mbid, MB_RELEASE_ARTIST) artist_mbid = extractUuid(mb_release.artist.id) mmda_logger('mb','result','artist mbid',artist_mbid,t) except WebServiceError, e: # TODO: add error handling here mmda_logger('mb-release','ERROR',e) raise e else: get_basic_artist(artist_mbid) release_group = CachedReleaseGroup.view('artists/releases',include_docs=True, key=mbid).one()
def _populate_deep_release_mb(release_group,release_mbid): """ Make sure ReleaseGroup contains additional, detailed information about specified release. @param release_group: a CachedReleaseGroup object @param release_mbid: a string containing a MusicBrainz ID of a release @return: a verified/updated CachedReleaseGroup object """ release = release_group.releases[release_mbid] if release['cache_state']['mb'][0] == 1: # TODO: remove unused includes try: t = mmda_logger('mb','request','release',release_mbid) mb_release = mb_query.getReleaseById(release_mbid, MB_RELEASE_INCLUDES) mmda_logger('mb','result','release',mb_release.title,t) except WebServiceError, e: # TODO: hard error here mmda_logger('mb-release','ERROR',e) raise e else: # make sure mbid of an artist is present if 'artist_mbid' not in release_group: release_group.artist_mbid = extractUuid(mb_release.artist.id) # TRACK LISTING # TODO: think about duration representation here tracks = [] for mb_track in mb_release.tracks: track = {'title':mb_track.title, 'mbid':extractUuid(mb_track.id)} if mb_track.duration: track['duration'] = humanize_duration(mb_track.duration) tracks.append(track) release['tracks'] = tracks # URL relations urls = {} for relation in mb_release.getRelations(Relation.TO_URL): relation_type = decruft_mb(relation.type) if relation_type not in urls: urls[relation_type] = [] urls[relation_type].append(relation.targetId) # urls is used in many places, so its handy to have it ready release['urls'] = urls # CREDIT relations credits = [{'type':decruft_mb(r.type), 'mbid':extractUuid(r.targetId), 'name':r.target.name} for r in mb_release.getRelations(Relation.TO_ARTIST)] if credits: release['credits'] = credits # MULTI-DISC-RELEASE information remasters = [] for relation in mb_release.getRelations(Relation.TO_RELEASE): relation_type = decruft_mb(relation.type) linked_release = {'mbid':extractUuid(relation.targetId), 'title':relation.target.title} if relation_type == 'PartOfSet': if relation.direction == 'backward': release['set_prev'] = linked_release else: release['set_next'] = linked_release elif relation_type == 'Remaster': if relation.direction == 'backward': remasters.append(linked_release) else: release['remaster_of'] = linked_release if remasters: release['remasters'] = remasters release['cache_state']['mb'] = [2,datetime.utcnow()] release_group = _perform_cover_lookup_on_mb_data(release_group, release_mbid) release_group.changes_present = True