Home Assistant Unofficial Reference 2024.12.1
models.py
Go to the documentation of this file.
1 """Media Source models."""
2 
3 from __future__ import annotations
4 
5 from abc import ABC
6 from dataclasses import dataclass
7 from typing import Any, cast
8 
9 from homeassistant.components.media_player import BrowseMedia, MediaClass, MediaType
10 from homeassistant.core import HomeAssistant, callback
11 
12 from .const import DOMAIN, URI_SCHEME, URI_SCHEME_REGEX
13 
14 
15 @dataclass(slots=True)
16 class PlayMedia:
17  """Represents a playable media."""
18 
19  url: str
20  mime_type: str
21 
22 
24  """Represent a browsable media file."""
25 
26  def __init__(
27  self, *, domain: str | None, identifier: str | None, **kwargs: Any
28  ) -> None:
29  """Initialize media source browse media."""
30  media_content_id = f"{URI_SCHEME}{domain or ''}"
31  if identifier:
32  media_content_id += f"/{identifier}"
33 
34  super().__init__(media_content_id=media_content_id, **kwargs)
35 
36  self.domaindomain = domain
37  self.identifieridentifier = identifier
38 
39 
40 @dataclass(slots=True)
42  """A parsed media item."""
43 
44  hass: HomeAssistant
45  domain: str | None
46  identifier: str
47  target_media_player: str | None
48 
49  async def async_browse(self) -> BrowseMediaSource:
50  """Browse this item."""
51  if self.domain is None:
52  base = BrowseMediaSource(
53  domain=None,
54  identifier=None,
55  media_class=MediaClass.APP,
56  media_content_type=MediaType.APPS,
57  title="Media Sources",
58  can_play=False,
59  can_expand=True,
60  children_media_class=MediaClass.APP,
61  )
62  base.children = sorted(
63  (
65  domain=source.domain,
66  identifier=None,
67  media_class=MediaClass.APP,
68  media_content_type=MediaType.APP,
69  thumbnail=f"https://brands.home-assistant.io/_/{source.domain}/logo.png",
70  title=source.name,
71  can_play=False,
72  can_expand=True,
73  )
74  for source in self.hass.data[DOMAIN].values()
75  ),
76  key=lambda item: item.title,
77  )
78  return base
79 
80  return await self.async_media_sourceasync_media_source().async_browse_media(self)
81 
82  async def async_resolve(self) -> PlayMedia:
83  """Resolve to playable item."""
84  return await self.async_media_sourceasync_media_source().async_resolve_media(self)
85 
86  @callback
87  def async_media_source(self) -> MediaSource:
88  """Return media source that owns this item."""
89  return cast(MediaSource, self.hass.data[DOMAIN][self.domain])
90 
91  @classmethod
92  def from_uri(
93  cls, hass: HomeAssistant, uri: str, target_media_player: str | None
94  ) -> MediaSourceItem:
95  """Create an item from a uri."""
96  if not (match := URI_SCHEME_REGEX.match(uri)):
97  raise ValueError("Invalid media source URI")
98 
99  domain = match.group("domain")
100  identifier = match.group("identifier")
101 
102  return cls(hass, domain, identifier, target_media_player)
103 
104 
105 class MediaSource(ABC):
106  """Represents a source of media files."""
107 
108  name: str | None = None
109 
110  def __init__(self, domain: str) -> None:
111  """Initialize a media source."""
112  self.domaindomain = domain
113  if not self.namename:
114  self.namename = domain
115 
116  async def async_resolve_media(self, item: MediaSourceItem) -> PlayMedia:
117  """Resolve a media item to a playable item."""
118  raise NotImplementedError
119 
120  async def async_browse_media(self, item: MediaSourceItem) -> BrowseMediaSource:
121  """Browse media."""
122  raise NotImplementedError
None __init__(self, *str|None domain, str|None identifier, **Any kwargs)
Definition: models.py:28
MediaSourceItem from_uri(cls, HomeAssistant hass, str uri, str|None target_media_player)
Definition: models.py:94
PlayMedia async_resolve_media(self, MediaSourceItem item)
Definition: models.py:116
BrowseMediaSource async_browse_media(self, MediaSourceItem item)
Definition: models.py:120
BrowseMediaSource async_browse_media(HomeAssistant hass, str|None media_content_id, *Callable[[BrowseMedia], bool]|None content_filter=None)
Definition: __init__.py:127
PlayMedia async_resolve_media(HomeAssistant hass, str media_content_id, str|None|UndefinedType target_media_player=UNDEFINED)
Definition: __init__.py:153