diff options
Diffstat (limited to 'addons/metadata.generic.albums/lib/musicbrainz.py')
-rw-r--r-- | addons/metadata.generic.albums/lib/musicbrainz.py | 165 |
1 files changed, 165 insertions, 0 deletions
diff --git a/addons/metadata.generic.albums/lib/musicbrainz.py b/addons/metadata.generic.albums/lib/musicbrainz.py new file mode 100644 index 0000000..aa91c14 --- /dev/null +++ b/addons/metadata.generic.albums/lib/musicbrainz.py @@ -0,0 +1,165 @@ +# -*- coding: utf-8 -*- + +def musicbrainz_albumfind(data, artist, album): + albums = [] + # count how often each releasegroup occurs in the release results + # keep track of the release with the highest score and earliest releasedate in each releasegroup + releasegroups = {} + for item in data.get('releases'): + mbid = item['id'] + score = item.get('score', 0) + releasegroup = item['release-group']['id'] + if 'date' in item and item['date']: + date = item['date'].replace('-','') + if len(date) == 4: + date = date + '9999' + else: + date = '99999999' + if releasegroup in releasegroups: + count = releasegroups[releasegroup][0] + 1 + topmbid = releasegroups[releasegroup][1] + topdate = releasegroups[releasegroup][2] + topscore = releasegroups[releasegroup][3] + if date < topdate and score >= topscore: + topdate = date + topmbid = mbid + releasegroups[releasegroup] = [count, topmbid, topdate, topscore] + else: + releasegroups[releasegroup] = [1, mbid, date, score] + if releasegroups: + # get the highest releasegroup count + maxcount = max(releasegroups.values())[0] + # get the releasegroup(s) that match this highest value + topgroups = [k for k, v in releasegroups.items() if v[0] == maxcount] + for item in data.get('releases'): + # only use the 'top' release from each releasegroup + if item['id'] != releasegroups[item['release-group']['id']][1]: + continue + albumdata = {} + if item.get('artist-credit'): + artists = [] + artistdisp = "" + for artist in item['artist-credit']: + artistdata = {} + artistdata['artist'] = artist['artist']['name'] + artistdata['mbartistid'] = artist['artist']['id'] + artistdata['artistsort'] = artist['artist']['sort-name'] + artistdisp = artistdisp + artist['artist']['name'] + artistdisp = artistdisp + artist.get('joinphrase', '') + artists.append(artistdata) + albumdata['artist'] = artists + albumdata['artist_description'] = artistdisp + if item.get('label-info','') and item['label-info'][0].get('label','') and item['label-info'][0]['label'].get('name',''): + albumdata['label'] = item['label-info'][0]['label']['name'] + albumdata['album'] = item['title'] + if item.get('date',''): + albumdata['year'] = item['date'][:4] + albumdata['thumb'] = 'https://coverartarchive.org/release-group/%s/front-250' % item['release-group']['id'] + if item.get('label-info','') and item['label-info'][0].get('label','') and item['label-info'][0]['label'].get('name',''): + albumdata['label'] = item['label-info'][0]['label']['name'] + if item.get('status',''): + albumdata['releasestatus'] = item['status'] + albumdata['type'] = item['release-group'].get('primary-type') + albumdata['mbalbumid'] = item['id'] + albumdata['mbreleasegroupid'] = item['release-group']['id'] + if item.get('score'): + releasescore = item['score'] / 100.0 + # if the release is in the releasegroup with most releases, it is considered the most accurate one + # (this also helps with preferring official releases over bootlegs, assuming there are more variations of an official release than of a bootleg) + if item['release-group']['id'] not in topgroups: + releasescore -= 0.001 + # if the release is an album, prefer it over singles/ep's + # (this needs to be the double of the above, as me might have just given the album a lesser score if the single happened to be in the topgroup) + if item['release-group'].get('primary-type') != 'Album': + releasescore -= 0.002 + albumdata['relevance'] = str(releasescore) + albums.append(albumdata) + return albums + +def musicbrainz_albumlinks(data): + albumlinks = {} + if 'relations' in data and data['relations']: + for item in data['relations']: + if item['type'] == 'allmusic': + albumlinks['allmusic'] = item['url']['resource'] + elif item['type'] == 'discogs': + albumlinks['discogs'] = item['url']['resource'].rsplit('/', 1)[1] + elif item['type'] == 'wikipedia': + albumlinks['wikipedia'] = item['url']['resource'].rsplit('/', 1)[1] + elif item['type'] == 'wikidata': + albumlinks['wikidata'] = item['url']['resource'].rsplit('/', 1)[1] + return albumlinks + +def musicbrainz_albumdetails(data): + albumdata = {} + albumdata['album'] = data['title'] + albumdata['mbalbumid'] = data['id'] + if data.get('release-group',''): + albumdata['mbreleasegroupid'] = data['release-group']['id'] + if data['release-group']['rating'] and data['release-group']['rating']['value']: + albumdata['rating'] = str(int((float(data['release-group']['rating']['value']) * 2) + 0.5)) + albumdata['votes'] = str(data['release-group']['rating']['votes-count']) + if data['release-group'].get('primary-type'): + albumtypes = [data['release-group']['primary-type']] + data['release-group']['secondary-types'] + albumdata['type'] = ' / '.join(albumtypes) + if 'Compilation' in albumtypes: + albumdata['compilation'] = 'true' + if data['release-group'].get('first-release-date',''): + albumdata['originaldate'] = data['release-group']['first-release-date'] + if data.get('release-events',''): + albumdata['year'] = data['release-events'][0]['date'][:4] + albumdata['releasedate'] = data['release-events'][0]['date'] + if data.get('label-info','') and data['label-info'][0].get('label','') and data['label-info'][0]['label'].get('name',''): + albumdata['label'] = data['label-info'][0]['label']['name'] + if data.get('status',''): + albumdata['releasestatus'] = data['status'] + if data.get('artist-credit'): + artists = [] + artistdisp = '' + for artist in data['artist-credit']: + artistdata = {} + artistdata['artist'] = artist['name'] + artistdata['mbartistid'] = artist['artist']['id'] + artistdata['artistsort'] = artist['artist']['sort-name'] + artistdisp = artistdisp + artist['name'] + artistdisp = artistdisp + artist.get('joinphrase', '') + artists.append(artistdata) + albumdata['artist'] = artists + albumdata['artist_description'] = artistdisp + return albumdata + +def musicbrainz_albumart(data): + albumdata = {} + thumbs = [] + extras = [] + for item in data['images']: + if 'Front' in item['types']: + thumbdata = {} + thumbdata['image'] = item['image'] + thumbdata['preview'] = item['thumbnails']['small'] + thumbdata['aspect'] = 'thumb' + thumbs.append(thumbdata) + if 'Back' in item['types']: + backdata = {} + backdata['image'] = item['image'] + backdata['preview'] = item['thumbnails']['small'] + backdata['aspect'] = 'back' + extras.append(backdata) + if 'Medium' in item['types']: + discartdata = {} + discartdata['image'] = item['image'] + discartdata['preview'] = item['thumbnails']['small'] + discartdata['aspect'] = 'discart' + extras.append(discartdata) + # exclude spine+back images + if 'Spine' in item['types'] and len(item['types']) == 1: + spinedata = {} + spinedata['image'] = item['image'] + spinedata['preview'] = item['thumbnails']['small'] + spinedata['aspect'] = 'spine' + extras.append(spinedata) + if thumbs: + albumdata['thumb'] = thumbs + if extras: + albumdata['extras'] = extras + return albumdata |