Add support for MJPEG cameras to camera media source (#66499)

This commit is contained in:
Paulus Schoutsen 2022-02-14 08:04:19 -08:00 committed by GitHub
parent 63cb79ec29
commit fec8c2ab82
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 43 additions and 13 deletions

View File

@ -47,8 +47,18 @@ class CameraMediaSource(MediaSource):
if not camera:
raise Unresolvable(f"Could not resolve media item: {item.identifier}")
stream_type = camera.frontend_stream_type
if stream_type is None:
return PlayMedia(
f"/api/camera_proxy_stream/{camera.entity_id}", camera.content_type
)
if camera.frontend_stream_type != STREAM_TYPE_HLS:
raise Unresolvable("Camera does not support HLS streaming.")
raise Unresolvable("Camera does not support MJPEG or HLS streaming.")
if "stream" not in self.hass.config.components:
raise Unresolvable("Stream integration not loaded")
try:
url = await _async_stream_endpoint_url(self.hass, camera, HLS_PROVIDER)
@ -65,16 +75,19 @@ class CameraMediaSource(MediaSource):
if item.identifier:
raise BrowseError("Unknown item")
if "stream" not in self.hass.config.components:
raise BrowseError("Stream integration is not loaded")
supported_stream_types: list[str | None] = [None]
if "stream" in self.hass.config.components:
supported_stream_types.append(STREAM_TYPE_HLS)
# Root. List cameras.
component: EntityComponent = self.hass.data[DOMAIN]
children = []
for camera in component.entities:
camera = cast(Camera, camera)
stream_type = camera.frontend_stream_type
if camera.frontend_stream_type != STREAM_TYPE_HLS:
if stream_type not in supported_stream_types:
continue
children.append(

View File

@ -15,17 +15,17 @@ async def setup_media_source(hass):
assert await async_setup_component(hass, "media_source", {})
@pytest.fixture(autouse=True)
async def mock_stream(hass):
"""Mock stream."""
hass.config.components.add("stream")
async def test_browsing(hass, mock_camera_hls):
"""Test browsing camera media source."""
item = await media_source.async_browse_media(hass, "media-source://camera")
assert item is not None
assert item.title == "Camera"
assert len(item.children) == 0
# Adding stream enables HLS camera
hass.config.components.add("stream")
item = await media_source.async_browse_media(hass, "media-source://camera")
assert len(item.children) == 2
@ -39,6 +39,9 @@ async def test_browsing_filter_non_hls(hass, mock_camera_web_rtc):
async def test_resolving(hass, mock_camera_hls):
"""Test resolving."""
# Adding stream enables HLS camera
hass.config.components.add("stream")
with patch(
"homeassistant.components.camera.media_source._async_stream_endpoint_url",
return_value="http://example.com/stream",
@ -53,20 +56,34 @@ async def test_resolving(hass, mock_camera_hls):
async def test_resolving_errors(hass, mock_camera_hls):
"""Test resolving."""
with pytest.raises(media_source.Unresolvable):
with pytest.raises(media_source.Unresolvable) as exc_info:
await media_source.async_resolve_media(
hass, "media-source://camera/camera.demo_camera"
)
assert str(exc_info.value) == "Stream integration not loaded"
hass.config.components.add("stream")
with pytest.raises(media_source.Unresolvable) as exc_info:
await media_source.async_resolve_media(
hass, "media-source://camera/camera.non_existing"
)
assert str(exc_info.value) == "Could not resolve media item: camera.non_existing"
with pytest.raises(media_source.Unresolvable), patch(
with pytest.raises(media_source.Unresolvable) as exc_info, patch(
"homeassistant.components.camera.Camera.frontend_stream_type",
new_callable=PropertyMock(return_value=STREAM_TYPE_WEB_RTC),
):
await media_source.async_resolve_media(
hass, "media-source://camera/camera.demo_camera"
)
assert str(exc_info.value) == "Camera does not support MJPEG or HLS streaming."
with pytest.raises(media_source.Unresolvable):
with pytest.raises(media_source.Unresolvable) as exc_info:
await media_source.async_resolve_media(
hass, "media-source://camera/camera.demo_camera"
)
assert (
str(exc_info.value) == "camera.demo_camera does not support play stream service"
)