diff --git a/homeassistant/components/stream/core.py b/homeassistant/components/stream/core.py index bf66ef729bd..5768f886adb 100644 --- a/homeassistant/components/stream/core.py +++ b/homeassistant/components/stream/core.py @@ -4,14 +4,13 @@ from __future__ import annotations import asyncio from collections import deque from collections.abc import Callable, Coroutine, Iterable -from dataclasses import dataclass +from dataclasses import dataclass, field import datetime from enum import IntEnum import logging from typing import TYPE_CHECKING, Any from aiohttp import web -import attr import numpy as np from homeassistant.components.http.view import HomeAssistantView @@ -51,15 +50,15 @@ class Orientation(IntEnum): ROTATE_RIGHT = 8 -@attr.s(slots=True) +@dataclass(slots=True) class StreamSettings: """Stream settings.""" - ll_hls: bool = attr.ib() - min_segment_duration: float = attr.ib() - part_target_duration: float = attr.ib() - hls_advance_part_limit: int = attr.ib() - hls_part_timeout: float = attr.ib() + ll_hls: bool + min_segment_duration: float + part_target_duration: float + hls_advance_part_limit: int + hls_part_timeout: float STREAM_SETTINGS_NON_LL_HLS = StreamSettings( @@ -81,29 +80,29 @@ class Part: data: bytes -@attr.s(slots=True) +@dataclass(slots=True) class Segment: """Represent a segment.""" - sequence: int = attr.ib() + sequence: int # the init of the mp4 the segment is based on - init: bytes = attr.ib() + init: bytes # For detecting discontinuities across stream restarts - stream_id: int = attr.ib() - start_time: datetime.datetime = attr.ib() - _stream_outputs: Iterable[StreamOutput] = attr.ib() - duration: float = attr.ib(default=0) - parts: list[Part] = attr.ib(factory=list) + stream_id: int + start_time: datetime.datetime + _stream_outputs: Iterable[StreamOutput] + duration: float = 0 + parts: list[Part] = field(default_factory=list) # Store text of this segment's hls playlist for reuse # Use list[str] for easy appends - hls_playlist_template: list[str] = attr.ib(factory=list) - hls_playlist_parts: list[str] = attr.ib(factory=list) + hls_playlist_template: list[str] = field(default_factory=list) + hls_playlist_parts: list[str] = field(default_factory=list) # Number of playlist parts rendered so far - hls_num_parts_rendered: int = attr.ib(default=0) + hls_num_parts_rendered: int = 0 # Set to true when all the parts are rendered - hls_playlist_complete: bool = attr.ib(default=False) + hls_playlist_complete: bool = False - def __attrs_post_init__(self) -> None: + def __post_init__(self) -> None: """Run after init.""" for output in self._stream_outputs: output.put(self) diff --git a/homeassistant/components/stream/worker.py b/homeassistant/components/stream/worker.py index cc4970c8a5e..3d27637c989 100644 --- a/homeassistant/components/stream/worker.py +++ b/homeassistant/components/stream/worker.py @@ -4,13 +4,13 @@ from __future__ import annotations from collections import defaultdict, deque from collections.abc import Callable, Generator, Iterator, Mapping import contextlib +from dataclasses import fields import datetime from io import SEEK_END, BytesIO import logging from threading import Event from typing import Any, Self, cast -import attr import av from homeassistant.core import HomeAssistant @@ -283,7 +283,7 @@ class StreamMuxer: init=read_init(self._memory_file), # Fetch the latest StreamOutputs, which may have changed since the # worker started. - stream_outputs=self._stream_state.outputs, + _stream_outputs=self._stream_state.outputs, start_time=self._start_time, ) self._memory_file_pos = self._memory_file.tell() @@ -537,7 +537,7 @@ def stream_worker( audio_stream = None # Disable ll-hls for hls inputs if container.format.name == "hls": - for field in attr.fields(StreamSettings): + for field in fields(StreamSettings): setattr( stream_settings, field.name, diff --git a/tests/components/stream/common.py b/tests/components/stream/common.py index 7ea583c0ec3..ae4a4fc2d9d 100644 --- a/tests/components/stream/common.py +++ b/tests/components/stream/common.py @@ -24,7 +24,7 @@ DefaultSegment = partial( init=None, stream_id=0, start_time=FAKE_TIME, - stream_outputs=[], + _stream_outputs=[], ) AUDIO_SAMPLE_RATE = 8000