Files
2025-10-25 13:21:06 +02:00

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