""" homeassistant.components.media_player.mpd ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Provides functionality to interact with a Music Player Daemon. Configuration: To use MPD you will need to add something like the following to your config/configuration.yaml media_player: platform: mpd server: 127.0.0.1 port: 6600 location: bedroom Variables: server *Required IP address of the Music Player Daemon. Example: 192.168.1.32 port *Optional Port of the Music Player Daemon, defaults to 6600. Example: 6600 location *Optional Location of your Music Player Daemon. """ import logging import socket from homeassistant.components.media_player import ( MediaPlayerDevice, STATE_NO_APP, ATTR_MEDIA_STATE, ATTR_MEDIA_CONTENT_ID, ATTR_MEDIA_TITLE, ATTR_MEDIA_ARTIST, ATTR_MEDIA_ALBUM, ATTR_MEDIA_DATE, ATTR_MEDIA_DURATION, ATTR_MEDIA_VOLUME, MEDIA_STATE_PAUSED, MEDIA_STATE_PLAYING, MEDIA_STATE_STOPPED, MEDIA_STATE_UNKNOWN) _LOGGER = logging.getLogger(__name__) # pylint: disable=unused-argument def setup_platform(hass, config, add_devices, discovery_info=None): """ Sets up the MPD platform. """ daemon = config.get('server', None) port = config.get('port', 6600) location = config.get('location', 'MPD') # pylint: disable=unused-argument try: from mpd import MPDClient except ImportError: _LOGGER.exception( "Unable to import mpd2. " "Did you maybe not install the 'python-mpd2' package?") return None # pylint: disable=unused-argument try: mpd_client = MPDClient() mpd_client.connect(daemon, port) except socket.error: _LOGGER.error( "Unable to connect to MPD. " "Please check your settings") return None mpd = [] if daemon is not None and port is not None: mpd.append(MpdDevice(daemon, port, location)) add_devices(mpd) class MpdDevice(MediaPlayerDevice): """ Represents a MPD server. """ def __init__(self, server, port, location): from mpd import MPDClient self.server = server self.port = port self._name = location self.state_attr = {ATTR_MEDIA_STATE: MEDIA_STATE_STOPPED} self.client = MPDClient() self.client.timeout = 10 self.client.idletimeout = None self.client.connect(self.server, self.port) @property def name(self): """ Returns the name of the device. """ return self._name # pylint: disable=no-member @property def state(self): """ Returns the state of the device. """ status = self.client.status() if status is None: return STATE_NO_APP else: return self.client.currentsong()['artist'] @property def media_state(self): """ Returns the media state. """ media_controller = self.client.status() if media_controller['state'] == 'play': return MEDIA_STATE_PLAYING elif media_controller['state'] == 'pause': return MEDIA_STATE_PAUSED elif media_controller['state'] == 'stop': return MEDIA_STATE_STOPPED else: return MEDIA_STATE_UNKNOWN # pylint: disable=no-member @property def state_attributes(self): """ Returns the state attributes. """ status = self.client.status() current_song = self.client.currentsong() if not status and not current_song: state_attr = {} if current_song['id']: state_attr[ATTR_MEDIA_CONTENT_ID] = current_song['id'] if current_song['date']: state_attr[ATTR_MEDIA_DATE] = current_song['date'] if current_song['title']: state_attr[ATTR_MEDIA_TITLE] = current_song['title'] if current_song['time']: state_attr[ATTR_MEDIA_DURATION] = current_song['time'] if current_song['artist']: state_attr[ATTR_MEDIA_ARTIST] = current_song['artist'] if current_song['album']: state_attr[ATTR_MEDIA_ALBUM] = current_song['album'] state_attr[ATTR_MEDIA_VOLUME] = status['volume'] return state_attr def turn_off(self): """ Service to exit the running MPD. """ self.client.stop() def volume_up(self): """ Service to send the MPD the command for volume up. """ current_volume = self.client.status()['volume'] if int(current_volume) <= 100: self.client.setvol(int(current_volume) + 5) def volume_down(self): """ Service to send the MPD the command for volume down. """ current_volume = self.client.status()['volume'] if int(current_volume) >= 0: self.client.setvol(int(current_volume) - 5) def media_play_pause(self): """ Service to send the MPD the command for play/pause. """ self.client.pause() def media_play(self): """ Service to send the MPD the command for play/pause. """ self.client.start() def media_pause(self): """ Service to send the MPD the command for play/pause. """ self.client.pause() def media_next_track(self): """ Service to send the MPD the command for next track. """ self.client.next() def media_prev_track(self): """ Service to send the MPD the command for previous track. """ self.client.previous()