Home Assistant Unofficial Reference 2024.12.1
media_player.py
Go to the documentation of this file.
1 """Media player support for Panasonic Viera TV."""
2 
3 from __future__ import annotations
4 
5 import logging
6 from typing import Any
7 
8 from panasonic_viera import Keys
9 
10 from homeassistant.components import media_source
12  BrowseMedia,
13  MediaPlayerDeviceClass,
14  MediaPlayerEntity,
15  MediaPlayerEntityFeature,
16  MediaPlayerState,
17  MediaType,
18  async_process_play_media_url,
19 )
20 from homeassistant.config_entries import ConfigEntry
21 from homeassistant.const import CONF_NAME
22 from homeassistant.core import HomeAssistant
23 from homeassistant.helpers.device_registry import DeviceInfo
24 from homeassistant.helpers.entity_platform import AddEntitiesCallback
25 
26 from .const import (
27  ATTR_DEVICE_INFO,
28  ATTR_MANUFACTURER,
29  ATTR_MODEL_NUMBER,
30  ATTR_REMOTE,
31  ATTR_UDN,
32  DEFAULT_MANUFACTURER,
33  DEFAULT_MODEL_NUMBER,
34  DOMAIN,
35 )
36 
37 _LOGGER = logging.getLogger(__name__)
38 
39 
41  hass: HomeAssistant,
42  config_entry: ConfigEntry,
43  async_add_entities: AddEntitiesCallback,
44 ) -> None:
45  """Set up Panasonic Viera TV from a config entry."""
46 
47  config = config_entry.data
48 
49  remote = hass.data[DOMAIN][config_entry.entry_id][ATTR_REMOTE]
50  name = config[CONF_NAME]
51  device_info = config[ATTR_DEVICE_INFO]
52 
53  tv_device = PanasonicVieraTVEntity(remote, name, device_info)
54  async_add_entities([tv_device])
55 
56 
58  """Representation of a Panasonic Viera TV."""
59 
60  _attr_supported_features = (
61  MediaPlayerEntityFeature.PAUSE
62  | MediaPlayerEntityFeature.VOLUME_STEP
63  | MediaPlayerEntityFeature.VOLUME_SET
64  | MediaPlayerEntityFeature.VOLUME_MUTE
65  | MediaPlayerEntityFeature.PREVIOUS_TRACK
66  | MediaPlayerEntityFeature.NEXT_TRACK
67  | MediaPlayerEntityFeature.TURN_OFF
68  | MediaPlayerEntityFeature.TURN_ON
69  | MediaPlayerEntityFeature.PLAY
70  | MediaPlayerEntityFeature.PLAY_MEDIA
71  | MediaPlayerEntityFeature.STOP
72  | MediaPlayerEntityFeature.BROWSE_MEDIA
73  )
74  _attr_has_entity_name = True
75  _attr_name = None
76  _attr_device_class = MediaPlayerDeviceClass.TV
77 
78  def __init__(self, remote, name, device_info):
79  """Initialize the entity."""
80  self._remote_remote = remote
81  if device_info is not None:
82  self._attr_device_info_attr_device_info = DeviceInfo(
83  identifiers={(DOMAIN, device_info[ATTR_UDN])},
84  manufacturer=device_info.get(ATTR_MANUFACTURER, DEFAULT_MANUFACTURER),
85  model=device_info.get(ATTR_MODEL_NUMBER, DEFAULT_MODEL_NUMBER),
86  name=name,
87  )
88  self._attr_unique_id_attr_unique_id = device_info[ATTR_UDN]
89  else:
90  self._attr_name_attr_name = name
91 
92  @property
93  def state(self) -> MediaPlayerState | None:
94  """Return the state of the device."""
95  return self._remote_remote.state
96 
97  @property
98  def available(self) -> bool:
99  """Return True if the device is available."""
100  return self._remote_remote.available
101 
102  @property
103  def volume_level(self) -> float | None:
104  """Volume level of the media player (0..1)."""
105  return self._remote_remote.volume
106 
107  @property
108  def is_volume_muted(self) -> bool | None:
109  """Boolean if volume is currently muted."""
110  return self._remote_remote.muted
111 
112  async def async_update(self) -> None:
113  """Retrieve the latest data."""
114  await self._remote_remote.async_update()
115 
116  async def async_turn_on(self) -> None:
117  """Turn on the media player."""
118  await self._remote_remote.async_turn_on(context=self._context_context)
119 
120  async def async_turn_off(self) -> None:
121  """Turn off media player."""
122  await self._remote_remote.async_turn_off()
123 
124  async def async_volume_up(self) -> None:
125  """Volume up the media player."""
126  await self._remote_remote.async_send_key(Keys.VOLUME_UP)
127 
128  async def async_volume_down(self) -> None:
129  """Volume down media player."""
130  await self._remote_remote.async_send_key(Keys.VOLUME_DOWN)
131 
132  async def async_mute_volume(self, mute: bool) -> None:
133  """Send mute command."""
134  await self._remote_remote.async_set_mute(mute)
135 
136  async def async_set_volume_level(self, volume: float) -> None:
137  """Set volume level, range 0..1."""
138  await self._remote_remote.async_set_volume(volume)
139 
140  async def async_media_play_pause(self) -> None:
141  """Simulate play pause media player."""
142  if self._remote_remote.playing:
143  await self._remote_remote.async_send_key(Keys.PAUSE)
144  self._remote_remote.playing = False
145  else:
146  await self._remote_remote.async_send_key(Keys.PLAY)
147  self._remote_remote.playing = True
148 
149  async def async_media_play(self) -> None:
150  """Send play command."""
151  await self._remote_remote.async_send_key(Keys.PLAY)
152  self._remote_remote.playing = True
153 
154  async def async_media_pause(self) -> None:
155  """Send pause command."""
156  await self._remote_remote.async_send_key(Keys.PAUSE)
157  self._remote_remote.playing = False
158 
159  async def async_media_stop(self) -> None:
160  """Stop playback."""
161  await self._remote_remote.async_send_key(Keys.STOP)
162 
163  async def async_media_next_track(self) -> None:
164  """Send the fast forward command."""
165  await self._remote_remote.async_send_key(Keys.FAST_FORWARD)
166 
167  async def async_media_previous_track(self) -> None:
168  """Send the rewind command."""
169  await self._remote_remote.async_send_key(Keys.REWIND)
170 
171  async def async_play_media(
172  self, media_type: MediaType | str, media_id: str, **kwargs: Any
173  ) -> None:
174  """Play media."""
175  if media_source.is_media_source_id(media_id):
176  media_type = MediaType.URL
177  play_item = await media_source.async_resolve_media(
178  self.hasshass, media_id, self.entity_identity_id
179  )
180  media_id = play_item.url
181 
182  if media_type != MediaType.URL:
183  _LOGGER.warning("Unsupported media_type: %s", media_type)
184  return
185 
186  media_id = async_process_play_media_url(self.hasshass, media_id)
187  await self._remote_remote.async_play_media(media_type, media_id)
188 
190  self,
191  media_content_type: MediaType | str | None = None,
192  media_content_id: str | None = None,
193  ) -> BrowseMedia:
194  """Implement the websocket media browsing helper."""
195  return await media_source.async_browse_media(self.hasshass, media_content_id)
None async_play_media(self, MediaType|str media_type, str media_id, **Any kwargs)
BrowseMedia async_browse_media(self, MediaType|str|None media_content_type=None, str|None media_content_id=None)
str async_process_play_media_url(HomeAssistant hass, str media_content_id, *bool allow_relative_url=False, bool for_supervisor_network=False)
Definition: browse_media.py:36
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: media_player.py:44