diff --git a/homeassistant/components/camera/webrtc.py b/homeassistant/components/camera/webrtc.py index 05924855bc4..fb9f05b58da 100644 --- a/homeassistant/components/camera/webrtc.py +++ b/homeassistant/components/camera/webrtc.py @@ -7,9 +7,6 @@ from collections.abc import Awaitable, Callable, Coroutine from dataclasses import dataclass, field from typing import TYPE_CHECKING, Any, Protocol -from mashumaro import field_options -from mashumaro.config import BaseConfig -from mashumaro.mixins.dict import DataClassDictMixin import voluptuous as vol from homeassistant.components import websocket_api @@ -32,19 +29,8 @@ DATA_ICE_SERVERS: HassKey[list[Callable[[], Coroutine[Any, Any, RTCIceServer]]]] ) -class _RTCBaseModel(DataClassDictMixin): - """Base class for RTC models.""" - - class Config(BaseConfig): - """Mashumaro config.""" - - # Serialize to spec conform names and omit default values - omit_default = True - serialize_by_alias = True - - @dataclass -class RTCIceServer(_RTCBaseModel): +class RTCIceServer: """RTC Ice Server. See https://www.w3.org/TR/webrtc/#rtciceserver-dictionary @@ -54,30 +40,56 @@ class RTCIceServer(_RTCBaseModel): username: str | None = None credential: str | None = None + def to_frontend_dict(self) -> dict[str, Any]: + """Return a dict that can be used by the frontend.""" + + data = { + "urls": self.urls, + } + if self.username is not None: + data["username"] = self.username + if self.credential is not None: + data["credential"] = self.credential + return data + @dataclass -class RTCConfiguration(_RTCBaseModel): +class RTCConfiguration: """RTC Configuration. See https://www.w3.org/TR/webrtc/#rtcconfiguration-dictionary """ - ice_servers: list[RTCIceServer] = field( - metadata=field_options(alias="iceServers"), default_factory=list - ) + ice_servers: list[RTCIceServer] = field(default_factory=list) + + def to_frontend_dict(self) -> dict[str, Any]: + """Return a dict that can be used by the frontend.""" + if not self.ice_servers: + return {} + + return { + "iceServers": [server.to_frontend_dict() for server in self.ice_servers] + } @dataclass(kw_only=True) -class WebRTCClientConfiguration(_RTCBaseModel): +class WebRTCClientConfiguration: """WebRTC configuration for the client. Not part of the spec, but required to configure client. """ configuration: RTCConfiguration = field(default_factory=RTCConfiguration) - data_channel: str | None = field( - metadata=field_options(alias="dataChannel"), default=None - ) + data_channel: str | None = None + + def to_frontend_dict(self) -> dict[str, Any]: + """Return a dict that can be used by the frontend.""" + data: dict[str, Any] = { + "configuration": self.configuration.to_frontend_dict(), + } + if self.data_channel is not None: + data["dataChannel"] = self.data_channel + return data class CameraWebRTCProvider(Protocol): @@ -153,7 +165,7 @@ async def ws_get_client_config( ) return - config = (await camera.async_get_webrtc_client_configuration()).to_dict() + config = (await camera.async_get_webrtc_client_configuration()).to_frontend_dict() connection.send_result( msg["id"], config, diff --git a/homeassistant/package_constraints.txt b/homeassistant/package_constraints.txt index d1a09ceb648..68642432c42 100644 --- a/homeassistant/package_constraints.txt +++ b/homeassistant/package_constraints.txt @@ -38,7 +38,6 @@ httpx==0.27.2 ifaddr==0.2.0 Jinja2==3.1.4 lru-dict==1.3.0 -mashumaro==3.13.1 mutagen==1.47.0 orjson==3.10.7 packaging>=23.1 @@ -123,6 +122,9 @@ backoff>=2.0 # v2 has breaking changes (#99218). pydantic==1.10.18 +# Required for Python 3.12.4 compatibility (#119223). +mashumaro>=3.13.1 + # Breaks asyncio # https://github.com/pubnub/python/issues/130 pubnub!=6.4.0 diff --git a/pyproject.toml b/pyproject.toml index 4e4d7c69538..81eb21242b5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -50,7 +50,6 @@ dependencies = [ "ifaddr==0.2.0", "Jinja2==3.1.4", "lru-dict==1.3.0", - "mashumaro==3.13.1", "PyJWT==2.9.0", # PyJWT has loose dependency. We want the latest one. "cryptography==43.0.1", diff --git a/requirements.txt b/requirements.txt index 7c40ac6236e..3f6f73f8430 100644 --- a/requirements.txt +++ b/requirements.txt @@ -24,7 +24,6 @@ home-assistant-bluetooth==1.13.0 ifaddr==0.2.0 Jinja2==3.1.4 lru-dict==1.3.0 -mashumaro==3.13.1 PyJWT==2.9.0 cryptography==43.0.1 Pillow==10.4.0 diff --git a/script/gen_requirements_all.py b/script/gen_requirements_all.py index 7787578902c..4641d4ac12a 100755 --- a/script/gen_requirements_all.py +++ b/script/gen_requirements_all.py @@ -140,6 +140,9 @@ backoff>=2.0 # v2 has breaking changes (#99218). pydantic==1.10.18 +# Required for Python 3.12.4 compatibility (#119223). +mashumaro>=3.13.1 + # Breaks asyncio # https://github.com/pubnub/python/issues/130 pubnub!=6.4.0