Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We鈥檒l occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement async_get_stream_source in the camera integration #35704

Merged
merged 2 commits into from May 25, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
8 changes: 8 additions & 0 deletions homeassistant/components/camera/__init__.py
Expand Up @@ -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."""
Expand Down
9 changes: 3 additions & 6 deletions homeassistant/components/homekit/type_cameras.py
Expand Up @@ -12,7 +12,6 @@
)
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
Expand Down Expand Up @@ -126,7 +125,6 @@ def __init__(self, hass, driver, name, entity_id, aid, config):
"""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]
Expand Down Expand Up @@ -188,14 +186,13 @@ def async_update_state(self, new_state):

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()
bdraco marked this conversation as resolved.
Show resolved Hide resolved
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"
Expand Down
13 changes: 13 additions & 0 deletions tests/components/camera/test_init.py
Expand Up @@ -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(
Expand Down