1 """Support for Lidarr."""
3 from __future__
import annotations
5 from collections.abc
import Callable
7 from typing
import Any, Generic
9 from aiopyarr
import LidarrQueue, LidarrQueueItem, LidarrRootFolder
14 SensorEntityDescription,
21 from .
import LidarrConfigEntry
22 from .const
import BYTE_SIZES
23 from .coordinator
import LidarrDataUpdateCoordinator, T
24 from .entity
import LidarrEntity
27 def get_space(data: list[LidarrRootFolder], name: str) -> str:
29 space: list[float] = []
31 if name
in mount.path:
32 mount.freeSpace = mount.freeSpace
if mount.accessible
else 0
34 mount.freeSpace / 1024 ** BYTE_SIZES.index(UnitOfInformation.GIGABYTES)
36 return f
"{space[0]:.2f}"
40 description: LidarrSensorEntityDescription[T], mount: LidarrRootFolder
41 ) -> tuple[LidarrSensorEntityDescription[T], str]:
42 """Return modified description and folder name."""
43 name = mount.path.rsplit(
"/")[-1].rsplit(
"\\")[-1]
44 desc = dataclasses.replace(
46 key=f
"{description.key}_{name}",
47 name=f
"{description.name} {name}".capitalize(),
52 @dataclasses.dataclass(frozen=True)
54 """Mixin for required keys."""
56 value_fn: Callable[[T, str], str | int]
59 @dataclasses.dataclass(frozen=True)
61 SensorEntityDescription, LidarrSensorEntityDescriptionMixIn[T], Generic[T]
63 """Class to describe a Lidarr sensor."""
65 attributes_fn: Callable[[T], dict[str, str] |
None] =
lambda _:
None
68 [LidarrSensorEntityDescription[T], LidarrRootFolder],
69 tuple[LidarrSensorEntityDescription[T], str] |
None,
75 SENSOR_TYPES: dict[str, LidarrSensorEntityDescription[Any]] = {
78 translation_key=
"disk_space",
79 native_unit_of_measurement=UnitOfInformation.GIGABYTES,
80 device_class=SensorDeviceClass.DATA_SIZE,
82 state_class=SensorStateClass.TOTAL,
83 description_fn=get_modified_description,
85 "queue": LidarrSensorEntityDescription[LidarrQueue](
87 translation_key=
"queue",
88 native_unit_of_measurement=
"albums",
89 value_fn=
lambda data, _: data.totalRecords,
90 state_class=SensorStateClass.TOTAL,
91 attributes_fn=
lambda data: {i.title:
queue_str(i)
for i
in data.records},
93 "wanted": LidarrSensorEntityDescription[LidarrQueue](
95 translation_key=
"wanted",
96 native_unit_of_measurement=
"albums",
97 value_fn=
lambda data, _: data.totalRecords,
98 state_class=SensorStateClass.TOTAL,
99 entity_registry_enabled_default=
False,
100 attributes_fn=
lambda data: {
101 album.title: album.artist.artistName
for album
in data.records
104 "albums": LidarrSensorEntityDescription[int](
106 translation_key=
"albums",
107 native_unit_of_measurement=
"albums",
108 value_fn=
lambda data, _: data,
109 state_class=SensorStateClass.TOTAL,
110 entity_registry_enabled_default=
False,
117 entry: LidarrConfigEntry,
118 async_add_entities: AddEntitiesCallback,
120 """Set up Lidarr sensors based on a config entry."""
121 entities: list[LidarrSensor[Any]] = []
122 for coordinator_type, description
in SENSOR_TYPES.items():
123 coordinator = getattr(entry.runtime_data, coordinator_type)
124 if coordinator_type !=
"disk_space":
129 for mount
in coordinator.data
130 if description.description_fn
136 """Implementation of the Lidarr sensor."""
138 entity_description: LidarrSensorEntityDescription[T]
142 coordinator: LidarrDataUpdateCoordinator[T],
143 description: LidarrSensorEntityDescription[T],
144 folder_name: str =
"",
146 """Create Lidarr entity."""
147 super().
__init__(coordinator, description)
152 """Return the state attributes of the sensor."""
157 """Return the state of the sensor."""
162 """Return string description of queue item."""
165 and item.timeleft ==
"00:00:00"
166 or not hasattr(item,
"trackedDownloadState")
169 return item.trackedDownloadState
None __init__(self, LidarrDataUpdateCoordinator[T] coordinator, LidarrSensorEntityDescription[T] description, str folder_name="")
dict[str, str]|None extra_state_attributes(self)
str|int native_value(self)
str queue_str(LidarrQueueItem item)
tuple[LidarrSensorEntityDescription[T], str] get_modified_description(LidarrSensorEntityDescription[T] description, LidarrRootFolder mount)
None async_setup_entry(HomeAssistant hass, LidarrConfigEntry entry, AddEntitiesCallback async_add_entities)
str get_space(list[LidarrRootFolder] data, str name)