1 """Support for track controls on the Sisyphus Kinetic Art Table."""
3 from __future__
import annotations
6 from sisyphus_control
import Track
10 MediaPlayerEntityFeature,
19 from .
import DATA_SISYPHUS
21 MEDIA_TYPE_TRACK =
"sisyphus_track"
27 add_entities: AddEntitiesCallback,
28 discovery_info: DiscoveryInfoType |
None =
None,
30 """Set up a media player entity for a Sisyphus table."""
31 if not discovery_info:
33 host = discovery_info[CONF_HOST]
35 table_holder = hass.data[DATA_SISYPHUS][host]
36 table = await table_holder.get_table()
37 except aiohttp.ClientError
as err:
38 raise PlatformNotReady
from err
44 """Representation of a Sisyphus table as a media player device."""
46 _attr_supported_features = (
47 MediaPlayerEntityFeature.VOLUME_MUTE
48 | MediaPlayerEntityFeature.VOLUME_SET
49 | MediaPlayerEntityFeature.TURN_OFF
50 | MediaPlayerEntityFeature.TURN_ON
51 | MediaPlayerEntityFeature.PAUSE
52 | MediaPlayerEntityFeature.SHUFFLE_SET
53 | MediaPlayerEntityFeature.PREVIOUS_TRACK
54 | MediaPlayerEntityFeature.NEXT_TRACK
55 | MediaPlayerEntityFeature.PLAY
59 """Initialize the Sisyphus media device."""
65 """Add listeners after this object has been initialized."""
69 """Force update table state."""
70 await self.
_table_table.refresh()
74 """Return the UUID of the table."""
75 return self.
_table_table.id
79 """Return true if the table is responding to heartbeats."""
80 return self.
_table_table.is_connected
84 """Return the name of the table."""
85 return self.
_name_name
88 def state(self) -> MediaPlayerState | None:
89 """Return the current state of the table; sleeping maps to off."""
90 if self.
_table_table.state
in [
"homing",
"playing"]:
91 return MediaPlayerState.PLAYING
92 if self.
_table_table.state ==
"paused":
93 if self.
_table_table.is_sleeping:
94 return MediaPlayerState.OFF
96 return MediaPlayerState.PAUSED
97 if self.
_table_table.state ==
"waiting":
98 return MediaPlayerState.IDLE
104 """Return the current playback speed (0..1)."""
105 return self.
_table_table.speed
109 """Return True if the current playlist is in shuffle mode."""
110 return self.
_table_table.is_shuffle
113 """Change the shuffle mode of the current playlist."""
118 """Return the name of the current playlist."""
119 return self.
_table_table.active_playlist.name
if self.
_table_table.active_playlist
else None
123 """Return the title of the current track."""
124 return self.
_table_table.active_track.name
if self.
_table_table.active_track
else None
128 """Return the content type currently playing; i.e. a Sisyphus track."""
129 return MEDIA_TYPE_TRACK
133 """Return the track ID of the current track."""
134 return self.
_table_table.active_track.id
if self.
_table_table.active_track
else None
138 """Return the total time it will take to run this track at the current speed."""
139 return self.
_table_table.active_track_total_time.total_seconds()
143 """Return the current position within the track."""
145 self.
_table_table.active_track_total_time
146 - self.
_table_table.active_track_remaining_time
151 """Return the last time we got a position update."""
152 return self.
_table_table.active_track_remaining_time_as_of
156 """Return the URL for a thumbnail image of the current track."""
158 if self.
_table_table.active_track:
159 return self.
_table_table.active_track.get_thumbnail_url(Track.ThumbnailSize.LARGE)
161 return super().media_image_url
164 """Wake up a sleeping table."""
165 await self.
_table_table.wakeup()
168 """Put the table to sleep."""
169 await self.
_table_table.sleep()
172 """Slow down playback."""
173 await self.
_table_table.set_speed(
max(0, self.
_table_table.speed - 0.1))
176 """Speed up playback."""
177 await self.
_table_table.set_speed(
min(1.0, self.
_table_table.speed + 0.1))
180 """Set playback speed (0..1)."""
181 await self.
_table_table.set_speed(volume)
185 await self.
_table_table.play()
189 await self.
_table_table.pause()
192 """Skip to next track."""
195 await self.
_table_table.active_playlist.play(
196 self.
_table_table.active_playlist.tracks[cur_track_index + 1]
200 """Skip to previous track."""
203 await self.
_table_table.active_playlist.play(
204 self.
_table_table.active_playlist.tracks[cur_track_index - 1]
208 for index, track
in enumerate(self.
_table_table.active_playlist.tracks):
209 if track.id == self.
_table_table.active_track.id:
None async_write_ha_state(self)
None add_entities(AsusWrtRouter router, AddEntitiesCallback async_add_entities, set[str] tracked)