1 """Play media via gstreamer."""
3 from __future__
import annotations
8 from gsp
import STATE_IDLE, STATE_PAUSED, STATE_PLAYING, GstreamerPlayer
9 import voluptuous
as vol
13 PLATFORM_SCHEMA
as MEDIA_PLAYER_PLATFORM_SCHEMA,
16 MediaPlayerEntityFeature,
19 async_process_play_media_url,
27 _LOGGER = logging.getLogger(__name__)
29 CONF_PIPELINE =
"pipeline"
33 PLATFORM_SCHEMA = MEDIA_PLAYER_PLATFORM_SCHEMA.extend(
34 {vol.Optional(CONF_NAME): cv.string, vol.Optional(CONF_PIPELINE): cv.string}
38 STATE_IDLE: MediaPlayerState.IDLE,
39 STATE_PAUSED: MediaPlayerState.PAUSED,
40 STATE_PLAYING: MediaPlayerState.PLAYING,
47 add_entities: AddEntitiesCallback,
48 discovery_info: DiscoveryInfoType |
None =
None,
50 """Set up the Gstreamer platform."""
52 name = config.get(CONF_NAME)
53 pipeline = config.get(CONF_PIPELINE)
54 player = GstreamerPlayer(pipeline)
57 """Quit the player on shutdown."""
60 hass.bus.listen_once(EVENT_HOMEASSISTANT_STOP, _shutdown)
65 """Representation of a Gstreamer device."""
67 _attr_media_content_type = MediaType.MUSIC
68 _attr_supported_features = (
69 MediaPlayerEntityFeature.VOLUME_SET
70 | MediaPlayerEntityFeature.PLAY
71 | MediaPlayerEntityFeature.PAUSE
72 | MediaPlayerEntityFeature.PLAY_MEDIA
73 | MediaPlayerEntityFeature.NEXT_TRACK
74 | MediaPlayerEntityFeature.BROWSE_MEDIA
77 def __init__(self, player: GstreamerPlayer, name: str |
None) ->
None:
78 """Initialize the Gstreamer device."""
80 self.
_name_name = name
or DOMAIN
90 """Update properties."""
100 """Set the volume level."""
101 self.
_player_player.volume = volume
104 self, media_type: MediaType | str, media_id: str, **kwargs: Any
108 if media_source.is_media_source_id(media_id):
109 sourced_media = await media_source.async_resolve_media(
112 media_id = sourced_media.url
114 elif media_type != MediaType.MUSIC:
115 _LOGGER.error(
"Invalid media type")
120 await self.
hasshass.async_add_executor_job(self.
_player_player.queue, media_id)
136 """Content ID of currently playing media."""
141 """Return the name of the device."""
142 return self.
_name_name
146 """Return the volume level."""
151 """Duration of current playing media in seconds."""
171 media_content_type: MediaType | str |
None =
None,
172 media_content_id: str |
None =
None,
174 """Implement the websocket media browsing helper."""
175 return await media_source.async_browse_media(
178 content_filter=
lambda item: item.media_content_type.startswith(
"audio/"),
None add_entities(AsusWrtRouter router, AddEntitiesCallback async_add_entities, set[str] tracked)