Radio now functional; Fetching lyrics still triggers 'Cannot run the event loop while another loop is running' error...
This commit is contained in:
@ -585,7 +585,7 @@ class IrisCore(pykka.ThreadingActor):
|
|||||||
else:
|
else:
|
||||||
return response
|
return response
|
||||||
|
|
||||||
def change_radio(self, *args, **kwargs):
|
async def change_radio(self, *args, **kwargs):
|
||||||
callback = kwargs.get('callback', False)
|
callback = kwargs.get('callback', False)
|
||||||
data = kwargs.get('data', {})
|
data = kwargs.get('data', {})
|
||||||
|
|
||||||
@ -604,7 +604,7 @@ class IrisCore(pykka.ThreadingActor):
|
|||||||
'enabled': 1,
|
'enabled': 1,
|
||||||
'results': []
|
'results': []
|
||||||
}
|
}
|
||||||
uris = self.load_more_tracks()
|
uris = await self.load_more_tracks()
|
||||||
|
|
||||||
# make sure we got recommendations
|
# make sure we got recommendations
|
||||||
if uris:
|
if uris:
|
||||||
@ -656,7 +656,7 @@ class IrisCore(pykka.ThreadingActor):
|
|||||||
# Failed fetching/adding tracks, so no-go
|
# Failed fetching/adding tracks, so no-go
|
||||||
else:
|
else:
|
||||||
logger.error("No recommendations returned by Spotify")
|
logger.error("No recommendations returned by Spotify")
|
||||||
self.radio['enabled'] = 0;
|
self.radio['enabled'] = 0
|
||||||
error = {
|
error = {
|
||||||
'code': 32500,
|
'code': 32500,
|
||||||
'message': 'Could not start radio',
|
'message': 'Could not start radio',
|
||||||
@ -701,10 +701,10 @@ class IrisCore(pykka.ThreadingActor):
|
|||||||
return response
|
return response
|
||||||
|
|
||||||
|
|
||||||
def load_more_tracks(self, *args, **kwargs):
|
async def load_more_tracks(self, *args, **kwargs):
|
||||||
|
|
||||||
try:
|
try:
|
||||||
self.get_spotify_token()
|
await self.get_spotify_token()
|
||||||
spotify_token = self.spotify_token
|
spotify_token = self.spotify_token
|
||||||
access_token = spotify_token['access_token']
|
access_token = spotify_token['access_token']
|
||||||
except:
|
except:
|
||||||
@ -712,27 +712,32 @@ class IrisCore(pykka.ThreadingActor):
|
|||||||
logger.error(error)
|
logger.error(error)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
url = 'https://api.spotify.com/v1/recommendations/'
|
||||||
|
url = url+'?seed_artists='+(",".join(self.radio['seed_artists'])).replace('spotify:artist:','')
|
||||||
|
url = url+'&seed_genres='+(",".join(self.radio['seed_genres'])).replace('spotify:genre:','')
|
||||||
|
url = url+'&seed_tracks='+(",".join(self.radio['seed_tracks'])).replace('spotify:track:','')
|
||||||
|
url = url+'&limit=50'
|
||||||
|
http_client = AsyncHTTPClient()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
url = 'https://api.spotify.com/v1/recommendations/'
|
http_response = await http_client.fetch(
|
||||||
url = url+'?seed_artists='+(",".join(self.radio['seed_artists'])).replace('spotify:artist:','')
|
url,
|
||||||
url = url+'&seed_genres='+(",".join(self.radio['seed_genres'])).replace('spotify:genre:','')
|
'POST',
|
||||||
url = url+'&seed_tracks='+(",".join(self.radio['seed_tracks'])).replace('spotify:track:','')
|
headers={'Authorization': 'Bearer '+access_token}
|
||||||
url = url+'&limit=50'
|
)
|
||||||
|
response_body = json.loads(http_response.body)
|
||||||
req = urllib.request(url)
|
|
||||||
req.add_header('Authorization', 'Bearer '+access_token)
|
|
||||||
|
|
||||||
response = urllib.urlopen(req, timeout=30).read()
|
|
||||||
response_dict = json.loads(response)
|
|
||||||
|
|
||||||
uris = []
|
uris = []
|
||||||
for track in response_dict['tracks']:
|
for track in response_body['tracks']:
|
||||||
uris.append( track['uri'] )
|
uris.append( track['uri'] )
|
||||||
|
|
||||||
return uris
|
return uris
|
||||||
|
|
||||||
except:
|
except (urllib.error.HTTPError, urllib.error.URLError) as e:
|
||||||
logger.error('IrisFrontend: Failed to fetch Spotify recommendations')
|
error = json.loads(e.read())
|
||||||
|
error = {'message': 'Could not fetch Spotify recommendations: '+error['error_description']}
|
||||||
|
logger.error('Could not fetch Spotify recommendations: '+error['error_description'])
|
||||||
|
logger.debug(error)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
@ -971,12 +976,12 @@ class IrisCore(pykka.ThreadingActor):
|
|||||||
# passing token to frontend for javascript requests without use of the Authorization Code Flow.
|
# passing token to frontend for javascript requests without use of the Authorization Code Flow.
|
||||||
##
|
##
|
||||||
|
|
||||||
def get_spotify_token(self, *args, **kwargs):
|
async def get_spotify_token(self, *args, **kwargs):
|
||||||
callback = kwargs.get('callback', False)
|
callback = kwargs.get('callback', False)
|
||||||
|
|
||||||
# Expired, so go get a new one
|
# Expired, so go get a new one
|
||||||
if (not self.spotify_token or self.spotify_token['expires_at'] <= time.time()):
|
if (not self.spotify_token or self.spotify_token['expires_at'] <= time.time()):
|
||||||
self.refresh_spotify_token()
|
await self.refresh_spotify_token()
|
||||||
|
|
||||||
response = {
|
response = {
|
||||||
'spotify_token': self.spotify_token
|
'spotify_token': self.spotify_token
|
||||||
@ -997,7 +1002,7 @@ class IrisCore(pykka.ThreadingActor):
|
|||||||
'client_id': self.config['spotify']['client_id'],
|
'client_id': self.config['spotify']['client_id'],
|
||||||
'client_secret': self.config['spotify']['client_secret'],
|
'client_secret': self.config['spotify']['client_secret'],
|
||||||
'grant_type': 'client_credentials'
|
'grant_type': 'client_credentials'
|
||||||
}
|
}
|
||||||
|
|
||||||
try:
|
try:
|
||||||
http_client = tornado.httpclient.AsyncHTTPClient()
|
http_client = tornado.httpclient.AsyncHTTPClient()
|
||||||
|
|||||||
@ -178,7 +178,7 @@ class HttpHandler(tornado.web.RequestHandler):
|
|||||||
else:
|
else:
|
||||||
getattr(iris, slug)(data=params, request=self.request, callback=lambda response=False, error=False: self.handle_result(id=id, method=slug, response=response, error=error))
|
getattr(iris, slug)(data=params, request=self.request, callback=lambda response=False, error=False: self.handle_result(id=id, method=slug, response=response, error=error))
|
||||||
|
|
||||||
except HTTPError as e:
|
except tornado.web.HTTPError as e:
|
||||||
self.handle_result(id=id, error={'code': 32601, 'message': "Invalid JSON payload"})
|
self.handle_result(id=id, error={'code': 32601, 'message': "Invalid JSON payload"})
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|||||||
@ -70840,7 +70840,7 @@ var MopidyMiddleware = function () {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 'MOPIDY_REMOVE_TRACKS':
|
case 'MOPIDY_REMOVE_TRACKS':
|
||||||
request(socket, store, 'tracklist.remove', { tlid: action.tlids }).then(function (response) {
|
request(socket, store, 'tracklist.remove', { criteria: { tlid: action.tlids } }).then(function (response) {
|
||||||
store.dispatch(pusherActions.deliverBroadcast('notification', {
|
store.dispatch(pusherActions.deliverBroadcast('notification', {
|
||||||
notification: {
|
notification: {
|
||||||
content: store.getState().pusher.username + ' removed ' + action.tlids.length + ' tracks'
|
content: store.getState().pusher.username + ' removed ' + action.tlids.length + ' tracks'
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@ -446,7 +446,7 @@ const MopidyMiddleware = (function () {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 'MOPIDY_REMOVE_TRACKS':
|
case 'MOPIDY_REMOVE_TRACKS':
|
||||||
request(socket, store, 'tracklist.remove', { tlid: action.tlids })
|
request(socket, store, 'tracklist.remove', { criteria: { tlid: action.tlids } })
|
||||||
.then((response) => {
|
.then((response) => {
|
||||||
store.dispatch(pusherActions.deliverBroadcast(
|
store.dispatch(pusherActions.deliverBroadcast(
|
||||||
'notification',
|
'notification',
|
||||||
|
|||||||
Reference in New Issue
Block a user