diff --git a/homeassistant/components/media_player/plex.py b/homeassistant/components/media_player/plex.py new file mode 100644 index 0000000000000000000000000000000000000000..96d0b2d0f84c3f8df2731299b85f466736e0bb64 --- /dev/null +++ b/homeassistant/components/media_player/plex.py @@ -0,0 +1,188 @@ +""" +homeassistant.components.media_player.plex +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Provides an interface to the Plex API + +Configuration: + +To use Plex add something like this to your configuration: + +media_player: + platform: plex + name: plex + user: plex + password: my_secure_password + +Variables: + +name +*Required +The name of the backend device + +device +*Required +The frontend device (Look under settings > devices). + +user +*Required +The Plex username + +password +*Required +The Plex password +""" + +import logging + +from homeassistant.components.media_player import ( + MediaPlayerDevice, SUPPORT_PAUSE, SUPPORT_PREVIOUS_TRACK, + SUPPORT_NEXT_TRACK, MEDIA_TYPE_TVSHOW, MEDIA_TYPE_VIDEO) +from homeassistant.const import ( + STATE_IDLE, STATE_PLAYING, STATE_PAUSED, STATE_UNKNOWN) +from plexapi.myplex import MyPlexUser + +_LOGGER = logging.getLogger(__name__) + +SUPPORT_PLEX = SUPPORT_PAUSE | SUPPORT_PREVIOUS_TRACK | SUPPORT_NEXT_TRACK + +# pylint: disable=abstract-method +# pylint: disable=unused-argument +def setup_platform(hass, config, add_devices, discovery_info=None): + """ Sets up the plex platform. """ + name = config.get('name', '') + user = config.get('user', '') + password = config.get('password', '') + plexuser = MyPlexUser.signin(user, password) + plexserver = plexuser.getResource(name).connect() + dev = plexserver.clients() + for device in dev: + if not "PlayStation" in device.name: + add_devices([PlexClient(device.name, plexserver)]) + +class PlexClient(MediaPlayerDevice): + """ Represents a Plex device. """ + + # pylint: disable=too-many-public-methods + + + def __init__(self, name, plexserver): + self.client = plexserver.client(name) + self._name = name + self._media = None + self.update() + self.server = plexserver + + @property + def name(self): + """ Returns the name of the device. """ + return self._name + + @property + def state(self): + """ Returns the state of the device. """ + if self._media is None: + return STATE_IDLE + else: + state = self._media.get('state') + if state == 'playing': + return STATE_PLAYING + elif state == 'paused': + return STATE_PAUSED + else: + return STATE_UNKNOWN + + def update(self): + timeline = self.client.timeline() + for timeline_item in timeline: + if timeline_item.get('state') in ('playing', 'paused'): + self._media = timeline_item + + @property + def media_content_id(self): + """ Content ID of current playing media. """ + if self._media is not None: + return self._media.get('ratingKey') + + @property + def media_content_type(self): + """ Content type of current playing media. """ + if self._media is None: + return None + else: + media_type = self.server.library.getByKey(self.media_content_id).type + if media_type == 'episode': + return MEDIA_TYPE_TVSHOW + elif media_type == 'movie': + return MEDIA_TYPE_VIDEO + return None + + @property + def media_duration(self): + """ Duration of current playing media in seconds. """ + if self._media is not None: + total_time = self._media.get('duration') + + return total_time + + @property + def media_image_url(self): + """ Image url of current playing media. """ + if self._media is not None: + return self.server.library.getByKey(self.media_content_id).thumbUrl + else: + return None + + @property + def media_title(self): + """ Title of current playing media. """ + # find a string we can use as a title + if self._media is not None: + return self.server.library.getByKey(self.media_content_id).title + @property + def media_season(self): + """ Season of curent playing media. (TV Show only) """ + if self._media is not None: + show_season = self.server.library.getByKey(self.media_content_id).season().index + return show_season + else: + return None + + @property + def media_series_title(self): + """ Series title of current playing media. (TV Show only)""" + if self._media is not None: + series_title = self.server.library.getByKey(self.media_content_id).show().title + return series_title + else: + return None + + @property + def media_episode(self): + """ Episode of current playing media. (TV Show only) """ + if self._media is not None: + show_episode = self.server.library.getByKey(self.media_content_id).index + return show_episode + else: + return None + + @property + def supported_media_commands(self): + """ Flags of media commands that are supported. """ + return SUPPORT_PLEX + + def media_play(self): + """ media_play media player. """ + self.client.play() + + def media_pause(self): + """ media_pause media player. """ + self.client.pause() + + def media_next_track(self): + """ Send next track command. """ + self.client.skipNext() + + def media_previous_track(self): + """ Send previous track command. """ + self.client.skipPrevious()