python-aidot-cameras 0.7.6__tar.gz → 0.7.8__tar.gz

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.
Files changed (42) hide show
  1. {python_aidot_cameras-0.7.6/src/python_aidot_cameras.egg-info → python_aidot_cameras-0.7.8}/PKG-INFO +1 -1
  2. {python_aidot_cameras-0.7.6 → python_aidot_cameras-0.7.8}/pyproject.toml +1 -1
  3. {python_aidot_cameras-0.7.6 → python_aidot_cameras-0.7.8}/src/aidot/camera/client.py +11 -0
  4. {python_aidot_cameras-0.7.6 → python_aidot_cameras-0.7.8}/src/aidot/camera/lan_control.py +3 -3
  5. {python_aidot_cameras-0.7.6 → python_aidot_cameras-0.7.8/src/python_aidot_cameras.egg-info}/PKG-INFO +1 -1
  6. {python_aidot_cameras-0.7.6 → python_aidot_cameras-0.7.8}/LICENSE +0 -0
  7. {python_aidot_cameras-0.7.6 → python_aidot_cameras-0.7.8}/README.md +0 -0
  8. {python_aidot_cameras-0.7.6 → python_aidot_cameras-0.7.8}/setup.cfg +0 -0
  9. {python_aidot_cameras-0.7.6 → python_aidot_cameras-0.7.8}/src/aidot/__init__.py +0 -0
  10. {python_aidot_cameras-0.7.6 → python_aidot_cameras-0.7.8}/src/aidot/aes_utils.py +0 -0
  11. {python_aidot_cameras-0.7.6 → python_aidot_cameras-0.7.8}/src/aidot/camera/__init__.py +0 -0
  12. {python_aidot_cameras-0.7.6 → python_aidot_cameras-0.7.8}/src/aidot/client.py +0 -0
  13. {python_aidot_cameras-0.7.6 → python_aidot_cameras-0.7.8}/src/aidot/const.py +0 -0
  14. {python_aidot_cameras-0.7.6 → python_aidot_cameras-0.7.8}/src/aidot/credentials.py +0 -0
  15. {python_aidot_cameras-0.7.6 → python_aidot_cameras-0.7.8}/src/aidot/device_client.py +0 -0
  16. {python_aidot_cameras-0.7.6 → python_aidot_cameras-0.7.8}/src/aidot/discover.py +0 -0
  17. {python_aidot_cameras-0.7.6 → python_aidot_cameras-0.7.8}/src/aidot/exceptions.py +0 -0
  18. {python_aidot_cameras-0.7.6 → python_aidot_cameras-0.7.8}/src/aidot/g711.py +0 -0
  19. {python_aidot_cameras-0.7.6 → python_aidot_cameras-0.7.8}/src/aidot/login_const.py +0 -0
  20. {python_aidot_cameras-0.7.6 → python_aidot_cameras-0.7.8}/src/aidot/models/__init__.py +0 -0
  21. {python_aidot_cameras-0.7.6 → python_aidot_cameras-0.7.8}/src/aidot/models/device_client_model.py +0 -0
  22. {python_aidot_cameras-0.7.6 → python_aidot_cameras-0.7.8}/src/aidot/models/device_model.py +0 -0
  23. {python_aidot_cameras-0.7.6 → python_aidot_cameras-0.7.8}/src/aidot/models/discover_model.py +0 -0
  24. {python_aidot_cameras-0.7.6 → python_aidot_cameras-0.7.8}/src/python_aidot_cameras.egg-info/SOURCES.txt +0 -0
  25. {python_aidot_cameras-0.7.6 → python_aidot_cameras-0.7.8}/src/python_aidot_cameras.egg-info/dependency_links.txt +0 -0
  26. {python_aidot_cameras-0.7.6 → python_aidot_cameras-0.7.8}/src/python_aidot_cameras.egg-info/requires.txt +0 -0
  27. {python_aidot_cameras-0.7.6 → python_aidot_cameras-0.7.8}/src/python_aidot_cameras.egg-info/top_level.txt +0 -0
  28. {python_aidot_cameras-0.7.6 → python_aidot_cameras-0.7.8}/tests/test_alarm_event.py +0 -0
  29. {python_aidot_cameras-0.7.6 → python_aidot_cameras-0.7.8}/tests/test_highport_nomination.py +0 -0
  30. {python_aidot_cameras-0.7.6 → python_aidot_cameras-0.7.8}/tests/test_lan_control.py +0 -0
  31. {python_aidot_cameras-0.7.6 → python_aidot_cameras-0.7.8}/tests/test_motion_poll.py +0 -0
  32. {python_aidot_cameras-0.7.6 → python_aidot_cameras-0.7.8}/tests/test_no_undefined_names.py +0 -0
  33. {python_aidot_cameras-0.7.6 → python_aidot_cameras-0.7.8}/tests/test_post_merge_hardening.py +0 -0
  34. {python_aidot_cameras-0.7.6 → python_aidot_cameras-0.7.8}/tests/test_sdes_idle_release.py +0 -0
  35. {python_aidot_cameras-0.7.6 → python_aidot_cameras-0.7.8}/tests/test_sdes_sprop.py +0 -0
  36. {python_aidot_cameras-0.7.6 → python_aidot_cameras-0.7.8}/tests/test_sdes_talk.py +0 -0
  37. {python_aidot_cameras-0.7.6 → python_aidot_cameras-0.7.8}/tests/test_sdes_watchdog.py +0 -0
  38. {python_aidot_cameras-0.7.6 → python_aidot_cameras-0.7.8}/tests/test_speak.py +0 -0
  39. {python_aidot_cameras-0.7.6 → python_aidot_cameras-0.7.8}/tests/test_stream_cap.py +0 -0
  40. {python_aidot_cameras-0.7.6 → python_aidot_cameras-0.7.8}/tests/test_talk.py +0 -0
  41. {python_aidot_cameras-0.7.6 → python_aidot_cameras-0.7.8}/tests/test_terminal_ack.py +0 -0
  42. {python_aidot_cameras-0.7.6 → python_aidot_cameras-0.7.8}/tests/test_token_refresh.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-aidot-cameras
3
- Version: 0.7.6
3
+ Version: 0.7.8
4
4
  Summary: Control AiDot/Leedarson WiFi lights and cameras (WebRTC streaming, two-way audio, PTZ, controls)
5
5
  Author-email: cbrightly <chris.brightly@gmail.com>
6
6
  License-Expression: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "python-aidot-cameras"
7
- version = "0.7.6"
7
+ version = "0.7.8"
8
8
  description = "Control AiDot/Leedarson WiFi lights and cameras (WebRTC streaming, two-way audio, PTZ, controls)"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -5452,6 +5452,13 @@ class CameraMixin:
5452
5452
  _fast_connect = os.environ.get("AIDOT_FAST_CONNECT", "").strip().lower() in (
5453
5453
  "1", "true", "yes", "on",
5454
5454
  )
5455
+ # fast_connect (skip livePlay/ICE waits + strip TURN) is validated for the
5456
+ # DTLS path only. On SDES cameras those skips leave the SCTP handshake
5457
+ # under-armed and the session churns/re-establishes (~every 60-90s),
5458
+ # dropping the live view to a snapshot. Force the full, stable handshake
5459
+ # for SDES regardless of the option/env.
5460
+ if self.is_sdes_camera:
5461
+ _fast_connect = False
5455
5462
 
5456
5463
  # Wake battery cameras via the cloud HTTP low-power endpoint before the
5457
5464
  # handshake (matches the app, which fires the HTTP wake so a sleeping camera
@@ -8939,6 +8946,10 @@ class CameraMixin:
8939
8946
  _fast_connect = os.environ.get("AIDOT_FAST_CONNECT", "").strip().lower() in (
8940
8947
  "1", "true", "yes", "on",
8941
8948
  )
8949
+ # SDES path: fast_connect's wait-skips / TURN-strip destabilise the SCTP
8950
+ # handshake (session churns ~every 60-90s -> live view drops to snapshot),
8951
+ # so always use the full, stable handshake here.
8952
+ _fast_connect = False
8942
8953
 
8943
8954
  user_id = user_id or str(self.user_id)
8944
8955
 
@@ -1,7 +1,7 @@
1
1
  """Offline LAN device-control for AiDot cameras.
2
2
 
3
- This is the **control plane only** settings, toggles, PTZ-adjacent attributes and
4
- status over the camera's local TCP:10000 channel. It does NOT do video; video is
3
+ This is the **control plane only** - settings, toggles, PTZ-adjacent attributes and
4
+ status - over the camera's local TCP:10000 channel. It does NOT do video; video is
5
5
  WebRTC (``liveType=2``) and stays cloud-MQTT-signaled.
6
6
 
7
7
  Design constraints (validated against LK.IPC.A000088 firmware):
@@ -10,7 +10,7 @@ Design constraints (validated against LK.IPC.A000088 firmware):
10
10
  (``magic 0x1EED`` + ``msgtype:int16`` + ``bodysize:int32``) followed by an
11
11
  AES-ECB-encrypted JSON body, keyed by the device's 16-char ``aesKey``.
12
12
  * It is **single-session**: a second ``loginReq`` evicts the first. So this client
13
- never holds a socket open every operation is a short-lived
13
+ never holds a socket open - every operation is a short-lived
14
14
  *connect → login → command(s) → close*, serialized by a per-camera lock.
15
15
  * The camera acks changes with ``setDevAttrResp`` but emits no ``setDevAttrNotif``,
16
16
  so there is no push; status is obtained by polling :meth:`async_get_attributes`.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-aidot-cameras
3
- Version: 0.7.6
3
+ Version: 0.7.8
4
4
  Summary: Control AiDot/Leedarson WiFi lights and cameras (WebRTC streaming, two-way audio, PTZ, controls)
5
5
  Author-email: cbrightly <chris.brightly@gmail.com>
6
6
  License-Expression: MIT