Home Assistant Unofficial Reference 2024.12.1
media_source.py
Go to the documentation of this file.
1 """Expose images as media sources."""
2 
3 from __future__ import annotations
4 
5 from typing import cast
6 
7 from homeassistant.components.media_player import BrowseError, MediaClass
9  BrowseMediaSource,
10  MediaSource,
11  MediaSourceItem,
12  PlayMedia,
13  Unresolvable,
14 )
15 from homeassistant.const import ATTR_FRIENDLY_NAME
16 from homeassistant.core import HomeAssistant, State
17 
18 from .const import DATA_COMPONENT, DOMAIN
19 
20 
21 async def async_get_media_source(hass: HomeAssistant) -> ImageMediaSource:
22  """Set up image media source."""
23  return ImageMediaSource(hass)
24 
25 
26 class ImageMediaSource(MediaSource):
27  """Provide images as media sources."""
28 
29  name: str = "Image"
30 
31  def __init__(self, hass: HomeAssistant) -> None:
32  """Initialize ImageMediaSource."""
33  super().__init__(DOMAIN)
34  self.hasshass = hass
35 
36  async def async_resolve_media(self, item: MediaSourceItem) -> PlayMedia:
37  """Resolve media to a url."""
38  image = self.hasshass.data[DATA_COMPONENT].get_entity(item.identifier)
39 
40  if not image:
41  raise Unresolvable(f"Could not resolve media item: {item.identifier}")
42 
43  return PlayMedia(
44  f"/api/image_proxy_stream/{image.entity_id}", image.content_type
45  )
46 
47  async def async_browse_media(
48  self,
49  item: MediaSourceItem,
50  ) -> BrowseMediaSource:
51  """Return media."""
52  if item.identifier:
53  raise BrowseError("Unknown item")
54 
55  children = [
56  BrowseMediaSource(
57  domain=DOMAIN,
58  identifier=image.entity_id,
59  media_class=MediaClass.VIDEO,
60  media_content_type=image.content_type,
61  title=cast(State, self.hasshass.states.get(image.entity_id)).attributes.get(
62  ATTR_FRIENDLY_NAME, image.name
63  ),
64  thumbnail=f"/api/image_proxy/{image.entity_id}",
65  can_play=True,
66  can_expand=False,
67  )
68  for image in self.hasshass.data[DATA_COMPONENT].entities
69  ]
70 
71  return BrowseMediaSource(
72  domain=DOMAIN,
73  identifier=None,
74  media_class=MediaClass.APP,
75  media_content_type="",
76  title="Image",
77  can_play=False,
78  can_expand=True,
79  children_media_class=MediaClass.IMAGE,
80  children=children,
81  )
PlayMedia async_resolve_media(self, MediaSourceItem item)
Definition: media_source.py:36
BrowseMediaSource async_browse_media(self, MediaSourceItem item)
Definition: media_source.py:50
CalendarEntity get_entity(HomeAssistant hass, str entity_id)
Definition: trigger.py:96
ImageMediaSource async_get_media_source(HomeAssistant hass)
Definition: media_source.py:21