1
0
mirror of https://github.com/krateng/maloja.git synced 2023-08-10 21:12:55 +03:00

Added Spotify API

This commit is contained in:
Krateng
2019-05-10 13:15:40 +02:00
parent 2d87f67322
commit 244ef307be
3 changed files with 74 additions and 35 deletions

View File

@@ -1,5 +1,6 @@
import urllib.parse, urllib.request
import json
import base64
from doreah.settings import get_settings
from doreah.logging import log
@@ -9,11 +10,21 @@ apis_artists = [
"name":"LastFM + Fanart.tv",
"check":get_settings("LASTFM_API_KEY") not in [None,"ASK"] and get_settings("FANARTTV_API_KEY") not in [None,"ASK"],
"steps":[
("url","http://ws.audioscrobbler.com/2.0/?method=artist.getinfo&artist={artiststring}&api_key=" + get_settings("LASTFM_API_KEY") + "&format=json"),
("get","http://ws.audioscrobbler.com/2.0/?method=artist.getinfo&artist={artiststring}&api_key=" + get_settings("LASTFM_API_KEY") + "&format=json"),
("parse",["artist","mbid"]),
("url","http://webservice.fanart.tv/v3/music/{var}?api_key=" + get_settings("FANARTTV_API_KEY")),
("get","http://webservice.fanart.tv/v3/music/{var}?api_key=" + get_settings("FANARTTV_API_KEY")),
("parse",["artistthumb",0,"url"])
]
},
{
"name":"Spotify",
"check":get_settings("SPOTIFY_API_ID") not in [None,"ASK"] and get_settings("SPOTIFY_API_SECRET") not in [None,"ASK"],
"steps":[
("post","https://accounts.spotify.com/api/token",{"Authorization":"Basic " + base64.b64encode(bytes(get_settings("SPOTIFY_API_ID") + ":" + get_settings("SPOTIFY_API_SECRET"),encoding="utf-8")).decode("utf-8")},{"grant_type":"client_credentials"}),
("parse",["access_token"]),
("get","https://api.spotify.com/v1/search?q={artiststring}&type=artist&access_token={var}"),
("parse",["artists","items",0,"images",0,"url"])
]
}
]
@@ -22,9 +33,19 @@ apis_tracks = [
"name":"LastFM",
"check":get_settings("LASTFM_API_KEY") not in [None,"ASK"],
"steps":[
("url","https://ws.audioscrobbler.com/2.0/?method=track.getinfo&track={titlestring}&artist={artiststring}&api_key=" + get_settings("LASTFM_API_KEY") + "&format=json"),
("get","https://ws.audioscrobbler.com/2.0/?method=track.getinfo&track={titlestring}&artist={artiststring}&api_key=" + get_settings("LASTFM_API_KEY") + "&format=json"),
("parse",["track","album","image",3,"#text"])
]
},
{
"name":"Spotify",
"check":get_settings("SPOTIFY_API_ID") not in [None,"ASK"] and get_settings("SPOTIFY_API_SECRET") not in [None,"ASK"],
"steps":[
("post","https://accounts.spotify.com/api/token",{"Authorization":"Basic " + base64.b64encode(bytes(get_settings("SPOTIFY_API_ID") + ":" + get_settings("SPOTIFY_API_SECRET"),encoding="utf-8")).decode("utf-8")},{"grant_type":"client_credentials"}),
("parse",["access_token"]),
("get","https://api.spotify.com/v1/search?q={artiststring}%20{titlestring}&type=track&access_token={var}"),
("parse",["tracks","items",0,"album","images",0,"url"])
]
}
]
@@ -36,9 +57,19 @@ def api_request_artist(artist):
artiststring = urllib.parse.quote(artist)
var = artiststring
for step in api["steps"]:
if step[0] == "url":
if step[0] == "get":
response = urllib.request.urlopen(step[1].format(artiststring=artiststring,var=var))
var = json.loads(response.read())
elif step[0] == "post":
keys = {
"url":step[1].format(artiststring=artiststring,var=var),
"method":"POST",
"headers":step[2],
"data":bytes(urllib.parse.urlencode(step[3]),encoding="utf-8")
}
req = urllib.request.Request(**keys)
response = urllib.request.urlopen(req)
var = json.loads(response.read())
elif step[0] == "parse":
for node in step[1]:
var = var[node]
@@ -61,20 +92,30 @@ def api_request_track(track):
titlestring = urllib.parse.quote(title)
var = artiststring + titlestring
for step in api["steps"]:
if step[0] == "url":
if step[0] == "get":
response = urllib.request.urlopen(step[1].format(artiststring=artiststring,titlestring=titlestring,var=var))
var = json.loads(response.read())
elif step[0] == "post":
keys = {
"url":step[1].format(artiststring=artiststring,titlestring=titlestring,var=var),
"method":"POST",
"headers":step[2],
"data":bytes(urllib.parse.urlencode(step[3]),encoding="utf-8")
}
req = urllib.request.Request(**keys)
response = urllib.request.urlopen(req)
var = json.loads(response.read())
elif step[0] == "parse":
for node in step[1]:
var = var[node]
assert isinstance(var,str) and var != ""
except:
if len(artists) == 1: return None
# try the same track with every single artist
for a in artists:
result = api_request_track(([a],title))
if result is not None:
return result
if len(artists) != 1:
# try the same track with every single artist
for a in artists:
result = api_request_track(([a],title))
if result is not None:
return result
continue
return var