uiprotect 0.10.1__py3-none-any.whl → 0.11.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of uiprotect might be problematic. Click here for more details.
- uiprotect/data/bootstrap.py +24 -33
- uiprotect/data/websocket.py +9 -3
- {uiprotect-0.10.1.dist-info → uiprotect-0.11.0.dist-info}/METADATA +1 -1
- {uiprotect-0.10.1.dist-info → uiprotect-0.11.0.dist-info}/RECORD +7 -7
- {uiprotect-0.10.1.dist-info → uiprotect-0.11.0.dist-info}/LICENSE +0 -0
- {uiprotect-0.10.1.dist-info → uiprotect-0.11.0.dist-info}/WHEEL +0 -0
- {uiprotect-0.10.1.dist-info → uiprotect-0.11.0.dist-info}/entry_points.txt +0 -0
uiprotect/data/bootstrap.py
CHANGED
|
@@ -41,7 +41,6 @@ from .types import EventType, FixSizeOrderedDict, ModelType
|
|
|
41
41
|
from .user import Group, User
|
|
42
42
|
from .websocket import (
|
|
43
43
|
WSAction,
|
|
44
|
-
WSJSONPacketFrame,
|
|
45
44
|
WSPacket,
|
|
46
45
|
WSSubscriptionMessage,
|
|
47
46
|
)
|
|
@@ -169,6 +168,10 @@ class ProtectDeviceRef(ProtectBaseObject):
|
|
|
169
168
|
id: str
|
|
170
169
|
|
|
171
170
|
|
|
171
|
+
_ModelType_NVR_value = ModelType.NVR.value
|
|
172
|
+
_ModelType_Event_value = ModelType.EVENT.value
|
|
173
|
+
|
|
174
|
+
|
|
172
175
|
class Bootstrap(ProtectBaseObject):
|
|
173
176
|
auth_user_id: str
|
|
174
177
|
access_key: str
|
|
@@ -536,51 +539,40 @@ class Bootstrap(ProtectBaseObject):
|
|
|
536
539
|
models: set[ModelType] | None = None,
|
|
537
540
|
ignore_stats: bool = False,
|
|
538
541
|
) -> WSSubscriptionMessage | None:
|
|
539
|
-
|
|
540
|
-
models = set()
|
|
541
|
-
|
|
542
|
-
if not isinstance(packet.action_frame, WSJSONPacketFrame):
|
|
543
|
-
_LOGGER.debug(
|
|
544
|
-
"Unexpected action frame format: %s",
|
|
545
|
-
packet.action_frame.payload_format,
|
|
546
|
-
)
|
|
547
|
-
|
|
548
|
-
if not isinstance(packet.data_frame, WSJSONPacketFrame):
|
|
549
|
-
_LOGGER.debug(
|
|
550
|
-
"Unexpected data frame format: %s",
|
|
551
|
-
packet.data_frame.payload_format,
|
|
552
|
-
)
|
|
553
|
-
|
|
542
|
+
"""Process a WS packet."""
|
|
554
543
|
action, data = self._get_frame_data(packet)
|
|
555
|
-
|
|
556
|
-
|
|
544
|
+
new_update_id: str = action["newUpdateId"]
|
|
545
|
+
if new_update_id is not None:
|
|
546
|
+
self.last_update_id = new_update_id
|
|
557
547
|
|
|
558
|
-
|
|
559
|
-
|
|
548
|
+
model_key: str = action["modelKey"]
|
|
549
|
+
if model_key not in ModelType.values_set():
|
|
550
|
+
_LOGGER.debug("Unknown model type: %s", model_key)
|
|
560
551
|
self._create_stat(packet, None, True)
|
|
561
552
|
return None
|
|
562
553
|
|
|
563
|
-
if
|
|
554
|
+
if models and ModelType(model_key) not in models:
|
|
564
555
|
self._create_stat(packet, None, True)
|
|
565
556
|
return None
|
|
566
557
|
|
|
567
|
-
|
|
558
|
+
action_action: str = action["action"]
|
|
559
|
+
if action_action == "remove":
|
|
568
560
|
return self._process_remove_packet(packet, data)
|
|
569
561
|
|
|
570
|
-
if
|
|
562
|
+
if not data:
|
|
571
563
|
self._create_stat(packet, None, True)
|
|
572
564
|
return None
|
|
573
565
|
|
|
574
566
|
try:
|
|
575
|
-
if
|
|
567
|
+
if action_action == "add":
|
|
576
568
|
return self._process_add_packet(packet, data)
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
if action["modelKey"] == ModelType.NVR.value:
|
|
569
|
+
if action_action == "update":
|
|
570
|
+
if model_key == _ModelType_NVR_value:
|
|
580
571
|
return self._process_nvr_update(packet, data, ignore_stats)
|
|
572
|
+
|
|
581
573
|
if (
|
|
582
|
-
|
|
583
|
-
or
|
|
574
|
+
model_key in ModelType.bootstrap_models_set()
|
|
575
|
+
or model_key == _ModelType_Event_value
|
|
584
576
|
):
|
|
585
577
|
return self._process_device_update(
|
|
586
578
|
packet,
|
|
@@ -588,13 +580,12 @@ class Bootstrap(ProtectBaseObject):
|
|
|
588
580
|
data,
|
|
589
581
|
ignore_stats,
|
|
590
582
|
)
|
|
591
|
-
_LOGGER.debug(
|
|
592
|
-
"Unexpected bootstrap model type deviceadoptedfor update: %s",
|
|
593
|
-
action["modelKey"],
|
|
594
|
-
)
|
|
595
583
|
except (ValidationError, ValueError) as err:
|
|
596
584
|
self._handle_ws_error(action, err)
|
|
597
585
|
|
|
586
|
+
_LOGGER.debug(
|
|
587
|
+
"Unexpected bootstrap model type deviceadoptedfor update: %s", model_key
|
|
588
|
+
)
|
|
598
589
|
self._create_stat(packet, None, True)
|
|
599
590
|
return None
|
|
600
591
|
|
uiprotect/data/websocket.py
CHANGED
|
@@ -7,6 +7,7 @@ import enum
|
|
|
7
7
|
import struct
|
|
8
8
|
import zlib
|
|
9
9
|
from dataclasses import dataclass
|
|
10
|
+
from functools import cache, cached_property
|
|
10
11
|
from typing import TYPE_CHECKING, Any
|
|
11
12
|
|
|
12
13
|
import orjson
|
|
@@ -62,6 +63,7 @@ class BaseWSPacketFrame:
|
|
|
62
63
|
raise NotImplementedError
|
|
63
64
|
|
|
64
65
|
@staticmethod
|
|
66
|
+
@cache
|
|
65
67
|
def klass_from_format(format_raw: int) -> type[BaseWSPacketFrame]:
|
|
66
68
|
payload_format = ProtectWSPayloadFormat(format_raw)
|
|
67
69
|
|
|
@@ -174,13 +176,15 @@ class WSJSONPacketFrame(BaseWSPacketFrame):
|
|
|
174
176
|
|
|
175
177
|
|
|
176
178
|
class WSPacket:
|
|
179
|
+
"""Class to handle a unifi protect websocket packet."""
|
|
180
|
+
|
|
177
181
|
_raw: bytes
|
|
178
182
|
_raw_encoded: str | None = None
|
|
179
183
|
|
|
180
184
|
_action_frame: BaseWSPacketFrame | None = None
|
|
181
185
|
_data_frame: BaseWSPacketFrame | None = None
|
|
182
186
|
|
|
183
|
-
def __init__(self, data: bytes):
|
|
187
|
+
def __init__(self, data: bytes) -> None:
|
|
184
188
|
self._raw = data
|
|
185
189
|
|
|
186
190
|
def decode(self) -> None:
|
|
@@ -190,7 +194,7 @@ class WSPacket:
|
|
|
190
194
|
self._action_frame.length,
|
|
191
195
|
)
|
|
192
196
|
|
|
193
|
-
@
|
|
197
|
+
@cached_property
|
|
194
198
|
def action_frame(self) -> BaseWSPacketFrame:
|
|
195
199
|
if self._action_frame is None:
|
|
196
200
|
self.decode()
|
|
@@ -200,7 +204,7 @@ class WSPacket:
|
|
|
200
204
|
|
|
201
205
|
return self._action_frame
|
|
202
206
|
|
|
203
|
-
@
|
|
207
|
+
@cached_property
|
|
204
208
|
def data_frame(self) -> BaseWSPacketFrame:
|
|
205
209
|
if self._data_frame is None:
|
|
206
210
|
self.decode()
|
|
@@ -220,6 +224,8 @@ class WSPacket:
|
|
|
220
224
|
self._action_frame = None
|
|
221
225
|
self._data_frame = None
|
|
222
226
|
self._raw_encoded = None
|
|
227
|
+
self.__dict__.pop("data_frame", None)
|
|
228
|
+
self.__dict__.pop("action_frame", None)
|
|
223
229
|
|
|
224
230
|
@property
|
|
225
231
|
def raw_base64(self) -> str:
|
|
@@ -15,13 +15,13 @@ uiprotect/cli/sensors.py,sha256=fQtcDJCVxs4VbAqcavgBy2ABiVxAW3GXtna6_XFBp2k,8153
|
|
|
15
15
|
uiprotect/cli/viewers.py,sha256=2cyrp104ffIvgT0wYGIO0G35QMkEbFe7fSVqLwDXQYQ,2171
|
|
16
16
|
uiprotect/data/__init__.py,sha256=OcfuJl2qXfHcj_mdnrHhzZ5tEIZrw8auziX5IE7dn-I,2938
|
|
17
17
|
uiprotect/data/base.py,sha256=ex-UC9CJUtzxMFqtYokSiXM8pNHVBqCzq7r8WrEf1Mw,37178
|
|
18
|
-
uiprotect/data/bootstrap.py,sha256=
|
|
18
|
+
uiprotect/data/bootstrap.py,sha256=e84W72zg6MZCgaYEunr6CCvd5b7Hb-GDSDEvfEGEt0Y,21556
|
|
19
19
|
uiprotect/data/convert.py,sha256=rOQplUMIdTMD2SbAx_iI9BNPDscnhDvyRVLEMDhtADg,2047
|
|
20
20
|
uiprotect/data/devices.py,sha256=LHVBT8ihMAZen7gIlQNbiYxukRrBpi_TNKNmV_5R6Xc,111705
|
|
21
21
|
uiprotect/data/nvr.py,sha256=OJso6oewA_jY7ovKbD2U2Onp1GqheT5bCW0F6dC53DQ,47570
|
|
22
22
|
uiprotect/data/types.py,sha256=6Z5ZqWTbH4Igy0l4QJShqQZ_zvrJKD0G-hZLjoBNP-U,16193
|
|
23
23
|
uiprotect/data/user.py,sha256=yBnUQ3qpHL745hLhR41WjWv_Yx51RlmfHapgvK0KSgM,7067
|
|
24
|
-
uiprotect/data/websocket.py,sha256=
|
|
24
|
+
uiprotect/data/websocket.py,sha256=WZJVA7EfYuKYMv-9jmvGgMWXKzE9ES25SKv1NQ2eHjc,6281
|
|
25
25
|
uiprotect/exceptions.py,sha256=kgn0cRM6lTtgLza09SDa3ZiX6ue1QqHCOogQ4qu6KTQ,965
|
|
26
26
|
uiprotect/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
27
27
|
uiprotect/release_cache.json,sha256=NamnSFy78hOWY0DPO87J9ELFCAN6NnVquv8gQO75ZG4,386
|
|
@@ -30,8 +30,8 @@ uiprotect/test_util/__init__.py,sha256=d2g7afa0LSdixQ0kjEDYwafDFME_UlW2LzxpamZ2B
|
|
|
30
30
|
uiprotect/test_util/anonymize.py,sha256=f-8ijU-_y9r-uAbhIPn0f0I6hzJpAkvJzc8UpWihObI,8478
|
|
31
31
|
uiprotect/utils.py,sha256=kXEr1xEoPAwUYuVPd6QoVnTf8MQwzQXQQ4JLyJsiRfY,18219
|
|
32
32
|
uiprotect/websocket.py,sha256=iMTdchymaCgVHsmY1bRbxkcymqt6WQircIHYNxCu178,7289
|
|
33
|
-
uiprotect-0.
|
|
34
|
-
uiprotect-0.
|
|
35
|
-
uiprotect-0.
|
|
36
|
-
uiprotect-0.
|
|
37
|
-
uiprotect-0.
|
|
33
|
+
uiprotect-0.11.0.dist-info/LICENSE,sha256=INx18jhdbVXMEiiBANeKEbrbz57ckgzxk5uutmmcxGk,1111
|
|
34
|
+
uiprotect-0.11.0.dist-info/METADATA,sha256=xyc8Jqihak81Xrqx9GhCDmIdJLGT-1CMsTfUDXVWskw,10985
|
|
35
|
+
uiprotect-0.11.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
|
|
36
|
+
uiprotect-0.11.0.dist-info/entry_points.txt,sha256=J78AUTPrTTxgI3s7SVgrmGqDP7piX2wuuEORzhDdVRA,47
|
|
37
|
+
uiprotect-0.11.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|