sciveo 0.3.2__tar.gz → 0.3.3__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.3.2 → sciveo-0.3.3}/PKG-INFO +16 -3
- sciveo-0.3.2/sciveo.egg-info/PKG-INFO → sciveo-0.3.3/README.md +15 -27
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/capture/storage.py +11 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/network/sniff/terminal.py +1 -1
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/tools/defaults.py +2 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/version.py +1 -1
- sciveo-0.3.2/README.md → sciveo-0.3.3/sciveo.egg-info/PKG-INFO +40 -2
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_cli_defaults.py +18 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_nvr.py +75 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_sniff.py +1 -1
- {sciveo-0.3.2 → sciveo-0.3.3}/MANIFEST.in +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/pyproject.toml +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/admin/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/admin/cli.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/admin/config.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/admin/device.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/admin/diagnostics.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/admin/network.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/admin/server.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/agents/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/agents/base.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/agents/cli.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/agents/clients/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/agents/clients/anthropic.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/agents/clients/gemini.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/agents/clients/groq.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/agents/clients/hf.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/agents/clients/ollama.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/agents/clients/openai.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/agents/configurations/coder.md +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/agents/configurations/ops.md +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/agents/configurations/researcher.md +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/agents/configurations/reviewer.md +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/agents/configurations/tester.md +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/agents/console.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/agents/evaluation/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/agents/evaluation/cases.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/agents/evaluation/challenges.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/agents/evaluation/checks.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/agents/evaluation/local_chat.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/agents/evaluation/preflight.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/agents/evaluation/report.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/agents/evaluation/runner.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/agents/media.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/agents/orchestration.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/agents/protocol.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/agents/render.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/agents/runtime.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/agents/specialization.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/agents/thinking.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/agents/tools/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/agents/tools/images.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/agents/tools/os.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/agents/tools/web.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/api/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/api/base.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/api/cli.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/api/ipc.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/api/prediction.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/api/predictors.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/api/server.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/api/upload.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/certification/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/certification/cli.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/certification/evaluator.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/certification/profiles.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/certification/renderer.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/certification/scenarios.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/chat/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/chat/cli.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/chat/client.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/chat/crypto.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/chat/protocol.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/chat/server.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/chat/store.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/chat/ui.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/cli.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/common/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/common/configuration.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/common/model.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/common/optimizers.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/common/sampling.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/content/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/content/dataset.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/content/experiment.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/content/project.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/content/runner.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/db/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/db/read_table.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/extensions/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/extensions/assets/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/extensions/assets/vscode-sciveo-0.1.0.vsix +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/extensions/catalog.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/extensions/cli.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/help.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/iam/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/iam/access.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/iam/api.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/iam/client.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/iam/database.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/iam/identity.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/iam/policy.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/iam/users.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/industrial/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/industrial/can.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/industrial/cli.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/industrial/device.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/industrial/dlms.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/industrial/dlms_io.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/industrial/iec104.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/industrial/iec104_listener.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/industrial/iec61850.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/industrial/modbus/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/industrial/modbus_device.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/industrial/opcua.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/industrial/sdi12.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/log.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/logger.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/capture/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/capture/cam.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/capture/cameras.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/capture/discovery.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/capture/draw.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/capture/games/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/capture/games/asteroids/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/capture/games/asteroids/asteroid.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/capture/games/asteroids/base_move.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/capture/games/asteroids/circle.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/capture/games/asteroids/game.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/capture/games/asteroids/geometrics.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/capture/games/asteroids/gravity_ball.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/capture/games/asteroids/laser.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/capture/games/asteroids/rocket.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/capture/games/asteroids/space_asteroids.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/capture/games/asteroids/volume_bar.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/capture/gst_server.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/capture/motion_detection.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/capture/nvr.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/capture/onvif.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/capture/onvif_device.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/capture/player.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/capture/readers.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/capture/recording_timeline.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/capture/recordings.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/capture/rpi.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/capture/rtp.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/capture/rtsp.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/capture/rtsp_client.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/capture/rtsp_scan.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/capture/settings.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/capture/system_player.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/capture/transcode.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/cli.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/ml/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/ml/base.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/ml/encoders/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/ml/encoders/base.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/ml/encoders/normalizer.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/ml/nlp/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/ml/nlp/search.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/ml/time_series/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/ml/time_series/dataset.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/ml/time_series/predictor.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/ml/time_series/trainer.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/ml/time_series/window_generator.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/pipelines/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/pipelines/base.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/pipelines/job_daemon.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/pipelines/layouts/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/pipelines/layouts/base.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/pipelines/local.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/pipelines/pipeline.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/pipelines/postprocessors/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/pipelines/postprocessors/base.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/pipelines/postprocessors/default.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/pipelines/processors/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/pipelines/processors/audio/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/pipelines/processors/audio/audio.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/pipelines/processors/audio/audio_extractor_process.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/pipelines/processors/aws.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/pipelines/processors/base.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/pipelines/processors/file/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/pipelines/processors/file/archive.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/pipelines/processors/image/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/pipelines/processors/image/album.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/pipelines/processors/image/album_in_image.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/pipelines/processors/image/depth_esimation.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/pipelines/processors/image/embeddings.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/pipelines/processors/image/filters.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/pipelines/processors/image/generators.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/pipelines/processors/image/histogram.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/pipelines/processors/image/mask.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/pipelines/processors/image/object_detection.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/pipelines/processors/image/resize.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/pipelines/processors/image/segmentation.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/pipelines/processors/image/watermark.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/pipelines/processors/media_info.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/pipelines/processors/nlp/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/pipelines/processors/nlp/address.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/pipelines/processors/qr.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/pipelines/processors/sci/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/pipelines/processors/sci/base.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/pipelines/processors/sci/dataset.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/pipelines/processors/sci/time_series/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/pipelines/processors/sci/time_series/predictor.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/pipelines/processors/sci/time_series/trainer.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/pipelines/processors/tpu_base.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/pipelines/processors/video/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/pipelines/processors/video/generators.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/pipelines/processors/video/motion_detection.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/pipelines/processors/video/resize.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/pipelines/processors/video/video_album.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/pipelines/processors/video/video_frames.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/pipelines/processors/video/video_resample.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/pipelines/queues.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/pipelines/server.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/pipelines/web/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/pipelines/web/server.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/tools/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/media/tools/video_interactive.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ml/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ml/base.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ml/dataset/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ml/dataset/object_detection.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ml/energy/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ml/energy/optimization.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ml/energy/solar.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ml/evaluation/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ml/evaluation/markdown.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ml/evaluation/object_detection.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ml/images/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ml/images/base.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ml/images/description.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ml/images/embeddings.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ml/images/object_detection.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ml/images/sciveyolo/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ml/images/sciveyolo/artifact.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ml/images/sciveyolo/engines.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ml/images/sciveyolo/evaluate.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ml/images/sciveyolo/ipc.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ml/images/sciveyolo/model.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ml/images/sciveyolo/results.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ml/images/sciveyolo/runtime.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ml/images/sciveyolo/runtime_stats.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ml/images/sciveyolo/torch_net.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ml/images/sciveyolo/train.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ml/images/sciveyolo/train_checkpoint.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ml/images/sciveyolo/train_data.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ml/images/sciveyolo/train_loss.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ml/images/sciveyolo/train_validate.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ml/images/tools.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ml/images/transformers.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ml/images/vlm.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ml/nlp/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ml/nlp/embeddings.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ml/nlp/tokenizers/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ml/nlp/tokenizers/bpe.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ml/video/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ml/video/description.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/monitoring/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/monitoring/cli.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/monitoring/monitor.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/monitoring/plant/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/monitoring/plant/ems300.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/monitoring/plant/sim.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/monitoring/plant/tools.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/monitoring/power.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/monitoring/start.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/monitoring/watchdog/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/monitoring/watchdog/base.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/monitoring/watchdog/gateway.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/monitoring/watchdog/network.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/monitoring/watchdog/privileged.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/monitoring/watchdog/process.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/monitoring/watchdog/repair.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/network/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/network/camera.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/network/cli.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/network/health.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/network/http_server.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/network/http_tools.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/network/interfaces.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/network/l2.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/network/modbus/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/network/modbus/catalog.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/network/modbus/cli.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/network/modbus/dashboard.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/network/modbus/discovery.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/network/modbus/models.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/network/modbus/profiles.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/network/modbus/server.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/network/modbus/session.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/network/modbus/sunspec.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/network/modbus/terminal.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/network/modbus/tools.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/network/mqtt.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/network/mqtt_server.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/network/onvif/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/network/onvif/client.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/network/onvif/device.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/network/onvif/discovery.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/network/onvif/ptz.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/network/onvif/security.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/network/onvif/server.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/network/onvif/services.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/network/onvif/settings.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/network/onvif/xml.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/network/selectors.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/network/sniff/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/network/sniff/av1.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/network/sniff/capture.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/network/sniff/cli.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/network/sniff/codecs.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/network/sniff/inspector.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/network/sniff/modbus.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/network/sniff/modbus_cli.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/network/sniff/modbus_inventory.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/network/sniff/modbus_pdu.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/network/sniff/network_cli.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/network/sniff/packets.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/network/sniff/protocols.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/network/sniff/streams.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/network/sniff/traffic.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/network/sniffer.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/network/snmp/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/network/snmp/oids.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/network/snmp/server.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/network/snmp/snapshot.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/network/snmp/tools.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/network/ssh.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/network/tools.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/notifications/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/notifications/base.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/notifications/slack.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/notifications/telegram.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/notifications/viber.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ops/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ops/cli.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ops/doctor.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ops/fleet.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ops/industrial.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/plant/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/plant/measurement.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/plant/modbus.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/storage/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/storage/auth.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/storage/cli.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/storage/cluster/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/storage/cluster/client.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/storage/cluster/config.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/storage/cluster/controller.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/storage/cluster/gateway.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/storage/cluster/metadata.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/storage/cluster/node.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/storage/cluster/placement.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/storage/cluster/protocol.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/storage/cluster/repair.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/storage/cluster/server.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/storage/config.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/storage/cors.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/storage/filesystem.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/storage/iam.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/storage/local.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/storage/metadata.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/storage/mutation.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/storage/policy.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/storage/post.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/storage/process.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/storage/runtime.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/storage/s3.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/storage/server.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/storage/sync.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/tools/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/tools/array.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/tools/aws/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/tools/aws/priority_queue.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/tools/aws/s3.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/tools/cli.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/tools/common.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/tools/complexity.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/tools/compress.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/tools/configuration.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/tools/configuration_cli.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/tools/configuration_tui.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/tools/crypto.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/tools/daemon.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/tools/draw/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/tools/draw/contours.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/tools/formating.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/tools/hardware.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/tools/http.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/tools/logger.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/tools/logggin.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/tools/os.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/tools/preferences.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/tools/queue.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/tools/random.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/tools/remote.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/tools/simple_counter.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/tools/sorting.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/tools/synchronized.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/tools/timers.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/tools/totp.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ui/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ui/cli.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ui/gui/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ui/gui/html/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ui/gui/html/client.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ui/gui/html/renderer.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ui/gui/html/server.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ui/gui/renderer.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ui/gui/window.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ui/html.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ui/tables.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ui/term/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ui/term/containers.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ui/term/dialogs.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ui/term/documents.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ui/term/gallery.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ui/term/html.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ui/term/images.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ui/term/layout.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ui/term/live.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ui/term/measurements.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ui/term/panels.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ui/term/progress.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ui/term/screen.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ui/term/selectors.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ui/term/status.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ui/term/streaming.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ui/term/tables.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ui/term/terminal.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ui/term/text.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ui/term/themes.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ui/term/trees.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/ui/term/widgets.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/web/__init__.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo/web/common.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo.egg-info/SOURCES.txt +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo.egg-info/dependency_links.txt +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo.egg-info/entry_points.txt +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo.egg-info/requires.txt +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/sciveo.egg-info/top_level.txt +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/setup.cfg +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/setup.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_admin.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_admin_concurrency.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_agents.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_agents_chat_listener.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_agents_evaluation.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_agents_evaluation_extended.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_agents_image_integration.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_agents_orchestration.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_agents_thinking.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_api_client.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_camera_discovery.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_camera_liveness.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_certification.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_chat.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_chint_dtsu666_catalog.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_cli_delegation.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_cli_modules.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_cli_themes.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_complexity.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_compress.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_configuration.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_configuration_tui.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_crypto.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_eval_markdown.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_extensions_catalog.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_gui.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_gui_http.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_help.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_iam.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_iam_database.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_industrial.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_industrial_protocols.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_l2.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_log.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_media_cli.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_ml_datasets.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_ml_energy.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_ml_ipc.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_ml_sciveyolo.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_ml_vlm.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_modbus.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_modbus_dashboard.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_modbus_models.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_modbus_sessions.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_monitor_http.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_monitoring.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_network_health.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_network_interfaces.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_network_selector.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_network_sniffer.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_notifications.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_nvr_capture.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_nvr_faulty_video.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_nvr_transcode.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_onvif.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_onvif_ptz.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_onvif_server.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_onvif_settings.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_ops_doctor_fleet.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_plant_modbus.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_predictor_transport.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_preferences.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_protocol_emulators_integration.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_protocol_io.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_recordings.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_rtsp_play.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_rtsp_scan.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_rtsp_viewer.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_runner.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_sampling.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_sciveyolo_ipc.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_sdm630_catalog.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_sniff_runtime.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_snmp.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_sorting.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_ssh.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_storage.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_storage_auth_hardening.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_storage_cluster.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_storage_cors.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_storage_iam.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_storage_iam_users.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_storage_metadata_hardening.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_storage_security_limits.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_sungrow_sh10rt_catalog.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_term_containers.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_term_dialogs.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_term_documents.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_term_gallery.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_term_html.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_term_progress.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_term_reports.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_term_selectors.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_term_streaming.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_term_table_options.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_term_tables.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_term_themes.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_term_views.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_tokenizers.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_totp.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_ui_html.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_ui_tables.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_video_codecs.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_video_player.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_watchdog_gateway.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_watchdog_network.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_watchdog_privileged.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_watchdog_repair.py +0 -0
- {sciveo-0.3.2 → sciveo-0.3.3}/test/test_watchdog_service.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: sciveo
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.3
|
|
4
4
|
Description-Content-Type: text/markdown
|
|
5
5
|
Provides-Extra: mon
|
|
6
6
|
Provides-Extra: agent
|
|
@@ -2396,6 +2396,19 @@ staging, and `BASE/video` for retained recordings. No separate `tmp`, `video`,
|
|
|
2396
2396
|
`motion.src`, or `motion.dst` paths are needed. Camera-specific motion settings
|
|
2397
2397
|
remain under `motion`.
|
|
2398
2398
|
|
|
2399
|
+
To keep temporary video I/O in RAM while retaining recordings on those HDD roots,
|
|
2400
|
+
set `"temp_path": "/mnt/nvr-ram"` to a separately mounted, size-limited tmpfs.
|
|
2401
|
+
Capture, motion processing and upload staging then use `TEMP/tmp2`, `TEMP/tmp3`
|
|
2402
|
+
and `TEMP/tmp4`; archives still use the ordered `BASE/video` roots and their
|
|
2403
|
+
capacity-based cleanup. The same free-space reserve applies to the temporary
|
|
2404
|
+
filesystem, so size it above that reserve plus the expected queued video volume.
|
|
2405
|
+
When temporary space runs low, capture waits while processing drains the queues;
|
|
2406
|
+
it does not switch temporary writes onto an HDD or delete archives to free RAM.
|
|
2407
|
+
Make the NVR service require the tmpfs mount at boot. RAM queues are volatile
|
|
2408
|
+
across reboot; finalized HDD archives remain persistent. Existing HDD queues are
|
|
2409
|
+
not moved or deleted when changing `temp_path`. Point external uploaders at
|
|
2410
|
+
`TEMP/tmp4` when this option is enabled.
|
|
2411
|
+
|
|
2399
2412
|
Optional per-stage transcoding is disabled unless configured. Put `transcode`
|
|
2400
2413
|
under `cam.CAMERA` to transcode every completed clip before archival and motion
|
|
2401
2414
|
processing. Put it under `motion.CAMERA` to transcode **only motion-selected**
|
|
@@ -2432,7 +2445,7 @@ processing continues without repeatedly encoding the same failed clip. Storage
|
|
|
2432
2445
|
write failures retain the source for retry; no incomplete MP4 enters the uploader
|
|
2433
2446
|
queue. An all-zero motion grid skips video decoding entirely.
|
|
2434
2447
|
|
|
2435
|
-
|
|
2448
|
+
Stages without a separate `temp_path` use the first available root in list order, skipping absent, unmounted,
|
|
2436
2449
|
or unwritable roots. Low space does not cause fallback. Free space must cover
|
|
2437
2450
|
both the incoming clip and the larger of `min_free_bytes` and `min_free_ratio`
|
|
2438
2451
|
(defaults: 1 GiB and 5%). Capture rechecks
|
|
@@ -2473,7 +2486,7 @@ With no usable root, capture waits and queued files are retained until storage
|
|
|
2473
2486
|
recovers. This provides fallback, not replication: clips already on a disconnected
|
|
2474
2487
|
disk become available again when that disk returns.
|
|
2475
2488
|
|
|
2476
|
-
|
|
2489
|
+
Without `temp_path`, external uploaders must watch `BASE/tmp4` on **every** configured root, including
|
|
2477
2490
|
roots that recover after startup. Existing queued files are not relocated when
|
|
2478
2491
|
migrating configurations. Legacy single-directory `path.tmp`, `path.video`,
|
|
2479
2492
|
`motion.src`, and `motion.dst` configurations remain supported when `paths` is
|
|
@@ -1,28 +1,3 @@
|
|
|
1
|
-
Metadata-Version: 2.1
|
|
2
|
-
Name: sciveo
|
|
3
|
-
Version: 0.3.2
|
|
4
|
-
Description-Content-Type: text/markdown
|
|
5
|
-
Provides-Extra: mon
|
|
6
|
-
Provides-Extra: agent
|
|
7
|
-
Provides-Extra: agent-local
|
|
8
|
-
Provides-Extra: net
|
|
9
|
-
Provides-Extra: server
|
|
10
|
-
Provides-Extra: storage
|
|
11
|
-
Provides-Extra: storage-postgres
|
|
12
|
-
Provides-Extra: chat
|
|
13
|
-
Provides-Extra: media
|
|
14
|
-
Provides-Extra: media-ml
|
|
15
|
-
Provides-Extra: sciveyolo
|
|
16
|
-
Provides-Extra: sciveyolo-gpu
|
|
17
|
-
Provides-Extra: sciveyolo-trt
|
|
18
|
-
Provides-Extra: web
|
|
19
|
-
Provides-Extra: db
|
|
20
|
-
Provides-Extra: power
|
|
21
|
-
Provides-Extra: industrial
|
|
22
|
-
Provides-Extra: energy
|
|
23
|
-
Provides-Extra: all
|
|
24
|
-
Provides-Extra: ml
|
|
25
|
-
|
|
26
1
|
# SCIVEO
|
|
27
2
|
|
|
28
3
|
Sciveo is a Python toolkit and CLI for ML/AI workflows, engineering automation,
|
|
@@ -2396,6 +2371,19 @@ staging, and `BASE/video` for retained recordings. No separate `tmp`, `video`,
|
|
|
2396
2371
|
`motion.src`, or `motion.dst` paths are needed. Camera-specific motion settings
|
|
2397
2372
|
remain under `motion`.
|
|
2398
2373
|
|
|
2374
|
+
To keep temporary video I/O in RAM while retaining recordings on those HDD roots,
|
|
2375
|
+
set `"temp_path": "/mnt/nvr-ram"` to a separately mounted, size-limited tmpfs.
|
|
2376
|
+
Capture, motion processing and upload staging then use `TEMP/tmp2`, `TEMP/tmp3`
|
|
2377
|
+
and `TEMP/tmp4`; archives still use the ordered `BASE/video` roots and their
|
|
2378
|
+
capacity-based cleanup. The same free-space reserve applies to the temporary
|
|
2379
|
+
filesystem, so size it above that reserve plus the expected queued video volume.
|
|
2380
|
+
When temporary space runs low, capture waits while processing drains the queues;
|
|
2381
|
+
it does not switch temporary writes onto an HDD or delete archives to free RAM.
|
|
2382
|
+
Make the NVR service require the tmpfs mount at boot. RAM queues are volatile
|
|
2383
|
+
across reboot; finalized HDD archives remain persistent. Existing HDD queues are
|
|
2384
|
+
not moved or deleted when changing `temp_path`. Point external uploaders at
|
|
2385
|
+
`TEMP/tmp4` when this option is enabled.
|
|
2386
|
+
|
|
2399
2387
|
Optional per-stage transcoding is disabled unless configured. Put `transcode`
|
|
2400
2388
|
under `cam.CAMERA` to transcode every completed clip before archival and motion
|
|
2401
2389
|
processing. Put it under `motion.CAMERA` to transcode **only motion-selected**
|
|
@@ -2432,7 +2420,7 @@ processing continues without repeatedly encoding the same failed clip. Storage
|
|
|
2432
2420
|
write failures retain the source for retry; no incomplete MP4 enters the uploader
|
|
2433
2421
|
queue. An all-zero motion grid skips video decoding entirely.
|
|
2434
2422
|
|
|
2435
|
-
|
|
2423
|
+
Stages without a separate `temp_path` use the first available root in list order, skipping absent, unmounted,
|
|
2436
2424
|
or unwritable roots. Low space does not cause fallback. Free space must cover
|
|
2437
2425
|
both the incoming clip and the larger of `min_free_bytes` and `min_free_ratio`
|
|
2438
2426
|
(defaults: 1 GiB and 5%). Capture rechecks
|
|
@@ -2473,7 +2461,7 @@ With no usable root, capture waits and queued files are retained until storage
|
|
|
2473
2461
|
recovers. This provides fallback, not replication: clips already on a disconnected
|
|
2474
2462
|
disk become available again when that disk returns.
|
|
2475
2463
|
|
|
2476
|
-
|
|
2464
|
+
Without `temp_path`, external uploaders must watch `BASE/tmp4` on **every** configured root, including
|
|
2477
2465
|
roots that recover after startup. Existing queued files are not relocated when
|
|
2478
2466
|
migrating configurations. Legacy single-directory `path.tmp`, `path.video`,
|
|
2479
2467
|
`motion.src`, and `motion.dst` configurations remain supported when `paths` is
|
|
@@ -25,6 +25,11 @@ from sciveo.tools.queue import TouchedFilePathQueue
|
|
|
25
25
|
class VideoStorage:
|
|
26
26
|
def __init__(self, configuration):
|
|
27
27
|
self.roots = configuration.get("paths")
|
|
28
|
+
self.temp_root = configuration.get("temp_path")
|
|
29
|
+
if self.temp_root is not None:
|
|
30
|
+
if not isinstance(self.temp_root, str) or not self.temp_root.strip():
|
|
31
|
+
raise ValueError("NVR temp_path must be a nonempty directory path")
|
|
32
|
+
self.temp_root = os.path.abspath(self.temp_root)
|
|
28
33
|
self.min_free_ratio = float(configuration.get("min_free_ratio", 0.05 if self.roots is not None else 0))
|
|
29
34
|
self.min_free_bytes = int(configuration.get("min_free_bytes", 1073741824 if self.roots is not None else 0))
|
|
30
35
|
self.cleanup_free_bytes = int(configuration.get("cleanup_free_bytes", 1073741824 if self.roots is not None else 0))
|
|
@@ -47,6 +52,8 @@ class VideoStorage:
|
|
|
47
52
|
raise ValueError("Use top-level paths for NVR storage roots")
|
|
48
53
|
|
|
49
54
|
def locations(self, stage):
|
|
55
|
+
if self.temp_root is not None and stage in ("tmp2", "tmp3", "tmp4"):
|
|
56
|
+
return [(self.temp_root, os.path.join(self.temp_root, stage))]
|
|
50
57
|
if self.roots is not None:
|
|
51
58
|
return [(root, os.path.join(root, stage)) for root in self.roots]
|
|
52
59
|
path = self.legacy_paths.get(stage)
|
|
@@ -146,6 +153,8 @@ class VideoStorage:
|
|
|
146
153
|
return None
|
|
147
154
|
|
|
148
155
|
def start_cleanup(self, root, stage, required_bytes):
|
|
156
|
+
if root == self.temp_root and stage in ("tmp2", "tmp3", "tmp4"):
|
|
157
|
+
return
|
|
149
158
|
if not self.cleanup_free_bytes or self.writable(root, required_bytes + self.cleanup_free_bytes // 2):
|
|
150
159
|
return
|
|
151
160
|
if self.cleanup_lock.acquire(blocking=False):
|
|
@@ -195,6 +204,8 @@ class VideoStorage:
|
|
|
195
204
|
warning("NVR empty archive cleanup failed", path, e.errno)
|
|
196
205
|
|
|
197
206
|
def clean_old_videos(self, root, stage, required_bytes, force=False):
|
|
207
|
+
if root == self.temp_root and stage in ("tmp2", "tmp3", "tmp4"):
|
|
208
|
+
return
|
|
198
209
|
selected_path = dict(self.locations(stage))[root]
|
|
199
210
|
if not self.available(root, selected_path):
|
|
200
211
|
return
|
|
@@ -280,7 +280,7 @@ class CameraDashboard:
|
|
|
280
280
|
|
|
281
281
|
@staticmethod
|
|
282
282
|
def selection_marker(record):
|
|
283
|
-
return {'rtsp': '▶', 'file': '
|
|
283
|
+
return {'rtsp': '▶', 'file': '▷', 'sniff': '»'}.get(record.get('source_kind'), '>')
|
|
284
284
|
|
|
285
285
|
@staticmethod
|
|
286
286
|
def label(record):
|
|
@@ -124,6 +124,8 @@ class CLIOptions:
|
|
|
124
124
|
for word in argv:
|
|
125
125
|
if word.startswith("-"):
|
|
126
126
|
option = self.parser._parse_optional(word)
|
|
127
|
+
if isinstance(option, list): # Python 3.12.11+ returns a list of matches.
|
|
128
|
+
option = option[0] if len(option) == 1 else None
|
|
127
129
|
if option and option[0] is not None:
|
|
128
130
|
explicit.add(option[0].dest)
|
|
129
131
|
command = "sniff" if args.command == "sniffer" else args.command
|
|
@@ -1,3 +1,28 @@
|
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
|
+
Name: sciveo
|
|
3
|
+
Version: 0.3.3
|
|
4
|
+
Description-Content-Type: text/markdown
|
|
5
|
+
Provides-Extra: mon
|
|
6
|
+
Provides-Extra: agent
|
|
7
|
+
Provides-Extra: agent-local
|
|
8
|
+
Provides-Extra: net
|
|
9
|
+
Provides-Extra: server
|
|
10
|
+
Provides-Extra: storage
|
|
11
|
+
Provides-Extra: storage-postgres
|
|
12
|
+
Provides-Extra: chat
|
|
13
|
+
Provides-Extra: media
|
|
14
|
+
Provides-Extra: media-ml
|
|
15
|
+
Provides-Extra: sciveyolo
|
|
16
|
+
Provides-Extra: sciveyolo-gpu
|
|
17
|
+
Provides-Extra: sciveyolo-trt
|
|
18
|
+
Provides-Extra: web
|
|
19
|
+
Provides-Extra: db
|
|
20
|
+
Provides-Extra: power
|
|
21
|
+
Provides-Extra: industrial
|
|
22
|
+
Provides-Extra: energy
|
|
23
|
+
Provides-Extra: all
|
|
24
|
+
Provides-Extra: ml
|
|
25
|
+
|
|
1
26
|
# SCIVEO
|
|
2
27
|
|
|
3
28
|
Sciveo is a Python toolkit and CLI for ML/AI workflows, engineering automation,
|
|
@@ -2371,6 +2396,19 @@ staging, and `BASE/video` for retained recordings. No separate `tmp`, `video`,
|
|
|
2371
2396
|
`motion.src`, or `motion.dst` paths are needed. Camera-specific motion settings
|
|
2372
2397
|
remain under `motion`.
|
|
2373
2398
|
|
|
2399
|
+
To keep temporary video I/O in RAM while retaining recordings on those HDD roots,
|
|
2400
|
+
set `"temp_path": "/mnt/nvr-ram"` to a separately mounted, size-limited tmpfs.
|
|
2401
|
+
Capture, motion processing and upload staging then use `TEMP/tmp2`, `TEMP/tmp3`
|
|
2402
|
+
and `TEMP/tmp4`; archives still use the ordered `BASE/video` roots and their
|
|
2403
|
+
capacity-based cleanup. The same free-space reserve applies to the temporary
|
|
2404
|
+
filesystem, so size it above that reserve plus the expected queued video volume.
|
|
2405
|
+
When temporary space runs low, capture waits while processing drains the queues;
|
|
2406
|
+
it does not switch temporary writes onto an HDD or delete archives to free RAM.
|
|
2407
|
+
Make the NVR service require the tmpfs mount at boot. RAM queues are volatile
|
|
2408
|
+
across reboot; finalized HDD archives remain persistent. Existing HDD queues are
|
|
2409
|
+
not moved or deleted when changing `temp_path`. Point external uploaders at
|
|
2410
|
+
`TEMP/tmp4` when this option is enabled.
|
|
2411
|
+
|
|
2374
2412
|
Optional per-stage transcoding is disabled unless configured. Put `transcode`
|
|
2375
2413
|
under `cam.CAMERA` to transcode every completed clip before archival and motion
|
|
2376
2414
|
processing. Put it under `motion.CAMERA` to transcode **only motion-selected**
|
|
@@ -2407,7 +2445,7 @@ processing continues without repeatedly encoding the same failed clip. Storage
|
|
|
2407
2445
|
write failures retain the source for retry; no incomplete MP4 enters the uploader
|
|
2408
2446
|
queue. An all-zero motion grid skips video decoding entirely.
|
|
2409
2447
|
|
|
2410
|
-
|
|
2448
|
+
Stages without a separate `temp_path` use the first available root in list order, skipping absent, unmounted,
|
|
2411
2449
|
or unwritable roots. Low space does not cause fallback. Free space must cover
|
|
2412
2450
|
both the incoming clip and the larger of `min_free_bytes` and `min_free_ratio`
|
|
2413
2451
|
(defaults: 1 GiB and 5%). Capture rechecks
|
|
@@ -2448,7 +2486,7 @@ With no usable root, capture waits and queued files are retained until storage
|
|
|
2448
2486
|
recovers. This provides fallback, not replication: clips already on a disconnected
|
|
2449
2487
|
disk become available again when that disk returns.
|
|
2450
2488
|
|
|
2451
|
-
|
|
2489
|
+
Without `temp_path`, external uploaders must watch `BASE/tmp4` on **every** configured root, including
|
|
2452
2490
|
roots that recover after startup. Existing queued files are not relocated when
|
|
2453
2491
|
migrating configurations. Legacy single-directory `path.tmp`, `path.video`,
|
|
2454
2492
|
`motion.src`, and `motion.dst` configurations remain supported when `paths` is
|
|
@@ -54,6 +54,24 @@ class TestCLIOptions(unittest.TestCase):
|
|
|
54
54
|
args, _ = self.arguments("scan")
|
|
55
55
|
self.assertEqual((args.timeout, args.theme), (2, "light"))
|
|
56
56
|
|
|
57
|
+
def test_explicit_options_support_old_and_new_argparse_results(self):
|
|
58
|
+
self.preferences.update({"scan.port": "22", "timeout": "7", "local-echo": "false", "theme": "amber"})
|
|
59
|
+
options = self.definitions(self.preferences)
|
|
60
|
+
argv = ["scan", "--port", "502", "--timeo=-2", "--handle-local-echo"]
|
|
61
|
+
matches = [(options.actions["port"], "--port", None, None),
|
|
62
|
+
(options.actions["timeout"], "--timeout", "=", "-2"),
|
|
63
|
+
(options.actions["local-echo"], "--handle-local-echo", None, None)]
|
|
64
|
+
for result_type in ("tuple", "list"):
|
|
65
|
+
with self.subTest(result_type=result_type):
|
|
66
|
+
args = options.parser.parse_args(argv)
|
|
67
|
+
results = [(action, name, value) for action, name, _, value in matches]
|
|
68
|
+
if result_type == "list":
|
|
69
|
+
results = [[match] for match in matches]
|
|
70
|
+
with patch.object(options.parser, "_parse_optional", side_effect=results):
|
|
71
|
+
applied = options.apply(args, argv)
|
|
72
|
+
self.assertEqual((args.port, args.timeout, args.handle_local_echo, args.theme), (502, -2, True, "amber"))
|
|
73
|
+
self.assertEqual(applied, {"theme"})
|
|
74
|
+
|
|
57
75
|
def test_camera_expiry_global_command_and_explicit_precedence(self):
|
|
58
76
|
options = self.definitions()
|
|
59
77
|
for command in ("sniff", "nvr", "rtsp"):
|
|
@@ -69,6 +69,81 @@ class TestNVRStorage(unittest.TestCase):
|
|
|
69
69
|
self.assertEqual(storage.select(stage), str(base / stage))
|
|
70
70
|
self.assertTrue((base / stage).is_dir())
|
|
71
71
|
|
|
72
|
+
def test_temp_path_separates_queues_from_archive_and_motion_uses_it(self):
|
|
73
|
+
temporary = self.base / "ram"
|
|
74
|
+
self.configuration["temp_path"] = str(temporary)
|
|
75
|
+
recorder = self.recorder()
|
|
76
|
+
self.assertIs(recorder.daemons[0].storage, recorder.storage)
|
|
77
|
+
for stage in ("tmp2", "tmp3", "tmp4"):
|
|
78
|
+
self.assertEqual(recorder.storage.select(stage), str(temporary / stage))
|
|
79
|
+
self.assertEqual(recorder.storage.locations(stage), [(str(temporary), str(temporary / stage))])
|
|
80
|
+
self.assertEqual(recorder.storage.select("video"), str(self.first / "video"))
|
|
81
|
+
|
|
82
|
+
def test_temp_capture_archives_on_disk_and_motion_stays_in_temp(self):
|
|
83
|
+
temporary = self.base / "ram"
|
|
84
|
+
self.configuration["temp_path"] = str(temporary)
|
|
85
|
+
recorder = self.recorder()
|
|
86
|
+
source = self.clip(temporary)
|
|
87
|
+
recorder.process_file(source.name, str(source))
|
|
88
|
+
archive = self.first / "video/cam/2026-09-28/10.00.00-10.01.00.mp4"
|
|
89
|
+
motion = temporary / "tmp3/cam___2026-09-28___10.00.00-10.01.00.mp4"
|
|
90
|
+
self.assertEqual(archive.read_bytes(), motion.read_bytes())
|
|
91
|
+
self.assertFalse(source.exists())
|
|
92
|
+
self.assertFalse((self.first / "tmp3").exists())
|
|
93
|
+
|
|
94
|
+
def test_full_temp_path_preserves_archives_and_queues_without_hdd_fallback(self):
|
|
95
|
+
temporary = self.base / "ram"
|
|
96
|
+
self.configuration.update(temp_path=str(temporary), min_free_bytes=1, cleanup_free_bytes=20)
|
|
97
|
+
storage = VideoStorage(self.configuration)
|
|
98
|
+
queued = self.clip(temporary)
|
|
99
|
+
archive = self.archive(self.first, "2020-01-01")
|
|
100
|
+
usage = shutil.disk_usage(self.first)
|
|
101
|
+
with patch("sciveo.media.capture.storage.shutil.disk_usage", return_value=usage._replace(free=0)):
|
|
102
|
+
self.assertIsNone(storage.select("tmp2"))
|
|
103
|
+
storage.clean_old_videos(str(temporary), "tmp2", 10, force=True)
|
|
104
|
+
self.assertTrue(archive.exists())
|
|
105
|
+
self.assertTrue(queued.exists())
|
|
106
|
+
self.assertIsNone(storage.cleanup_thread)
|
|
107
|
+
self.assertEqual(storage.select("tmp2"), str(temporary / "tmp2"))
|
|
108
|
+
|
|
109
|
+
def test_missing_temp_mount_cannot_fall_back_to_system_disk(self):
|
|
110
|
+
temporary = self.base / "unmounted/nvr"
|
|
111
|
+
self.configuration.update(temp_path=str(temporary), allow_root_disk=False)
|
|
112
|
+
storage = VideoStorage(self.configuration)
|
|
113
|
+
with patch.object(storage, "allowed", return_value=False):
|
|
114
|
+
self.assertIsNone(storage.select("tmp2"))
|
|
115
|
+
self.assertFalse(temporary.exists())
|
|
116
|
+
|
|
117
|
+
def test_temp_path_does_not_change_archive_fallback(self):
|
|
118
|
+
temporary = self.base / "ram"
|
|
119
|
+
self.configuration["temp_path"] = str(temporary)
|
|
120
|
+
storage = VideoStorage(self.configuration)
|
|
121
|
+
available = storage.available
|
|
122
|
+
with patch.object(storage, "available", side_effect=lambda root, path: root != str(self.first) and available(root, path)):
|
|
123
|
+
self.assertEqual(storage.select("video"), str(self.second / "video"))
|
|
124
|
+
self.assertEqual(storage.select("tmp2"), str(temporary / "tmp2"))
|
|
125
|
+
|
|
126
|
+
def test_temp_space_pressure_does_not_start_archive_cleanup(self):
|
|
127
|
+
temporary = self.base / "ram"
|
|
128
|
+
self.configuration.update(temp_path=str(temporary), cleanup_free_bytes=10**20)
|
|
129
|
+
storage = VideoStorage(self.configuration)
|
|
130
|
+
with patch.object(storage, "run_cleanup") as cleanup:
|
|
131
|
+
self.assertEqual(storage.select("tmp2"), str(temporary / "tmp2"))
|
|
132
|
+
cleanup.assert_not_called()
|
|
133
|
+
self.assertIsNone(storage.cleanup_thread)
|
|
134
|
+
|
|
135
|
+
def test_invalid_temp_paths_are_rejected(self):
|
|
136
|
+
for value in ("", " ", [], 1, False):
|
|
137
|
+
with self.subTest(value=value), self.assertRaises(ValueError):
|
|
138
|
+
VideoStorage(dict(self.configuration, temp_path=value))
|
|
139
|
+
|
|
140
|
+
def test_temp_root_matching_archive_root_still_allows_archive_cleanup(self):
|
|
141
|
+
self.storage.temp_root = str(self.first)
|
|
142
|
+
old = self.archive(self.first, "2020-01-01")
|
|
143
|
+
with self.capacity({self.first: 0, self.second: 100}):
|
|
144
|
+
self.assertEqual(self.storage.select("video"), str(self.first / "video"))
|
|
145
|
+
self.assertFalse(old.exists())
|
|
146
|
+
|
|
72
147
|
def test_missing_drive_cannot_create_directories_on_root_disk_by_default(self):
|
|
73
148
|
missing = self.base / "data-10/nvr"
|
|
74
149
|
self.configuration["paths"] = [str(missing)]
|
|
@@ -555,7 +555,7 @@ class TestSniffTerminal(unittest.TestCase):
|
|
|
555
555
|
|
|
556
556
|
def test_selection_marker_identifies_stream_source_in_list_and_grid(self):
|
|
557
557
|
self.assertTrue(all(record['source_kind'] == 'sniff' for record in self.records))
|
|
558
|
-
for source, marker in (('rtsp', '▶'), ('file', '
|
|
558
|
+
for source, marker in (('rtsp', '▶'), ('file', '▷'), ('sniff', '»')):
|
|
559
559
|
record = dict(self.records[0], source_kind=source)
|
|
560
560
|
for mode in ('video', 'grid'):
|
|
561
561
|
text = TerminalText.clean(CameraDashboard().render([record], mode=mode, stream=SizedStream(100, 30)))
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|