From 5f0b2a7d15df474c47c73c2ddac3fa9e8bd4f332 Mon Sep 17 00:00:00 2001 From: happyleavesaoc Date: Sun, 12 Feb 2017 16:00:27 -0500 Subject: [PATCH] [WIP] gstreamer media player (#5839) * gstreamer media player * gstreamer meta --- .coveragerc | 1 + .../components/media_player/gstreamer.py | 162 ++++++++++++++++++ requirements_all.txt | 3 + 3 files changed, 166 insertions(+) create mode 100644 homeassistant/components/media_player/gstreamer.py diff --git a/.coveragerc b/.coveragerc index 771cdcfe85b..8d7d58f7f65 100644 --- a/.coveragerc +++ b/.coveragerc @@ -224,6 +224,7 @@ omit = homeassistant/components/media_player/emby.py homeassistant/components/media_player/firetv.py homeassistant/components/media_player/gpmdp.py + homeassistant/components/media_player/gstreamer.py homeassistant/components/media_player/hdmi_cec.py homeassistant/components/media_player/itunes.py homeassistant/components/media_player/kodi.py diff --git a/homeassistant/components/media_player/gstreamer.py b/homeassistant/components/media_player/gstreamer.py new file mode 100644 index 00000000000..b74af4a4ddb --- /dev/null +++ b/homeassistant/components/media_player/gstreamer.py @@ -0,0 +1,162 @@ +""" +Play media via gstreamer. + +For more details about this platform, please refer to the documentation at +https://home-assistant.io/components/media_player.gstreamer/ +""" +import logging + +import voluptuous as vol + +from homeassistant.components.media_player import ( + MEDIA_TYPE_MUSIC, SUPPORT_VOLUME_MUTE, SUPPORT_VOLUME_SET, + SUPPORT_PAUSE, SUPPORT_SEEK, SUPPORT_STOP, SUPPORT_PLAY_MEDIA, + SUPPORT_PLAY, SUPPORT_NEXT_TRACK, PLATFORM_SCHEMA, MediaPlayerDevice) +from homeassistant.const import ( + STATE_IDLE, CONF_NAME, EVENT_HOMEASSISTANT_STOP) +import homeassistant.helpers.config_validation as cv + + +_LOGGER = logging.getLogger(__name__) + + +REQUIREMENTS = ['gstreamer-player==1.0.0'] +DOMAIN = 'gstreamer' +CONF_PIPELINE = 'pipeline' + + +SUPPORT_GSTREAMER = SUPPORT_VOLUME_SET | SUPPORT_VOLUME_MUTE | \ + SUPPORT_PLAY | SUPPORT_PAUSE | SUPPORT_SEEK | SUPPORT_STOP | \ + SUPPORT_PLAY_MEDIA | SUPPORT_SEEK | SUPPORT_NEXT_TRACK + +PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ + vol.Optional(CONF_NAME): cv.string, + vol.Optional(CONF_PIPELINE): cv.string, +}) + + +# pylint: disable=unused-argument +def setup_platform(hass, config, add_devices, discovery_info=None): + """Setup the Gstreamer platform.""" + from gsp import GstreamerPlayer + name = config.get(CONF_NAME) + pipeline = config.get(CONF_PIPELINE) + player = GstreamerPlayer(pipeline) + + def _shutdown(call): + """Quit the player on shutdown.""" + player.quit() + + hass.bus.listen_once(EVENT_HOMEASSISTANT_STOP, _shutdown) + add_devices([GstreamerDevice(player, name)]) + + +class GstreamerDevice(MediaPlayerDevice): + """Representation of a Gstreamer device.""" + + def __init__(self, player, name): + """Initialize the Gstreamer device.""" + self._player = player + self._name = name or DOMAIN + self._state = STATE_IDLE + self._volume = None + self._duration = None + self._position = None + self._uri = None + self._title = None + self._artist = None + self._album = None + + def update(self): + """Update properties.""" + self._state = self._player.state + self._volume = self._player.volume + self._duration = self._player.duration + self._position = self._player.position + self._uri = self._player.uri + self._title = self._player.title + self._album = self._player.album + self._artist = self._player.artist + + def mute_volume(self, mute): + """Send the mute command.""" + self._player.mute() + + def set_volume_level(self, volume): + """Set the volume level.""" + self._player.volume = volume + + def play_media(self, media_type, media_id, **kwargs): + """Play media.""" + if media_type != MEDIA_TYPE_MUSIC: + _LOGGER.error('invalid media type') + return + self._player.queue(media_id) + + def media_seek(self, position): + """Seek.""" + self._player.position = position + + def media_next_track(self): + """Next track.""" + self._player.next() + + @property + def media_content_id(self): + """Content ID of currently playing media.""" + return self._uri + + @property + def content_type(self): + """Content type of currently playing media.""" + return MEDIA_TYPE_MUSIC + + @property + def name(self): + """Return the name of the device.""" + return self._name + + @property + def volume_level(self): + """Return the volume level.""" + return self._volume + + @property + def is_volume_muted(self): + """Volume muted.""" + return self._volume == 0 + + @property + def supported_features(self): + """Flag media player features that are supported.""" + return SUPPORT_GSTREAMER + + @property + def state(self): + """Return the state of the player.""" + return self._state + + @property + def media_duration(self): + """Duration of current playing media in seconds.""" + return self._duration + + @property + def media_position(self): + """Position of current playing media in seconds.""" + return self._position + + @property + def media_title(self): + """Media title.""" + return self._title + + @property + def media_artist(self): + """Media artist.""" + return self._artist + + @property + def media_album_name(self): + """Media album.""" + return self._album diff --git a/requirements_all.txt b/requirements_all.txt index b80726e5e3a..0a26e1bbf72 100755 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -182,6 +182,9 @@ googlemaps==2.4.4 # homeassistant.components.sensor.gpsd gps3==0.33.3 +# homeassistant.components.media_player.gstreamer +gstreamer-player==1.0.0 + # homeassistant.components.ffmpeg ha-ffmpeg==1.4