Implement async_get_stream_source in the camera integration (#35704)

This commit is contained in:
J. Nick Koston 2020-05-25 17:41:50 -05:00 committed by GitHub
parent 6fbc3c4a51
commit 3dfeec5033
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 24 additions and 6 deletions

View file

@ -161,6 +161,14 @@ async def async_get_image(hass, entity_id, timeout=10):
raise HomeAssistantError("Unable to get image")
@bind_hass
async def async_get_stream_source(hass, entity_id):
"""Fetch the stream source for a camera entity."""
camera = _get_camera_from_entity_id(hass, entity_id)
return await camera.stream_source()
@bind_hass
async def async_get_mjpeg_stream(hass, request, entity_id):
"""Fetch an mjpeg stream from a camera entity."""

View file

@ -12,7 +12,6 @@ from pyhap.camera import (
)
from pyhap.const import CATEGORY_CAMERA
from homeassistant.components.camera.const import DOMAIN as DOMAIN_CAMERA
from homeassistant.components.ffmpeg import DATA_FFMPEG
from homeassistant.core import callback
from homeassistant.helpers.event import async_track_time_interval
@ -126,7 +125,6 @@ class Camera(HomeAccessory, PyhapCamera):
"""Initialize a Camera accessory object."""
self._ffmpeg = hass.data[DATA_FFMPEG]
self._cur_session = None
self._camera = hass.data[DOMAIN_CAMERA]
for config_key in CONFIG_DEFAULTS:
if config_key not in config:
config[config_key] = CONFIG_DEFAULTS[config_key]
@ -188,14 +186,13 @@ class Camera(HomeAccessory, PyhapCamera):
async def _async_get_stream_source(self):
"""Find the camera stream source url."""
camera = self._camera.get_entity(self.entity_id)
if not camera or not camera.is_on:
return None
stream_source = self.config.get(CONF_STREAM_SOURCE)
if stream_source:
return stream_source
try:
stream_source = await camera.stream_source()
stream_source = await self.hass.components.camera.async_get_stream_source(
self.entity_id
)
except Exception: # pylint: disable=broad-except
_LOGGER.exception(
"Failed to get stream source - this could be a transient error or your camera might not be compatible with HomeKit yet"

View file

@ -67,6 +67,19 @@ async def test_get_image_from_camera(hass, image_mock_url):
assert image.content == b"Test"
async def test_get_stream_source_from_camera(hass, mock_camera):
"""Fetch stream source from camera entity."""
with patch(
"homeassistant.components.camera.Camera.stream_source",
return_value="rtsp://127.0.0.1/stream",
) as mock_camera_stream_source:
stream_source = await camera.async_get_stream_source(hass, "camera.demo_camera")
assert mock_camera_stream_source.called
assert stream_source == "rtsp://127.0.0.1/stream"
async def test_get_image_without_exists_camera(hass, image_mock_url):
"""Try to get image without exists camera."""
with patch(