Radio now functional; Fetching lyrics still triggers 'Cannot run the event loop while another loop is running' error...

This commit is contained in:
James Barnsley
2020-01-19 21:21:11 +13:00
parent 20d5e3729d
commit 7da76f3b9c
5 changed files with 31 additions and 26 deletions

View File

@ -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()

View File

@ -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

View File

@ -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

View File

@ -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',