1 """Home Assistant Cast platform."""
3 from __future__
import annotations
5 from pychromecast
import Chromecast
6 from pychromecast.const
import CAST_TYPE_CHROMECAST
12 NO_URL_AVAILABLE_ERROR,
26 from .const
import DOMAIN, ConfigNotFound
27 from .dashboard
import LovelaceConfig
29 DEFAULT_DASHBOARD =
"_default_"
33 hass: HomeAssistant, cast_type: str
34 ) -> list[BrowseMedia]:
35 """Create a root object for media browsing."""
36 if cast_type != CAST_TYPE_CHROMECAST:
41 media_class=MediaClass.APP,
43 media_content_type=DOMAIN,
44 thumbnail=
"https://brands.home-assistant.io/_/lovelace/logo.png",
53 media_content_type: MediaType | str,
54 media_content_id: str,
56 ) -> BrowseMedia |
None:
58 if media_content_type != DOMAIN:
62 get_url(hass, require_ssl=
True, prefer_external=
True)
63 except NoURLAvailableError
as err:
64 raise BrowseError(NO_URL_AVAILABLE_ERROR)
from err
67 if not media_content_id:
71 media_class=MediaClass.APP,
72 media_content_id=DEFAULT_DASHBOARD,
73 media_content_type=DOMAIN,
74 thumbnail=
"https://brands.home-assistant.io/_/lovelace/logo.png",
79 for url_path
in hass.data[DOMAIN][
"dashboards"]:
89 root.children = children
94 except ValueError
as err:
95 raise BrowseError(f
"Dashboard {media_content_id} not found")
from err
99 for view
in info[
"views"]:
103 media_class=MediaClass.APP,
104 media_content_id=f
'{info["url_path"]}/{view["path"]}',
105 media_content_type=DOMAIN,
106 thumbnail=
"https://brands.home-assistant.io/_/lovelace/logo.png",
113 root.children = children
120 chromecast: Chromecast,
121 media_type: MediaType | str,
125 if media_type != DOMAIN:
129 url_path, view_path = media_id.split(
"/", 1)
134 except ValueError
as err:
136 view_path = info[
"views"][0][
"path"]
if info[
"views"]
else "0"
139 ATTR_ENTITY_ID: cast_entity_id,
140 ATTR_VIEW_PATH: view_path,
142 if url_path != DEFAULT_DASHBOARD:
143 data[ATTR_URL_PATH] = url_path
145 await hass.services.async_call(
155 """Load a dashboard and return info on views."""
156 if url_path == DEFAULT_DASHBOARD:
158 dashboard: LovelaceConfig |
None = hass.data[DOMAIN][
"dashboards"].
get(url_path)
160 if dashboard
is None:
161 raise ValueError(
"Invalid dashboard specified")
164 config = await dashboard.async_load(
False)
165 except ConfigNotFound:
168 if dashboard.url_path
is None:
169 url_path = DEFAULT_DASHBOARD
172 url_path = dashboard.url_path
173 title = config.get(
"title", url_path)
if config
else url_path
178 "url_path": url_path,
182 if config
is None or "views" not in config:
185 for idx, view
in enumerate(config[
"views"]):
186 path = view.get(
"path", f
"{idx}")
189 "title": view.get(
"title", path),
199 """Convert dashboard info to browse item."""
202 media_class=MediaClass.APP,
203 media_content_id=info[
"url_path"],
204 media_content_type=DOMAIN,
205 thumbnail=
"https://brands.home-assistant.io/_/lovelace/logo.png",
207 can_expand=len(info[
"views"]) > 1,
web.Response get(self, web.Request request, str config_key)
list[BrowseMedia] async_get_media_browser_root_object(HomeAssistant hass, str cast_type)
def _get_dashboard_info(hass, url_path)
BrowseMedia _item_from_info(dict info)
BrowseMedia|None async_browse_media(HomeAssistant hass, MediaType|str media_content_type, str media_content_id, str cast_type)
bool async_play_media(HomeAssistant hass, str cast_entity_id, Chromecast chromecast, MediaType|str media_type, str media_id)
str get_url(HomeAssistant hass, *bool require_current_request=False, bool require_ssl=False, bool require_standard_port=False, bool require_cloud=False, bool allow_internal=True, bool allow_external=True, bool allow_cloud=True, bool|None allow_ip=None, bool|None prefer_external=None, bool prefer_cloud=False)