nedo-vision-worker 1.2.1__tar.gz → 1.2.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.
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/PKG-INFO +3 -1
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/README.md +2 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/__init__.py +1 -1
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/doctor.py +32 -2
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/repositories/WorkerSourceRepository.py +10 -1
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/services/AIModelClient.py +12 -2
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/services/GrpcClientBase.py +1 -1
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/services/WorkerSourcePipelineClient.py +189 -177
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/services/WorkerSourceUpdater.py +4 -3
- nedo_vision_worker-1.2.3/nedo_vision_worker/util/FFmpegUtil.py +73 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/util/VideoProbeUtil.py +1 -6
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/worker/DataSenderWorker.py +1 -1
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/worker/PipelineImageWorker.py +1 -1
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker.egg-info/PKG-INFO +3 -1
- nedo_vision_worker-1.2.1/nedo_vision_worker/util/FFmpegUtil.py +0 -124
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/cli.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/config/ConfigurationManager.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/config/__init__.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/database/DatabaseManager.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/database/__init__.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/initializer/AppInitializer.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/initializer/__init__.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/models/__init__.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/models/ai_model.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/models/auth.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/models/config.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/models/dataset_source.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/models/logs.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/models/ppe_detection.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/models/ppe_detection_label.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/models/restricted_area_violation.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/models/user.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/models/worker_source.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/models/worker_source_pipeline.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/models/worker_source_pipeline_config.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/models/worker_source_pipeline_debug.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/models/worker_source_pipeline_detection.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/protos/AIModelService_pb2.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/protos/AIModelService_pb2_grpc.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/protos/DatasetSourceService_pb2.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/protos/DatasetSourceService_pb2_grpc.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/protos/HumanDetectionService_pb2.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/protos/HumanDetectionService_pb2_grpc.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/protos/PPEDetectionService_pb2.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/protos/PPEDetectionService_pb2_grpc.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/protos/VisionWorkerService_pb2.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/protos/VisionWorkerService_pb2_grpc.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/protos/WorkerSourcePipelineService_pb2.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/protos/WorkerSourcePipelineService_pb2_grpc.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/protos/WorkerSourceService_pb2.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/protos/WorkerSourceService_pb2_grpc.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/protos/__init__.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/repositories/AIModelRepository.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/repositories/DatasetSourceRepository.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/repositories/PPEDetectionRepository.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/repositories/RestrictedAreaRepository.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/repositories/WorkerSourcePipelineDebugRepository.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/repositories/WorkerSourcePipelineDetectionRepository.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/repositories/WorkerSourcePipelineRepository.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/repositories/__init__.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/services/ConnectionInfoClient.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/services/DatasetSourceClient.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/services/DirectDeviceToRTMPStreamer.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/services/FileToRTMPServer.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/services/GrpcClientManager.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/services/ImageUploadClient.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/services/PPEDetectionClient.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/services/RTSPtoRTMPStreamer.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/services/RestrictedAreaClient.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/services/SharedDirectDeviceClient.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/services/SharedVideoStreamServer.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/services/SystemUsageClient.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/services/SystemWideDeviceCoordinator.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/services/VideoSharingDaemon.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/services/VideoStreamClient.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/services/WorkerSourceClient.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/services/WorkerStatusClient.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/services/__init__.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/util/HardwareID.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/util/ImageUploader.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/util/Networking.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/util/PlatformDetector.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/util/SystemMonitor.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/util/__init__.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/worker/CoreActionWorker.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/worker/DataSyncWorker.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/worker/DatasetFrameSender.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/worker/DatasetFrameWorker.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/worker/PPEDetectionManager.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/worker/PipelineActionWorker.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/worker/RabbitMQListener.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/worker/RestrictedAreaManager.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/worker/SystemUsageManager.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/worker/VideoStreamWorker.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/worker/WorkerManager.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/worker/__init__.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/worker_service.py +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker.egg-info/SOURCES.txt +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker.egg-info/dependency_links.txt +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker.egg-info/entry_points.txt +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker.egg-info/requires.txt +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker.egg-info/top_level.txt +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/pyproject.toml +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/setup.cfg +0 -0
- {nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/setup.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: nedo-vision-worker
|
|
3
|
-
Version: 1.2.
|
|
3
|
+
Version: 1.2.3
|
|
4
4
|
Summary: Nedo Vision Worker Service Library for AI Vision Processing
|
|
5
5
|
Author-email: Willy Achmat Fauzi <willy.achmat@gmail.com>
|
|
6
6
|
Maintainer-email: Willy Achmat Fauzi <willy.achmat@gmail.com>
|
|
@@ -165,6 +165,8 @@ pip install -e .
|
|
|
165
165
|
pip install -e .[dev]
|
|
166
166
|
```
|
|
167
167
|
|
|
168
|
+
See [INSTALL.md](INSTALL.md) for detailed installation instructions.
|
|
169
|
+
|
|
168
170
|
## 🔍 System Diagnostics
|
|
169
171
|
|
|
170
172
|
Before running the worker service, use the built-in diagnostic tool to verify your system:
|
|
@@ -112,6 +112,8 @@ pip install -e .
|
|
|
112
112
|
pip install -e .[dev]
|
|
113
113
|
```
|
|
114
114
|
|
|
115
|
+
See [INSTALL.md](INSTALL.md) for detailed installation instructions.
|
|
116
|
+
|
|
115
117
|
## 🔍 System Diagnostics
|
|
116
118
|
|
|
117
119
|
Before running the worker service, use the built-in diagnostic tool to verify your system:
|
|
@@ -87,8 +87,8 @@ class WorkerServiceDoctor:
|
|
|
87
87
|
def check_python_environment(self) -> None:
|
|
88
88
|
"""Comprehensive Python environment validation."""
|
|
89
89
|
version = sys.version_info
|
|
90
|
-
min_version = (3,
|
|
91
|
-
recommended_version = (3,
|
|
90
|
+
min_version = (3, 10)
|
|
91
|
+
recommended_version = (3, 10)
|
|
92
92
|
|
|
93
93
|
details = [
|
|
94
94
|
f"Python {version.major}.{version.minor}.{version.micro}",
|
|
@@ -891,6 +891,36 @@ class WorkerServiceDoctor:
|
|
|
891
891
|
performance_impact=performance_impact
|
|
892
892
|
))
|
|
893
893
|
|
|
894
|
+
def check_psutil_installation(self) -> None:
|
|
895
|
+
"""Check if psutil is installed for system monitoring."""
|
|
896
|
+
details = []
|
|
897
|
+
recommendations = []
|
|
898
|
+
try:
|
|
899
|
+
import psutil
|
|
900
|
+
version = getattr(psutil, '__version__', 'N/A')
|
|
901
|
+
details.append(f"psutil version: {version}")
|
|
902
|
+
status = HealthStatus.GOOD
|
|
903
|
+
message = "psutil is installed"
|
|
904
|
+
is_blocking = False
|
|
905
|
+
performance_impact = "None"
|
|
906
|
+
except ImportError:
|
|
907
|
+
status = HealthStatus.WARNING
|
|
908
|
+
message = "psutil not installed"
|
|
909
|
+
details.append("System resource monitoring will be disabled.")
|
|
910
|
+
recommendations.append("Install psutil for system monitoring: pip install psutil")
|
|
911
|
+
is_blocking = False
|
|
912
|
+
performance_impact = "Low"
|
|
913
|
+
|
|
914
|
+
self._add_result(HealthCheck(
|
|
915
|
+
name="System Monitoring (psutil)",
|
|
916
|
+
status=status,
|
|
917
|
+
message=message,
|
|
918
|
+
details=details,
|
|
919
|
+
recommendations=recommendations if recommendations else None,
|
|
920
|
+
is_blocking=is_blocking,
|
|
921
|
+
performance_impact=performance_impact
|
|
922
|
+
))
|
|
923
|
+
|
|
894
924
|
def run_comprehensive_health_check(self) -> List[HealthCheck]:
|
|
895
925
|
"""Execute all health checks with progress indication."""
|
|
896
926
|
print("🏥 Nedo Vision Worker Service - Comprehensive Health Check")
|
|
@@ -17,6 +17,15 @@ class WorkerSourceRepository:
|
|
|
17
17
|
except Exception as e:
|
|
18
18
|
logger.error(f"🚨 [APP] Database error while fetching worker sources: {e}", exc_info=True)
|
|
19
19
|
return []
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def get_worker_sources_by_worker_id(self, worker_id: str):
|
|
23
|
+
"""Retrieve all worker sources from the database."""
|
|
24
|
+
try:
|
|
25
|
+
return self.session.query(WorkerSourceEntity).filter_by(worker_id=worker_id).all()
|
|
26
|
+
except Exception as e:
|
|
27
|
+
logger.error(f"🚨 [APP] Database error while fetching worker sources: {e}", exc_info=True)
|
|
28
|
+
return []
|
|
20
29
|
|
|
21
30
|
def bulk_update_worker_sources(self, updated_records):
|
|
22
31
|
"""Batch update worker sources in the database."""
|
|
@@ -43,4 +52,4 @@ class WorkerSourceRepository:
|
|
|
43
52
|
return None
|
|
44
53
|
except Exception as e:
|
|
45
54
|
logger.error(f"🚨 [APP] Database error while fetching worker source by ID {worker_source_id}: {e}", exc_info=True)
|
|
46
|
-
return None
|
|
55
|
+
return None
|
{nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/services/AIModelClient.py
RENAMED
|
@@ -160,8 +160,12 @@ class AIModelClient(GrpcClientBase):
|
|
|
160
160
|
|
|
161
161
|
def _handle_existing_model(self, server_model, local_model, updated_models: List):
|
|
162
162
|
if not self._model_file_exists(local_model.file):
|
|
163
|
-
|
|
164
|
-
self.
|
|
163
|
+
# Only schedule download if not already downloading
|
|
164
|
+
if not self._is_downloading(server_model.id):
|
|
165
|
+
logging.warning(f"⚠️ Model file missing for {local_model.name}. Re-downloading...")
|
|
166
|
+
self._schedule_download(server_model)
|
|
167
|
+
else:
|
|
168
|
+
logging.debug(f"⏳ Model {local_model.name} is already being downloaded, skipping...")
|
|
165
169
|
return
|
|
166
170
|
|
|
167
171
|
needs_update, changes = self._check_model_changes(server_model, local_model)
|
|
@@ -246,6 +250,12 @@ class AIModelClient(GrpcClientBase):
|
|
|
246
250
|
local_model.set_main_class(server_model.main_class)
|
|
247
251
|
|
|
248
252
|
def _schedule_download(self, model):
|
|
253
|
+
# Check if already downloading - don't cancel and restart
|
|
254
|
+
if self._is_downloading(model.id):
|
|
255
|
+
logging.debug(f"⏳ Model {model.name} download already in progress, skipping reschedule")
|
|
256
|
+
return
|
|
257
|
+
|
|
258
|
+
# Only cancel if there's a stale download entry
|
|
249
259
|
self._cancel_download(model.id)
|
|
250
260
|
|
|
251
261
|
download_info = DownloadInfo(
|
{nedo_vision_worker-1.2.1 → nedo_vision_worker-1.2.3}/nedo_vision_worker/services/GrpcClientBase.py
RENAMED
|
@@ -68,7 +68,7 @@ class GrpcClientBase:
|
|
|
68
68
|
self.connected = False
|
|
69
69
|
error_msg = str(e)
|
|
70
70
|
|
|
71
|
-
logger.error(f"⚠️ Connection failed ({attempts}/{self.max_retries}): {error_msg}")
|
|
71
|
+
logger.error(f"⚠️ Connection failed ({attempts}/{self.max_retries}): {error_msg}", exc_info=True)
|
|
72
72
|
|
|
73
73
|
if attempts < self.max_retries:
|
|
74
74
|
sleep_time = retry_interval * (2 ** (attempts - 1))
|