sciveo 0.2.99__tar.gz → 0.3.2__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 (559) hide show
  1. {sciveo-0.2.99/sciveo.egg-info → sciveo-0.3.2}/PKG-INFO +192 -4
  2. {sciveo-0.2.99 → sciveo-0.3.2}/README.md +191 -3
  3. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/cli.py +7 -3
  4. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/help.py +26 -12
  5. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/onvif.py +38 -0
  6. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/player.py +74 -12
  7. sciveo-0.3.2/sciveo/media/capture/recording_timeline.py +244 -0
  8. sciveo-0.3.2/sciveo/media/capture/recordings.py +577 -0
  9. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/rtsp_client.py +35 -3
  10. sciveo-0.3.2/sciveo/media/capture/settings.py +161 -0
  11. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/cli.py +21 -9
  12. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/cli.py +2 -0
  13. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/modbus/__init__.py +2 -0
  14. sciveo-0.3.2/sciveo/network/modbus/catalog.py +876 -0
  15. sciveo-0.3.2/sciveo/network/modbus/models.py +661 -0
  16. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/modbus/profiles.py +25 -3
  17. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/modbus/server.py +60 -6
  18. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/modbus/tools.py +53 -3
  19. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/onvif/__init__.py +3 -0
  20. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/onvif/client.py +9 -1
  21. sciveo-0.3.2/sciveo/network/onvif/ptz.py +169 -0
  22. sciveo-0.3.2/sciveo/network/onvif/settings.py +165 -0
  23. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/sniff/cli.py +4 -3
  24. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/sniff/modbus_inventory.py +57 -4
  25. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/sniff/streams.py +1 -1
  26. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/sniff/terminal.py +252 -22
  27. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/plant/modbus.py +26 -6
  28. sciveo-0.3.2/sciveo/ui/gui/html/__init__.py +17 -0
  29. sciveo-0.3.2/sciveo/ui/gui/html/client.py +114 -0
  30. sciveo-0.3.2/sciveo/ui/gui/html/renderer.py +75 -0
  31. sciveo-0.3.2/sciveo/ui/gui/html/server.py +147 -0
  32. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/gui/window.py +18 -4
  33. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/term/__init__.py +2 -2
  34. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/term/widgets.py +32 -2
  35. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/version.py +1 -1
  36. {sciveo-0.2.99 → sciveo-0.3.2/sciveo.egg-info}/PKG-INFO +192 -4
  37. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo.egg-info/SOURCES.txt +16 -0
  38. sciveo-0.3.2/test/test_chint_dtsu666_catalog.py +83 -0
  39. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_gui.py +57 -2
  40. sciveo-0.3.2/test/test_gui_http.py +188 -0
  41. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_modbus.py +148 -0
  42. sciveo-0.3.2/test/test_modbus_models.py +936 -0
  43. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_modbus_sessions.py +48 -0
  44. sciveo-0.3.2/test/test_onvif_ptz.py +255 -0
  45. sciveo-0.3.2/test/test_onvif_settings.py +335 -0
  46. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_plant_modbus.py +35 -0
  47. sciveo-0.3.2/test/test_recordings.py +1014 -0
  48. sciveo-0.3.2/test/test_sdm630_catalog.py +122 -0
  49. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_sniff.py +8 -0
  50. sciveo-0.3.2/test/test_sungrow_sh10rt_catalog.py +182 -0
  51. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_term_themes.py +12 -0
  52. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_video_player.py +102 -0
  53. sciveo-0.2.99/sciveo/network/modbus/catalog.py +0 -131
  54. sciveo-0.2.99/sciveo/network/modbus/models.py +0 -205
  55. sciveo-0.2.99/test/test_modbus_models.py +0 -147
  56. {sciveo-0.2.99 → sciveo-0.3.2}/MANIFEST.in +0 -0
  57. {sciveo-0.2.99 → sciveo-0.3.2}/pyproject.toml +0 -0
  58. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/__init__.py +0 -0
  59. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/admin/__init__.py +0 -0
  60. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/admin/cli.py +0 -0
  61. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/admin/config.py +0 -0
  62. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/admin/device.py +0 -0
  63. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/admin/diagnostics.py +0 -0
  64. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/admin/network.py +0 -0
  65. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/admin/server.py +0 -0
  66. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/__init__.py +0 -0
  67. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/base.py +0 -0
  68. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/cli.py +0 -0
  69. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/clients/__init__.py +0 -0
  70. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/clients/anthropic.py +0 -0
  71. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/clients/gemini.py +0 -0
  72. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/clients/groq.py +0 -0
  73. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/clients/hf.py +0 -0
  74. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/clients/ollama.py +0 -0
  75. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/clients/openai.py +0 -0
  76. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/configurations/coder.md +0 -0
  77. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/configurations/ops.md +0 -0
  78. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/configurations/researcher.md +0 -0
  79. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/configurations/reviewer.md +0 -0
  80. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/configurations/tester.md +0 -0
  81. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/console.py +0 -0
  82. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/evaluation/__init__.py +0 -0
  83. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/evaluation/cases.py +0 -0
  84. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/evaluation/challenges.py +0 -0
  85. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/evaluation/checks.py +0 -0
  86. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/evaluation/local_chat.py +0 -0
  87. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/evaluation/preflight.py +0 -0
  88. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/evaluation/report.py +0 -0
  89. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/evaluation/runner.py +0 -0
  90. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/media.py +0 -0
  91. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/orchestration.py +0 -0
  92. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/protocol.py +0 -0
  93. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/render.py +0 -0
  94. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/runtime.py +0 -0
  95. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/specialization.py +0 -0
  96. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/thinking.py +0 -0
  97. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/tools/__init__.py +0 -0
  98. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/tools/images.py +0 -0
  99. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/tools/os.py +0 -0
  100. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/tools/web.py +0 -0
  101. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/api/__init__.py +0 -0
  102. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/api/base.py +0 -0
  103. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/api/cli.py +0 -0
  104. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/api/ipc.py +0 -0
  105. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/api/prediction.py +0 -0
  106. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/api/predictors.py +0 -0
  107. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/api/server.py +0 -0
  108. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/api/upload.py +0 -0
  109. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/certification/__init__.py +0 -0
  110. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/certification/cli.py +0 -0
  111. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/certification/evaluator.py +0 -0
  112. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/certification/profiles.py +0 -0
  113. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/certification/renderer.py +0 -0
  114. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/certification/scenarios.py +0 -0
  115. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/chat/__init__.py +0 -0
  116. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/chat/cli.py +0 -0
  117. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/chat/client.py +0 -0
  118. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/chat/crypto.py +0 -0
  119. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/chat/protocol.py +0 -0
  120. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/chat/server.py +0 -0
  121. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/chat/store.py +0 -0
  122. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/chat/ui.py +0 -0
  123. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/common/__init__.py +0 -0
  124. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/common/configuration.py +0 -0
  125. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/common/model.py +0 -0
  126. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/common/optimizers.py +0 -0
  127. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/common/sampling.py +0 -0
  128. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/content/__init__.py +0 -0
  129. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/content/dataset.py +0 -0
  130. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/content/experiment.py +0 -0
  131. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/content/project.py +0 -0
  132. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/content/runner.py +0 -0
  133. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/db/__init__.py +0 -0
  134. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/db/read_table.py +0 -0
  135. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/extensions/__init__.py +0 -0
  136. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/extensions/assets/__init__.py +0 -0
  137. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/extensions/assets/vscode-sciveo-0.1.0.vsix +0 -0
  138. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/extensions/catalog.py +0 -0
  139. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/extensions/cli.py +0 -0
  140. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/iam/__init__.py +0 -0
  141. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/iam/access.py +0 -0
  142. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/iam/api.py +0 -0
  143. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/iam/client.py +0 -0
  144. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/iam/database.py +0 -0
  145. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/iam/identity.py +0 -0
  146. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/iam/policy.py +0 -0
  147. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/iam/users.py +0 -0
  148. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/industrial/__init__.py +0 -0
  149. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/industrial/can.py +0 -0
  150. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/industrial/cli.py +0 -0
  151. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/industrial/device.py +0 -0
  152. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/industrial/dlms.py +0 -0
  153. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/industrial/dlms_io.py +0 -0
  154. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/industrial/iec104.py +0 -0
  155. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/industrial/iec104_listener.py +0 -0
  156. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/industrial/iec61850.py +0 -0
  157. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/industrial/modbus/__init__.py +0 -0
  158. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/industrial/modbus_device.py +0 -0
  159. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/industrial/opcua.py +0 -0
  160. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/industrial/sdi12.py +0 -0
  161. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/log.py +0 -0
  162. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/logger.py +0 -0
  163. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/__init__.py +0 -0
  164. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/__init__.py +0 -0
  165. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/cam.py +0 -0
  166. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/cameras.py +0 -0
  167. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/discovery.py +0 -0
  168. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/draw.py +0 -0
  169. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/games/__init__.py +0 -0
  170. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/games/asteroids/__init__.py +0 -0
  171. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/games/asteroids/asteroid.py +0 -0
  172. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/games/asteroids/base_move.py +0 -0
  173. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/games/asteroids/circle.py +0 -0
  174. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/games/asteroids/game.py +0 -0
  175. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/games/asteroids/geometrics.py +0 -0
  176. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/games/asteroids/gravity_ball.py +0 -0
  177. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/games/asteroids/laser.py +0 -0
  178. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/games/asteroids/rocket.py +0 -0
  179. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/games/asteroids/space_asteroids.py +0 -0
  180. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/games/asteroids/volume_bar.py +0 -0
  181. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/gst_server.py +0 -0
  182. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/motion_detection.py +0 -0
  183. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/nvr.py +0 -0
  184. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/onvif_device.py +0 -0
  185. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/readers.py +0 -0
  186. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/rpi.py +0 -0
  187. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/rtp.py +0 -0
  188. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/rtsp.py +0 -0
  189. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/rtsp_scan.py +0 -0
  190. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/storage.py +0 -0
  191. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/system_player.py +0 -0
  192. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/transcode.py +0 -0
  193. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/ml/__init__.py +0 -0
  194. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/ml/base.py +0 -0
  195. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/ml/encoders/__init__.py +0 -0
  196. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/ml/encoders/base.py +0 -0
  197. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/ml/encoders/normalizer.py +0 -0
  198. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/ml/nlp/__init__.py +0 -0
  199. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/ml/nlp/search.py +0 -0
  200. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/ml/time_series/__init__.py +0 -0
  201. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/ml/time_series/dataset.py +0 -0
  202. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/ml/time_series/predictor.py +0 -0
  203. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/ml/time_series/trainer.py +0 -0
  204. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/ml/time_series/window_generator.py +0 -0
  205. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/__init__.py +0 -0
  206. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/base.py +0 -0
  207. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/job_daemon.py +0 -0
  208. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/layouts/__init__.py +0 -0
  209. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/layouts/base.py +0 -0
  210. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/local.py +0 -0
  211. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/pipeline.py +0 -0
  212. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/postprocessors/__init__.py +0 -0
  213. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/postprocessors/base.py +0 -0
  214. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/postprocessors/default.py +0 -0
  215. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/__init__.py +0 -0
  216. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/audio/__init__.py +0 -0
  217. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/audio/audio.py +0 -0
  218. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/audio/audio_extractor_process.py +0 -0
  219. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/aws.py +0 -0
  220. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/base.py +0 -0
  221. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/file/__init__.py +0 -0
  222. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/file/archive.py +0 -0
  223. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/image/__init__.py +0 -0
  224. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/image/album.py +0 -0
  225. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/image/album_in_image.py +0 -0
  226. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/image/depth_esimation.py +0 -0
  227. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/image/embeddings.py +0 -0
  228. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/image/filters.py +0 -0
  229. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/image/generators.py +0 -0
  230. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/image/histogram.py +0 -0
  231. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/image/mask.py +0 -0
  232. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/image/object_detection.py +0 -0
  233. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/image/resize.py +0 -0
  234. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/image/segmentation.py +0 -0
  235. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/image/watermark.py +0 -0
  236. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/media_info.py +0 -0
  237. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/nlp/__init__.py +0 -0
  238. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/nlp/address.py +0 -0
  239. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/qr.py +0 -0
  240. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/sci/__init__.py +0 -0
  241. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/sci/base.py +0 -0
  242. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/sci/dataset.py +0 -0
  243. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/sci/time_series/__init__.py +0 -0
  244. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/sci/time_series/predictor.py +0 -0
  245. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/sci/time_series/trainer.py +0 -0
  246. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/tpu_base.py +0 -0
  247. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/video/__init__.py +0 -0
  248. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/video/generators.py +0 -0
  249. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/video/motion_detection.py +0 -0
  250. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/video/resize.py +0 -0
  251. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/video/video_album.py +0 -0
  252. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/video/video_frames.py +0 -0
  253. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/video/video_resample.py +0 -0
  254. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/queues.py +0 -0
  255. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/server.py +0 -0
  256. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/web/__init__.py +0 -0
  257. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/web/server.py +0 -0
  258. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/tools/__init__.py +0 -0
  259. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/tools/video_interactive.py +0 -0
  260. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/__init__.py +0 -0
  261. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/base.py +0 -0
  262. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/dataset/__init__.py +0 -0
  263. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/dataset/object_detection.py +0 -0
  264. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/energy/__init__.py +0 -0
  265. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/energy/optimization.py +0 -0
  266. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/energy/solar.py +0 -0
  267. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/evaluation/__init__.py +0 -0
  268. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/evaluation/markdown.py +0 -0
  269. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/evaluation/object_detection.py +0 -0
  270. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/images/__init__.py +0 -0
  271. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/images/base.py +0 -0
  272. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/images/description.py +0 -0
  273. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/images/embeddings.py +0 -0
  274. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/images/object_detection.py +0 -0
  275. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/images/sciveyolo/__init__.py +0 -0
  276. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/images/sciveyolo/artifact.py +0 -0
  277. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/images/sciveyolo/engines.py +0 -0
  278. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/images/sciveyolo/evaluate.py +0 -0
  279. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/images/sciveyolo/ipc.py +0 -0
  280. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/images/sciveyolo/model.py +0 -0
  281. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/images/sciveyolo/results.py +0 -0
  282. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/images/sciveyolo/runtime.py +0 -0
  283. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/images/sciveyolo/runtime_stats.py +0 -0
  284. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/images/sciveyolo/torch_net.py +0 -0
  285. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/images/sciveyolo/train.py +0 -0
  286. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/images/sciveyolo/train_checkpoint.py +0 -0
  287. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/images/sciveyolo/train_data.py +0 -0
  288. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/images/sciveyolo/train_loss.py +0 -0
  289. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/images/sciveyolo/train_validate.py +0 -0
  290. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/images/tools.py +0 -0
  291. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/images/transformers.py +0 -0
  292. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/images/vlm.py +0 -0
  293. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/nlp/__init__.py +0 -0
  294. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/nlp/embeddings.py +0 -0
  295. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/nlp/tokenizers/__init__.py +0 -0
  296. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/nlp/tokenizers/bpe.py +0 -0
  297. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/video/__init__.py +0 -0
  298. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/video/description.py +0 -0
  299. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/monitoring/__init__.py +0 -0
  300. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/monitoring/cli.py +0 -0
  301. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/monitoring/monitor.py +0 -0
  302. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/monitoring/plant/__init__.py +0 -0
  303. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/monitoring/plant/ems300.py +0 -0
  304. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/monitoring/plant/sim.py +0 -0
  305. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/monitoring/plant/tools.py +0 -0
  306. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/monitoring/power.py +0 -0
  307. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/monitoring/start.py +0 -0
  308. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/monitoring/watchdog/__init__.py +0 -0
  309. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/monitoring/watchdog/base.py +0 -0
  310. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/monitoring/watchdog/gateway.py +0 -0
  311. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/monitoring/watchdog/network.py +0 -0
  312. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/monitoring/watchdog/privileged.py +0 -0
  313. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/monitoring/watchdog/process.py +0 -0
  314. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/monitoring/watchdog/repair.py +0 -0
  315. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/__init__.py +0 -0
  316. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/camera.py +0 -0
  317. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/health.py +0 -0
  318. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/http_server.py +0 -0
  319. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/http_tools.py +0 -0
  320. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/interfaces.py +0 -0
  321. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/l2.py +0 -0
  322. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/modbus/cli.py +0 -0
  323. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/modbus/dashboard.py +0 -0
  324. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/modbus/discovery.py +0 -0
  325. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/modbus/session.py +0 -0
  326. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/modbus/sunspec.py +0 -0
  327. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/modbus/terminal.py +0 -0
  328. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/mqtt.py +0 -0
  329. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/mqtt_server.py +0 -0
  330. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/onvif/device.py +0 -0
  331. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/onvif/discovery.py +0 -0
  332. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/onvif/security.py +0 -0
  333. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/onvif/server.py +0 -0
  334. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/onvif/services.py +0 -0
  335. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/onvif/xml.py +0 -0
  336. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/selectors.py +0 -0
  337. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/sniff/__init__.py +0 -0
  338. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/sniff/av1.py +0 -0
  339. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/sniff/capture.py +0 -0
  340. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/sniff/codecs.py +0 -0
  341. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/sniff/inspector.py +0 -0
  342. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/sniff/modbus.py +0 -0
  343. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/sniff/modbus_cli.py +0 -0
  344. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/sniff/modbus_pdu.py +0 -0
  345. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/sniff/network_cli.py +0 -0
  346. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/sniff/packets.py +0 -0
  347. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/sniff/protocols.py +0 -0
  348. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/sniff/traffic.py +0 -0
  349. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/sniffer.py +0 -0
  350. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/snmp/__init__.py +0 -0
  351. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/snmp/oids.py +0 -0
  352. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/snmp/server.py +0 -0
  353. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/snmp/snapshot.py +0 -0
  354. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/snmp/tools.py +0 -0
  355. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/ssh.py +0 -0
  356. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/tools.py +0 -0
  357. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/notifications/__init__.py +0 -0
  358. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/notifications/base.py +0 -0
  359. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/notifications/slack.py +0 -0
  360. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/notifications/telegram.py +0 -0
  361. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/notifications/viber.py +0 -0
  362. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ops/__init__.py +0 -0
  363. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ops/cli.py +0 -0
  364. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ops/doctor.py +0 -0
  365. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ops/fleet.py +0 -0
  366. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ops/industrial.py +0 -0
  367. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/plant/__init__.py +0 -0
  368. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/plant/measurement.py +0 -0
  369. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/storage/__init__.py +0 -0
  370. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/storage/auth.py +0 -0
  371. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/storage/cli.py +0 -0
  372. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/storage/cluster/__init__.py +0 -0
  373. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/storage/cluster/client.py +0 -0
  374. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/storage/cluster/config.py +0 -0
  375. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/storage/cluster/controller.py +0 -0
  376. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/storage/cluster/gateway.py +0 -0
  377. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/storage/cluster/metadata.py +0 -0
  378. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/storage/cluster/node.py +0 -0
  379. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/storage/cluster/placement.py +0 -0
  380. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/storage/cluster/protocol.py +0 -0
  381. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/storage/cluster/repair.py +0 -0
  382. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/storage/cluster/server.py +0 -0
  383. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/storage/config.py +0 -0
  384. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/storage/cors.py +0 -0
  385. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/storage/filesystem.py +0 -0
  386. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/storage/iam.py +0 -0
  387. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/storage/local.py +0 -0
  388. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/storage/metadata.py +0 -0
  389. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/storage/mutation.py +0 -0
  390. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/storage/policy.py +0 -0
  391. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/storage/post.py +0 -0
  392. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/storage/process.py +0 -0
  393. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/storage/runtime.py +0 -0
  394. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/storage/s3.py +0 -0
  395. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/storage/server.py +0 -0
  396. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/storage/sync.py +0 -0
  397. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/__init__.py +0 -0
  398. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/array.py +0 -0
  399. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/aws/__init__.py +0 -0
  400. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/aws/priority_queue.py +0 -0
  401. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/aws/s3.py +0 -0
  402. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/cli.py +0 -0
  403. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/common.py +0 -0
  404. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/complexity.py +0 -0
  405. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/compress.py +0 -0
  406. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/configuration.py +0 -0
  407. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/configuration_cli.py +0 -0
  408. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/configuration_tui.py +0 -0
  409. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/crypto.py +0 -0
  410. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/daemon.py +0 -0
  411. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/defaults.py +0 -0
  412. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/draw/__init__.py +0 -0
  413. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/draw/contours.py +0 -0
  414. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/formating.py +0 -0
  415. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/hardware.py +0 -0
  416. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/http.py +0 -0
  417. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/logger.py +0 -0
  418. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/logggin.py +0 -0
  419. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/os.py +0 -0
  420. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/preferences.py +0 -0
  421. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/queue.py +0 -0
  422. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/random.py +0 -0
  423. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/remote.py +0 -0
  424. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/simple_counter.py +0 -0
  425. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/sorting.py +0 -0
  426. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/synchronized.py +0 -0
  427. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/timers.py +0 -0
  428. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/totp.py +0 -0
  429. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/__init__.py +0 -0
  430. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/cli.py +0 -0
  431. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/gui/__init__.py +0 -0
  432. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/gui/renderer.py +0 -0
  433. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/html.py +0 -0
  434. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/tables.py +0 -0
  435. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/term/containers.py +0 -0
  436. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/term/dialogs.py +0 -0
  437. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/term/documents.py +0 -0
  438. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/term/gallery.py +0 -0
  439. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/term/html.py +0 -0
  440. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/term/images.py +0 -0
  441. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/term/layout.py +0 -0
  442. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/term/live.py +0 -0
  443. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/term/measurements.py +0 -0
  444. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/term/panels.py +0 -0
  445. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/term/progress.py +0 -0
  446. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/term/screen.py +0 -0
  447. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/term/selectors.py +0 -0
  448. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/term/status.py +0 -0
  449. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/term/streaming.py +0 -0
  450. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/term/tables.py +0 -0
  451. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/term/terminal.py +0 -0
  452. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/term/text.py +0 -0
  453. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/term/themes.py +0 -0
  454. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/term/trees.py +0 -0
  455. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/web/__init__.py +0 -0
  456. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/web/common.py +0 -0
  457. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo.egg-info/dependency_links.txt +0 -0
  458. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo.egg-info/entry_points.txt +0 -0
  459. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo.egg-info/requires.txt +0 -0
  460. {sciveo-0.2.99 → sciveo-0.3.2}/sciveo.egg-info/top_level.txt +0 -0
  461. {sciveo-0.2.99 → sciveo-0.3.2}/setup.cfg +0 -0
  462. {sciveo-0.2.99 → sciveo-0.3.2}/setup.py +0 -0
  463. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_admin.py +0 -0
  464. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_admin_concurrency.py +0 -0
  465. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_agents.py +0 -0
  466. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_agents_chat_listener.py +0 -0
  467. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_agents_evaluation.py +0 -0
  468. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_agents_evaluation_extended.py +0 -0
  469. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_agents_image_integration.py +0 -0
  470. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_agents_orchestration.py +0 -0
  471. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_agents_thinking.py +0 -0
  472. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_api_client.py +0 -0
  473. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_camera_discovery.py +0 -0
  474. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_camera_liveness.py +0 -0
  475. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_certification.py +0 -0
  476. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_chat.py +0 -0
  477. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_cli_defaults.py +0 -0
  478. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_cli_delegation.py +0 -0
  479. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_cli_modules.py +0 -0
  480. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_cli_themes.py +0 -0
  481. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_complexity.py +0 -0
  482. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_compress.py +0 -0
  483. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_configuration.py +0 -0
  484. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_configuration_tui.py +0 -0
  485. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_crypto.py +0 -0
  486. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_eval_markdown.py +0 -0
  487. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_extensions_catalog.py +0 -0
  488. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_help.py +0 -0
  489. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_iam.py +0 -0
  490. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_iam_database.py +0 -0
  491. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_industrial.py +0 -0
  492. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_industrial_protocols.py +0 -0
  493. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_l2.py +0 -0
  494. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_log.py +0 -0
  495. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_media_cli.py +0 -0
  496. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_ml_datasets.py +0 -0
  497. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_ml_energy.py +0 -0
  498. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_ml_ipc.py +0 -0
  499. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_ml_sciveyolo.py +0 -0
  500. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_ml_vlm.py +0 -0
  501. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_modbus_dashboard.py +0 -0
  502. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_monitor_http.py +0 -0
  503. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_monitoring.py +0 -0
  504. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_network_health.py +0 -0
  505. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_network_interfaces.py +0 -0
  506. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_network_selector.py +0 -0
  507. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_network_sniffer.py +0 -0
  508. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_notifications.py +0 -0
  509. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_nvr.py +0 -0
  510. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_nvr_capture.py +0 -0
  511. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_nvr_faulty_video.py +0 -0
  512. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_nvr_transcode.py +0 -0
  513. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_onvif.py +0 -0
  514. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_onvif_server.py +0 -0
  515. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_ops_doctor_fleet.py +0 -0
  516. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_predictor_transport.py +0 -0
  517. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_preferences.py +0 -0
  518. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_protocol_emulators_integration.py +0 -0
  519. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_protocol_io.py +0 -0
  520. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_rtsp_play.py +0 -0
  521. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_rtsp_scan.py +0 -0
  522. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_rtsp_viewer.py +0 -0
  523. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_runner.py +0 -0
  524. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_sampling.py +0 -0
  525. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_sciveyolo_ipc.py +0 -0
  526. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_sniff_runtime.py +0 -0
  527. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_snmp.py +0 -0
  528. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_sorting.py +0 -0
  529. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_ssh.py +0 -0
  530. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_storage.py +0 -0
  531. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_storage_auth_hardening.py +0 -0
  532. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_storage_cluster.py +0 -0
  533. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_storage_cors.py +0 -0
  534. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_storage_iam.py +0 -0
  535. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_storage_iam_users.py +0 -0
  536. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_storage_metadata_hardening.py +0 -0
  537. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_storage_security_limits.py +0 -0
  538. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_term_containers.py +0 -0
  539. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_term_dialogs.py +0 -0
  540. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_term_documents.py +0 -0
  541. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_term_gallery.py +0 -0
  542. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_term_html.py +0 -0
  543. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_term_progress.py +0 -0
  544. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_term_reports.py +0 -0
  545. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_term_selectors.py +0 -0
  546. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_term_streaming.py +0 -0
  547. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_term_table_options.py +0 -0
  548. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_term_tables.py +0 -0
  549. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_term_views.py +0 -0
  550. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_tokenizers.py +0 -0
  551. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_totp.py +0 -0
  552. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_ui_html.py +0 -0
  553. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_ui_tables.py +0 -0
  554. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_video_codecs.py +0 -0
  555. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_watchdog_gateway.py +0 -0
  556. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_watchdog_network.py +0 -0
  557. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_watchdog_privileged.py +0 -0
  558. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_watchdog_repair.py +0 -0
  559. {sciveo-0.2.99 → sciveo-0.3.2}/test/test_watchdog_service.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sciveo
3
- Version: 0.2.99
3
+ Version: 0.3.2
4
4
  Description-Content-Type: text/markdown
5
5
  Provides-Extra: mon
6
6
  Provides-Extra: agent
@@ -1894,8 +1894,8 @@ sciveo nvr --input-path cameras.json --play term --view list --max-streams 256 -
1894
1894
  sciveo rtsp --url rtsp://192.168.1.20/stream1 --play term
1895
1895
  ```
1896
1896
 
1897
- Use the existing NVR `cam` mapping. Recording/storage settings in an existing
1898
- file are ignored by playback. Credentials may remain in legacy URLs or be
1897
+ Use the existing NVR `cam` mapping. Playback also reads finalized recordings
1898
+ when storage paths are configured; it never saves video. Credentials may remain in legacy URLs or be
1899
1899
  specified separately (per camera overrides the optional top-level defaults):
1900
1900
 
1901
1901
  ```json
@@ -2125,7 +2125,7 @@ Common camera URL starting points (confirm against the model/firmware settings):
2125
2125
  Use H.264 or H.265 and a short keyframe interval, such as 1-2 seconds, for quick
2126
2126
  switching. A substream reduces capture bandwidth and decoder load for large grids.
2127
2127
 
2128
- The camera dashboard is shared by `--play term`, `--play cv2` and `--play native`.
2128
+ The camera dashboard is shared by `--play term`, `--play cv2`, `--play native` and `--play http`.
2129
2129
  The same `TerminalPage`, panels, menus, tables and `ImageWidget` compose every
2130
2130
  view. `sciveo.ui.gui.GraphicalRenderer` paints those widgets onto a pixel canvas;
2131
2131
  video retains its original decoded resolution and fits its panel without turning
@@ -2153,6 +2153,194 @@ The legacy native plain RTSP path uses FFplay, or the Windows URL handler;
2153
2153
  RTSPS currently uses this plain path. Offscreen camera previews stay bounded at
2154
2154
  320x180; only active decoders retain full-resolution frames.
2155
2155
 
2156
+ In an active NVR/RTSP single-camera view, press `e` to enter ONVIF PTZ control.
2157
+ The shared direction-pad overlay flashes the pending arrow until movement and
2158
+ Stop complete, then restores its theme color. New movement keys are ignored
2159
+ while pending; Stop and exit remain available. This also works in graphical and
2160
+ HTTP views, using the reusable `sciveo.ui.term.DirectionPad` widget.
2161
+ Arrows or `i` (up), `j` (left), `k` (right), `m` (down) move the camera;
2162
+ `+`/`-` controls zoom when advertised. Space stops movement and `e` returns to
2163
+ camera navigation. Terminal/native Escape also leaves PTZ mode; HTTP Escape
2164
+ retains its browser-local refresh toggle. Slideshow is disabled while controlling
2165
+ PTZ, and camera selection stays fixed. Unsupported cameras or denied ONVIF access
2166
+ show a status message. Passive sniffing never offers PTZ or sends ONVIF commands.
2167
+
2168
+ Each key requests a 250 ms pulse at 25% of the advertised velocity range, followed
2169
+ by an explicit pan/tilt/zoom Stop. A camera-side timeout (at most one second) is
2170
+ also sent. Repeated keys are dropped while a pulse is executing; leaving PTZ,
2171
+ losing the selected stream, or closing playback cancels pending motion. The
2172
+ reusable clients are `sciveo.network.onvif.ONVIFPTZClient` and
2173
+ `ONVIFPTZController`; regular ONVIF discovery remains read-only. PTZ reuses the
2174
+ credentials accepted by ONVIF discovery, including its clock correction.
2175
+
2176
+ Press `c` in active NVR/RTSP single-camera view to open **Camera settings** in
2177
+ terminal/native/OpenCV/HTTP. Up/down or Tab selects a field; Enter toggles a
2178
+ choice or opens text editing. Enter accepts the draft, Escape cancels editing.
2179
+ Choose **Apply changes** to send changed clock/NTP settings and read them back;
2180
+ **Reload / discard draft** fetches current values, and **Cancel / close** discards
2181
+ unapplied edits. An Apply already in progress finishes before the panel closes.
2182
+ UTC date/time uses `YYYY-MM-DD HH:MM:SS`; time zones use the camera's ONVIF/POSIX
2183
+ string, e.g. `UTC0` or `EET-2EEST`. NTP servers accept comma-separated DNS names,
2184
+ IPv4 or IPv6 addresses; DHCP-provided servers and NTP-controlled UTC are read-only.
2185
+ Unavailable NTP access is marked explicitly. Partial failures require Reload;
2186
+ the UI never claims an atomic update across the clock and NTP operations.
2187
+ HTTP Escape closes the settings panel/editor; outside it, q/Esc still pauses only
2188
+ browser refresh. The reusable client is `sciveo.network.onvif.ONVIFSettingsClient`.
2189
+ Passive sniffing never exposes these settings or sends camera requests.
2190
+
2191
+ HTTP playback serves the same widgets as HTML/CSS through
2192
+ `sciveo.ui.gui.html.HtmlRenderer` and `HttpWindow`, without a separate web widget
2193
+ set or additional server dependencies:
2194
+
2195
+ ```shell
2196
+ sciveo rtsp --url rtsp://192.168.10.179:8550/cam --play http --port 8080
2197
+ sciveo nvr --input-path cameras.json --play http --port 8080 --view grid --size 4x3
2198
+ sciveo capture --src tv --play http --port 8080
2199
+ sudo sciveo sniff --if enx00e04c360035 --proto rtsp --play http --port 8080
2200
+ ```
2201
+
2202
+ Open `http://localhost:8080/`. The configured theme and player keyboard controls
2203
+ work in the browser, including `[ theme ]`, `g`, `v`, `i`, and `s`. All connected
2204
+ browsers control one shared dashboard; the latest browser resize sets its viewport.
2205
+ `q`/Escape pauses refresh in that browser tab, keeping the last image visible;
2206
+ press it again to resume. Other tabs and the HTTP service continue running.
2207
+ Use Ctrl+C in the launching terminal to stop the service. `--view plain` hides dashboard panels.
2208
+ The HTTP port defaults to 8080 unless explicitly configured; specify the camera
2209
+ port inside `--url`, since `--port` belongs to the HTTP service in this mode.
2210
+
2211
+ Sciveo receives and decodes the camera stream, then serves binary JPEG frames at
2212
+ original decoded resolution, fitted to the video panels by CSS. JavaScript polls
2213
+ for updates (up to 10 times per second) and replaces the display after images load.
2214
+ This is a JPEG preview transport, with higher bandwidth than compressed H.264
2215
+ browser playback; it carries no audio. The last image stays visible during an
2216
+ interruption. Only the latest two rendered frames are retained. Browsers receive
2217
+ neither camera credentials nor RTSP URLs for direct playback. Sniff mode remains
2218
+ passive: HTTP displays already captured video and never connects to cameras.
2219
+
2220
+ The service defaults to `--host 127.0.0.1` and uses plain HTTP. Use `--host 0.0.0.0`
2221
+ to listen on all IPv4 interfaces, then browse `http://SERVER_IP:8080/`.
2222
+ For example, `sciveo nvr --input-path recordings.json --play http --host 0.0.0.0 --port 8080`.
2223
+ A local nginx reverse proxy
2224
+ can provide HTTPS, authentication and external access; preserve the original
2225
+ `Host` header for same-origin browser controls. No TLS or authentication is built
2226
+ into this local preview service. RTSPS sources currently require native plain
2227
+ playback instead.
2228
+
2229
+ #### NVR recording playback
2230
+
2231
+ The same dashboard can combine live `cam` / `auto` sources with recordings, or
2232
+ use a separate recording-only JSON. Add this object to the camera configuration:
2233
+
2234
+ ```json
2235
+ {
2236
+ "recordings": {
2237
+ "paths": ["/mnt/data-2/nvr/video", "/mnt/data-1/nvr/video"],
2238
+ "scan_period": 5
2239
+ }
2240
+ }
2241
+ ```
2242
+
2243
+ `recordings.paths` names the finalized video directories directly. Existing
2244
+ capture configurations also work: top-level `paths` names storage bases, so the
2245
+ viewer reads each `BASE/video`; legacy `path.video` is accepted too. An explicit
2246
+ `recordings.paths` overrides these capture paths. Optional `recordings.cameras`
2247
+ is a list of camera directory names to include. Recording-only configurations
2248
+ do not scan or connect to network cameras.
2249
+
2250
+ ```shell
2251
+ sciveo nvr --input-path recordings.json --play term --view grid --size 2x2
2252
+ sciveo nvr --input-path recordings.json --play native
2253
+ sciveo nvr --input-path recordings.json --play http --port 8080
2254
+ ```
2255
+
2256
+ The index reads the recorder's `CAMERA/YYYY-MM-DD/HH.MM.SS-HH.MM.SS.mp4`
2257
+ layout, including clips crossing midnight. Pending files and symlinks are
2258
+ ignored. Dates are recorder-local wall time from the filenames. Each video
2259
+ shows its from/to timestamps; decoded clips use their measured duration.
2260
+ Recent files refresh in the background every five seconds after the previous
2261
+ refresh finishes; a separate worker indexes full history at startup and at least
2262
+ 60 seconds between completed passes. Unchanged day listings are cached. Slow
2263
+ history reads do not block the recent-file worker or navigation.
2264
+
2265
+ Live and recorded sources appear as separate camera entries. Grid mode follows
2266
+ each archive camera's newest finalized file, holds its last image at the end,
2267
+ and switches when the next file arrives. Entering grid mode returns historical
2268
+ selections to latest. Only visible cameras and single-view neighbors decode,
2269
+ up to 20 at once; GUI/HTTP retain original video resolution.
2270
+
2271
+ The selected camera marker identifies its source in both lists and grids:
2272
+ `▶` live RTSP, `▣` recording/video file, `◉` sniffed RTP/RTSP. The selection
2273
+ highlight keeps the configured theme. Other menus keep their `>` default;
2274
+ `MenuView(marker="◆")` or `MenuView(marker=callable)` customizes that single-cell
2275
+ marker for third-party widgets.
2276
+
2277
+ In single recorded-video view, the 24-hour timeline highlights available
2278
+ recordings and shows the selected time:
2279
+
2280
+ - Left/right selects the previous/next recording file (normally about one minute).
2281
+ It uses actual file timestamps, including gaps, rather than a fixed time jump.
2282
+ - `-` / `+` adjusts it by one hour (`=` also moves forward).
2283
+ - `p` / `n` adjusts it by one day. PageUp/PageDown also works
2284
+ (Fn + Up/Down on MacBook keyboards).
2285
+ - Adjustments accumulate until ten seconds after the last keypress. The overlay
2286
+ shows the total offset, target and countdown. Left three times then `-` means
2287
+ three files back plus one hour (normally minus one hour three minutes), with
2288
+ one file opened after the pause.
2289
+ Enter applies immediately; Escape cancels the adjustment. Changing camera or
2290
+ view cancels an unapplied adjustment.
2291
+ - `b` opens date/time entry (`YYYY-MM-DD HH:MM:SS`); Enter seeks, Escape cancels.
2292
+ - `,` / `.` plays the previous/next clip; `l` jumps to the latest file at 1x
2293
+ and follows new recordings, including while an earlier seek is pending.
2294
+ - `x` cycles archive playback speed: 1x (default), 2x, 4x, 8x, 16x, 32x, 64x, then 1x.
2295
+ The timeline and key legend show the speed. Changes keep the current position
2296
+ and continue at that speed across files; live streams and latest-file playback
2297
+ stay at 1x. All speeds above 1x sample keyframes to reduce decoder work.
2298
+ Speed changes reconfigure the decoder in the background at the current position;
2299
+ display refresh stays constant. Actual throughput depends on disk and decoder performance.
2300
+ - During a seek, a flashing overlay shows the pressed key, target time and elapsed
2301
+ wait over the last frame. Further seek keys pause until a new frame or an error;
2302
+ camera selection, view changes and quit remain available.
2303
+ - `f` opens the selected video fullscreen without menus, timeline or borders;
2304
+ `f` or Escape restores the previous view. This also works for live and sniffed
2305
+ video. Native/OpenCV use display fullscreen, HTTP requests browser fullscreen,
2306
+ and terminal playback fills the terminal area. Video keeps its aspect ratio.
2307
+ - A seek starts continuous forward playback through the same camera's files,
2308
+ in timestamp order, across gaps and date boundaries. Each file starts at its
2309
+ beginning. At the end of the archive, playback retains the last frame and
2310
+ continues when the index discovers a later recording.
2311
+ - Gaps longer than one recording period (60 seconds by default, configurable as
2312
+ `recordings.period`) are marked red on the timeline. After crossing a gap, a
2313
+ **MISSING 1h 15m of videos** stripe uses red text on the theme's background
2314
+ and shows its duration and from/to times.
2315
+ Short gaps occupy at least one timeline cell so they remain visible at a
2316
+ compact width. Seeking into a gap starts the next available file, including on
2317
+ a later day. Before the archive it starts the first file; after the archive it
2318
+ starts the last file. The timeline shows the actual selected time. Only a
2319
+ camera with no available recordings shows **NO RECORDING**.
2320
+ These controls work in the terminal, native/OpenCV dashboard and HTTP viewer.
2321
+
2322
+ Navigation has one-recording-file resolution (normally one minute): the camera
2323
+ and requested date/time select a file, which always plays from its beginning.
2324
+ The timeline then shows its actual start/playback time, with no within-file seek.
2325
+ Indexed dates are reused, metadata probes run separately from decoding and are
2326
+ cached for 256 files, and file frames are paced after decoding so input startup
2327
+ is not throttled to real time. During the adjustment countdown, one background
2328
+ worker prepares the target file and holds its first frame. Confirming the seek
2329
+ reuses that decoder. Forward archive playback also prepares the next indexed
2330
+ file. Neighboring cameras retain a paused preview; only visible recordings keep
2331
+ decoding. Only current/prepared frames and bounded decoder pipes are retained;
2332
+ files are not pre-decoded into RAM.
2333
+
2334
+ All TUI/GUI/HTTP event loops are for rendering and keyboard/mouse input. Disk
2335
+ scans, network operations, decoding, metadata queries and slow cleanup belong
2336
+ to background workers. Event handlers enqueue work and render published state;
2337
+ they must not wait for a worker or hold a lock used for long-running work.
2338
+ Archive navigation uses the in-memory index, with history sorting outside its
2339
+ short snapshot lock and timeline rendering limited to the visible day.
2340
+
2341
+ Archive playback only reads files and never modifies the recording service or
2342
+ retention settings. Camera PTZ/settings controls apply only to live entries.
2343
+
2156
2344
  Third-party clients render the existing widgets with the same API:
2157
2345
 
2158
2346
  ```python
@@ -1869,8 +1869,8 @@ sciveo nvr --input-path cameras.json --play term --view list --max-streams 256 -
1869
1869
  sciveo rtsp --url rtsp://192.168.1.20/stream1 --play term
1870
1870
  ```
1871
1871
 
1872
- Use the existing NVR `cam` mapping. Recording/storage settings in an existing
1873
- file are ignored by playback. Credentials may remain in legacy URLs or be
1872
+ Use the existing NVR `cam` mapping. Playback also reads finalized recordings
1873
+ when storage paths are configured; it never saves video. Credentials may remain in legacy URLs or be
1874
1874
  specified separately (per camera overrides the optional top-level defaults):
1875
1875
 
1876
1876
  ```json
@@ -2100,7 +2100,7 @@ Common camera URL starting points (confirm against the model/firmware settings):
2100
2100
  Use H.264 or H.265 and a short keyframe interval, such as 1-2 seconds, for quick
2101
2101
  switching. A substream reduces capture bandwidth and decoder load for large grids.
2102
2102
 
2103
- The camera dashboard is shared by `--play term`, `--play cv2` and `--play native`.
2103
+ The camera dashboard is shared by `--play term`, `--play cv2`, `--play native` and `--play http`.
2104
2104
  The same `TerminalPage`, panels, menus, tables and `ImageWidget` compose every
2105
2105
  view. `sciveo.ui.gui.GraphicalRenderer` paints those widgets onto a pixel canvas;
2106
2106
  video retains its original decoded resolution and fits its panel without turning
@@ -2128,6 +2128,194 @@ The legacy native plain RTSP path uses FFplay, or the Windows URL handler;
2128
2128
  RTSPS currently uses this plain path. Offscreen camera previews stay bounded at
2129
2129
  320x180; only active decoders retain full-resolution frames.
2130
2130
 
2131
+ In an active NVR/RTSP single-camera view, press `e` to enter ONVIF PTZ control.
2132
+ The shared direction-pad overlay flashes the pending arrow until movement and
2133
+ Stop complete, then restores its theme color. New movement keys are ignored
2134
+ while pending; Stop and exit remain available. This also works in graphical and
2135
+ HTTP views, using the reusable `sciveo.ui.term.DirectionPad` widget.
2136
+ Arrows or `i` (up), `j` (left), `k` (right), `m` (down) move the camera;
2137
+ `+`/`-` controls zoom when advertised. Space stops movement and `e` returns to
2138
+ camera navigation. Terminal/native Escape also leaves PTZ mode; HTTP Escape
2139
+ retains its browser-local refresh toggle. Slideshow is disabled while controlling
2140
+ PTZ, and camera selection stays fixed. Unsupported cameras or denied ONVIF access
2141
+ show a status message. Passive sniffing never offers PTZ or sends ONVIF commands.
2142
+
2143
+ Each key requests a 250 ms pulse at 25% of the advertised velocity range, followed
2144
+ by an explicit pan/tilt/zoom Stop. A camera-side timeout (at most one second) is
2145
+ also sent. Repeated keys are dropped while a pulse is executing; leaving PTZ,
2146
+ losing the selected stream, or closing playback cancels pending motion. The
2147
+ reusable clients are `sciveo.network.onvif.ONVIFPTZClient` and
2148
+ `ONVIFPTZController`; regular ONVIF discovery remains read-only. PTZ reuses the
2149
+ credentials accepted by ONVIF discovery, including its clock correction.
2150
+
2151
+ Press `c` in active NVR/RTSP single-camera view to open **Camera settings** in
2152
+ terminal/native/OpenCV/HTTP. Up/down or Tab selects a field; Enter toggles a
2153
+ choice or opens text editing. Enter accepts the draft, Escape cancels editing.
2154
+ Choose **Apply changes** to send changed clock/NTP settings and read them back;
2155
+ **Reload / discard draft** fetches current values, and **Cancel / close** discards
2156
+ unapplied edits. An Apply already in progress finishes before the panel closes.
2157
+ UTC date/time uses `YYYY-MM-DD HH:MM:SS`; time zones use the camera's ONVIF/POSIX
2158
+ string, e.g. `UTC0` or `EET-2EEST`. NTP servers accept comma-separated DNS names,
2159
+ IPv4 or IPv6 addresses; DHCP-provided servers and NTP-controlled UTC are read-only.
2160
+ Unavailable NTP access is marked explicitly. Partial failures require Reload;
2161
+ the UI never claims an atomic update across the clock and NTP operations.
2162
+ HTTP Escape closes the settings panel/editor; outside it, q/Esc still pauses only
2163
+ browser refresh. The reusable client is `sciveo.network.onvif.ONVIFSettingsClient`.
2164
+ Passive sniffing never exposes these settings or sends camera requests.
2165
+
2166
+ HTTP playback serves the same widgets as HTML/CSS through
2167
+ `sciveo.ui.gui.html.HtmlRenderer` and `HttpWindow`, without a separate web widget
2168
+ set or additional server dependencies:
2169
+
2170
+ ```shell
2171
+ sciveo rtsp --url rtsp://192.168.10.179:8550/cam --play http --port 8080
2172
+ sciveo nvr --input-path cameras.json --play http --port 8080 --view grid --size 4x3
2173
+ sciveo capture --src tv --play http --port 8080
2174
+ sudo sciveo sniff --if enx00e04c360035 --proto rtsp --play http --port 8080
2175
+ ```
2176
+
2177
+ Open `http://localhost:8080/`. The configured theme and player keyboard controls
2178
+ work in the browser, including `[ theme ]`, `g`, `v`, `i`, and `s`. All connected
2179
+ browsers control one shared dashboard; the latest browser resize sets its viewport.
2180
+ `q`/Escape pauses refresh in that browser tab, keeping the last image visible;
2181
+ press it again to resume. Other tabs and the HTTP service continue running.
2182
+ Use Ctrl+C in the launching terminal to stop the service. `--view plain` hides dashboard panels.
2183
+ The HTTP port defaults to 8080 unless explicitly configured; specify the camera
2184
+ port inside `--url`, since `--port` belongs to the HTTP service in this mode.
2185
+
2186
+ Sciveo receives and decodes the camera stream, then serves binary JPEG frames at
2187
+ original decoded resolution, fitted to the video panels by CSS. JavaScript polls
2188
+ for updates (up to 10 times per second) and replaces the display after images load.
2189
+ This is a JPEG preview transport, with higher bandwidth than compressed H.264
2190
+ browser playback; it carries no audio. The last image stays visible during an
2191
+ interruption. Only the latest two rendered frames are retained. Browsers receive
2192
+ neither camera credentials nor RTSP URLs for direct playback. Sniff mode remains
2193
+ passive: HTTP displays already captured video and never connects to cameras.
2194
+
2195
+ The service defaults to `--host 127.0.0.1` and uses plain HTTP. Use `--host 0.0.0.0`
2196
+ to listen on all IPv4 interfaces, then browse `http://SERVER_IP:8080/`.
2197
+ For example, `sciveo nvr --input-path recordings.json --play http --host 0.0.0.0 --port 8080`.
2198
+ A local nginx reverse proxy
2199
+ can provide HTTPS, authentication and external access; preserve the original
2200
+ `Host` header for same-origin browser controls. No TLS or authentication is built
2201
+ into this local preview service. RTSPS sources currently require native plain
2202
+ playback instead.
2203
+
2204
+ #### NVR recording playback
2205
+
2206
+ The same dashboard can combine live `cam` / `auto` sources with recordings, or
2207
+ use a separate recording-only JSON. Add this object to the camera configuration:
2208
+
2209
+ ```json
2210
+ {
2211
+ "recordings": {
2212
+ "paths": ["/mnt/data-2/nvr/video", "/mnt/data-1/nvr/video"],
2213
+ "scan_period": 5
2214
+ }
2215
+ }
2216
+ ```
2217
+
2218
+ `recordings.paths` names the finalized video directories directly. Existing
2219
+ capture configurations also work: top-level `paths` names storage bases, so the
2220
+ viewer reads each `BASE/video`; legacy `path.video` is accepted too. An explicit
2221
+ `recordings.paths` overrides these capture paths. Optional `recordings.cameras`
2222
+ is a list of camera directory names to include. Recording-only configurations
2223
+ do not scan or connect to network cameras.
2224
+
2225
+ ```shell
2226
+ sciveo nvr --input-path recordings.json --play term --view grid --size 2x2
2227
+ sciveo nvr --input-path recordings.json --play native
2228
+ sciveo nvr --input-path recordings.json --play http --port 8080
2229
+ ```
2230
+
2231
+ The index reads the recorder's `CAMERA/YYYY-MM-DD/HH.MM.SS-HH.MM.SS.mp4`
2232
+ layout, including clips crossing midnight. Pending files and symlinks are
2233
+ ignored. Dates are recorder-local wall time from the filenames. Each video
2234
+ shows its from/to timestamps; decoded clips use their measured duration.
2235
+ Recent files refresh in the background every five seconds after the previous
2236
+ refresh finishes; a separate worker indexes full history at startup and at least
2237
+ 60 seconds between completed passes. Unchanged day listings are cached. Slow
2238
+ history reads do not block the recent-file worker or navigation.
2239
+
2240
+ Live and recorded sources appear as separate camera entries. Grid mode follows
2241
+ each archive camera's newest finalized file, holds its last image at the end,
2242
+ and switches when the next file arrives. Entering grid mode returns historical
2243
+ selections to latest. Only visible cameras and single-view neighbors decode,
2244
+ up to 20 at once; GUI/HTTP retain original video resolution.
2245
+
2246
+ The selected camera marker identifies its source in both lists and grids:
2247
+ `▶` live RTSP, `▣` recording/video file, `◉` sniffed RTP/RTSP. The selection
2248
+ highlight keeps the configured theme. Other menus keep their `>` default;
2249
+ `MenuView(marker="◆")` or `MenuView(marker=callable)` customizes that single-cell
2250
+ marker for third-party widgets.
2251
+
2252
+ In single recorded-video view, the 24-hour timeline highlights available
2253
+ recordings and shows the selected time:
2254
+
2255
+ - Left/right selects the previous/next recording file (normally about one minute).
2256
+ It uses actual file timestamps, including gaps, rather than a fixed time jump.
2257
+ - `-` / `+` adjusts it by one hour (`=` also moves forward).
2258
+ - `p` / `n` adjusts it by one day. PageUp/PageDown also works
2259
+ (Fn + Up/Down on MacBook keyboards).
2260
+ - Adjustments accumulate until ten seconds after the last keypress. The overlay
2261
+ shows the total offset, target and countdown. Left three times then `-` means
2262
+ three files back plus one hour (normally minus one hour three minutes), with
2263
+ one file opened after the pause.
2264
+ Enter applies immediately; Escape cancels the adjustment. Changing camera or
2265
+ view cancels an unapplied adjustment.
2266
+ - `b` opens date/time entry (`YYYY-MM-DD HH:MM:SS`); Enter seeks, Escape cancels.
2267
+ - `,` / `.` plays the previous/next clip; `l` jumps to the latest file at 1x
2268
+ and follows new recordings, including while an earlier seek is pending.
2269
+ - `x` cycles archive playback speed: 1x (default), 2x, 4x, 8x, 16x, 32x, 64x, then 1x.
2270
+ The timeline and key legend show the speed. Changes keep the current position
2271
+ and continue at that speed across files; live streams and latest-file playback
2272
+ stay at 1x. All speeds above 1x sample keyframes to reduce decoder work.
2273
+ Speed changes reconfigure the decoder in the background at the current position;
2274
+ display refresh stays constant. Actual throughput depends on disk and decoder performance.
2275
+ - During a seek, a flashing overlay shows the pressed key, target time and elapsed
2276
+ wait over the last frame. Further seek keys pause until a new frame or an error;
2277
+ camera selection, view changes and quit remain available.
2278
+ - `f` opens the selected video fullscreen without menus, timeline or borders;
2279
+ `f` or Escape restores the previous view. This also works for live and sniffed
2280
+ video. Native/OpenCV use display fullscreen, HTTP requests browser fullscreen,
2281
+ and terminal playback fills the terminal area. Video keeps its aspect ratio.
2282
+ - A seek starts continuous forward playback through the same camera's files,
2283
+ in timestamp order, across gaps and date boundaries. Each file starts at its
2284
+ beginning. At the end of the archive, playback retains the last frame and
2285
+ continues when the index discovers a later recording.
2286
+ - Gaps longer than one recording period (60 seconds by default, configurable as
2287
+ `recordings.period`) are marked red on the timeline. After crossing a gap, a
2288
+ **MISSING 1h 15m of videos** stripe uses red text on the theme's background
2289
+ and shows its duration and from/to times.
2290
+ Short gaps occupy at least one timeline cell so they remain visible at a
2291
+ compact width. Seeking into a gap starts the next available file, including on
2292
+ a later day. Before the archive it starts the first file; after the archive it
2293
+ starts the last file. The timeline shows the actual selected time. Only a
2294
+ camera with no available recordings shows **NO RECORDING**.
2295
+ These controls work in the terminal, native/OpenCV dashboard and HTTP viewer.
2296
+
2297
+ Navigation has one-recording-file resolution (normally one minute): the camera
2298
+ and requested date/time select a file, which always plays from its beginning.
2299
+ The timeline then shows its actual start/playback time, with no within-file seek.
2300
+ Indexed dates are reused, metadata probes run separately from decoding and are
2301
+ cached for 256 files, and file frames are paced after decoding so input startup
2302
+ is not throttled to real time. During the adjustment countdown, one background
2303
+ worker prepares the target file and holds its first frame. Confirming the seek
2304
+ reuses that decoder. Forward archive playback also prepares the next indexed
2305
+ file. Neighboring cameras retain a paused preview; only visible recordings keep
2306
+ decoding. Only current/prepared frames and bounded decoder pipes are retained;
2307
+ files are not pre-decoded into RAM.
2308
+
2309
+ All TUI/GUI/HTTP event loops are for rendering and keyboard/mouse input. Disk
2310
+ scans, network operations, decoding, metadata queries and slow cleanup belong
2311
+ to background workers. Event handlers enqueue work and render published state;
2312
+ they must not wait for a worker or hold a lock used for long-running work.
2313
+ Archive navigation uses the in-memory index, with history sorting outside its
2314
+ short snapshot lock and timeline rendering limited to the visible day.
2315
+
2316
+ Archive playback only reads files and never modifies the recording service or
2317
+ retention settings. Camera PTZ/settings controls apply only to live entries.
2318
+
2131
2319
  Third-party clients render the existing widgets with the same API:
2132
2320
 
2133
2321
  ```python
@@ -106,9 +106,9 @@ def main(argv=None):
106
106
  parser.add_argument('--net', type=str, default=None, help='Network like 192.168.10.0/24')
107
107
  parser.add_argument('--watchdog-net', action='store_true', help=argparse.SUPPRESS)
108
108
  parser.add_argument('--url', type=str, default=None, help='URL')
109
- parser.add_argument('--host', type=str, default=None, help='Host ip or name')
109
+ parser.add_argument('--host', type=str, default=None, help='Host ip or name; HTTP player bind address with --play http (default 127.0.0.1)')
110
110
  parser.add_argument('--capture-port', type=int, default=502, help='Modbus server port in the source PCAP for session emulation')
111
- parser.add_argument('--port', type=int, default=22, help='Host port number, used for network ops')
111
+ parser.add_argument('--port', type=int, default=22, help='Host port for network ops; HTTP player listen port with --play http (default 8080)')
112
112
  parser.add_argument('--s3', action='store_true', help='Run the local S3-compatible storage service')
113
113
  parser.add_argument('--sync', action='store_true', help='Synchronize local storage files with local metadata and exit when supported')
114
114
  parser.add_argument('--stats', action='store_true', help='Show local storage statistics when supported')
@@ -146,7 +146,7 @@ def main(argv=None):
146
146
  parser.add_argument('--arp', action='store_true', help='For scan --health, run ARP/neighbors and live DHCP discovery only')
147
147
  parser.add_argument('--l2', action='store_true', help='Include L2/link-local discovery for scan or scan --health')
148
148
  parser.add_argument('--interface', '--if', dest='device', type=str, default=None, help='Network interface or bridge, for example eth1 or br-1')
149
- parser.add_argument('--play', choices=('term', 'cv2', 'native'), default=None, help='Video display for any source: terminal, OpenCV, or native window')
149
+ parser.add_argument('--play', choices=('term', 'cv2', 'native', 'http'), default=None, help='Video display for any source: terminal, OpenCV, native window, or HTTP browser')
150
150
  parser.add_argument('--show-period', type=float, default=3, help='Terminal camera slideshow interval in seconds (default 3); s toggles playback')
151
151
  parser.add_argument('--view', choices=('list', 'grid', 'table', 'plain', 'packets', 'connections', 'protocols', 'transactions', 'devices', 'registers'), default=None, help='Camera dashboard, plain video, or network sniffer view')
152
152
  parser.add_argument('--max-packets', type=int, default=2000, help='Retained packet metadata records for sniffer')
@@ -333,6 +333,10 @@ def main(argv=None):
333
333
  args.period = 1
334
334
  if "proto" not in configured and not any(arg == '--proto' or arg.startswith('--proto=') for arg in argv):
335
335
  args.proto = 'all'
336
+ if args.play == 'http':
337
+ args.host = args.host or '127.0.0.1'
338
+ if not port_was_set:
339
+ args.port = 8080
336
340
  if args.command == 'admin' and not port_was_set:
337
341
  args.port = None
338
342
  if args.command == 'scan' and args.health and not parallel_was_set:
@@ -959,7 +959,9 @@ class Help:
959
959
  "options": [
960
960
  ("--interface IFACE, --if IFACE", "Interface or bridge to capture, for example eth1 or br-1."),
961
961
  ("--proto rtsp|rtp", "Both names select camera RTSP control and UDP/TCP-interleaved RTP together. Omit --proto (or use all) for the generic packet renderer."),
962
- ("--play term|cv2|native", "Use the same camera dashboard and keys in terminal, OpenCV or native SDL2 windows; GUI video keeps original resolution."),
962
+ ("--play term|cv2|native|http", "Use the same camera dashboard and keys in terminal, OpenCV native SDL2 windows or the HTTP browser; GUI video keeps original resolution."),
963
+ ("--host HOST", "HTTP player bind address with --play http. Default: 127.0.0.1; use 0.0.0.0 for all IPv4 interfaces."),
964
+ ("--port PORT", "HTTP player listen port with --play http. Default: 8080."),
963
965
  ("--show-period SECONDS", "Slideshow interval: positive, finite seconds, including fractions. Default: 3. Press s to toggle cameras in single view or pages in grid view; this option does not start it."),
964
966
  ("--cam-expiry SECONDS", "Hide cameras after this long without video: positive, finite seconds. Default: 60. Red STALE warning remains at 10 seconds; returning video restores visibility. Also available in sciveo config."),
965
967
  ("--view list|grid|table|plain", "Camera list/player, paged grid or statistics; plain shows video only in any display backend."),
@@ -987,6 +989,7 @@ class Help:
987
989
  "Live capture requires Scapy, system libpcap and OS capture permissions. Terminal images require Pillow; decoding requires FFmpeg.",
988
990
  "Playback uses captured packets only and never reconnects or authenticates to a camera. Wait for codec parameter sets and a keyframe.",
989
991
  "Strictly passive: no RTSP, ONVIF or discovery requests and no camera credentials. i cycles main captured stream, info, other captured streams from the same camera, then main. Uncaptured catalog hints are never listed or requested.",
992
+ "HTTP defaults to http://127.0.0.1:8080/; --host 0.0.0.0 allows LAN access and --port overrides the port; HTML/CSS widgets and binary JPEG frames share the same theme and keys.",
990
993
  "All displays consume decoded captured frames only, including native/OpenCV windows; they never open camera URLs. A desktop session is required for GUI windows.",
991
994
  "Model/resolution are shown only when advertised or decoded; the observed Ethernet MAC may belong to a router. FPS and Mbit/s use a rolling window; sequence gaps are capture gaps, not confirmed network loss.",
992
995
  "H.264, HEVC, AV1 and H.266/VVC RTP reassembly; other advertised formats use FFmpeg SDP/RTP. Missing decoders and decode failures name the codec. Encrypted RTSPS/SRTP cannot be decoded.",
@@ -1003,7 +1006,7 @@ class Help:
1003
1006
  ],
1004
1007
  },
1005
1008
  "nvr": {
1006
- "summary": "Record RTSP cameras or view them in a terminal without saving video.",
1009
+ "summary": "Record RTSP cameras or play live cameras and HDD recordings in the shared dashboard.",
1007
1010
  "usage": [
1008
1011
  f"{self.name} nvr --input-path CAMS_JSON",
1009
1012
  f"{self.name} nvr --input-path CAMS_JSON --play term --view grid --size 4x5",
@@ -1011,7 +1014,12 @@ class Help:
1011
1014
  "options": [
1012
1015
  ("--input-path PATH", "Camera/NVR configuration JSON file."),
1013
1016
  ("--url URL", "Single RTSP source for terminal playback instead of a camera JSON file."),
1014
- ("--play term|cv2|native", "Use the same themed camera dashboard in terminal, OpenCV or native SDL2 windows, without recording."),
1017
+ ("e (single video)", "ONVIF PTZ mode: arrows/i/j/k/m move, +/- zoom, Space stops, e returns to camera selection."),
1018
+ ("c (single video)", "Active NVR/RTSP camera settings: clock, time zone, daylight saving, NTP; Enter edits, Apply writes."),
1019
+ ("b (recorded video)", "Pick recording-local date/time, then Enter plays. Immediate seeks: Left/right -/+5min, -/+ -/+1hour (= also advances), p/n -/+1day; ,/. previous/next clip, l latest. PgUp/PgDn also changes day."),
1020
+ ("--play term|cv2|native|http", "Use the same themed camera dashboard in terminal, OpenCV native SDL2 windows or the HTTP browser, without recording."),
1021
+ ("--host HOST", "HTTP player bind address with --play http. Default: 127.0.0.1; use 0.0.0.0 for all IPv4 interfaces."),
1022
+ ("--port PORT", "HTTP player listen port with --play http. Default: 8080."),
1015
1023
  ("--show-period SECONDS", "Slideshow interval: positive, finite seconds, including fractions. Default: 3. Press s to toggle cameras in single view or pages in grid view; this option does not start it."),
1016
1024
  ("--cam-expiry SECONDS", "Hide cameras after this long without video: positive, finite seconds. Default: 60. Red STALE warning remains at 10 seconds; returning video restores visibility. Also available in sciveo config."),
1017
1025
  ("--view list|grid|table|plain", "Use the same player, paged grid and statistics as sniff; plain shows video only. Implies playback only."),
@@ -1030,7 +1038,8 @@ class Help:
1030
1038
  "Local Tapo, Hikvision, Dahua, Axis and Reolink references supplement device reports; catalog capabilities are labeled separately from current measured video. Unsupported ONVIF does not prevent playback.",
1031
1039
  "i cycles main -> camera info/configuration -> URL-ordered secondary video -> JPEG profiles -> main. Info lists profiles, model/manufacturer, firmware and camera time; PgUp/PgDn scrolls. No settings are changed. Playback uses available FFmpeg decoders.",
1032
1040
  "TCP-interleaved RTSP, Basic/Digest authentication, keepalive and reconnect. All streams are buffered. Single view prepares current/previous/next; grid decodes at most 20. Last images survive interruptions with a NO VIDEO DATA stripe until fresh video resumes.",
1033
- "Playback ignores recording/storage settings and never saves video. Without --play or --view, the existing recording behavior remains.",
1041
+ "Playback reads finalized recordings from recordings.paths, capture paths (BASE/video), or legacy path.video. Optional recordings.scan_period defaults to 5 seconds; recordings.cameras filters directory names. Recording-only JSON needs no cam/auto settings or network access.",
1042
+ "Archive grid follows newest files and shows from/to dates. Single view has a 24-hour availability timeline and b date/time entry. Files follow CAMERA/YYYY-MM-DD/HH.MM.SS-HH.MM.SS.mp4. Playback never saves video; without --play or --view, existing recording behavior remains.",
1034
1043
  "Use camera-specific RTSP paths: Tapo /stream1 or /stream2; Hikvision /Streaming/Channels/101 or /102; Dahua /cam/realmonitor?channel=1&subtype=0 or 1; Axis /axis-media/media.amp.",
1035
1044
  "Grid +/- changes layout; n/p or PageUp/PageDown changes pages; arrows/j/k selects cameras and wraps in single view; s toggles camera/grid-page slideshow (--show-period, default 3s); v video, g grid, t stats, i stream/info, q/Esc exit.",
1036
1045
  ],
@@ -1046,20 +1055,21 @@ class Help:
1046
1055
  f"{self.name} rtsp --url URL",
1047
1056
  f"{self.name} rtsp --url URL --play term",
1048
1057
  f"{self.name} rtsp --url URL --play cv2|native",
1058
+ f"{self.name} rtsp --url URL --play http --port 8080",
1049
1059
  f"{self.name} rtsp --host HOST --port PORT --stream STREAM",
1050
1060
  f"{self.name} rtsp --src SRC [--src-id ID] [--width W] [--height H] [--fps FPS]",
1051
1061
  ],
1052
1062
  "options": [
1053
1063
  ("--url URL", "RTSP URL to play."),
1054
- ("--play term|cv2|native", "Choose the shared dashboard in terminal, OpenCV or native SDL2 windows. With no --play, select from an availability-marked menu on an interactive terminal."),
1064
+ ("--play term|cv2|native|http", "Choose the shared dashboard in terminal, OpenCV native SDL2 windows or the HTTP browser. With no --play, select from an availability-marked menu on an interactive terminal."),
1055
1065
  ("--duration SECONDS", "Stop terminal, OpenCV or native FFplay playback after this positive, finite interval."),
1056
1066
  ("--show-period SECONDS", "Slideshow interval: positive, finite seconds, including fractions. Default: 3. Press s to toggle cameras in single view or pages in grid view; this option does not start it."),
1057
1067
  ("--cam-expiry SECONDS", "Hide cameras after this long without video: positive, finite seconds. Default: 60. Red STALE warning remains at 10 seconds; returning video restores visibility. Also available in sciveo config."),
1058
1068
  ("--input-path PATH", "NVR-format camera JSON for terminal playback; see nvr help."),
1059
1069
  ("--view list|grid|table|plain", "Shared camera dashboard by default; plain retains the simple video window. GUI and terminal share themes and keys."),
1060
1070
  ("--size N|COLUMNSxROWS", "Terminal grid size, maximum 4x5."),
1061
- ("--host HOST", "RTSP host or server bind host."),
1062
- ("--port PORT", "RTSP port."),
1071
+ ("--host HOST", "RTSP host or server bind host; with --play http, HTTP bind address (default 127.0.0.1; 0.0.0.0 for all IPv4 interfaces)."),
1072
+ ("--port PORT", "RTSP server port; with --play http, HTTP listen port (default 8080), so specify the camera using --url."),
1063
1073
  ("--stream STREAM", "RTSP stream path/name."),
1064
1074
  ("--src SRC", "Server source, for example color or camera source."),
1065
1075
  ("--src-id ID", "Camera/source id."),
@@ -1076,6 +1086,7 @@ class Help:
1076
1086
  "The native dashboard needs SDL2, Pillow, FFmpeg and a desktop session; OpenCV needs a GUI-enabled cv2 build. All backends use the same camera widgets, navigation, grid, info, statistics and theme. q/Esc or closing the window exits; audio is disabled.",
1077
1087
  "Use --view plain for the previous simple player: FFplay on macOS/Linux, registered RTSP handler on Windows. RTSPS currently uses this plain path. An explicit native selection skips throwaway GUI probe windows.",
1078
1088
  "OpenCV playback needs a GUI-enabled cv2 build and a display. Without a terminal, no --play selects an available GUI player.",
1089
+ "Active NVR/RTSP single video: e toggles ONVIF PTZ; arrows or i/j/k/m move; +/- zoom if supported; Space stops. Passive sniffing never controls cameras.",
1079
1090
  "The shared RTSP dashboard supports authenticated URLs in every display backend. The legacy native plain launcher disallows embedded credentials, queries and fragments. Terminal display requires POSIX terminal controls, Pillow and FFmpeg.",
1080
1091
  "ONVIF is opt-in for stream servers only. Its protocol API is sciveo.network.onvif, alongside network.modbus and network.snmp.",
1081
1092
  "onvif may be true, false or an object: host, port, advertise_host, discovery, users, identity, state_path, allow_system_time.",
@@ -1095,10 +1106,10 @@ class Help:
1095
1106
  "capture": {
1096
1107
  "summary": "Play video from a TV test pattern, file, camera, screen, Raspberry Pi camera or RTSP source.",
1097
1108
  "usage": [
1098
- f"{self.name} capture --src tv --play term|cv2|native",
1099
- f"{self.name} capture --input-path VIDEO --play term|cv2|native",
1100
- f"{self.name} capture --url RTSP_URL --play term|cv2|native",
1101
- f"{self.name} capture --src cam --src-id ID --play term|cv2|native",
1109
+ f"{self.name} capture --src tv --play term|cv2|native|http",
1110
+ f"{self.name} capture --input-path VIDEO --play term|cv2|native|http",
1111
+ f"{self.name} capture --url RTSP_URL --play term|cv2|native|http",
1112
+ f"{self.name} capture --src cam --src-id ID --play term|cv2|native|http",
1102
1113
  f"{self.name} capture --src screen [--src-id DISPLAY] [--data-json REGION]",
1103
1114
  f"{self.name} capture --src rpi [--src-id ID] [--width W] [--height H]",
1104
1115
  ],
@@ -1106,7 +1117,9 @@ class Help:
1106
1117
  ("--src cam|screen|rpi|tv", "Capture source. tv (also test/color) generates a moving FFmpeg test pattern entirely in memory."),
1107
1118
  ("--input-path VIDEO", "Play a local video file using the installed FFmpeg decoders."),
1108
1119
  ("--url RTSP_URL", "Play RTSP through the same player selection as sciveo rtsp."),
1109
- ("--play term|cv2|native", "Choose the shared dashboard display independently of the source. Omit it for the availability-marked player selector."),
1120
+ ("--play term|cv2|native|http", "Choose the shared dashboard display independently of the source. Omit it for the availability-marked player selector."),
1121
+ ("--host HOST", "HTTP player bind address with --play http. Default: 127.0.0.1; use 0.0.0.0 for all IPv4 interfaces."),
1122
+ ("--port PORT", "HTTP player listen port with --play http. Default: 8080."),
1110
1123
  ("--view list|grid|table|plain", "Use shared camera views, or plain for video without dashboard controls."),
1111
1124
  ("--duration SECONDS", "Stop after a positive, finite interval. q/Esc or closing a video window exits."),
1112
1125
  ("--theme NAME", "Shared terminal/GUI player theme; uses the global theme when omitted. [ and ] cycle themes."),
@@ -1118,6 +1131,7 @@ class Help:
1118
1131
  ],
1119
1132
  "examples": [
1120
1133
  f"{self.name} capture --src tv --play native",
1134
+ f"{self.name} capture --src tv --play http --port 8080",
1121
1135
  f"{self.name} capture --src tv --play cv2 --duration 30",
1122
1136
  f"{self.name} capture --src tv --play term --theme amber",
1123
1137
  f"{self.name} capture --input-path video.mp4 --play native",