python-aidot-cameras 0.15.6__tar.gz → 0.15.7__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.15.6/python_aidot_cameras.egg-info → python_aidot_cameras-0.15.7}/PKG-INFO +1 -1
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/camera/sdes_open.py +10 -1
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/pyproject.toml +1 -1
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7/python_aidot_cameras.egg-info}/PKG-INFO +1 -1
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/python_aidot_cameras.egg-info/SOURCES.txt +1 -0
- python_aidot_cameras-0.15.7/tests/test_bridge_state_sentinels.py +68 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/LICENSE +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/MANIFEST.in +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/README.md +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/__init__.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/__main__.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/_upstream.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/_vendor/__init__.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/_vendor/aiortc/__init__.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/_vendor/aiortc/clock.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/_vendor/aiortc/codecs/__init__.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/_vendor/aiortc/codecs/base.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/_vendor/aiortc/codecs/g711.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/_vendor/aiortc/codecs/g722.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/_vendor/aiortc/codecs/h264.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/_vendor/aiortc/codecs/opus.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/_vendor/aiortc/codecs/vpx.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/_vendor/aiortc/contrib/__init__.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/_vendor/aiortc/contrib/media.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/_vendor/aiortc/contrib/signaling.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/_vendor/aiortc/events.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/_vendor/aiortc/exceptions.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/_vendor/aiortc/jitterbuffer.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/_vendor/aiortc/mediastreams.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/_vendor/aiortc/rate.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/_vendor/aiortc/rtcconfiguration.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/_vendor/aiortc/rtcdatachannel.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/_vendor/aiortc/rtcdtlstransport.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/_vendor/aiortc/rtcicetransport.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/_vendor/aiortc/rtcpeerconnection.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/_vendor/aiortc/rtcrtpparameters.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/_vendor/aiortc/rtcrtpreceiver.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/_vendor/aiortc/rtcrtpsender.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/_vendor/aiortc/rtcrtptransceiver.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/_vendor/aiortc/rtcsctptransport.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/_vendor/aiortc/rtcsessiondescription.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/_vendor/aiortc/rtp.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/_vendor/aiortc/sdp.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/_vendor/aiortc/stats.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/_vendor/aiortc/utils.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/ble_gateway.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/camera/__init__.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/camera/client.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/camera/constants.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/camera/controls.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/camera/go2rtc.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/camera/hwaccel.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/camera/lan_control.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/camera/models.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/camera/playback.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/camera/protocol.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/camera/sdes.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/camera/tutk.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/camera/webrtc.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/camera/webrtc_open.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/client.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/const.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/credentials.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/crypto.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/device_client.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/discover.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/exceptions.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/g711.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/py.typed +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/python_aidot_cameras.egg-info/dependency_links.txt +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/python_aidot_cameras.egg-info/entry_points.txt +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/python_aidot_cameras.egg-info/requires.txt +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/python_aidot_cameras.egg-info/top_level.txt +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/setup.cfg +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_aioice_compat.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_alarm_event.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_answer_sdp_video_pt.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_audio_mux_offline.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_backoff.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_battery_detection.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_battery_evidence_corroboration.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_battery_skip_turn.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_ble_gateway.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_constants_imports_resolve.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_deferred_hardening.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_device_login_guard.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_device_user_info_cache.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_dormant_camera_cleanup.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_dtls_mux_terminal_write.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_dtls_not_ready_burst.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_dtls_pinning.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_dtls_serve_decode_skip.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_dtls_serve_open_timeout.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_dtls_skip_signaling_wait.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_dtls_slow_probe.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_dtls_stdout_producer.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_egress_guard.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_env_seams.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_go2rtc.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_go2rtc_cli.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_h264_decode_rate_limit.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_highport_nomination.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_hwaccel_probe.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_ice_config_cache.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_ice_peer_reflexive.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_idle_release_both_loops.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_keepalive_renew.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_key_restart_sdp.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_keyframe_prompter.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_lan_control.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_light_active_color_mode.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_live_stream_param.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_live_validate_policy.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_logging_caps.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_media_socket_rcvbuf.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_media_wait_floor.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_motion_poll.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_mqtt_credential_refetch.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_mqtt_credential_self_heal.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_mqtt_password_not_persisted.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_mqtt_session_reconnect.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_narrow_pc_ice.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_no_self_referential_go2rtc.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_no_undefined_names.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_offline_keepalive_pause.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_open_fail_logger.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_open_gate_delay.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_peerid_reuse.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_persistent_mqtt.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_persistent_mqtt_robustness.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_playback_tls.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_post_merge_hardening.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_resolution_persists.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_restart_cycle.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_retry_policy.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_scripts_importable.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_sdes_adaptive.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_sdes_bridge_break_gate.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_sdes_echo_wait_timeout.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_sdes_fast_liveplay.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_sdes_ffmpeg_stderr_log.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_sdes_idle_release.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_sdes_open_cleanup.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_sdes_serve_audio.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_sdes_serve_cmd.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_sdes_serve_stderr_drain.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_sdes_sprop.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_sdes_talk.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_sdes_teardown_exit_log.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_sdes_terminal_ack.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_sdes_terminal_ack_latency.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_sdes_watchdog.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_sdp_narrowing_properties.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_sdp_payload_type_narrowing.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_security_hardening.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_serializable_login_info.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_serve_relay.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_session_stats.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_shared_house_seam.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_speak.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_sprop_staleness.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_stream_cap.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_stream_drain_ownership.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_stream_idle.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_stream_slot_cap.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_stream_teardown.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_talk.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_terminal_ack.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_token_file_robustness.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_token_refresh.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_turn_create_permission.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_upstream_compat.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_viewer_check_throttle.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_viewer_presence.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_viewer_present_push_mode.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_wait_or_event.py +0 -0
- {python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_wake_readiness_retry.py +0 -0
{python_aidot_cameras-0.15.6/python_aidot_cameras.egg-info → python_aidot_cameras-0.15.7}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: python-aidot-cameras
|
|
3
|
-
Version: 0.15.
|
|
3
|
+
Version: 0.15.7
|
|
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
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/camera/sdes_open.py
RENAMED
|
@@ -3637,7 +3637,16 @@ class _SdesOpenMixin:
|
|
|
3637
3637
|
if not _sdes_probe_received:
|
|
3638
3638
|
_sdes_probe_received = True
|
|
3639
3639
|
_last_hb_ts = _time_br.time() # HB fires in 10s
|
|
3640
|
-
|
|
3640
|
+
# Guard on a counter that is actually assigned.
|
|
3641
|
+
# This used to test `_tutk_seq`, a name nothing
|
|
3642
|
+
# ever set, so hasattr was False on EVERY packet
|
|
3643
|
+
# and both counters were reset to 0 each time -
|
|
3644
|
+
# every synthesized packet went out with
|
|
3645
|
+
# sequence number 1. ffmpeg reads a constant
|
|
3646
|
+
# sequence as a stream of discontinuities and
|
|
3647
|
+
# reports `RTP: missed N packets` for loss that
|
|
3648
|
+
# never happened.
|
|
3649
|
+
if not hasattr(_bridge_fn, '_tutk_seq_v'):
|
|
3641
3650
|
_bridge_fn._tutk_seq_a = 0
|
|
3642
3651
|
_bridge_fn._tutk_seq_v = 0
|
|
3643
3652
|
if _tk_audio:
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "python-aidot-cameras"
|
|
7
|
-
version = "0.15.
|
|
7
|
+
version = "0.15.7"
|
|
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"
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7/python_aidot_cameras.egg-info}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: python-aidot-cameras
|
|
3
|
-
Version: 0.15.
|
|
3
|
+
Version: 0.15.7
|
|
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
|
|
@@ -78,6 +78,7 @@ tests/test_battery_detection.py
|
|
|
78
78
|
tests/test_battery_evidence_corroboration.py
|
|
79
79
|
tests/test_battery_skip_turn.py
|
|
80
80
|
tests/test_ble_gateway.py
|
|
81
|
+
tests/test_bridge_state_sentinels.py
|
|
81
82
|
tests/test_constants_imports_resolve.py
|
|
82
83
|
tests/test_deferred_hardening.py
|
|
83
84
|
tests/test_device_login_guard.py
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"""Lazy-init guards on the bridge must name a variable something actually sets.
|
|
2
|
+
|
|
3
|
+
The bridge keeps its per-session state as attributes on its own function object
|
|
4
|
+
and initialises them with `if not hasattr(_bridge_fn, 'X')`. That idiom fails
|
|
5
|
+
silently when `X` is not the attribute the block goes on to assign: the guard is
|
|
6
|
+
true on every packet, so the state resets every packet, and nothing raises.
|
|
7
|
+
|
|
8
|
+
It happened. The TUTK-to-RTP synthesis guarded on `_tutk_seq` while assigning
|
|
9
|
+
`_tutk_seq_a` and `_tutk_seq_v`, so both sequence counters reset on every packet
|
|
10
|
+
and every synthesized RTP packet carried sequence number 1. ffmpeg reads a
|
|
11
|
+
constant sequence as a stream of discontinuities and logs `RTP: missed N
|
|
12
|
+
packets` - loss that never happened, on a hop where the kernel counters showed
|
|
13
|
+
zero drops. Measured on the box: 0 drops on every socket in the path while
|
|
14
|
+
ffmpeg reported 21 new missed-packet lines in one window.
|
|
15
|
+
|
|
16
|
+
These tests read the source because the bridge is one long closure that cannot
|
|
17
|
+
be called in isolation.
|
|
18
|
+
"""
|
|
19
|
+
import inspect
|
|
20
|
+
import re
|
|
21
|
+
|
|
22
|
+
from aidot_cameras.camera import sdes_open
|
|
23
|
+
|
|
24
|
+
_SRC = inspect.getsource(sdes_open)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def _assigned_attrs() -> set:
|
|
28
|
+
"""Every `_bridge_fn.X = ...` attribute assigned anywhere in the module."""
|
|
29
|
+
return set(re.findall(r"_bridge_fn\.([A-Za-z_][A-Za-z0-9_]*)\s*=[^=]", _SRC))
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def test_every_hasattr_sentinel_is_a_name_something_assigns():
|
|
33
|
+
guarded = set(re.findall(r"hasattr\(_bridge_fn,\s*'([^']+)'\)", _SRC))
|
|
34
|
+
assigned = _assigned_attrs()
|
|
35
|
+
orphans = sorted(guarded - assigned)
|
|
36
|
+
assert not orphans, (
|
|
37
|
+
"these hasattr guards name attributes nothing ever assigns, so they are "
|
|
38
|
+
f"true on every packet and reset their state each time: {orphans}"
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def test_the_tutk_sequence_counters_survive_between_packets():
|
|
43
|
+
"""The specific regression: a constant RTP sequence number.
|
|
44
|
+
|
|
45
|
+
Pin the guard to a counter the block assigns, so a reset-per-packet cannot
|
|
46
|
+
come back by renaming one side of the pair.
|
|
47
|
+
"""
|
|
48
|
+
block = re.search(
|
|
49
|
+
r"if not hasattr\(_bridge_fn,\s*'([^']+)'\):\s*\n"
|
|
50
|
+
r"\s*_bridge_fn\._tutk_seq_a = 0\s*\n"
|
|
51
|
+
r"\s*_bridge_fn\._tutk_seq_v = 0",
|
|
52
|
+
_SRC,
|
|
53
|
+
)
|
|
54
|
+
assert block, "the TUTK sequence init block moved - re-point this test"
|
|
55
|
+
sentinel = block.group(1)
|
|
56
|
+
assert sentinel in ("_tutk_seq_a", "_tutk_seq_v"), (
|
|
57
|
+
f"the guard tests {sentinel!r}, which is not one of the counters it "
|
|
58
|
+
"initialises - the counters will reset on every packet and every "
|
|
59
|
+
"synthesized packet will carry the same sequence number"
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def test_the_counters_increment_rather_than_being_reassigned():
|
|
64
|
+
"""Both counters must advance from their previous value, not restart."""
|
|
65
|
+
for name in ("_tutk_seq_a", "_tutk_seq_v"):
|
|
66
|
+
assert re.search(
|
|
67
|
+
rf"_bridge_fn\.{name} = \(_bridge_fn\.{name} \+ 1\) & 0xFFFF", _SRC
|
|
68
|
+
), f"{name} no longer advances from its own previous value"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/_vendor/__init__.py
RENAMED
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/_vendor/aiortc/__init__.py
RENAMED
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/_vendor/aiortc/clock.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
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/_vendor/aiortc/events.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/_vendor/aiortc/rate.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
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/_vendor/aiortc/rtp.py
RENAMED
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/_vendor/aiortc/sdp.py
RENAMED
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/_vendor/aiortc/stats.py
RENAMED
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/_vendor/aiortc/utils.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/camera/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/camera/constants.py
RENAMED
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/camera/controls.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/camera/lan_control.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/camera/playback.py
RENAMED
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/camera/protocol.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/aidot_cameras/camera/webrtc_open.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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_answer_sdp_video_pt.py
RENAMED
|
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.15.6 → python_aidot_cameras-0.15.7}/tests/test_constants_imports_resolve.py
RENAMED
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_deferred_hardening.py
RENAMED
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_device_login_guard.py
RENAMED
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_device_user_info_cache.py
RENAMED
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_dormant_camera_cleanup.py
RENAMED
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_dtls_mux_terminal_write.py
RENAMED
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_dtls_not_ready_burst.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_dtls_serve_decode_skip.py
RENAMED
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_dtls_serve_open_timeout.py
RENAMED
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_dtls_skip_signaling_wait.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_dtls_stdout_producer.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_h264_decode_rate_limit.py
RENAMED
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_highport_nomination.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_ice_peer_reflexive.py
RENAMED
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_idle_release_both_loops.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_light_active_color_mode.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_live_validate_policy.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_media_socket_rcvbuf.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_mqtt_credential_refetch.py
RENAMED
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_mqtt_credential_self_heal.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_mqtt_session_reconnect.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_no_self_referential_go2rtc.py
RENAMED
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_no_undefined_names.py
RENAMED
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_offline_keepalive_pause.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_persistent_mqtt_robustness.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_post_merge_hardening.py
RENAMED
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_resolution_persists.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_scripts_importable.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_sdes_bridge_break_gate.py
RENAMED
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_sdes_echo_wait_timeout.py
RENAMED
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_sdes_fast_liveplay.py
RENAMED
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_sdes_ffmpeg_stderr_log.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_sdes_serve_stderr_drain.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_sdes_teardown_exit_log.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_sdes_terminal_ack_latency.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_sdp_narrowing_properties.py
RENAMED
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_sdp_payload_type_narrowing.py
RENAMED
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_security_hardening.py
RENAMED
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_serializable_login_info.py
RENAMED
|
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.15.6 → python_aidot_cameras-0.15.7}/tests/test_stream_drain_ownership.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_token_file_robustness.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_turn_create_permission.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_viewer_check_throttle.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_viewer_present_push_mode.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-0.15.6 → python_aidot_cameras-0.15.7}/tests/test_wake_readiness_retry.py
RENAMED
|
File without changes
|