python-aidot-cameras 1.0.0rc45__tar.gz → 1.0.0rc46__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 (336) hide show
  1. {python_aidot_cameras-1.0.0rc45/python_aidot_cameras.egg-info → python_aidot_cameras-1.0.0rc46}/PKG-INFO +1 -1
  2. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/camera/client.py +29 -4
  3. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/camera/go2rtc.py +4 -2
  4. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/camera/protocol.py +23 -0
  5. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/pyproject.toml +1 -1
  6. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46/python_aidot_cameras.egg-info}/PKG-INFO +1 -1
  7. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/python_aidot_cameras.egg-info/SOURCES.txt +1 -0
  8. python_aidot_cameras-1.0.0rc46/tests/test_battery_cap_spans_sessions.py +67 -0
  9. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/LICENSE +0 -0
  10. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/MANIFEST.in +0 -0
  11. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/README.md +0 -0
  12. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/__init__.py +0 -0
  13. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/__main__.py +0 -0
  14. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/_log_redaction.py +0 -0
  15. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/_upstream.py +0 -0
  16. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/_vendor/__init__.py +0 -0
  17. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/_vendor/aiortc/LICENSE +0 -0
  18. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/_vendor/aiortc/__init__.py +0 -0
  19. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/_vendor/aiortc/clock.py +0 -0
  20. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/_vendor/aiortc/codecs/__init__.py +0 -0
  21. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/_vendor/aiortc/codecs/base.py +0 -0
  22. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/_vendor/aiortc/codecs/g711.py +0 -0
  23. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/_vendor/aiortc/codecs/g722.py +0 -0
  24. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/_vendor/aiortc/codecs/h264.py +0 -0
  25. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/_vendor/aiortc/codecs/opus.py +0 -0
  26. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/_vendor/aiortc/codecs/vpx.py +0 -0
  27. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/_vendor/aiortc/contrib/__init__.py +0 -0
  28. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/_vendor/aiortc/contrib/media.py +0 -0
  29. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/_vendor/aiortc/contrib/signaling.py +0 -0
  30. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/_vendor/aiortc/events.py +0 -0
  31. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/_vendor/aiortc/exceptions.py +0 -0
  32. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/_vendor/aiortc/jitterbuffer.py +0 -0
  33. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/_vendor/aiortc/mediastreams.py +0 -0
  34. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/_vendor/aiortc/rate.py +0 -0
  35. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/_vendor/aiortc/rtcconfiguration.py +0 -0
  36. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/_vendor/aiortc/rtcdatachannel.py +0 -0
  37. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/_vendor/aiortc/rtcdtlstransport.py +0 -0
  38. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/_vendor/aiortc/rtcicetransport.py +0 -0
  39. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/_vendor/aiortc/rtcpeerconnection.py +0 -0
  40. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/_vendor/aiortc/rtcrtpparameters.py +0 -0
  41. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/_vendor/aiortc/rtcrtpreceiver.py +0 -0
  42. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/_vendor/aiortc/rtcrtpsender.py +0 -0
  43. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/_vendor/aiortc/rtcrtptransceiver.py +0 -0
  44. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/_vendor/aiortc/rtcsctptransport.py +0 -0
  45. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/_vendor/aiortc/rtcsessiondescription.py +0 -0
  46. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/_vendor/aiortc/rtp.py +0 -0
  47. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/_vendor/aiortc/sdp.py +0 -0
  48. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/_vendor/aiortc/stats.py +0 -0
  49. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/_vendor/aiortc/utils.py +0 -0
  50. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/camera/__init__.py +0 -0
  51. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/camera/aac_track.py +0 -0
  52. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/camera/constants.py +0 -0
  53. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/camera/controls.py +0 -0
  54. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/camera/h264_sps.py +0 -0
  55. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/camera/hls_ts.py +0 -0
  56. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/camera/hwaccel.py +0 -0
  57. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/camera/lan_control.py +0 -0
  58. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/camera/models.py +0 -0
  59. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/camera/playback.py +0 -0
  60. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/camera/recording.py +0 -0
  61. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/camera/rtp_h264.py +0 -0
  62. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/camera/rtsp_publish.py +0 -0
  63. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/camera/sd_events.py +0 -0
  64. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/camera/sd_listing.py +0 -0
  65. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/camera/sd_playback.py +0 -0
  66. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/camera/sdes.py +0 -0
  67. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/camera/sdes_open.py +0 -0
  68. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/camera/ts_fanout.py +0 -0
  69. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/camera/ts_tee.py +0 -0
  70. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/camera/tutk.py +0 -0
  71. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/camera/webrtc.py +0 -0
  72. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/camera/webrtc_open.py +0 -0
  73. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/client.py +0 -0
  74. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/cloud_auth.py +0 -0
  75. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/const.py +0 -0
  76. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/credentials.py +0 -0
  77. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/crypto.py +0 -0
  78. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/device_client.py +0 -0
  79. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/discover.py +0 -0
  80. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/exceptions.py +0 -0
  81. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/g711.py +0 -0
  82. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/lan_retry.py +0 -0
  83. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/aidot_cameras/py.typed +0 -0
  84. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/python_aidot_cameras.egg-info/dependency_links.txt +0 -0
  85. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/python_aidot_cameras.egg-info/entry_points.txt +0 -0
  86. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/python_aidot_cameras.egg-info/requires.txt +0 -0
  87. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/python_aidot_cameras.egg-info/top_level.txt +0 -0
  88. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/setup.cfg +0 -0
  89. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_aac_track.py +0 -0
  90. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_abandoned_attempt_skips_the_doomed_serve.py +0 -0
  91. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_abandoned_wait_still_maps_audio.py +0 -0
  92. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_aioice_compat.py +0 -0
  93. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_alarm_event.py +0 -0
  94. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_answer_pt_kinds.py +0 -0
  95. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_answer_sdp_video_pt.py +0 -0
  96. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_answer_section_selection.py +0 -0
  97. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_arrival_timestamps.py +0 -0
  98. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_audio_mux_offline.py +0 -0
  99. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_auth_error_routing.py +0 -0
  100. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_auto_alarm.py +0 -0
  101. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_auto_light_settings.py +0 -0
  102. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_avio_ctrl_uses_the_session_dseq.py +0 -0
  103. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_avio_request.py +0 -0
  104. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_avio_response_parse.py +0 -0
  105. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_avio_response_router.py +0 -0
  106. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_backoff.py +0 -0
  107. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_battery_detection.py +0 -0
  108. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_battery_evidence_corroboration.py +0 -0
  109. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_battery_stale_offer_is_abandoned_early.py +0 -0
  110. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_battery_wake_settles_before_the_command.py +0 -0
  111. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_ble_gateway_is_gone.py +0 -0
  112. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_bridge_state_sentinels.py +0 -0
  113. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_busy_backoff.py +0 -0
  114. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_camera_properties.py +0 -0
  115. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_canary_log_names_the_camera.py +0 -0
  116. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_cloud_count.py +0 -0
  117. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_cloud_error_log_names_the_exception.py +0 -0
  118. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_cloud_error_severity.py +0 -0
  119. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_cloud_plan.py +0 -0
  120. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_constants_imports_resolve.py +0 -0
  121. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_control_verdicts.py +0 -0
  122. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_declared_properties.py +0 -0
  123. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_deferred_hardening.py +0 -0
  124. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_detection_types.py +0 -0
  125. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_device_cmd_seq_match.py +0 -0
  126. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_device_login_guard.py +0 -0
  127. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_device_user_info_cache.py +0 -0
  128. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_direct_publish_attaches_negotiated_audio.py +0 -0
  129. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_direct_ts_keyframe_signal.py +0 -0
  130. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_direct_ts_serve.py +0 -0
  131. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_direct_ts_serve_only_for_http.py +0 -0
  132. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_dormant_camera_cleanup.py +0 -0
  133. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_drain_is_cancellable.py +0 -0
  134. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_dtls_mux_terminal_write.py +0 -0
  135. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_dtls_not_ready_burst.py +0 -0
  136. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_dtls_pinning.py +0 -0
  137. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_dtls_recorder_wiring.py +0 -0
  138. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_dtls_resolution_ack.py +0 -0
  139. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_dtls_serve_decode_skip.py +0 -0
  140. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_dtls_serve_ice_wait.py +0 -0
  141. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_dtls_serve_open_timeout.py +0 -0
  142. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_dtls_skip_signaling_wait.py +0 -0
  143. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_dtls_slow_probe.py +0 -0
  144. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_dtls_stdout_producer.py +0 -0
  145. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_dtls_tap_states_no_reorder.py +0 -0
  146. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_dtls_ts_copy_recording.py +0 -0
  147. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_dtls_video_presence.py +0 -0
  148. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_egress_guard.py +0 -0
  149. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_env_seams.py +0 -0
  150. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_feature_probe_needs_a_live_session.py +0 -0
  151. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_ffmpeg_signal_exit_is_not_a_crash.py +0 -0
  152. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_first_media_abandon_rules.py +0 -0
  153. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_futile_keepalive.py +0 -0
  154. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_gate_requires_a_decoded_frame.py +0 -0
  155. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_go2rtc.py +0 -0
  156. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_go2rtc_cli.py +0 -0
  157. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_h264_decode_rate_limit.py +0 -0
  158. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_h264_sps.py +0 -0
  159. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_highport_nomination.py +0 -0
  160. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_hls_ts_end_to_end.py +0 -0
  161. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_hls_ts_wiring.py +0 -0
  162. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_hwaccel_probe.py +0 -0
  163. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_ice_config_cache.py +0 -0
  164. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_ice_credentials_match_the_app.py +0 -0
  165. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_ice_peer_reflexive.py +0 -0
  166. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_idle_release_both_loops.py +0 -0
  167. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_keepalive_renew.py +0 -0
  168. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_key_restart_sdp.py +0 -0
  169. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_keyframe_prompter.py +0 -0
  170. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_lan_control.py +0 -0
  171. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_lan_login_accessors.py +0 -0
  172. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_lan_retry_reaches_the_storming_devices.py +0 -0
  173. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_lan_retry_silences_upstream_over_ceiling.py +0 -0
  174. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_lan_sweep_only_with_lights.py +0 -0
  175. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_late_repeats_are_dropped.py +0 -0
  176. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_light_active_color_mode.py +0 -0
  177. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_live_session_carries_talk.py +0 -0
  178. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_live_stream_param.py +0 -0
  179. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_live_validate_policy.py +0 -0
  180. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_live_validate_token_refresh.py +0 -0
  181. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_live_video_canary.py +0 -0
  182. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_liveplay_echo_timeout.py +0 -0
  183. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_local_only_controls.py +0 -0
  184. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_log_hygiene.py +0 -0
  185. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_logging_caps.py +0 -0
  186. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_login_connect_deadline.py +0 -0
  187. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_login_reconnect_backoff.py +0 -0
  188. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_media_counted_only_when_plaintext.py +0 -0
  189. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_media_path_is_reported.py +0 -0
  190. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_media_socket_rcvbuf.py +0 -0
  191. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_media_wait_floor.py +0 -0
  192. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_motion_poll.py +0 -0
  193. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_mqtt_client_id_is_exact.py +0 -0
  194. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_mqtt_credential_refetch.py +0 -0
  195. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_mqtt_credential_self_heal.py +0 -0
  196. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_mqtt_password_not_persisted.py +0 -0
  197. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_mqtt_session_reconnect.py +0 -0
  198. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_mqtt_thread_not_orphaned.py +0 -0
  199. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_nack.py +0 -0
  200. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_nack_cannot_add_load_in_a_burst.py +0 -0
  201. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_narrow_pc_ice.py +0 -0
  202. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_no_key_material_in_logs.py +0 -0
  203. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_no_private_notes_on_the_public_surface.py +0 -0
  204. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_no_self_referential_go2rtc.py +0 -0
  205. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_no_unbounded_hex_dumps.py +0 -0
  206. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_no_undefined_names.py +0 -0
  207. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_nominates_as_soon_as_the_answer_lands.py +0 -0
  208. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_off_subnet_candidate.py +0 -0
  209. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_offer_keeps_rtcp_feedback.py +0 -0
  210. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_offline_keepalive_pause.py +0 -0
  211. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_on_frame_is_an_av_frame.py +0 -0
  212. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_open_fail_logger.py +0 -0
  213. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_open_gate_delay.py +0 -0
  214. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_peer_id_class_env.py +0 -0
  215. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_peer_id_client_type.py +0 -0
  216. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_peerid_reuse.py +0 -0
  217. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_persistent_mqtt.py +0 -0
  218. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_persistent_mqtt_robustness.py +0 -0
  219. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_playback_tls.py +0 -0
  220. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_post_merge_hardening.py +0 -0
  221. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_ptz_probe_reads_what_it_is_told.py +0 -0
  222. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_public_signature_matches_impl.py +0 -0
  223. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_publish_target_readiness.py +0 -0
  224. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_quality_campaign_in_session.py +0 -0
  225. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_reboot_action.py +0 -0
  226. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_recent_recordings.py +0 -0
  227. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_remb.py +0 -0
  228. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_remb_goes_out_the_relay_aware_sender.py +0 -0
  229. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_removed_keepalive_arguments_are_tolerated.py +0 -0
  230. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_resent_frames_are_dropped.py +0 -0
  231. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_resolution_persists.py +0 -0
  232. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_restart_cycle.py +0 -0
  233. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_retry_policy.py +0 -0
  234. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_rtp_h264.py +0 -0
  235. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_rtsp_publish.py +0 -0
  236. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_rtsp_publish_go2rtc.py +0 -0
  237. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_scripts_importable.py +0 -0
  238. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_sctp_init_ack_tsn.py +0 -0
  239. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_sctp_reassembly.py +0 -0
  240. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_sctp_sack.py +0 -0
  241. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_sd_card_presence.py +0 -0
  242. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_sd_event_decode.py +0 -0
  243. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_sd_event_probe_payloads.py +0 -0
  244. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_sd_listing.py +0 -0
  245. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_sd_playback.py +0 -0
  246. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_sdes_avio_dispatch.py +0 -0
  247. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_sdes_bridge_break_gate.py +0 -0
  248. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_sdes_connection_mode.py +0 -0
  249. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_sdes_echo_wait_is_not_dead_time.py +0 -0
  250. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_sdes_fast_liveplay.py +0 -0
  251. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_sdes_ffmpeg_stderr_log.py +0 -0
  252. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_sdes_first_media_stall_report.py +0 -0
  253. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_sdes_ice_teardown.py +0 -0
  254. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_sdes_idle_release.py +0 -0
  255. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_sdes_nack_bridge.py +0 -0
  256. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_sdes_offer_video_pin.py +0 -0
  257. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_sdes_open_cleanup.py +0 -0
  258. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_sdes_pinned_codec_retry.py +0 -0
  259. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_sdes_sctp_abort.py +0 -0
  260. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_sdes_serve_audio.py +0 -0
  261. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_sdes_serve_cmd.py +0 -0
  262. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_sdes_serve_stderr_drain.py +0 -0
  263. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_sdes_session_cap.py +0 -0
  264. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_sdes_sprop.py +0 -0
  265. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_sdes_talk.py +0 -0
  266. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_sdes_teardown_exit_log.py +0 -0
  267. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_sdes_terminal_ack.py +0 -0
  268. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_sdes_terminal_ack_latency.py +0 -0
  269. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_sdes_watchdog.py +0 -0
  270. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_sdp_narrowing_properties.py +0 -0
  271. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_sdp_payload_type_narrowing.py +0 -0
  272. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_security_hardening.py +0 -0
  273. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_self_peer_is_an_address_not_an_ip.py +0 -0
  274. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_serializable_login_info.py +0 -0
  275. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_serve_bound_survives_arrival_stamping.py +0 -0
  276. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_serve_input_timeout.py +0 -0
  277. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_serve_loss_tolerance.py +0 -0
  278. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_serve_pt_respects_the_pin.py +0 -0
  279. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_serve_relay.py +0 -0
  280. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_serve_stderr_keeps_the_reason.py +0 -0
  281. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_session_stats.py +0 -0
  282. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_session_stop_twice.py +0 -0
  283. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_shared_house_seam.py +0 -0
  284. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_signalling_is_attributable_to_a_camera.py +0 -0
  285. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_skip_guard.py +0 -0
  286. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_snapshot_cancellation.py +0 -0
  287. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_speak.py +0 -0
  288. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_sprop_capture_gate.py +0 -0
  289. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_sprop_staleness.py +0 -0
  290. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_sprop_unstable_public.py +0 -0
  291. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_sprop_write_is_reported_truthfully.py +0 -0
  292. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_srtp_rx_rekey.py +0 -0
  293. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_srtp_tx_key_note.py +0 -0
  294. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_stable_terminal_id.py +0 -0
  295. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_stall_nudge_policy.py +0 -0
  296. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_stall_report_says_what_the_answer_carried.py +0 -0
  297. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_stall_report_says_whether_the_trigger_was_answered.py +0 -0
  298. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_stall_report_separates_silence_from_undecryptable.py +0 -0
  299. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_stall_report_survives_a_caller_giving_up.py +0 -0
  300. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_stall_reports_reach_the_artifact.py +0 -0
  301. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_status_and_trace_channels.py +0 -0
  302. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_stream_cap.py +0 -0
  303. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_stream_drain_ownership.py +0 -0
  304. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_stream_idle.py +0 -0
  305. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_stream_slot_cap.py +0 -0
  306. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_stream_teardown.py +0 -0
  307. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_talk.py +0 -0
  308. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_talk_reports_a_speaker_that_never_opened.py +0 -0
  309. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_tap_to_mux_end_to_end.py +0 -0
  310. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_terminal_ack.py +0 -0
  311. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_tmmbr.py +0 -0
  312. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_token_file_robustness.py +0 -0
  313. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_token_refresh.py +0 -0
  314. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_transport_failure_reporting.py +0 -0
  315. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_ts_fanout.py +0 -0
  316. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_ts_tee.py +0 -0
  317. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_turn_create_permission.py +0 -0
  318. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_tutk_path_is_out_of_reach.py +0 -0
  319. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_unbuildable_summary_repeats_at_debug.py +0 -0
  320. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_unreachable_nominee_is_abandoned_early.py +0 -0
  321. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_upstream_compat.py +0 -0
  322. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_upstream_seam_adapter.py +0 -0
  323. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_upstream_secrets_redacted.py +0 -0
  324. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_validator_shares_one_token.py +0 -0
  325. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_vendored_aiortc_integrity.py +0 -0
  326. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_video_presence_needs_a_keyframe.py +0 -0
  327. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_video_profile_log.py +0 -0
  328. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_video_pts_dts.py +0 -0
  329. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_video_ts_unwrap.py +0 -0
  330. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_viewer_check_throttle.py +0 -0
  331. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_viewer_presence.py +0 -0
  332. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_viewer_present_push_mode.py +0 -0
  333. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_wait_or_event.py +0 -0
  334. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_wake_gate_camera_evidence.py +0 -0
  335. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_wake_readiness_retry.py +0 -0
  336. {python_aidot_cameras-1.0.0rc45 → python_aidot_cameras-1.0.0rc46}/tests/test_webrtc_answer_race.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-aidot-cameras
3
- Version: 1.0.0rc45
3
+ Version: 1.0.0rc46
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
@@ -97,6 +97,7 @@ from .protocol import ( # noqa: F401 - used here and/or by the webrtc_open mixi
97
97
  _grab_free_port,
98
98
  _tcp_table_has_established_on_port,
99
99
  _idle_release_due,
100
+ _battery_cap_spans_sessions_due,
100
101
  _battery_unknown_release_s,
101
102
  _stream_startup_grace_s,
102
103
  _DirectTsServer,
@@ -4834,8 +4835,10 @@ class CameraMixin(
4834
4835
  def _sdes_serve_consumer_present(self, port: int) -> "Optional[bool]":
4835
4836
  """True if a TCP client is connected to the SDES serve ``port`` (a viewer
4836
4837
  is pulling), False if none, None if the TCP table can't be read (non-Linux
4837
- / sandboxed host). The caller MUST treat None as 'unknown' and NOT release
4838
- - failing safe to the current always-reconnect behaviour."""
4838
+ / sandboxed host). None is 'unknown': a mains camera is not released on
4839
+ it, and since 1.0.0rc45 a battery camera is, once
4840
+ AIDOT_BATTERY_UNKNOWN_VIEWER_RELEASE_S has passed without a known viewer
4841
+ (protocol._idle_release_due)."""
4839
4842
  read_any = False
4840
4843
  found = False
4841
4844
  for _path in ("/proc/net/tcp", "/proc/net/tcp6"):
@@ -5095,6 +5098,13 @@ class CameraMixin(
5095
5098
  # burst stays on ONE peerid: a fresh peerid registers another camera-side
5096
5099
  # session, which is what wedged the L2 in the first place (0.12.16).
5097
5100
  _not_ready_burst = 0
5101
+ # The battery unknown-viewer cap counts from the last viewer KNOWN
5102
+ # present in any session of this keepalive, not from each session's
5103
+ # open: a loop of sessions that end on their own (a refused publish
5104
+ # ends the serve in seconds) re-anchored every 35-60 s and never
5105
+ # reached it, re-waking a battery camera for as long as the cause
5106
+ # lasted. See _battery_cap_spans_sessions_due.
5107
+ _last_known_viewer = time.monotonic()
5098
5108
 
5099
5109
  while self._streaming_active:
5100
5110
  if self._serve_relay is not None:
@@ -5328,10 +5338,14 @@ class CameraMixin(
5328
5338
  _present = await self._viewer_present(_serve_port)
5329
5339
  if _present: # True -> a viewer is pulling; stay alive
5330
5340
  _last_consumer = time.monotonic()
5341
+ _last_known_viewer = _last_consumer
5331
5342
  _viewer_seen = True
5332
5343
  elif _idle_release_due(
5333
5344
  _present,
5334
- _last_consumer,
5345
+ # Unknown counts across reopens; a known absence
5346
+ # keeps its per-session window, so a viewer
5347
+ # re-attaching after a camera-side drop is not cut.
5348
+ _last_known_viewer if _present is None else _last_consumer,
5335
5349
  time.monotonic(),
5336
5350
  _idle_secs,
5337
5351
  battery=_battery,
@@ -5344,7 +5358,7 @@ class CameraMixin(
5344
5358
  "SDES serve: %s released - viewer state "
5345
5359
  "unknown for %.0f s on a battery camera",
5346
5360
  self.device_id,
5347
- time.monotonic() - _last_consumer,
5361
+ time.monotonic() - _last_known_viewer,
5348
5362
  )
5349
5363
  _idle_release = True
5350
5364
  break
@@ -5358,6 +5372,17 @@ class CameraMixin(
5358
5372
  finally:
5359
5373
  self._stream_session = None
5360
5374
 
5375
+ if not _idle_release and _battery_cap_spans_sessions_due(
5376
+ _battery, _unknown_cap, _last_known_viewer, time.monotonic()
5377
+ ):
5378
+ _LOGGER.info(
5379
+ "SDES serve: %s released - no viewer known for %.0f s across"
5380
+ " sessions that ended on their own, on a battery camera",
5381
+ self.device_id,
5382
+ time.monotonic() - _last_known_viewer,
5383
+ )
5384
+ _idle_release = True
5385
+
5361
5386
  if _idle_release:
5362
5387
  # No HA consumer for the idle window: go dormant instead of
5363
5388
  # reconnecting forever. camera.stream_source() restarts us (and
@@ -108,8 +108,10 @@ class Go2rtcClient:
108
108
  not a viewer exists. Idle-release keyed on the socket therefore never
109
109
  fires and every camera streams forever after a single view.
110
110
 
111
- None means unknown (go2rtc unreachable or the stream absent), and callers
112
- must fail safe by not releasing on it.
111
+ None means unknown (go2rtc unreachable or the stream absent). A mains
112
+ camera is not released on it; since 1.0.0rc45 a battery camera is, after
113
+ AIDOT_BATTERY_UNKNOWN_VIEWER_RELEASE_S without a known viewer
114
+ (protocol._idle_release_due).
113
115
  """
114
116
  streams = await self.list_streams()
115
117
  entry = streams.get(name)
@@ -1656,6 +1656,29 @@ def _idle_release_due(
1656
1656
  return (now - last_consumer) > _window
1657
1657
 
1658
1658
 
1659
+ def _battery_cap_spans_sessions_due(
1660
+ battery: bool,
1661
+ unknown_cap_s: "Optional[float]",
1662
+ last_known_viewer: float,
1663
+ now: float,
1664
+ ) -> bool:
1665
+ """Whether a battery keepalive should stop instead of opening another session.
1666
+
1667
+ Checked when an SDES session has ended on its own. ``last_known_viewer`` is
1668
+ the last time a viewer was KNOWN present in any session of this keepalive
1669
+ (or the keepalive's start), so it is not reset by a reopen. The per-session
1670
+ checks cannot see a loop of sessions that end before their first viewer
1671
+ check - a publish the target refuses ends the serve in seconds, and a fresh
1672
+ session opens 10 s later - so without this a battery camera was re-woken
1673
+ every 35-60 s for as long as the cause lasted. A camera being watched keeps
1674
+ ``last_known_viewer`` fresh from each session's checks and is not stopped.
1675
+ Uses the same cap as the unknown-viewer release; <= 0 disables it.
1676
+ """
1677
+ if not battery or not unknown_cap_s or unknown_cap_s <= 0:
1678
+ return False
1679
+ return (now - last_known_viewer) > unknown_cap_s
1680
+
1681
+
1659
1682
  #: Default for ``AIDOT_BATTERY_UNKNOWN_VIEWER_RELEASE_S``.
1660
1683
  _BATTERY_UNKNOWN_RELEASE_S = 300.0
1661
1684
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "python-aidot-cameras"
7
- version = "1.0.0rc45"
7
+ version = "1.0.0rc46"
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"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-aidot-cameras
3
- Version: 1.0.0rc45
3
+ Version: 1.0.0rc46
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
@@ -101,6 +101,7 @@ tests/test_avio_request.py
101
101
  tests/test_avio_response_parse.py
102
102
  tests/test_avio_response_router.py
103
103
  tests/test_backoff.py
104
+ tests/test_battery_cap_spans_sessions.py
104
105
  tests/test_battery_detection.py
105
106
  tests/test_battery_evidence_corroboration.py
106
107
  tests/test_battery_stale_offer_is_abandoned_early.py
@@ -0,0 +1,67 @@
1
+ """The battery unknown-viewer cap must survive a reopened SDES session.
2
+
3
+ Found by the 2026-10-11 review: the cap, the idle window and the start-up grace
4
+ were all measured from each session's open. A publish the target refuses ends
5
+ the serve before the first viewer check, a fresh session opens 10 s later, and
6
+ the anchors reset, so a battery camera was re-woken every 35-60 s for as long as
7
+ the cause lasted (reproduced against integration 2.37.2 on a bundled-only
8
+ install, and an add-on outage does the same).
9
+ """
10
+
11
+ import inspect
12
+
13
+ import aidot_cameras.camera.client as cc
14
+ from aidot_cameras.camera.protocol import _battery_cap_spans_sessions_due as due
15
+
16
+
17
+ def test_a_battery_keepalive_with_no_known_viewer_past_the_cap_stops():
18
+ assert due(True, 300.0, last_known_viewer=0.0, now=301.0) is True
19
+
20
+
21
+ def test_inside_the_cap_it_reopens():
22
+ assert due(True, 300.0, last_known_viewer=0.0, now=299.0) is False
23
+
24
+
25
+ def test_a_mains_camera_is_never_stopped_this_way():
26
+ assert due(False, 300.0, last_known_viewer=0.0, now=10_000.0) is False
27
+
28
+
29
+ def test_a_cap_of_zero_or_none_disables_it():
30
+ assert due(True, 0.0, last_known_viewer=0.0, now=10_000.0) is False
31
+ assert due(True, None, last_known_viewer=0.0, now=10_000.0) is False
32
+
33
+
34
+ def _src():
35
+ return inspect.getsource(cc.CameraMixin._sdes_keepalive_loop_inner)
36
+
37
+
38
+ def test_the_anchor_is_set_once_per_keepalive_not_per_session():
39
+ src = _src()
40
+ loop = src.index("while self._streaming_active:")
41
+ first = src.index("_last_known_viewer = time.monotonic()")
42
+ assert first < loop, "the keepalive-wide anchor must sit above the session loop"
43
+ assert src.count("_last_known_viewer = time.monotonic()") == 1
44
+
45
+
46
+ def test_a_known_viewer_refreshes_the_keepalive_anchor():
47
+ src = _src()
48
+ seen = src.index("_viewer_seen = True")
49
+ assert (
50
+ "_last_known_viewer = _last_consumer"
51
+ in src[src.rindex("if _present:", 0, seen) : seen]
52
+ )
53
+
54
+
55
+ def test_unknown_uses_the_keepalive_anchor_and_absence_the_session_one():
56
+ src = _src()
57
+ call = src[src.index("_idle_release_due(") :]
58
+ call = call[: call.index("_idle_release = True")]
59
+ assert "_last_known_viewer if _present is None else _last_consumer" in call
60
+
61
+
62
+ def test_a_session_that_ended_on_its_own_is_checked_before_reopening():
63
+ src = _src()
64
+ check = src.index("_battery_cap_spans_sessions_due(")
65
+ release = src.index("if _idle_release:", check)
66
+ assert check < release
67
+ assert "_battery, _unknown_cap, _last_known_viewer" in src[check:release]