maloja/maloja/thirdparty/musicbrainz.py

65 lines
1.6 KiB
Python

from . import MetadataInterface
import urllib.parse, urllib.request
import json
import time
import threading
from ..__pkginfo__ import USER_AGENT
class MusicBrainz(MetadataInterface):
name = "MusicBrainz"
identifier = "musicbrainz"
# musicbrainz is rate-limited
lock = threading.Lock()
useragent = USER_AGENT
settings = {
}
metadata = {
"response_type":"json",
"response_parse_tree_track": ["images",0,"thumbnails","500"],
"required_settings": [],
}
def get_image_artist(self,artist):
return None
# not supported
def get_image_track(self,track):
self.lock.acquire()
try:
artists, title = track
artiststring = ", ".join(artists) #Join artists collection into string
titlestring = title
querystr = urllib.parse.urlencode({
"fmt":"json",
"query":"{title} {artist}".format(artist=artiststring,title=titlestring)
})
req = urllib.request.Request(**{
"url":"https://musicbrainz.org/ws/2/release?" + querystr,
"method":"GET",
"headers":{
"User-Agent":self.useragent
}
})
response = urllib.request.urlopen(req)
responsedata = response.read()
data = json.loads(responsedata)
mbid = data["releases"][0]["id"]
response = urllib.request.urlopen(
"https://coverartarchive.org/release/{mbid}?fmt=json".format(mbid=mbid)
)
responsedata = response.read()
data = json.loads(responsedata)
imgurl = self.metadata_parse_response_track(data)
if imgurl is not None: imgurl = self.postprocess_url(imgurl)
return imgurl
except Exception:
return None
finally:
time.sleep(2)
self.lock.release()