]> kaliko git repositories - python-musicpdaio.git/blobdiff - mpdaio/client.py
Move protocol logic in the client
[python-musicpdaio.git] / mpdaio / client.py
index 00dbfed61f50e237bac788000200236b4752af3e..aaffc0a929e3f4b9cc7de56ce3d95c4d9c1fd480 100644 (file)
@@ -11,7 +11,7 @@ from .exceptions import MPDConnectionError, MPDProtocolError, MPDCommandError
 from .utils import Range, escape
 
 from .const import CONNECTION_MAX, CONNECTION_TIMEOUT
-from .const import ERROR_PREFIX, SUCCESS, NEXT
+from .const import HELLO_PREFIX, ERROR_PREFIX, SUCCESS, NEXT
 
 log = logging.getLogger(__name__)
 
@@ -295,17 +295,28 @@ class CmdHandler:
             return retval
 
     async def _init_connection(self):
-        """Init connection if needed"""
+        """Init connection if needed
+
+        * Consumes the hello line and sets the protocol version
+        * Send password command if a password is provided
+        """
         if not self.connection.version:
-            # TODO: move hello here instead of connection?
-            # Need to consume hello
-            pass
+            await self._hello()
         if self.password and not self.connection.auth:
             # Need to send password
             await self._write_command('password', [self.password])
             await self._fetch_nothing()
             self.connection.auth = True
 
+    async def _hello(self) -> None:
+        """Consume HELLO_PREFIX"""
+        data = await self.connection.readuntil(b'\n')
+        rcv = data.decode('utf-8')
+        if not rcv.startswith(HELLO_PREFIX):
+            raise MPDProtocolError(f'Got invalid MPD hello: "{rcv}"')
+        log.debug('consumed hello prefix: %r', rcv)
+        self.connection.version = rcv.split('\n')[0][len(HELLO_PREFIX):]
+
     async def _write_line(self, line):
         self.connection.write(f"{line!s}\n".encode())
         await self.connection.drain()