python-aidot-cameras 0.7.31__tar.gz → 0.7.32__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.
- {python_aidot_cameras-0.7.31/src/python_aidot_cameras.egg-info → python_aidot_cameras-0.7.32}/PKG-INFO +2 -2
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/README.md +1 -1
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/pyproject.toml +1 -1
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/src/aidot/camera/client.py +15 -12
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32/src/python_aidot_cameras.egg-info}/PKG-INFO +2 -2
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/tests/test_sdes_fast_liveplay.py +9 -8
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/LICENSE +0 -0
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/MANIFEST.in +0 -0
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/setup.cfg +0 -0
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/src/aidot/__init__.py +0 -0
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/src/aidot/aes_utils.py +0 -0
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/src/aidot/camera/__init__.py +0 -0
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/src/aidot/camera/constants.py +0 -0
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/src/aidot/camera/controls.py +0 -0
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/src/aidot/camera/go2rtc.py +0 -0
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/src/aidot/camera/lan_control.py +0 -0
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/src/aidot/camera/models.py +0 -0
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/src/aidot/camera/playback.py +0 -0
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/src/aidot/camera/protocol.py +0 -0
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/src/aidot/camera/sdes.py +0 -0
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/src/aidot/camera/tutk.py +0 -0
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/src/aidot/camera/webrtc.py +0 -0
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/src/aidot/client.py +0 -0
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/src/aidot/const.py +0 -0
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/src/aidot/credentials.py +0 -0
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/src/aidot/device_client.py +0 -0
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/src/aidot/discover.py +0 -0
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/src/aidot/exceptions.py +0 -0
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/src/aidot/g711.py +0 -0
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/src/aidot/login_const.py +0 -0
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/src/aidot/models/__init__.py +0 -0
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/src/aidot/models/device_client_model.py +0 -0
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/src/aidot/models/device_model.py +0 -0
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/src/aidot/models/discover_model.py +0 -0
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/src/aidot/py.typed +0 -0
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/src/python_aidot_cameras.egg-info/SOURCES.txt +0 -0
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/src/python_aidot_cameras.egg-info/dependency_links.txt +0 -0
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/src/python_aidot_cameras.egg-info/requires.txt +0 -0
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/src/python_aidot_cameras.egg-info/top_level.txt +0 -0
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/tests/test_alarm_event.py +0 -0
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/tests/test_backoff.py +0 -0
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/tests/test_go2rtc.py +0 -0
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/tests/test_highport_nomination.py +0 -0
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/tests/test_lan_control.py +0 -0
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/tests/test_live_stream_param.py +0 -0
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/tests/test_motion_poll.py +0 -0
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/tests/test_no_undefined_names.py +0 -0
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/tests/test_persistent_mqtt.py +0 -0
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/tests/test_post_merge_hardening.py +0 -0
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/tests/test_sdes_adaptive.py +0 -0
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/tests/test_sdes_idle_release.py +0 -0
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/tests/test_sdes_sprop.py +0 -0
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/tests/test_sdes_talk.py +0 -0
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/tests/test_sdes_watchdog.py +0 -0
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/tests/test_serve_relay.py +0 -0
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/tests/test_speak.py +0 -0
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/tests/test_stream_cap.py +0 -0
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/tests/test_stream_idle.py +0 -0
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/tests/test_talk.py +0 -0
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/tests/test_terminal_ack.py +0 -0
- {python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/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.
|
|
3
|
+
Version: 0.7.32
|
|
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
|
|
@@ -124,7 +124,7 @@ chosen to work out of the box; override only when tuning.
|
|
|
124
124
|
| `AIDOT_FAST_CONNECT` | Enables LAN-direct "fast connect" mode (STUN-only, skips several cloud signaling waits) when set to a truthy value. | unset (off) |
|
|
125
125
|
| `AIDOT_PERSISTENT_MQTT` | Reuse ONE account-level persistent MQTT connection for device commands, attribute fetches, AND stream-open signaling (matching the official app) instead of connecting per operation, cutting cloud connect churn. **On by default** (the app's behaviour; live soak cut SDES NO_MEDIA ~57%→~19%); set to `0`/`false`/`no`/`off` to disable. | enabled (on) |
|
|
126
126
|
| `AIDOT_SDES_ADAPTIVE` | Adaptive fast-with-fallback for the SDES keepalive loop: try the fast path first (skip livePlay waits + TURN relay pre-alloc) and fall back to the full relay path if a fast attempt delivers no media. A per-device cache skips the fast attempt on later views once it has failed for a camera. Truthy value enables. | unset (off) |
|
|
127
|
-
| `AIDOT_SDES_FAST_LIVEPLAY` |
|
|
127
|
+
| `AIDOT_SDES_FAST_LIVEPLAY` | Don't block on the `livePlayResp` wait for eligible SDES cameras (~4.5 s faster cold start), going straight to webrtcReq/ICE — what the official app does (it never waits for livePlayResp). Role-reversal models (A001064 PTZ) always excluded for correctness. **On by default**; set to `0`/`false`/`no`/`off` to disable. | enabled (on) |
|
|
128
128
|
| `AIDOT_SERVE_RELAY` | Holds the public stream port via an internal relay that proxies to ffmpeg, so the first (cold) view connects instead of failing while ffmpeg can't pre-bind the port. Set to `0` to serve ffmpeg directly. | `1` (enabled) |
|
|
129
129
|
| `AIDOT_MAX_CONCURRENT_OPENS` | Caps how many stream opens run concurrently. | `2` |
|
|
130
130
|
| `AIDOT_MAX_CONCURRENT_STREAMS` | Caps how many cameras stream at once. | `3` |
|
|
@@ -97,7 +97,7 @@ chosen to work out of the box; override only when tuning.
|
|
|
97
97
|
| `AIDOT_FAST_CONNECT` | Enables LAN-direct "fast connect" mode (STUN-only, skips several cloud signaling waits) when set to a truthy value. | unset (off) |
|
|
98
98
|
| `AIDOT_PERSISTENT_MQTT` | Reuse ONE account-level persistent MQTT connection for device commands, attribute fetches, AND stream-open signaling (matching the official app) instead of connecting per operation, cutting cloud connect churn. **On by default** (the app's behaviour; live soak cut SDES NO_MEDIA ~57%→~19%); set to `0`/`false`/`no`/`off` to disable. | enabled (on) |
|
|
99
99
|
| `AIDOT_SDES_ADAPTIVE` | Adaptive fast-with-fallback for the SDES keepalive loop: try the fast path first (skip livePlay waits + TURN relay pre-alloc) and fall back to the full relay path if a fast attempt delivers no media. A per-device cache skips the fast attempt on later views once it has failed for a camera. Truthy value enables. | unset (off) |
|
|
100
|
-
| `AIDOT_SDES_FAST_LIVEPLAY` |
|
|
100
|
+
| `AIDOT_SDES_FAST_LIVEPLAY` | Don't block on the `livePlayResp` wait for eligible SDES cameras (~4.5 s faster cold start), going straight to webrtcReq/ICE — what the official app does (it never waits for livePlayResp). Role-reversal models (A001064 PTZ) always excluded for correctness. **On by default**; set to `0`/`false`/`no`/`off` to disable. | enabled (on) |
|
|
101
101
|
| `AIDOT_SERVE_RELAY` | Holds the public stream port via an internal relay that proxies to ffmpeg, so the first (cold) view connects instead of failing while ffmpeg can't pre-bind the port. Set to `0` to serve ffmpeg directly. | `1` (enabled) |
|
|
102
102
|
| `AIDOT_MAX_CONCURRENT_OPENS` | Caps how many stream opens run concurrently. | `2` |
|
|
103
103
|
| `AIDOT_MAX_CONCURRENT_STREAMS` | Caps how many cameras stream at once. | `3` |
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "python-aidot-cameras"
|
|
7
|
-
version = "0.7.
|
|
7
|
+
version = "0.7.32"
|
|
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"
|
|
@@ -2607,16 +2607,19 @@ class CameraMixin(_CameraControlsMixin):
|
|
|
2607
2607
|
return 120.0
|
|
2608
2608
|
|
|
2609
2609
|
def _resolve_sdes_fast_liveplay(self) -> bool:
|
|
2610
|
-
"""Whether to use SDES fast-liveplay
|
|
2611
|
-
echo/livePlayResp signaling
|
|
2612
|
-
|
|
2613
|
-
|
|
2614
|
-
|
|
2615
|
-
|
|
2616
|
-
|
|
2617
|
-
|
|
2618
|
-
|
|
2619
|
-
the flag
|
|
2610
|
+
"""Whether to use SDES fast-liveplay: don't block on the always-timing-out
|
|
2611
|
+
echo/livePlayResp signaling, go straight to webrtcReq/ICE.
|
|
2612
|
+
|
|
2613
|
+
**Default ON** - this is exactly what the official app does (it never waits
|
|
2614
|
+
for/parses livePlayResp; fire-and-forget). Disable via
|
|
2615
|
+
``AIDOT_SDES_FAST_LIVEPLAY`` in {0,false,no,off} or per-camera
|
|
2616
|
+
``_sdes_fast_liveplay_opt=False`` (the explicit opt always wins).
|
|
2617
|
+
|
|
2618
|
+
Role-reversal models (``_NO_FAST_LIVEPLAY_MODELS``, e.g. A001064) are ALWAYS
|
|
2619
|
+
excluded regardless of the flag - their handshake needs the camera armed
|
|
2620
|
+
before our webrtcReq, so the early webrtcReq degrades their media (a
|
|
2621
|
+
correctness exclusion, not a default choice). Only consulted for SDES
|
|
2622
|
+
cameras (the caller gates on is_sdes_camera)."""
|
|
2620
2623
|
model = getattr(getattr(self, "info", None), "model_id", None)
|
|
2621
2624
|
if model in self._NO_FAST_LIVEPLAY_MODELS:
|
|
2622
2625
|
return False
|
|
@@ -2626,8 +2629,8 @@ class CameraMixin(_CameraControlsMixin):
|
|
|
2626
2629
|
ov = getattr(self, "_fast_attempt_override", None)
|
|
2627
2630
|
if ov is not None:
|
|
2628
2631
|
return bool(ov)
|
|
2629
|
-
return os.environ.get("AIDOT_SDES_FAST_LIVEPLAY", "").strip().lower() in (
|
|
2630
|
-
"
|
|
2632
|
+
return os.environ.get("AIDOT_SDES_FAST_LIVEPLAY", "").strip().lower() not in (
|
|
2633
|
+
"0", "false", "no", "off")
|
|
2631
2634
|
|
|
2632
2635
|
def _resolve_sdes_skip_turn(self) -> bool:
|
|
2633
2636
|
"""EXPERIMENTAL (opt-in, default off): skip the blocking SDES TURN relay
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: python-aidot-cameras
|
|
3
|
-
Version: 0.7.
|
|
3
|
+
Version: 0.7.32
|
|
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
|
|
@@ -124,7 +124,7 @@ chosen to work out of the box; override only when tuning.
|
|
|
124
124
|
| `AIDOT_FAST_CONNECT` | Enables LAN-direct "fast connect" mode (STUN-only, skips several cloud signaling waits) when set to a truthy value. | unset (off) |
|
|
125
125
|
| `AIDOT_PERSISTENT_MQTT` | Reuse ONE account-level persistent MQTT connection for device commands, attribute fetches, AND stream-open signaling (matching the official app) instead of connecting per operation, cutting cloud connect churn. **On by default** (the app's behaviour; live soak cut SDES NO_MEDIA ~57%→~19%); set to `0`/`false`/`no`/`off` to disable. | enabled (on) |
|
|
126
126
|
| `AIDOT_SDES_ADAPTIVE` | Adaptive fast-with-fallback for the SDES keepalive loop: try the fast path first (skip livePlay waits + TURN relay pre-alloc) and fall back to the full relay path if a fast attempt delivers no media. A per-device cache skips the fast attempt on later views once it has failed for a camera. Truthy value enables. | unset (off) |
|
|
127
|
-
| `AIDOT_SDES_FAST_LIVEPLAY` |
|
|
127
|
+
| `AIDOT_SDES_FAST_LIVEPLAY` | Don't block on the `livePlayResp` wait for eligible SDES cameras (~4.5 s faster cold start), going straight to webrtcReq/ICE — what the official app does (it never waits for livePlayResp). Role-reversal models (A001064 PTZ) always excluded for correctness. **On by default**; set to `0`/`false`/`no`/`off` to disable. | enabled (on) |
|
|
128
128
|
| `AIDOT_SERVE_RELAY` | Holds the public stream port via an internal relay that proxies to ffmpeg, so the first (cold) view connects instead of failing while ffmpeg can't pre-bind the port. Set to `0` to serve ffmpeg directly. | `1` (enabled) |
|
|
129
129
|
| `AIDOT_MAX_CONCURRENT_OPENS` | Caps how many stream opens run concurrently. | `2` |
|
|
130
130
|
| `AIDOT_MAX_CONCURRENT_STREAMS` | Caps how many cameras stream at once. | `3` |
|
{python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/tests/test_sdes_fast_liveplay.py
RENAMED
|
@@ -21,21 +21,22 @@ def _cam():
|
|
|
21
21
|
return _CAM.__new__(_CAM)
|
|
22
22
|
|
|
23
23
|
|
|
24
|
-
def
|
|
24
|
+
def test_default_on(monkeypatch):
|
|
25
|
+
# default ON (matches the app — it never waits for livePlayResp)
|
|
25
26
|
monkeypatch.delenv("AIDOT_SDES_FAST_LIVEPLAY", raising=False)
|
|
26
|
-
assert _cam()._resolve_sdes_fast_liveplay() is
|
|
27
|
+
assert _cam()._resolve_sdes_fast_liveplay() is True
|
|
27
28
|
|
|
28
29
|
|
|
29
|
-
def
|
|
30
|
-
for val in ("
|
|
30
|
+
def test_env_disables(monkeypatch):
|
|
31
|
+
for val in ("0", "false", "no", "off", " Off "):
|
|
31
32
|
monkeypatch.setenv("AIDOT_SDES_FAST_LIVEPLAY", val)
|
|
32
|
-
assert _cam()._resolve_sdes_fast_liveplay() is
|
|
33
|
+
assert _cam()._resolve_sdes_fast_liveplay() is False, val
|
|
33
34
|
|
|
34
35
|
|
|
35
|
-
def
|
|
36
|
-
for val in ("
|
|
36
|
+
def test_env_truthy_or_unknown_stays_on(monkeypatch):
|
|
37
|
+
for val in ("1", "true", "yes", "on", "", "anything"):
|
|
37
38
|
monkeypatch.setenv("AIDOT_SDES_FAST_LIVEPLAY", val)
|
|
38
|
-
assert _cam()._resolve_sdes_fast_liveplay() is
|
|
39
|
+
assert _cam()._resolve_sdes_fast_liveplay() is True, val
|
|
39
40
|
|
|
40
41
|
|
|
41
42
|
def test_role_reversal_model_always_excluded(monkeypatch):
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/src/aidot/models/device_client_model.py
RENAMED
|
File without changes
|
{python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/src/aidot/models/device_model.py
RENAMED
|
File without changes
|
{python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/src/aidot/models/discover_model.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/tests/test_highport_nomination.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/tests/test_no_undefined_names.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-0.7.31 → python_aidot_cameras-0.7.32}/tests/test_post_merge_hardening.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|