[FileItem] Fix mimetype content lookup
[xbmc.git] / addons / metadata.generic.albums / lib / musicbrainz.py
blobaa91c14e5dce665260b67edfdccf6a14f849ff49
1 # -*- coding: utf-8 -*-
3 def musicbrainz_albumfind(data, artist, album):
4 albums = []
5 # count how often each releasegroup occurs in the release results
6 # keep track of the release with the highest score and earliest releasedate in each releasegroup
7 releasegroups = {}
8 for item in data.get('releases'):
9 mbid = item['id']
10 score = item.get('score', 0)
11 releasegroup = item['release-group']['id']
12 if 'date' in item and item['date']:
13 date = item['date'].replace('-','')
14 if len(date) == 4:
15 date = date + '9999'
16 else:
17 date = '99999999'
18 if releasegroup in releasegroups:
19 count = releasegroups[releasegroup][0] + 1
20 topmbid = releasegroups[releasegroup][1]
21 topdate = releasegroups[releasegroup][2]
22 topscore = releasegroups[releasegroup][3]
23 if date < topdate and score >= topscore:
24 topdate = date
25 topmbid = mbid
26 releasegroups[releasegroup] = [count, topmbid, topdate, topscore]
27 else:
28 releasegroups[releasegroup] = [1, mbid, date, score]
29 if releasegroups:
30 # get the highest releasegroup count
31 maxcount = max(releasegroups.values())[0]
32 # get the releasegroup(s) that match this highest value
33 topgroups = [k for k, v in releasegroups.items() if v[0] == maxcount]
34 for item in data.get('releases'):
35 # only use the 'top' release from each releasegroup
36 if item['id'] != releasegroups[item['release-group']['id']][1]:
37 continue
38 albumdata = {}
39 if item.get('artist-credit'):
40 artists = []
41 artistdisp = ""
42 for artist in item['artist-credit']:
43 artistdata = {}
44 artistdata['artist'] = artist['artist']['name']
45 artistdata['mbartistid'] = artist['artist']['id']
46 artistdata['artistsort'] = artist['artist']['sort-name']
47 artistdisp = artistdisp + artist['artist']['name']
48 artistdisp = artistdisp + artist.get('joinphrase', '')
49 artists.append(artistdata)
50 albumdata['artist'] = artists
51 albumdata['artist_description'] = artistdisp
52 if item.get('label-info','') and item['label-info'][0].get('label','') and item['label-info'][0]['label'].get('name',''):
53 albumdata['label'] = item['label-info'][0]['label']['name']
54 albumdata['album'] = item['title']
55 if item.get('date',''):
56 albumdata['year'] = item['date'][:4]
57 albumdata['thumb'] = 'https://coverartarchive.org/release-group/%s/front-250' % item['release-group']['id']
58 if item.get('label-info','') and item['label-info'][0].get('label','') and item['label-info'][0]['label'].get('name',''):
59 albumdata['label'] = item['label-info'][0]['label']['name']
60 if item.get('status',''):
61 albumdata['releasestatus'] = item['status']
62 albumdata['type'] = item['release-group'].get('primary-type')
63 albumdata['mbalbumid'] = item['id']
64 albumdata['mbreleasegroupid'] = item['release-group']['id']
65 if item.get('score'):
66 releasescore = item['score'] / 100.0
67 # if the release is in the releasegroup with most releases, it is considered the most accurate one
68 # (this also helps with preferring official releases over bootlegs, assuming there are more variations of an official release than of a bootleg)
69 if item['release-group']['id'] not in topgroups:
70 releasescore -= 0.001
71 # if the release is an album, prefer it over singles/ep's
72 # (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)
73 if item['release-group'].get('primary-type') != 'Album':
74 releasescore -= 0.002
75 albumdata['relevance'] = str(releasescore)
76 albums.append(albumdata)
77 return albums
79 def musicbrainz_albumlinks(data):
80 albumlinks = {}
81 if 'relations' in data and data['relations']:
82 for item in data['relations']:
83 if item['type'] == 'allmusic':
84 albumlinks['allmusic'] = item['url']['resource']
85 elif item['type'] == 'discogs':
86 albumlinks['discogs'] = item['url']['resource'].rsplit('/', 1)[1]
87 elif item['type'] == 'wikipedia':
88 albumlinks['wikipedia'] = item['url']['resource'].rsplit('/', 1)[1]
89 elif item['type'] == 'wikidata':
90 albumlinks['wikidata'] = item['url']['resource'].rsplit('/', 1)[1]
91 return albumlinks
93 def musicbrainz_albumdetails(data):
94 albumdata = {}
95 albumdata['album'] = data['title']
96 albumdata['mbalbumid'] = data['id']
97 if data.get('release-group',''):
98 albumdata['mbreleasegroupid'] = data['release-group']['id']
99 if data['release-group']['rating'] and data['release-group']['rating']['value']:
100 albumdata['rating'] = str(int((float(data['release-group']['rating']['value']) * 2) + 0.5))
101 albumdata['votes'] = str(data['release-group']['rating']['votes-count'])
102 if data['release-group'].get('primary-type'):
103 albumtypes = [data['release-group']['primary-type']] + data['release-group']['secondary-types']
104 albumdata['type'] = ' / '.join(albumtypes)
105 if 'Compilation' in albumtypes:
106 albumdata['compilation'] = 'true'
107 if data['release-group'].get('first-release-date',''):
108 albumdata['originaldate'] = data['release-group']['first-release-date']
109 if data.get('release-events',''):
110 albumdata['year'] = data['release-events'][0]['date'][:4]
111 albumdata['releasedate'] = data['release-events'][0]['date']
112 if data.get('label-info','') and data['label-info'][0].get('label','') and data['label-info'][0]['label'].get('name',''):
113 albumdata['label'] = data['label-info'][0]['label']['name']
114 if data.get('status',''):
115 albumdata['releasestatus'] = data['status']
116 if data.get('artist-credit'):
117 artists = []
118 artistdisp = ''
119 for artist in data['artist-credit']:
120 artistdata = {}
121 artistdata['artist'] = artist['name']
122 artistdata['mbartistid'] = artist['artist']['id']
123 artistdata['artistsort'] = artist['artist']['sort-name']
124 artistdisp = artistdisp + artist['name']
125 artistdisp = artistdisp + artist.get('joinphrase', '')
126 artists.append(artistdata)
127 albumdata['artist'] = artists
128 albumdata['artist_description'] = artistdisp
129 return albumdata
131 def musicbrainz_albumart(data):
132 albumdata = {}
133 thumbs = []
134 extras = []
135 for item in data['images']:
136 if 'Front' in item['types']:
137 thumbdata = {}
138 thumbdata['image'] = item['image']
139 thumbdata['preview'] = item['thumbnails']['small']
140 thumbdata['aspect'] = 'thumb'
141 thumbs.append(thumbdata)
142 if 'Back' in item['types']:
143 backdata = {}
144 backdata['image'] = item['image']
145 backdata['preview'] = item['thumbnails']['small']
146 backdata['aspect'] = 'back'
147 extras.append(backdata)
148 if 'Medium' in item['types']:
149 discartdata = {}
150 discartdata['image'] = item['image']
151 discartdata['preview'] = item['thumbnails']['small']
152 discartdata['aspect'] = 'discart'
153 extras.append(discartdata)
154 # exclude spine+back images
155 if 'Spine' in item['types'] and len(item['types']) == 1:
156 spinedata = {}
157 spinedata['image'] = item['image']
158 spinedata['preview'] = item['thumbnails']['small']
159 spinedata['aspect'] = 'spine'
160 extras.append(spinedata)
161 if thumbs:
162 albumdata['thumb'] = thumbs
163 if extras:
164 albumdata['extras'] = extras
165 return albumdata