diff --git a/vrobbler/apps/scrobbles/musicbrainz.py b/vrobbler/apps/scrobbles/musicbrainz.py new file mode 100644 index 0000000..24af9ac --- /dev/null +++ b/vrobbler/apps/scrobbles/musicbrainz.py @@ -0,0 +1,87 @@ +import logging + +import musicbrainzngs +from dateutil.parser import parse + +logger = logging.getLogger(__name__) + + +def lookup_album_from_mb(musicbrainz_id: str) -> dict: + release_dict = {} + + musicbrainzngs.set_useragent('vrobbler', '0.3.0') + release_data = musicbrainzngs.get_release_by_id( + musicbrainz_id, + includes=['artists', 'release-groups', 'recordings'], + ).get('release') + + if not release_data: + return release_dict + + primary_artist = release_data.get('artist-credit')[0] + release_dict = { + 'artist': { + 'name': primary_artist.get('name'), + 'musicbrainz_id': primary_artist.get('id'), + }, + 'album': { + 'name': release_data.get('title'), + 'musicbrainz_id': musicbrainz_id, + 'musicbrainz_releasegroup_id': release_data.get( + 'release-group' + ).get('id'), + 'musicbrainz_albumaritist_id': primary_artist.get('id'), + 'year': release_data.get('year')[0:4], + }, + } + + release_dict['tracks'] = [] + for track in release_data.get('medium-list')[0]['track-list']: + recording = track['recording'] + release_dict['tracks'].append( + { + 'title': recording['title'], + 'musicbrainz_id': recording['id'], + 'run_time_ticks': track['length'], + } + ) + + return release_dict + + +def lookup_album_dict_from_mb(release_name: str, artist_name: str) -> dict: + musicbrainzngs.set_useragent('vrobbler', '0.3.0') + + top_result = musicbrainzngs.search_releases( + release_name, artist=artist_name + )['release-list'][0] + score = int(top_result.get('ext:score')) + if score < 85: + logger.debug( + "Album lookup score below 85 threshold", + extra={"result": top_result}, + ) + return {} + print(top_result) + return { + "year": parse(top_result["date"]).year, + "mb_id": top_result["id"], + "mb_group_id": top_result["release-group"]["id"], + } + + +def lookup_artist_id_from_mb(artist_name: str) -> str: + musicbrainzngs.set_useragent('vrobbler', '0.3.0') + + top_result = musicbrainzngs.search_artists(artist=artist_name)[ + 'artist-list' + ][0] + score = int(top_result.get('ext:score')) + if score < 85: + logger.debug( + "Artist lookup score below 85 threshold", + extra={"result": top_result}, + ) + return "" + + return top_result["id"]