def getRelease(releaseid, include_artist_info=True): """ Deep release search to get track info """ with mb_lock: release = {} results = None try: if include_artist_info: results = musicbrainzngs.get_release_by_id( releaseid, ["artists", "release-groups", "media", "recordings"] ).get("release") else: results = musicbrainzngs.get_release_by_id(releaseid, ["media", "recordings"]).get("release") except WebServiceError, e: logger.warn( 'Attempt to retrieve information from MusicBrainz for release "%s" failed (%s)' % (releaseid, str(e)) ) time.sleep(5) if not results: return False release["title"] = unicode(results["title"]) release["id"] = unicode(results["id"]) release["asin"] = unicode(results["asin"]) if "asin" in results else None release["date"] = unicode(results["date"]) if "date" in results else None try: release["format"] = unicode(results["medium-list"][0]["format"]) except: release["format"] = u"Unknown" try: release["country"] = unicode(results["country"]) except: release["country"] = u"Unknown" if include_artist_info: if "release-group" in results: release["rgid"] = unicode(results["release-group"]["id"]) release["rg_title"] = unicode(results["release-group"]["title"]) try: release["rg_type"] = unicode(results["release-group"]["type"]) except KeyError: release["rg_type"] = u"Unknown" else: logger.warn("Release " + releaseid + "had no ReleaseGroup associated") release["artist_name"] = unicode(results["artist-credit"][0]["artist"]["name"]) release["artist_id"] = unicode(results["artist-credit"][0]["artist"]["id"]) release["tracks"] = getTracksFromRelease(results) return release
def getRelease(releaseid, include_artist_info=True): """ Deep release search to get track info """ with mb_lock: release = {} results = None try: if include_artist_info: results = musicbrainzngs.get_release_by_id(releaseid,["artists","release-groups","media","recordings"]).get('release') else: results = musicbrainzngs.get_release_by_id(releaseid,["media","recordings"]).get('release') except WebServiceError, e: logger.warn('Attempt to retrieve information from MusicBrainz for release "%s" failed (%s)' % (releaseid, str(e))) time.sleep(5) if not results: return False release['title'] = unicode(results['title']) release['id'] = unicode(results['id']) release['asin'] = unicode(results['asin']) if 'asin' in results else None release['date'] = unicode(results['date']) if 'date' in results else None try: release['format'] = unicode(results['medium-list'][0]['format']) except: release['format'] = u'Unknown' try: release['country'] = unicode(results['country']) except: release['country'] = u'Unknown' if include_artist_info: if 'release-group' in results: release['rgid'] = unicode(results['release-group']['id']) release['rg_title'] = unicode(results['release-group']['title']) try: release['rg_type'] = unicode(results['release-group']['type']) except KeyError: release['rg_type'] = u'Unknown' else: logger.warn("Release " + releaseid + "had no ReleaseGroup associated") release['artist_name'] = unicode(results['artist-credit'][0]['artist']['name']) release['artist_id'] = unicode(results['artist-credit'][0]['artist']['id']) release['tracks'] = getTracksFromRelease(results) return release
def album_for_id(albumid): """Fetches an album by its MusicBrainz ID and returns an AlbumInfo object or None if the album is not found. """ try: res = musicbrainzngs.get_release_by_id(albumid, RELEASE_INCLUDES) except musicbrainzngs.ResponseError: log.debug('Album ID match failed.') return None return album_info(res['release'])
def getRelease(releaseid): """ Deep release search to get track info """ with mb_lock: release = {} results = None q, sleepytime = startmb() try: results = musicbrainzngs.get_release_by_id(releaseid,["artists","release-groups","media","recordings"]).get('release') except WebServiceError, e: logger.warn('Attempt to retrieve information from MusicBrainz for release "%s" failed (%s)' % (releaseid, str(e))) time.sleep(5) if not results: return False time.sleep(sleepytime) release['title'] = unicode(results['title']) release['id'] = unicode(results['id']) release['asin'] = unicode(results['asin']) if 'asin' in results else None release['date'] = unicode(results['date']) if 'release-group' in results: release['rgid'] = unicode(results['release-group']['id']) release['rg_title'] = unicode(results['release-group']['title']) release['rg_type'] = unicode(results['release-group']['type']) else: logger.warn("Release " + releaseid + "had no ReleaseGroup associated") release['artist_name'] = unicode(results['artist-credit'][0]['artist']['name']) release['artist_id'] = unicode(results['artist-credit'][0]['artist']['id']) totalTracks = 0 tracks = [] for medium in results['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['length']) if 'length' in track else 0 }) totalTracks += 1 release['tracks'] = tracks return release
def album_for_id(albumid): """Fetches an album by its MusicBrainz ID and returns an AlbumInfo object or None if the album is not found. May raise a MusicBrainzAPIError. """ try: res = musicbrainzngs.get_release_by_id(albumid, RELEASE_INCLUDES) except musicbrainzngs.ResponseError: log.debug('Album ID match failed.') return None except musicbrainzngs.MusicBrainzError as exc: raise MusicBrainzAPIError(exc, 'get release by ID', albumid, traceback.format_exc()) return album_info(res['release'])
def getReleaseGroup(rgid): """ Returns a dictionary of the best stuff from a release group """ with mb_lock: releaselist = [] releaseGroup = None q, sleepytime = startmb() try: releaseGroup = musicbrainzngs.get_release_group_by_id(rgid,["artists","releases","media","discids",])['release-group'] except WebServiceError, e: logger.warn('Attempt to retrieve information from MusicBrainz for release group "%s" failed (%s)' % (rgid, str(e))) 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['release-list']: releaseResult = None try: releaseResult = musicbrainzngs.get_release_by_id(release['id'],["recordings","media"])['release'] except WebServiceError, e: logger.warn('Attempt to retrieve release information for %s from MusicBrainz failed (%s)' % (releaseResult.title, str(e))) time.sleep(5) if not releaseResult: continue 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', 'CD': '0', 'Cassette': '3', '2xCD': '1', 'Digital Media': '0' } countries = { 'US': '0', 'GB': '1', 'JP': '2', } try: format = int(formats[releaseResult['medium-list'][0]['format']]) except: format = 3 try: 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'] if 'length' in track['recording'] else track['length'] if 'length' in track else 0) }) totalTracks += 1 release_dict = { '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')) if 'date' in releaseResult else None, 'format': format, 'country': country } release_dict['tracks'] = tracks releaselist.append(release_dict)
def getRelease(releaseid, include_artist_info=True): """ Deep release search to get track info """ with mb_lock: release = {} results = None q, sleepytime = startmb() try: if include_artist_info: results = musicbrainzngs.get_release_by_id( releaseid, ["artists", "release-groups", "media", "recordings" ]).get('release') else: results = musicbrainzngs.get_release_by_id( releaseid, ["media", "recordings"]).get('release') except WebServiceError, e: logger.warn( 'Attempt to retrieve information from MusicBrainz for release "%s" failed (%s)' % (releaseid, str(e))) time.sleep(5) if not results: return False time.sleep(sleepytime) release['title'] = unicode(results['title']) release['id'] = unicode(results['id']) release['asin'] = unicode( results['asin']) if 'asin' in results else None release['date'] = unicode( results['date']) if 'date' in results else None try: release['format'] = unicode(results['medium-list'][0]['format']) except: release['format'] = u'Unknown' try: release['country'] = unicode(results['country']) except: release['country'] = u'Unknown' if include_artist_info: if 'release-group' in results: release['rgid'] = unicode(results['release-group']['id']) release['rg_title'] = unicode( results['release-group']['title']) release['rg_type'] = unicode(results['release-group']['type']) else: logger.warn("Release " + releaseid + "had no ReleaseGroup associated") release['artist_name'] = unicode( results['artist-credit'][0]['artist']['name']) release['artist_id'] = unicode( results['artist-credit'][0]['artist']['id']) totalTracks = 1 tracks = [] for medium in results['medium-list']: for track in medium['track-list']: tracks.append({ 'number': totalTracks, 'title': unicode(track['recording']['title']), 'id': unicode(track['recording']['id']), 'url': u"http://musicbrainz.org/track/" + track['recording']['id'], 'duration': int(track['length']) if 'length' in track else 0 }) totalTracks += 1 release['tracks'] = tracks return release
def getReleaseGroup(rgid): """ Returns a dictionary of the best stuff from a release group """ with mb_lock: releaselist = [] releaseGroup = None q, sleepytime = startmb() try: releaseGroup = musicbrainzngs.get_release_group_by_id( rgid, [ "artists", "releases", "media", "discids", ])['release-group'] except WebServiceError, e: logger.warn( 'Attempt to retrieve information from MusicBrainz for release group "%s" failed (%s)' % (rgid, str(e))) 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['release-list']: releaseResult = None try: releaseResult = musicbrainzngs.get_release_by_id( release['id'], ["recordings", "media"])['release'] except WebServiceError, e: logger.warn( 'Attempt to retrieve release information for %s from MusicBrainz failed (%s)' % (releaseResult.title, str(e))) time.sleep(5) if not releaseResult: continue #skip releases that do not have any release date associated with them #if we don't do this the albums will get the release date "None" and will #automatically be set to wanted if "Automatically Mark Upcoming Albums as Wanted" is set #because None is not a valid date and will never be in the past so it is always upcoming if 'date' not in releaseResult: continue 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', 'CD': '0', 'Cassette': '3', '2xCD': '1', 'Digital Media': '0' } countries = { 'US': '0', 'GB': '1', 'JP': '2', } try: format = int( formats[releaseResult['medium-list'][0]['format']]) except: format = 3 try: 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'] if 'length' in track['recording'] else track['length'] if 'length' in track else 0) }) totalTracks += 1 release_dict = { '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 } release_dict['tracks'] = tracks releaselist.append(release_dict)