from .exceptions import MPDConnectionError, MPDProtocolError, MPDCommandError
from .utils import Range, escape
-from . import CONNECTION_MAX, CONNECTION_TIMEOUT
-from . import ERROR_PREFIX, SUCCESS, NEXT
+from .const import CONNECTION_MAX, CONNECTION_TIMEOUT
+from .const import ERROR_PREFIX, SUCCESS, NEXT
log = logging.getLogger(__name__)
#: host used with the current connection (:py:obj:`str`)
self.host = host or self.server_discovery[0]
#: password detected in :envvar:`MPD_HOST` environment variable (:py:obj:`str`)
- self.password = password or self.server_discovery[2]
+ self.pwd = password or self.server_discovery[2]
#: port used with the current connection (:py:obj:`int`, :py:obj:`str`)
self.port = port or self.server_discovery[1]
self.mpd_timeout = CONNECTION_TIMEOUT
def __getattr__(self, attr):
command = attr
- wrapper = CmdHandler(self._pool, self.host, self.port, self.password, self.mpd_timeout)
+ wrapper = CmdHandler(self._pool, self.host, self.port, self.pwd, self.mpd_timeout)
if command not in wrapper._commands:
command = command.replace("_", " ")
if command not in wrapper._commands:
"clearerror": self._fetch_nothing,
"currentsong": self._fetch_object,
"idle": self._fetch_list,
- # "noidle": None,
+ "noidle": self._fetch_nothing,
"status": self._fetch_object,
"stats": self._fetch_object,
# Playback Option Commands
server, port = self.host
self.command = command
self.args = args or ''
- self.connection = await self.pool.connect(server, port, timeout=self.timeout)
+ self.connection = await self.pool.connect(server, port, self.timeout)
async with self.connection:
+ await self._init_connection()
retval = self._commands[command]
await self._write_command(command, args)
if callable(retval):
return await retval()
return retval
+ async def _init_connection(self):
+ """Init connection if needed"""
+ if not self.connection.version:
+ # TODO: move hello here instead of connection?
+ # Need to consume hello
+ pass
+ 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 _write_line(self, line):
self.connection.write(f"{line!s}\n".encode())
await self.connection.drain()
from types import TracebackType
from typing import Any, List, Optional, Tuple, Type
-from . import HELLO_PREFIX
+from .const import HELLO_PREFIX
from .exceptions import MPDProtocolError
try: # Python 3.7
self._reader = reader
self._writer = writer
self._closed = False
+ self.auth = False
self.in_use = False
+ self.version: str | None = None
def __repr__(self):
host = f"{self._host[0]}:{self._host[1]}"
raise MPDProtocolError(f'Got invalid MPD hello: "{rcv}"')
log.debug('consumed hello prefix: %r', rcv)
self.version = rcv.split('\n')[0][len(HELLO_PREFIX):]
- log.info('protocol version: %s', self.version)
def __getattr__(self, name: str) -> Any:
"""All unknown attributes are delegated to the reader and writer"""