1 # -*- coding: utf-8 -*-
3 def musicbrainz_albumfind(data
, artist
, album
):
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
8 for item
in data
.get('releases'):
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('-','')
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
:
26 releasegroups
[releasegroup
] = [count
, topmbid
, topdate
, topscore
]
28 releasegroups
[releasegroup
] = [1, mbid
, date
, score
]
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]:
39 if item
.get('artist-credit'):
42 for artist
in item
['artist-credit']:
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']
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
:
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':
75 albumdata
['relevance'] = str(releasescore
)
76 albums
.append(albumdata
)
79 def musicbrainz_albumlinks(data
):
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]
93 def musicbrainz_albumdetails(data
):
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'):
119 for artist
in data
['artist-credit']:
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
131 def musicbrainz_albumart(data
):
135 for item
in data
['images']:
136 if 'Front' in item
['types']:
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']:
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']:
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:
157 spinedata
['image'] = item
['image']
158 spinedata
['preview'] = item
['thumbnails']['small']
159 spinedata
['aspect'] = 'spine'
160 extras
.append(spinedata
)
162 albumdata
['thumb'] = thumbs
164 albumdata
['extras'] = extras