Move MpdSession to a session module
This commit is contained in:
parent
d9d6a3d5b6
commit
d4f5d02c72
@ -4,8 +4,8 @@ import sys
|
|||||||
from pykka import registry, actor
|
from pykka import registry, actor
|
||||||
|
|
||||||
from mopidy import core, settings
|
from mopidy import core, settings
|
||||||
from mopidy.frontends.mpd import dispatcher, protocol
|
from mopidy.frontends.mpd import session
|
||||||
from mopidy.utils import locale_decode, log, network, process
|
from mopidy.utils import locale_decode, network, process
|
||||||
|
|
||||||
logger = logging.getLogger('mopidy.frontends.mpd')
|
logger = logging.getLogger('mopidy.frontends.mpd')
|
||||||
|
|
||||||
@ -33,7 +33,7 @@ class MpdFrontend(actor.ThreadingActor, core.CoreListener):
|
|||||||
try:
|
try:
|
||||||
network.Server(
|
network.Server(
|
||||||
hostname, port,
|
hostname, port,
|
||||||
protocol=MpdSession, protocol_kwargs={'core': core},
|
protocol=session.MpdSession, protocol_kwargs={'core': core},
|
||||||
max_connections=settings.MPD_SERVER_MAX_CONNECTIONS)
|
max_connections=settings.MPD_SERVER_MAX_CONNECTIONS)
|
||||||
except IOError as error:
|
except IOError as error:
|
||||||
logger.error(
|
logger.error(
|
||||||
@ -43,7 +43,7 @@ class MpdFrontend(actor.ThreadingActor, core.CoreListener):
|
|||||||
logger.info(u'MPD server running at [%s]:%s', hostname, port)
|
logger.info(u'MPD server running at [%s]:%s', hostname, port)
|
||||||
|
|
||||||
def on_stop(self):
|
def on_stop(self):
|
||||||
process.stop_actors_by_class(MpdSession)
|
process.stop_actors_by_class(session.MpdSession)
|
||||||
|
|
||||||
def send_idle(self, subsystem):
|
def send_idle(self, subsystem):
|
||||||
# FIXME this should be updated once pykka supports non-blocking calls
|
# FIXME this should be updated once pykka supports non-blocking calls
|
||||||
@ -53,7 +53,7 @@ class MpdFrontend(actor.ThreadingActor, core.CoreListener):
|
|||||||
'attr_path': ('on_idle',),
|
'attr_path': ('on_idle',),
|
||||||
'args': [subsystem],
|
'args': [subsystem],
|
||||||
'kwargs': {},
|
'kwargs': {},
|
||||||
}, target_class=MpdSession)
|
}, target_class=session.MpdSession)
|
||||||
|
|
||||||
def playback_state_changed(self, old_state, new_state):
|
def playback_state_changed(self, old_state, new_state):
|
||||||
self.send_idle('player')
|
self.send_idle('player')
|
||||||
@ -66,53 +66,3 @@ class MpdFrontend(actor.ThreadingActor, core.CoreListener):
|
|||||||
|
|
||||||
def volume_changed(self):
|
def volume_changed(self):
|
||||||
self.send_idle('mixer')
|
self.send_idle('mixer')
|
||||||
|
|
||||||
|
|
||||||
class MpdSession(network.LineProtocol):
|
|
||||||
"""
|
|
||||||
The MPD client session. Keeps track of a single client session. Any
|
|
||||||
requests from the client is passed on to the MPD request dispatcher.
|
|
||||||
"""
|
|
||||||
|
|
||||||
terminator = protocol.LINE_TERMINATOR
|
|
||||||
encoding = protocol.ENCODING
|
|
||||||
delimiter = r'\r?\n'
|
|
||||||
|
|
||||||
def __init__(self, connection, core=None):
|
|
||||||
super(MpdSession, self).__init__(connection)
|
|
||||||
self.dispatcher = dispatcher.MpdDispatcher(session=self, core=core)
|
|
||||||
|
|
||||||
def on_start(self):
|
|
||||||
logger.info(u'New MPD connection from [%s]:%s', self.host, self.port)
|
|
||||||
self.send_lines([u'OK MPD %s' % protocol.VERSION])
|
|
||||||
|
|
||||||
def on_line_received(self, line):
|
|
||||||
logger.debug(
|
|
||||||
u'Request from [%s]:%s to %s: %s',
|
|
||||||
self.host, self.port, self.actor_urn, line)
|
|
||||||
|
|
||||||
response = self.dispatcher.handle_request(line)
|
|
||||||
if not response:
|
|
||||||
return
|
|
||||||
|
|
||||||
logger.debug(
|
|
||||||
u'Response to [%s]:%s from %s: %s',
|
|
||||||
self.host, self.port, self.actor_urn,
|
|
||||||
log.indent(self.terminator.join(response)))
|
|
||||||
|
|
||||||
self.send_lines(response)
|
|
||||||
|
|
||||||
def on_idle(self, subsystem):
|
|
||||||
self.dispatcher.handle_idle(subsystem)
|
|
||||||
|
|
||||||
def decode(self, line):
|
|
||||||
try:
|
|
||||||
return super(MpdSession, self).decode(line.decode('string_escape'))
|
|
||||||
except ValueError:
|
|
||||||
logger.warning(
|
|
||||||
u'Stopping actor due to unescaping error, data '
|
|
||||||
u'supplied by client was not valid.')
|
|
||||||
self.stop()
|
|
||||||
|
|
||||||
def close(self):
|
|
||||||
self.stop()
|
|
||||||
|
|||||||
56
mopidy/frontends/mpd/session.py
Normal file
56
mopidy/frontends/mpd/session.py
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
import logging
|
||||||
|
|
||||||
|
from mopidy.frontends.mpd import dispatcher, protocol
|
||||||
|
from mopidy.utils import log, network
|
||||||
|
|
||||||
|
logger = logging.getLogger('mopidy.frontends.mpd')
|
||||||
|
|
||||||
|
|
||||||
|
class MpdSession(network.LineProtocol):
|
||||||
|
"""
|
||||||
|
The MPD client session. Keeps track of a single client session. Any
|
||||||
|
requests from the client is passed on to the MPD request dispatcher.
|
||||||
|
"""
|
||||||
|
|
||||||
|
terminator = protocol.LINE_TERMINATOR
|
||||||
|
encoding = protocol.ENCODING
|
||||||
|
delimiter = r'\r?\n'
|
||||||
|
|
||||||
|
def __init__(self, connection, core=None):
|
||||||
|
super(MpdSession, self).__init__(connection)
|
||||||
|
self.dispatcher = dispatcher.MpdDispatcher(session=self, core=core)
|
||||||
|
|
||||||
|
def on_start(self):
|
||||||
|
logger.info(u'New MPD connection from [%s]:%s', self.host, self.port)
|
||||||
|
self.send_lines([u'OK MPD %s' % protocol.VERSION])
|
||||||
|
|
||||||
|
def on_line_received(self, line):
|
||||||
|
logger.debug(
|
||||||
|
u'Request from [%s]:%s to %s: %s',
|
||||||
|
self.host, self.port, self.actor_urn, line)
|
||||||
|
|
||||||
|
response = self.dispatcher.handle_request(line)
|
||||||
|
if not response:
|
||||||
|
return
|
||||||
|
|
||||||
|
logger.debug(
|
||||||
|
u'Response to [%s]:%s from %s: %s',
|
||||||
|
self.host, self.port, self.actor_urn,
|
||||||
|
log.indent(self.terminator.join(response)))
|
||||||
|
|
||||||
|
self.send_lines(response)
|
||||||
|
|
||||||
|
def on_idle(self, subsystem):
|
||||||
|
self.dispatcher.handle_idle(subsystem)
|
||||||
|
|
||||||
|
def decode(self, line):
|
||||||
|
try:
|
||||||
|
return super(MpdSession, self).decode(line.decode('string_escape'))
|
||||||
|
except ValueError:
|
||||||
|
logger.warning(
|
||||||
|
u'Stopping actor due to unescaping error, data '
|
||||||
|
u'supplied by client was not valid.')
|
||||||
|
self.stop()
|
||||||
|
|
||||||
|
def close(self):
|
||||||
|
self.stop()
|
||||||
@ -4,7 +4,7 @@ from pykka.registry import ActorRegistry
|
|||||||
|
|
||||||
from mopidy import core, settings
|
from mopidy import core, settings
|
||||||
from mopidy.backends import dummy
|
from mopidy.backends import dummy
|
||||||
from mopidy.frontends import mpd
|
from mopidy.frontends.mpd import session
|
||||||
|
|
||||||
from tests import unittest
|
from tests import unittest
|
||||||
|
|
||||||
@ -27,7 +27,7 @@ class BaseTestCase(unittest.TestCase):
|
|||||||
self.core = core.Core.start(backend=self.backend).proxy()
|
self.core = core.Core.start(backend=self.backend).proxy()
|
||||||
|
|
||||||
self.connection = MockConnection()
|
self.connection = MockConnection()
|
||||||
self.session = mpd.MpdSession(self.connection, core=self.core)
|
self.session = session.MpdSession(self.connection, core=self.core)
|
||||||
self.dispatcher = self.session.dispatcher
|
self.dispatcher = self.session.dispatcher
|
||||||
self.context = self.dispatcher.context
|
self.context = self.dispatcher.context
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user