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.
- {sciveo-0.2.99/sciveo.egg-info → sciveo-0.3.2}/PKG-INFO +192 -4
- {sciveo-0.2.99 → sciveo-0.3.2}/README.md +191 -3
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/cli.py +7 -3
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/help.py +26 -12
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/onvif.py +38 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/player.py +74 -12
- sciveo-0.3.2/sciveo/media/capture/recording_timeline.py +244 -0
- sciveo-0.3.2/sciveo/media/capture/recordings.py +577 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/rtsp_client.py +35 -3
- sciveo-0.3.2/sciveo/media/capture/settings.py +161 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/cli.py +21 -9
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/cli.py +2 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/modbus/__init__.py +2 -0
- sciveo-0.3.2/sciveo/network/modbus/catalog.py +876 -0
- sciveo-0.3.2/sciveo/network/modbus/models.py +661 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/modbus/profiles.py +25 -3
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/modbus/server.py +60 -6
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/modbus/tools.py +53 -3
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/onvif/__init__.py +3 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/onvif/client.py +9 -1
- sciveo-0.3.2/sciveo/network/onvif/ptz.py +169 -0
- sciveo-0.3.2/sciveo/network/onvif/settings.py +165 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/sniff/cli.py +4 -3
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/sniff/modbus_inventory.py +57 -4
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/sniff/streams.py +1 -1
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/sniff/terminal.py +252 -22
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/plant/modbus.py +26 -6
- sciveo-0.3.2/sciveo/ui/gui/html/__init__.py +17 -0
- sciveo-0.3.2/sciveo/ui/gui/html/client.py +114 -0
- sciveo-0.3.2/sciveo/ui/gui/html/renderer.py +75 -0
- sciveo-0.3.2/sciveo/ui/gui/html/server.py +147 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/gui/window.py +18 -4
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/term/__init__.py +2 -2
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/term/widgets.py +32 -2
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/version.py +1 -1
- {sciveo-0.2.99 → sciveo-0.3.2/sciveo.egg-info}/PKG-INFO +192 -4
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo.egg-info/SOURCES.txt +16 -0
- sciveo-0.3.2/test/test_chint_dtsu666_catalog.py +83 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_gui.py +57 -2
- sciveo-0.3.2/test/test_gui_http.py +188 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_modbus.py +148 -0
- sciveo-0.3.2/test/test_modbus_models.py +936 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_modbus_sessions.py +48 -0
- sciveo-0.3.2/test/test_onvif_ptz.py +255 -0
- sciveo-0.3.2/test/test_onvif_settings.py +335 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_plant_modbus.py +35 -0
- sciveo-0.3.2/test/test_recordings.py +1014 -0
- sciveo-0.3.2/test/test_sdm630_catalog.py +122 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_sniff.py +8 -0
- sciveo-0.3.2/test/test_sungrow_sh10rt_catalog.py +182 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_term_themes.py +12 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_video_player.py +102 -0
- sciveo-0.2.99/sciveo/network/modbus/catalog.py +0 -131
- sciveo-0.2.99/sciveo/network/modbus/models.py +0 -205
- sciveo-0.2.99/test/test_modbus_models.py +0 -147
- {sciveo-0.2.99 → sciveo-0.3.2}/MANIFEST.in +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/pyproject.toml +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/admin/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/admin/cli.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/admin/config.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/admin/device.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/admin/diagnostics.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/admin/network.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/admin/server.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/base.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/cli.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/clients/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/clients/anthropic.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/clients/gemini.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/clients/groq.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/clients/hf.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/clients/ollama.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/clients/openai.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/configurations/coder.md +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/configurations/ops.md +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/configurations/researcher.md +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/configurations/reviewer.md +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/configurations/tester.md +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/console.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/evaluation/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/evaluation/cases.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/evaluation/challenges.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/evaluation/checks.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/evaluation/local_chat.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/evaluation/preflight.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/evaluation/report.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/evaluation/runner.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/media.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/orchestration.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/protocol.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/render.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/runtime.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/specialization.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/thinking.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/tools/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/tools/images.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/tools/os.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/agents/tools/web.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/api/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/api/base.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/api/cli.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/api/ipc.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/api/prediction.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/api/predictors.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/api/server.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/api/upload.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/certification/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/certification/cli.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/certification/evaluator.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/certification/profiles.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/certification/renderer.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/certification/scenarios.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/chat/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/chat/cli.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/chat/client.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/chat/crypto.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/chat/protocol.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/chat/server.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/chat/store.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/chat/ui.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/common/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/common/configuration.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/common/model.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/common/optimizers.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/common/sampling.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/content/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/content/dataset.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/content/experiment.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/content/project.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/content/runner.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/db/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/db/read_table.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/extensions/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/extensions/assets/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/extensions/assets/vscode-sciveo-0.1.0.vsix +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/extensions/catalog.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/extensions/cli.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/iam/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/iam/access.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/iam/api.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/iam/client.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/iam/database.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/iam/identity.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/iam/policy.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/iam/users.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/industrial/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/industrial/can.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/industrial/cli.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/industrial/device.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/industrial/dlms.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/industrial/dlms_io.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/industrial/iec104.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/industrial/iec104_listener.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/industrial/iec61850.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/industrial/modbus/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/industrial/modbus_device.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/industrial/opcua.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/industrial/sdi12.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/log.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/logger.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/cam.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/cameras.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/discovery.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/draw.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/games/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/games/asteroids/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/games/asteroids/asteroid.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/games/asteroids/base_move.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/games/asteroids/circle.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/games/asteroids/game.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/games/asteroids/geometrics.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/games/asteroids/gravity_ball.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/games/asteroids/laser.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/games/asteroids/rocket.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/games/asteroids/space_asteroids.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/games/asteroids/volume_bar.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/gst_server.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/motion_detection.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/nvr.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/onvif_device.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/readers.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/rpi.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/rtp.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/rtsp.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/rtsp_scan.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/storage.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/system_player.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/capture/transcode.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/ml/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/ml/base.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/ml/encoders/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/ml/encoders/base.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/ml/encoders/normalizer.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/ml/nlp/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/ml/nlp/search.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/ml/time_series/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/ml/time_series/dataset.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/ml/time_series/predictor.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/ml/time_series/trainer.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/ml/time_series/window_generator.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/base.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/job_daemon.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/layouts/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/layouts/base.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/local.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/pipeline.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/postprocessors/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/postprocessors/base.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/postprocessors/default.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/audio/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/audio/audio.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/audio/audio_extractor_process.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/aws.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/base.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/file/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/file/archive.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/image/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/image/album.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/image/album_in_image.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/image/depth_esimation.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/image/embeddings.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/image/filters.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/image/generators.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/image/histogram.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/image/mask.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/image/object_detection.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/image/resize.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/image/segmentation.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/image/watermark.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/media_info.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/nlp/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/nlp/address.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/qr.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/sci/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/sci/base.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/sci/dataset.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/sci/time_series/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/sci/time_series/predictor.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/sci/time_series/trainer.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/tpu_base.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/video/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/video/generators.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/video/motion_detection.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/video/resize.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/video/video_album.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/video/video_frames.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/processors/video/video_resample.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/queues.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/server.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/web/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/pipelines/web/server.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/tools/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/media/tools/video_interactive.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/base.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/dataset/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/dataset/object_detection.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/energy/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/energy/optimization.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/energy/solar.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/evaluation/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/evaluation/markdown.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/evaluation/object_detection.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/images/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/images/base.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/images/description.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/images/embeddings.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/images/object_detection.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/images/sciveyolo/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/images/sciveyolo/artifact.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/images/sciveyolo/engines.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/images/sciveyolo/evaluate.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/images/sciveyolo/ipc.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/images/sciveyolo/model.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/images/sciveyolo/results.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/images/sciveyolo/runtime.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/images/sciveyolo/runtime_stats.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/images/sciveyolo/torch_net.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/images/sciveyolo/train.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/images/sciveyolo/train_checkpoint.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/images/sciveyolo/train_data.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/images/sciveyolo/train_loss.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/images/sciveyolo/train_validate.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/images/tools.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/images/transformers.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/images/vlm.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/nlp/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/nlp/embeddings.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/nlp/tokenizers/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/nlp/tokenizers/bpe.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/video/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ml/video/description.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/monitoring/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/monitoring/cli.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/monitoring/monitor.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/monitoring/plant/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/monitoring/plant/ems300.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/monitoring/plant/sim.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/monitoring/plant/tools.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/monitoring/power.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/monitoring/start.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/monitoring/watchdog/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/monitoring/watchdog/base.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/monitoring/watchdog/gateway.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/monitoring/watchdog/network.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/monitoring/watchdog/privileged.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/monitoring/watchdog/process.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/monitoring/watchdog/repair.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/camera.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/health.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/http_server.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/http_tools.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/interfaces.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/l2.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/modbus/cli.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/modbus/dashboard.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/modbus/discovery.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/modbus/session.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/modbus/sunspec.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/modbus/terminal.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/mqtt.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/mqtt_server.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/onvif/device.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/onvif/discovery.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/onvif/security.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/onvif/server.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/onvif/services.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/onvif/xml.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/selectors.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/sniff/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/sniff/av1.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/sniff/capture.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/sniff/codecs.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/sniff/inspector.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/sniff/modbus.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/sniff/modbus_cli.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/sniff/modbus_pdu.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/sniff/network_cli.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/sniff/packets.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/sniff/protocols.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/sniff/traffic.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/sniffer.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/snmp/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/snmp/oids.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/snmp/server.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/snmp/snapshot.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/snmp/tools.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/ssh.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/network/tools.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/notifications/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/notifications/base.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/notifications/slack.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/notifications/telegram.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/notifications/viber.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ops/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ops/cli.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ops/doctor.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ops/fleet.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ops/industrial.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/plant/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/plant/measurement.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/storage/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/storage/auth.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/storage/cli.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/storage/cluster/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/storage/cluster/client.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/storage/cluster/config.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/storage/cluster/controller.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/storage/cluster/gateway.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/storage/cluster/metadata.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/storage/cluster/node.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/storage/cluster/placement.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/storage/cluster/protocol.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/storage/cluster/repair.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/storage/cluster/server.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/storage/config.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/storage/cors.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/storage/filesystem.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/storage/iam.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/storage/local.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/storage/metadata.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/storage/mutation.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/storage/policy.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/storage/post.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/storage/process.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/storage/runtime.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/storage/s3.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/storage/server.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/storage/sync.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/array.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/aws/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/aws/priority_queue.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/aws/s3.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/cli.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/common.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/complexity.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/compress.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/configuration.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/configuration_cli.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/configuration_tui.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/crypto.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/daemon.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/defaults.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/draw/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/draw/contours.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/formating.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/hardware.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/http.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/logger.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/logggin.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/os.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/preferences.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/queue.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/random.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/remote.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/simple_counter.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/sorting.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/synchronized.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/timers.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/tools/totp.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/cli.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/gui/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/gui/renderer.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/html.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/tables.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/term/containers.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/term/dialogs.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/term/documents.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/term/gallery.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/term/html.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/term/images.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/term/layout.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/term/live.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/term/measurements.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/term/panels.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/term/progress.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/term/screen.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/term/selectors.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/term/status.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/term/streaming.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/term/tables.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/term/terminal.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/term/text.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/term/themes.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/ui/term/trees.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/web/__init__.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo/web/common.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo.egg-info/dependency_links.txt +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo.egg-info/entry_points.txt +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo.egg-info/requires.txt +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/sciveo.egg-info/top_level.txt +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/setup.cfg +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/setup.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_admin.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_admin_concurrency.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_agents.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_agents_chat_listener.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_agents_evaluation.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_agents_evaluation_extended.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_agents_image_integration.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_agents_orchestration.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_agents_thinking.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_api_client.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_camera_discovery.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_camera_liveness.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_certification.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_chat.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_cli_defaults.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_cli_delegation.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_cli_modules.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_cli_themes.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_complexity.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_compress.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_configuration.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_configuration_tui.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_crypto.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_eval_markdown.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_extensions_catalog.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_help.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_iam.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_iam_database.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_industrial.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_industrial_protocols.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_l2.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_log.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_media_cli.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_ml_datasets.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_ml_energy.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_ml_ipc.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_ml_sciveyolo.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_ml_vlm.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_modbus_dashboard.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_monitor_http.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_monitoring.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_network_health.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_network_interfaces.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_network_selector.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_network_sniffer.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_notifications.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_nvr.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_nvr_capture.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_nvr_faulty_video.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_nvr_transcode.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_onvif.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_onvif_server.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_ops_doctor_fleet.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_predictor_transport.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_preferences.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_protocol_emulators_integration.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_protocol_io.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_rtsp_play.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_rtsp_scan.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_rtsp_viewer.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_runner.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_sampling.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_sciveyolo_ipc.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_sniff_runtime.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_snmp.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_sorting.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_ssh.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_storage.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_storage_auth_hardening.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_storage_cluster.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_storage_cors.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_storage_iam.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_storage_iam_users.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_storage_metadata_hardening.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_storage_security_limits.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_term_containers.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_term_dialogs.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_term_documents.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_term_gallery.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_term_html.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_term_progress.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_term_reports.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_term_selectors.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_term_streaming.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_term_table_options.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_term_tables.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_term_views.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_tokenizers.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_totp.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_ui_html.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_ui_tables.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_video_codecs.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_watchdog_gateway.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_watchdog_network.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_watchdog_privileged.py +0 -0
- {sciveo-0.2.99 → sciveo-0.3.2}/test/test_watchdog_repair.py +0 -0
- {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
|
|
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.
|
|
1898
|
-
|
|
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
|
|
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.
|
|
1873
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
("
|
|
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
|
|
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
|
|
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",
|