-
This commit is contained in:
165
Kodi/Lenovo/addons/metadata.generic.albums/lib/musicbrainz.py
Normal file
165
Kodi/Lenovo/addons/metadata.generic.albums/lib/musicbrainz.py
Normal file
@@ -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
|
||||
Reference in New Issue
Block a user