166 lines
7.9 KiB
Python
166 lines
7.9 KiB
Python
# -*- 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
|