From b53ba2ca6d16a4b576a985ab741f7a243562653d Mon Sep 17 00:00:00 2001 From: James Barnsley Date: Thu, 16 Feb 2017 19:51:49 +1300 Subject: [PATCH] Tinkering with /ws --- mopidy_iris/__init__.py | 10 ++++++-- mopidy_iris/frontend.py | 32 +++++++------------------ mopidy_iris/http.py | 5 ++-- mopidy_iris/{pusher.py => websocket.py} | 5 ++-- src/js/services/pusher/middleware.js | 4 ++-- 5 files changed, 25 insertions(+), 31 deletions(-) rename mopidy_iris/{pusher.py => websocket.py} (96%) diff --git a/mopidy_iris/__init__.py b/mopidy_iris/__init__.py index 1a0d939e..872d51ac 100755 --- a/mopidy_iris/__init__.py +++ b/mopidy_iris/__init__.py @@ -5,7 +5,8 @@ import tornado.web import tornado.websocket from mopidy import config, ext from frontend import IrisFrontend -from http import RequestHandler +from http import HttpHandler +from websocket import WebsocketHandler logger = logging.getLogger(__name__) __version__ = '2.12.1' @@ -52,10 +53,15 @@ def factory(config, core): (r"/images/(.*)", tornado.web.StaticFileHandler, { "path": config['local-images']['image_dir'] }), - (r'/http/([^/]*)', RequestHandler, { + (r'/http/([^/]*)', HttpHandler, { 'core': core, + 'frontend': IrisFrontend, 'config': config }), + (r'/ws/?', WebsocketHandler, { + 'core': core, + 'frontend': IrisFrontend + }), (r'/(.*)', tornado.web.StaticFileHandler, { "path": path, "default_filename": "index.html" diff --git a/mopidy_iris/frontend.py b/mopidy_iris/frontend.py index ca5178fe..b80aa9e3 100755 --- a/mopidy_iris/frontend.py +++ b/mopidy_iris/frontend.py @@ -1,6 +1,6 @@ from __future__ import unicode_literals -import logging, json, pykka, pylast, pusher, urllib, urllib2, os, sys, mopidy_iris, subprocess +import logging, json, pykka, pylast, urllib, urllib2, os, sys, mopidy_iris, subprocess import tornado.web import tornado.websocket import tornado.ioloop @@ -8,6 +8,7 @@ from mopidy import config, ext from mopidy.core import CoreListener from pkg_resources import parse_version from spotipy import Spotify +from websocket import WebsocketHandler # import logger logger = logging.getLogger(__name__) @@ -35,23 +36,8 @@ class IrisFrontend(pykka.ThreadingActor, CoreListener): "seed_tracks": [] } - def on_start(self): - + def on_start(self): logger.info('Starting Iris '+self.version) - - # try and start a pusher server - port = str(self.config['iris']['pusherport']) - try: - self.pusher = tornado.web.Application([( '/pusher', pusher.PusherWebsocketHandler, { 'frontend': self } )]) - self.pusher.listen(port) - logger.info('Pusher server running at [0.0.0.0]:'+port) - - except( pylast.NetworkError, pylast.MalformedResponseError, pylast.WSError ) as e: - logger.error('Error starting Pusher: %s', e) - self.stop() - - # get a fresh spotify authentication token and store for future use - # self.refresh_spotify_token() ## @@ -102,7 +88,7 @@ class IrisFrontend(pykka.ThreadingActor, CoreListener): self.load_more_tracks() except RuntimeError: - pusher.broadcast('error', {'source': 'check_for_radio_update', 'message': 'Could not fetch tracklist length'}) + WebsocketHandler.broadcast('error', {'source': 'check_for_radio_update', 'message': 'Could not fetch tracklist length'}) logger.warning('IrisFrontend: Could not fetch tracklist length') pass @@ -123,7 +109,7 @@ class IrisFrontend(pykka.ThreadingActor, CoreListener): token = token['access_token'] except: logger.error('IrisFrontend: access_token missing or invalid') - pusher.broadcast('error', {'source': 'load_more_tracks', 'message': 'access_token missing or invalid'}) + WebsocketHandler.broadcast('error', {'source': 'load_more_tracks', 'message': 'access_token missing or invalid'}) try: spotify = Spotify( auth = token ) @@ -161,7 +147,7 @@ class IrisFrontend(pykka.ThreadingActor, CoreListener): self.core.playback.play() # notify clients - pusher.broadcast('radio', { 'radio': self.radio }) + WebsocketHandler.broadcast('radio', { 'radio': self.radio }) # return new radio state to initial call return self.radio @@ -183,7 +169,7 @@ class IrisFrontend(pykka.ThreadingActor, CoreListener): self.core.playback.stop() # notify clients - pusher.broadcast( 'radio', { 'radio': self.radio }) + WebsocketHandler.broadcast( 'radio', { 'radio': self.radio }) # return new radio state to initial call return self.radio @@ -212,7 +198,7 @@ class IrisFrontend(pykka.ThreadingActor, CoreListener): self.queue_metadata['tlid_'+str(tlid)] = item # broadcast to all clients - pusher.broadcast('queue_metadata', {'queue_metadata': self.queue_metadata}) + WebsocketHandler.broadcast('queue_metadata', {'queue_metadata': self.queue_metadata}) return self.queue_metadata @@ -232,7 +218,7 @@ class IrisFrontend(pykka.ThreadingActor, CoreListener): self.queue_metadata = cleaned_queue_metadata # broadcast to all clients - pusher.broadcast('queue_metadata', {'queue_metadata': self.queue_metadata}) + WebsocketHandler.broadcast('queue_metadata', {'queue_metadata': self.queue_metadata}) ## diff --git a/mopidy_iris/http.py b/mopidy_iris/http.py index bb089473..3330aa92 100755 --- a/mopidy_iris/http.py +++ b/mopidy_iris/http.py @@ -7,12 +7,13 @@ from spotipy import Spotify # import logger logger = logging.getLogger(__name__) -class RequestHandler(tornado.web.RequestHandler): +class HttpHandler(tornado.web.RequestHandler): def set_default_headers(self): self.set_header("Access-Control-Allow-Origin", "*") - def initialize(self, core, config): + def initialize(self, frontend, core, config): + self.frontend = frontend self.core = core self.config = config diff --git a/mopidy_iris/pusher.py b/mopidy_iris/websocket.py similarity index 96% rename from mopidy_iris/pusher.py rename to mopidy_iris/websocket.py index e868051b..46e74584 100755 --- a/mopidy_iris/pusher.py +++ b/mopidy_iris/websocket.py @@ -76,9 +76,10 @@ def digest_protocol( protocol ): # This is the actual websocket thread that accepts, digests and emits messages. # TODO: Figure out how to merge this into the main Mopidy websocket to avoid needing two websocket servers ## -class PusherWebsocketHandler(tornado.websocket.WebSocketHandler): +class WebsocketHandler(tornado.websocket.WebSocketHandler): - def initialize(self, frontend): + def initialize(self, core, frontend): + self.core = core self.frontend = frontend def check_origin(self, origin): diff --git a/src/js/services/pusher/middleware.js b/src/js/services/pusher/middleware.js index 9cce3556..16122962 100755 --- a/src/js/services/pusher/middleware.js +++ b/src/js/services/pusher/middleware.js @@ -95,9 +95,9 @@ const PusherMiddleware = (function(){ username: Math.random().toString(36).substr(2, 9) } if( state.pusher.username ) connection.username = state.pusher.username; - + socket = new WebSocket( - 'ws://'+state.mopidy.host+':'+state.pusher.port+'/pusher', + 'ws://'+state.mopidy.host+':'+state.mopidy.port+'/iris/ws', [ connection.clientid, connection.connectionid, connection.username ] );