1 """Netatmo Media Source Implementation."""
3 from __future__
import annotations
20 from .const
import DATA_CAMERAS, DATA_EVENTS, DOMAIN, MANUFACTURER
22 _LOGGER = logging.getLogger(__name__)
23 MIME_TYPE =
"application/x-mpegURL"
27 """Incompatible media source attributes."""
31 """Set up Netatmo media source."""
32 return NetatmoSource(hass)
36 """Provide Netatmo camera recordings as media sources."""
38 name: str = MANUFACTURER
40 def __init__(self, hass: HomeAssistant) ->
None:
41 """Initialize Netatmo source."""
44 self.
eventsevents = self.
hasshass.data[DOMAIN][DATA_EVENTS]
47 """Resolve media to a url."""
49 url = self.
eventsevents[camera_id][event_id][
"media_url"]
56 except Unresolvable
as err:
59 return self.
_browse_media_browse_media(source, camera_id, event_id)
62 self, source: str, camera_id: str, event_id: int |
None
63 ) -> BrowseMediaSource:
65 if camera_id
and camera_id
not in self.
eventsevents:
68 if event_id
and event_id
not in self.
eventsevents[camera_id]:
74 self, source: str, camera_id: str, event_id: int |
None =
None
75 ) -> BrowseMediaSource:
76 if event_id
and event_id
in self.
eventsevents[camera_id]:
77 created = dt.datetime.fromtimestamp(
78 self.
eventsevents[camera_id][event_id][
"event_time"]
80 thumbnail = self.
eventsevents[camera_id][event_id].
get(
"snapshot", {}).
get(
"url")
82 self.
eventsevents[camera_id][event_id].
get(
"message",
"")
84 title = f
"{created} - {message}"
86 title = self.
hasshass.data[DOMAIN][DATA_CAMERAS].
get(camera_id, MANUFACTURER)
90 path = f
"{source}/{camera_id}/{event_id}"
92 path = f
"{source}/{camera_id}"
94 media_class = MediaClass.DIRECTORY
if event_id
is None else MediaClass.VIDEO
99 media_class=media_class,
100 media_content_type=MediaType.VIDEO,
103 event_id
and self.
eventsevents[camera_id][event_id].
get(
"media_url")
105 can_expand=event_id
is None,
109 if not media.can_play
and not media.can_expand:
111 "Camera %s with event %s without media url found", camera_id, event_id
113 raise IncompatibleMediaSource
115 if not media.can_expand:
121 for cid
in self.
eventsevents:
124 media.children.append(child)
126 for eid
in self.
eventsevents[camera_id]:
129 except IncompatibleMediaSource:
132 media.children.append(child)
138 """Remove html tags from string."""
139 clean = re.compile(
"<.*?>")
140 return re.sub(clean,
"", text)
145 item: MediaSourceItem,
146 ) -> tuple[str, str, int |
None]:
147 """Parse identifier."""
148 if not item.identifier
or "/" not in item.identifier:
149 return "events",
"",
None
151 source, path = item.identifier.lstrip(
"/").split(
"/", 1)
153 if source !=
"events":
157 camera_id, event_id = path.split(
"/", 1)
158 return source, camera_id,
int(event_id)
160 return source, path,
None
web.Response get(self, web.Request request, str config_key)