forked from platypush/platypush
Added draft for mopidy backend over websocket
This commit is contained in:
parent
f68efc0d68
commit
7b99842225
1 changed files with 64 additions and 0 deletions
64
platypush/backend/music/mopidy.py
Normal file
64
platypush/backend/music/mopidy.py
Normal file
|
@ -0,0 +1,64 @@
|
|||
import asyncio
|
||||
import time
|
||||
|
||||
from platypush.backend import Backend
|
||||
from platypush.message.event.music import MusicPlayEvent, MusicPauseEvent, \
|
||||
MusicStopEvent, NewPlayingTrackEvent, PlaylistChangeEvent, VolumeChangeEvent, \
|
||||
PlaybackConsumeModeChangeEvent, PlaybackSingleModeChangeEvent, \
|
||||
PlaybackRepeatModeChangeEvent, PlaybackRandomModeChangeEvent
|
||||
|
||||
|
||||
class MusicMopidyBackend(Backend):
|
||||
"""
|
||||
This backend listens for events on a Mopidy music server streaming port.
|
||||
Since this backend leverages the Mopidy websocket interface it is only
|
||||
compatible with Mopidy and not with other MPD servers. Please use the
|
||||
:class:`platypush.backend.music.mpd.MusicMpdBackend` for a similar polling
|
||||
solution if you're not running Mopidy or your instance has the websocket
|
||||
interface or web port disabled.
|
||||
|
||||
Triggers:
|
||||
|
||||
* :class:`platypush.message.event.music.MusicPlayEvent` if the playback state changed to play
|
||||
* :class:`platypush.message.event.music.MusicPauseEvent` if the playback state changed to pause
|
||||
* :class:`platypush.message.event.music.MusicStopEvent` if the playback state changed to stop
|
||||
* :class:`platypush.message.event.music.NewPlayingTrackEvent` if a new track is being played
|
||||
* :class:`platypush.message.event.music.PlaylistChangeEvent` if the main playlist has changed
|
||||
* :class:`platypush.message.event.music.VolumeChangeEvent` if the main volume has changed
|
||||
|
||||
Requires:
|
||||
* **websockets** (``pip install websockets``)
|
||||
* Mopidy installed and the HTTP service enabled
|
||||
"""
|
||||
|
||||
def __init__(self, server='localhost', port=6680, **kwargs):
|
||||
super().__init__(**kwargs)
|
||||
|
||||
self.server = server
|
||||
self.port = int(port)
|
||||
self.url = 'ws://{}:{}/mopidy/ws'.format(server, port)
|
||||
|
||||
async def poll_events(self):
|
||||
import websockets
|
||||
|
||||
try:
|
||||
while not self.should_stop():
|
||||
async with websockets.connect(self.url) as ws:
|
||||
msg = await ws.recv()
|
||||
# TODO handle the message
|
||||
except Exception as e:
|
||||
self.logger.warning('The Mopidy backend raised an exception')
|
||||
self.logger.exception(e)
|
||||
time.sleep(2) # Wait a bit before retrying
|
||||
|
||||
def run(self):
|
||||
super().run()
|
||||
|
||||
loop = asyncio.new_event_loop()
|
||||
asyncio.set_event_loop(loop)
|
||||
|
||||
while not self.should_stop():
|
||||
loop.run_until_complete(self.poll_events())
|
||||
|
||||
|
||||
# vim:sw=4:ts=4:et:
|
Loading…
Reference in a new issue