1 """Dune HD implementation of the media player."""
3 from __future__
import annotations
5 from typing
import Any, Final
7 from pdunehd
import DuneHDPlayer
13 MediaPlayerEntityFeature,
16 async_process_play_media_url,
23 from .const
import ATTR_MANUFACTURER, DEFAULT_NAME, DOMAIN
25 CONF_SOURCES: Final =
"sources"
27 DUNEHD_PLAYER_SUPPORT: Final[MediaPlayerEntityFeature] = (
28 MediaPlayerEntityFeature.PAUSE
29 | MediaPlayerEntityFeature.TURN_ON
30 | MediaPlayerEntityFeature.TURN_OFF
31 | MediaPlayerEntityFeature.PREVIOUS_TRACK
32 | MediaPlayerEntityFeature.NEXT_TRACK
33 | MediaPlayerEntityFeature.PLAY
34 | MediaPlayerEntityFeature.PLAY_MEDIA
35 | MediaPlayerEntityFeature.BROWSE_MEDIA
40 hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
42 """Add Dune HD entities from a config_entry."""
43 unique_id = entry.entry_id
45 player: DuneHDPlayer = hass.data[DOMAIN][entry.entry_id]
51 """Implementation of the Dune HD player."""
53 _attr_has_entity_name =
True
56 def __init__(self, player: DuneHDPlayer, name: str, unique_id: str) ->
None:
57 """Initialize entity to control Dune HD."""
60 self.
_state_state: dict[str, Any] = {}
63 identifiers={(DOMAIN, unique_id)},
64 manufacturer=ATTR_MANUFACTURER,
69 """Update internal status of the entity."""
74 def state(self) -> MediaPlayerState:
75 """Return player state."""
76 state = MediaPlayerState.OFF
77 if "playback_position" in self.
_state_state:
78 state = MediaPlayerState.PLAYING
79 if self.
_state_state.
get(
"player_state")
in (
"playing",
"buffering",
"photo_viewer"):
80 state = MediaPlayerState.PLAYING
81 if int(self.
_state_state.
get(
"playback_speed", 1234)) == 0:
82 state = MediaPlayerState.PAUSED
83 if self.
_state_state.
get(
"player_state") ==
"navigator":
84 state = MediaPlayerState.ON
89 """Return True if entity is available."""
90 return len(self.
_state_state) > 0
94 """Return the volume level of the media player (0..1)."""
95 return int(self.
_state_state.
get(
"playback_volume", 0)) / 100
99 """Return a boolean if volume is currently muted."""
100 return int(self.
_state_state.
get(
"playback_mute", 0)) == 1
104 """Flag media player features that are supported."""
105 return DUNEHD_PLAYER_SUPPORT
108 """Volume up media player."""
112 """Volume down media player."""
116 """Mute/unmute player volume."""
120 """Turn off media player."""
125 """Turn on media player."""
129 """Play media player."""
133 """Pause media player."""
137 self, media_type: MediaType | str, media_id: str, **kwargs: Any
139 """Play media from a URL or file."""
141 if media_source.is_media_source_id(media_id):
142 sourced_media = await media_source.async_resolve_media(
145 media_id = sourced_media.url
150 self.
_state_state = await self.
hasshass.async_add_executor_job(
151 self.
_player_player.launch_media_url, media_id
156 media_content_type: MediaType | str |
None =
None,
157 media_content_id: str |
None =
None,
159 """Implement the websocket media browsing helper."""
160 return await media_source.async_browse_media(self.
hasshass, media_content_id)
164 """Return the current media source."""
171 if self.
_state_state.
get(
"player_state") ==
"bluray_playback":
173 elif self.
_state_state.
get(
"player_state") ==
"photo_viewer":
175 elif self.
_state_state.
get(
"playback_url"):
181 """Send previous track command."""
185 """Send next track command."""
web.Response get(self, web.Request request, str config_key)