Update nest media source to make device play most recent event (#67557)
This commit is contained in:
parent
13eeaa4c73
commit
2678d8120a
2 changed files with 33 additions and 5 deletions
|
@ -339,15 +339,21 @@ class NestMediaSource(MediaSource):
|
||||||
media_id: MediaId | None = parse_media_id(item.identifier)
|
media_id: MediaId | None = parse_media_id(item.identifier)
|
||||||
if not media_id:
|
if not media_id:
|
||||||
raise Unresolvable("No identifier specified for MediaSourceItem")
|
raise Unresolvable("No identifier specified for MediaSourceItem")
|
||||||
if not media_id.event_token:
|
|
||||||
raise Unresolvable(
|
|
||||||
"Identifier missing an event_token: %s" % item.identifier
|
|
||||||
)
|
|
||||||
devices = await self.devices()
|
devices = await self.devices()
|
||||||
if not (device := devices.get(media_id.device_id)):
|
if not (device := devices.get(media_id.device_id)):
|
||||||
raise Unresolvable(
|
raise Unresolvable(
|
||||||
"Unable to find device with identifier: %s" % item.identifier
|
"Unable to find device with identifier: %s" % item.identifier
|
||||||
)
|
)
|
||||||
|
if not media_id.event_token:
|
||||||
|
# The device resolves to the most recent event if available
|
||||||
|
if not (
|
||||||
|
last_event_id := await _async_get_recent_event_id(media_id, device)
|
||||||
|
):
|
||||||
|
raise Unresolvable(
|
||||||
|
"Unable to resolve recent event for device: %s" % item.identifier
|
||||||
|
)
|
||||||
|
media_id = last_event_id
|
||||||
|
|
||||||
# Infer content type from the device, since it only supports one
|
# Infer content type from the device, since it only supports one
|
||||||
# snapshot type (either jpg or mp4 clip)
|
# snapshot type (either jpg or mp4 clip)
|
||||||
content_type = EventImageType.IMAGE.content_type
|
content_type = EventImageType.IMAGE.content_type
|
||||||
|
@ -384,6 +390,7 @@ class NestMediaSource(MediaSource):
|
||||||
device_id=last_event_id.device_id,
|
device_id=last_event_id.device_id,
|
||||||
event_token=last_event_id.event_token,
|
event_token=last_event_id.event_token,
|
||||||
)
|
)
|
||||||
|
browse_device.can_play = True
|
||||||
browse_root.children.append(browse_device)
|
browse_root.children.append(browse_device)
|
||||||
return browse_root
|
return browse_root
|
||||||
|
|
||||||
|
|
|
@ -327,6 +327,7 @@ async def test_camera_event(hass, auth, hass_client):
|
||||||
assert browse.children[0].identifier == device.id
|
assert browse.children[0].identifier == device.id
|
||||||
assert browse.children[0].title == "Front: Recent Events"
|
assert browse.children[0].title == "Front: Recent Events"
|
||||||
assert browse.children[0].can_expand
|
assert browse.children[0].can_expand
|
||||||
|
assert browse.children[0].can_play
|
||||||
# Expanding the root does not expand the device
|
# Expanding the root does not expand the device
|
||||||
assert len(browse.children[0].children) == 0
|
assert len(browse.children[0].children) == 0
|
||||||
|
|
||||||
|
@ -371,6 +372,13 @@ async def test_camera_event(hass, auth, hass_client):
|
||||||
contents = await response.read()
|
contents = await response.read()
|
||||||
assert contents == IMAGE_BYTES_FROM_EVENT
|
assert contents == IMAGE_BYTES_FROM_EVENT
|
||||||
|
|
||||||
|
# Resolving the device id points to the most recent event
|
||||||
|
media = await media_source.async_resolve_media(
|
||||||
|
hass, f"{const.URI_SCHEME}{DOMAIN}/{device.id}"
|
||||||
|
)
|
||||||
|
assert media.url == f"/api/nest/event_media/{device.id}/{event_identifier}"
|
||||||
|
assert media.mime_type == "image/jpeg"
|
||||||
|
|
||||||
|
|
||||||
async def test_event_order(hass, auth):
|
async def test_event_order(hass, auth):
|
||||||
"""Test multiple events are in descending timestamp order."""
|
"""Test multiple events are in descending timestamp order."""
|
||||||
|
@ -787,6 +795,7 @@ async def test_camera_event_clip_preview(hass, auth, hass_client, mp4):
|
||||||
browse.children[0].thumbnail
|
browse.children[0].thumbnail
|
||||||
== f"/api/nest/event_media/{device.id}/{event_identifier}/thumbnail"
|
== f"/api/nest/event_media/{device.id}/{event_identifier}/thumbnail"
|
||||||
)
|
)
|
||||||
|
assert browse.children[0].can_play
|
||||||
# Browse to the device
|
# Browse to the device
|
||||||
browse = await media_source.async_browse_media(
|
browse = await media_source.async_browse_media(
|
||||||
hass, f"{const.URI_SCHEME}{DOMAIN}/{device.id}"
|
hass, f"{const.URI_SCHEME}{DOMAIN}/{device.id}"
|
||||||
|
@ -805,7 +814,6 @@ async def test_camera_event_clip_preview(hass, auth, hass_client, mp4):
|
||||||
assert not browse.children[0].can_expand
|
assert not browse.children[0].can_expand
|
||||||
assert len(browse.children[0].children) == 0
|
assert len(browse.children[0].children) == 0
|
||||||
assert browse.children[0].can_play
|
assert browse.children[0].can_play
|
||||||
# No thumbnail support for mp4 clips yet
|
|
||||||
assert (
|
assert (
|
||||||
browse.children[0].thumbnail
|
browse.children[0].thumbnail
|
||||||
== f"/api/nest/event_media/{device.id}/{event_identifier}/thumbnail"
|
== f"/api/nest/event_media/{device.id}/{event_identifier}/thumbnail"
|
||||||
|
@ -973,6 +981,10 @@ async def test_multiple_devices(hass, auth, hass_client):
|
||||||
assert device2
|
assert device2
|
||||||
|
|
||||||
# Very no events have been received yet
|
# Very no events have been received yet
|
||||||
|
browse = await media_source.async_browse_media(hass, f"{const.URI_SCHEME}{DOMAIN}")
|
||||||
|
assert len(browse.children) == 2
|
||||||
|
assert not browse.children[0].can_play
|
||||||
|
assert not browse.children[1].can_play
|
||||||
browse = await media_source.async_browse_media(
|
browse = await media_source.async_browse_media(
|
||||||
hass, f"{const.URI_SCHEME}{DOMAIN}/{device1.id}"
|
hass, f"{const.URI_SCHEME}{DOMAIN}/{device1.id}"
|
||||||
)
|
)
|
||||||
|
@ -998,6 +1010,10 @@ async def test_multiple_devices(hass, auth, hass_client):
|
||||||
)
|
)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
|
browse = await media_source.async_browse_media(hass, f"{const.URI_SCHEME}{DOMAIN}")
|
||||||
|
assert len(browse.children) == 2
|
||||||
|
assert browse.children[0].can_play
|
||||||
|
assert not browse.children[1].can_play
|
||||||
browse = await media_source.async_browse_media(
|
browse = await media_source.async_browse_media(
|
||||||
hass, f"{const.URI_SCHEME}{DOMAIN}/{device1.id}"
|
hass, f"{const.URI_SCHEME}{DOMAIN}/{device1.id}"
|
||||||
)
|
)
|
||||||
|
@ -1020,6 +1036,10 @@ async def test_multiple_devices(hass, auth, hass_client):
|
||||||
)
|
)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
|
browse = await media_source.async_browse_media(hass, f"{const.URI_SCHEME}{DOMAIN}")
|
||||||
|
assert len(browse.children) == 2
|
||||||
|
assert browse.children[0].can_play
|
||||||
|
assert browse.children[1].can_play
|
||||||
browse = await media_source.async_browse_media(
|
browse = await media_source.async_browse_media(
|
||||||
hass, f"{const.URI_SCHEME}{DOMAIN}/{device1.id}"
|
hass, f"{const.URI_SCHEME}{DOMAIN}/{device1.id}"
|
||||||
)
|
)
|
||||||
|
@ -1427,6 +1447,7 @@ async def test_camera_image_resize(hass, auth, hass_client):
|
||||||
browse.children[0].thumbnail
|
browse.children[0].thumbnail
|
||||||
== f"/api/nest/event_media/{device.id}/{event_identifier}/thumbnail"
|
== f"/api/nest/event_media/{device.id}/{event_identifier}/thumbnail"
|
||||||
)
|
)
|
||||||
|
assert browse.children[0].can_play
|
||||||
|
|
||||||
# Browse to device. No thumbnail is needed for the device on the device page
|
# Browse to device. No thumbnail is needed for the device on the device page
|
||||||
browse = await media_source.async_browse_media(
|
browse = await media_source.async_browse_media(
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue