diff --git a/.core_files.yaml b/.core_files.yaml index 318a4387510..b6c20bf7542 100644 --- a/.core_files.yaml +++ b/.core_files.yaml @@ -76,6 +76,7 @@ components: &components - homeassistant/components/logger/* - homeassistant/components/lovelace/* - homeassistant/components/media_source/* + - homeassistant/components/mjpeg/* - homeassistant/components/mqtt/* - homeassistant/components/network/* - homeassistant/components/onboarding/* diff --git a/homeassistant/components/agent_dvr/camera.py b/homeassistant/components/agent_dvr/camera.py index 474d1f08b80..bad90efee8f 100644 --- a/homeassistant/components/agent_dvr/camera.py +++ b/homeassistant/components/agent_dvr/camera.py @@ -5,13 +5,8 @@ import logging from agent import AgentError from homeassistant.components.camera import SUPPORT_ON_OFF -from homeassistant.components.mjpeg.camera import ( - CONF_MJPEG_URL, - CONF_STILL_IMAGE_URL, - MjpegCamera, - filter_urllib3_logging, -) -from homeassistant.const import ATTR_ATTRIBUTION, CONF_NAME +from homeassistant.components.mjpeg.camera import MjpegCamera, filter_urllib3_logging +from homeassistant.const import ATTR_ATTRIBUTION from homeassistant.helpers import entity_platform from homeassistant.helpers.entity import DeviceInfo @@ -70,16 +65,15 @@ class AgentCamera(MjpegCamera): def __init__(self, device): """Initialize as a subclass of MjpegCamera.""" - device_info = { - CONF_NAME: device.name, - CONF_MJPEG_URL: f"{device.client._server_url}{device.mjpeg_image_url}&size={device.mjpegStreamWidth}x{device.mjpegStreamHeight}", - CONF_STILL_IMAGE_URL: f"{device.client._server_url}{device.still_image_url}&size={device.mjpegStreamWidth}x{device.mjpegStreamHeight}", - } self.device = device self._removed = False self._attr_name = f"{device.client.name} {device.name}" self._attr_unique_id = f"{device._client.unique}_{device.typeID}_{device.id}" - super().__init__(device_info) + super().__init__( + name=device.name, + mjpeg_url=f"{device.client._server_url}{device.mjpeg_image_url}&size={device.mjpegStreamWidth}x{device.mjpegStreamHeight}", + still_image_url=f"{device.client._server_url}{device.still_image_url}&size={device.mjpegStreamWidth}x{device.mjpegStreamHeight}", + ) self._attr_device_info = DeviceInfo( identifiers={(AGENT_DOMAIN, self.unique_id)}, manufacturer="Agent", diff --git a/homeassistant/components/axis/camera.py b/homeassistant/components/axis/camera.py index bb8b072fb06..c52aac37a02 100644 --- a/homeassistant/components/axis/camera.py +++ b/homeassistant/components/axis/camera.py @@ -2,20 +2,9 @@ from urllib.parse import urlencode from homeassistant.components.camera import SUPPORT_STREAM -from homeassistant.components.mjpeg.camera import ( - CONF_MJPEG_URL, - CONF_STILL_IMAGE_URL, - MjpegCamera, - filter_urllib3_logging, -) +from homeassistant.components.mjpeg.camera import MjpegCamera, filter_urllib3_logging from homeassistant.config_entries import ConfigEntry -from homeassistant.const import ( - CONF_AUTHENTICATION, - CONF_NAME, - CONF_PASSWORD, - CONF_USERNAME, - HTTP_DIGEST_AUTHENTICATION, -) +from homeassistant.const import HTTP_DIGEST_AUTHENTICATION from homeassistant.core import HomeAssistant from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.helpers.entity_platform import AddEntitiesCallback @@ -47,15 +36,15 @@ class AxisCamera(AxisEntityBase, MjpegCamera): """Initialize Axis Communications camera component.""" AxisEntityBase.__init__(self, device) - config = { - CONF_NAME: device.name, - CONF_USERNAME: device.username, - CONF_PASSWORD: device.password, - CONF_MJPEG_URL: self.mjpeg_source, - CONF_STILL_IMAGE_URL: self.image_source, - CONF_AUTHENTICATION: HTTP_DIGEST_AUTHENTICATION, - } - MjpegCamera.__init__(self, config) + MjpegCamera.__init__( + self, + name=device.name, + username=device.username, + password=device.password, + mjpeg_url=self.mjpeg_source, + still_image_url=self.image_source, + authentication=HTTP_DIGEST_AUTHENTICATION, + ) self._attr_unique_id = f"{device.unique_id}-camera" diff --git a/homeassistant/components/mjpeg/camera.py b/homeassistant/components/mjpeg/camera.py index 0de303455b9..3a9c1a6cf91 100644 --- a/homeassistant/components/mjpeg/camera.py +++ b/homeassistant/components/mjpeg/camera.py @@ -49,7 +49,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( [HTTP_BASIC_AUTHENTICATION, HTTP_DIGEST_AUTHENTICATION] ), vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_PASSWORD): cv.string, + vol.Optional(CONF_PASSWORD, default=""): cv.string, vol.Optional(CONF_USERNAME): cv.string, vol.Optional(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): cv.boolean, } @@ -71,13 +71,13 @@ async def async_setup_platform( async_add_entities( [ MjpegCamera( - config[CONF_NAME], - config[CONF_AUTHENTICATION], - config.get(CONF_USERNAME), - config.get(CONF_PASSWORD), - config[CONF_MJPEG_URL], - config.get(CONF_STILL_IMAGE_URL), - config[CONF_VERIFY_SSL], + name=config[CONF_NAME], + authentication=config[CONF_AUTHENTICATION], + username=config.get(CONF_USERNAME), + password=config[CONF_PASSWORD], + mjpeg_url=config[CONF_MJPEG_URL], + still_image_url=config.get(CONF_STILL_IMAGE_URL), + verify_ssl=config[CONF_VERIFY_SSL], ) ] ) @@ -116,13 +116,14 @@ class MjpegCamera(Camera): def __init__( self, + *, name: str, - authentication: str, - username: str | None, - password: str | None, mjpeg_url: str, still_image_url: str | None, - verify_ssl: bool, + authentication: str | None = None, + username: str | None = None, + password: str = "", + verify_ssl: bool = True, ) -> None: """Initialize a MJPEG camera.""" super().__init__() diff --git a/homeassistant/components/motioneye/camera.py b/homeassistant/components/motioneye/camera.py index b9b7f6d42c8..acf170472da 100644 --- a/homeassistant/components/motioneye/camera.py +++ b/homeassistant/components/motioneye/camera.py @@ -27,7 +27,6 @@ import voluptuous as vol from homeassistant.components.mjpeg.camera import ( CONF_MJPEG_URL, CONF_STILL_IMAGE_URL, - CONF_VERIFY_SSL, MjpegCamera, ) from homeassistant.config_entries import ConfigEntry @@ -144,6 +143,8 @@ async def async_setup_entry( class MotionEyeMjpegCamera(MotionEyeEntity, MjpegCamera): """motionEye mjpeg camera.""" + _name: str + def __init__( self, config_entry_id: str, @@ -173,10 +174,8 @@ class MotionEyeMjpegCamera(MotionEyeEntity, MjpegCamera): ) MjpegCamera.__init__( self, - { - CONF_VERIFY_SSL: False, - **self._get_mjpeg_camera_properties_for_camera(camera), - }, + verify_ssl=False, + **self._get_mjpeg_camera_properties_for_camera(camera), ) @callback @@ -207,7 +206,7 @@ class MotionEyeMjpegCamera(MotionEyeEntity, MjpegCamera): return { CONF_NAME: camera[KEY_NAME], CONF_USERNAME: self._surveillance_username if auth is not None else None, - CONF_PASSWORD: self._surveillance_password if auth is not None else None, + CONF_PASSWORD: self._surveillance_password if auth is not None else "", CONF_MJPEG_URL: streaming_url or "", CONF_STILL_IMAGE_URL: self._client.get_camera_snapshot_url(camera), CONF_AUTHENTICATION: auth, @@ -227,7 +226,10 @@ class MotionEyeMjpegCamera(MotionEyeEntity, MjpegCamera): self._still_image_url = properties[CONF_STILL_IMAGE_URL] self._authentication = properties[CONF_AUTHENTICATION] - if self._authentication == HTTP_BASIC_AUTHENTICATION: + if ( + self._authentication == HTTP_BASIC_AUTHENTICATION + and self._username is not None + ): self._auth = aiohttp.BasicAuth(self._username, password=self._password) def _is_acceptable_streaming_camera(self) -> bool: diff --git a/homeassistant/components/zoneminder/camera.py b/homeassistant/components/zoneminder/camera.py index 70e9548414e..5e262ff6903 100644 --- a/homeassistant/components/zoneminder/camera.py +++ b/homeassistant/components/zoneminder/camera.py @@ -3,13 +3,7 @@ from __future__ import annotations import logging -from homeassistant.components.mjpeg.camera import ( - CONF_MJPEG_URL, - CONF_STILL_IMAGE_URL, - MjpegCamera, - filter_urllib3_logging, -) -from homeassistant.const import CONF_NAME, CONF_VERIFY_SSL +from homeassistant.components.mjpeg.camera import MjpegCamera, filter_urllib3_logging from homeassistant.core import HomeAssistant from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType @@ -44,13 +38,12 @@ class ZoneMinderCamera(MjpegCamera): def __init__(self, monitor, verify_ssl): """Initialize as a subclass of MjpegCamera.""" - device_info = { - CONF_NAME: monitor.name, - CONF_MJPEG_URL: monitor.mjpeg_image_url, - CONF_STILL_IMAGE_URL: monitor.still_image_url, - CONF_VERIFY_SSL: verify_ssl, - } - super().__init__(device_info) + super().__init__( + name=monitor.name, + mjpeg_url=monitor.mjpeg_image_url, + still_image_url=monitor.still_image_url, + verify_ssl=verify_ssl, + ) self._is_recording = None self._is_available = None self._monitor = monitor