Update nest media source to make device play most recent event (#67557)

pull/67540/head^2
Allen Porter 2022-03-03 08:16:03 -08:00 committed by GitHub
parent 13eeaa4c73
commit 2678d8120a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 33 additions and 5 deletions

View File

@ -339,15 +339,21 @@ class NestMediaSource(MediaSource):
media_id: MediaId | None = parse_media_id(item.identifier)
if not media_id:
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()
if not (device := devices.get(media_id.device_id)):
raise Unresolvable(
"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
# snapshot type (either jpg or mp4 clip)
content_type = EventImageType.IMAGE.content_type
@ -384,6 +390,7 @@ class NestMediaSource(MediaSource):
device_id=last_event_id.device_id,
event_token=last_event_id.event_token,
)
browse_device.can_play = True
browse_root.children.append(browse_device)
return browse_root

View File

@ -327,6 +327,7 @@ async def test_camera_event(hass, auth, hass_client):
assert browse.children[0].identifier == device.id
assert browse.children[0].title == "Front: Recent Events"
assert browse.children[0].can_expand
assert browse.children[0].can_play
# Expanding the root does not expand the device
assert len(browse.children[0].children) == 0
@ -371,6 +372,13 @@ async def test_camera_event(hass, auth, hass_client):
contents = await response.read()
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):
"""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
== f"/api/nest/event_media/{device.id}/{event_identifier}/thumbnail"
)
assert browse.children[0].can_play
# Browse to the device
browse = await media_source.async_browse_media(
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 len(browse.children[0].children) == 0
assert browse.children[0].can_play
# No thumbnail support for mp4 clips yet
assert (
browse.children[0].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
# 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(
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()
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(
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()
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(
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
== 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 = await media_source.async_browse_media(