nedo-vision-worker 1.2.0__tar.gz → 1.2.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/PKG-INFO +3 -1
  2. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/README.md +2 -0
  3. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/__init__.py +1 -1
  4. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/cli.py +1 -1
  5. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/doctor.py +32 -2
  6. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/repositories/WorkerSourceRepository.py +10 -1
  7. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/services/GrpcClientBase.py +1 -1
  8. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/services/VideoStreamClient.py +14 -8
  9. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/services/WorkerSourcePipelineClient.py +189 -176
  10. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/services/WorkerSourceUpdater.py +4 -3
  11. nedo_vision_worker-1.2.2/nedo_vision_worker/util/FFmpegUtil.py +73 -0
  12. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/util/VideoProbeUtil.py +6 -8
  13. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/worker/DataSenderWorker.py +1 -1
  14. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/worker/PipelineImageWorker.py +1 -1
  15. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker.egg-info/PKG-INFO +3 -1
  16. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker.egg-info/SOURCES.txt +1 -0
  17. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/config/ConfigurationManager.py +0 -0
  18. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/config/__init__.py +0 -0
  19. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/database/DatabaseManager.py +0 -0
  20. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/database/__init__.py +0 -0
  21. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/initializer/AppInitializer.py +0 -0
  22. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/initializer/__init__.py +0 -0
  23. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/models/__init__.py +0 -0
  24. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/models/ai_model.py +0 -0
  25. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/models/auth.py +0 -0
  26. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/models/config.py +0 -0
  27. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/models/dataset_source.py +0 -0
  28. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/models/logs.py +0 -0
  29. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/models/ppe_detection.py +0 -0
  30. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/models/ppe_detection_label.py +0 -0
  31. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/models/restricted_area_violation.py +0 -0
  32. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/models/user.py +0 -0
  33. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/models/worker_source.py +0 -0
  34. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/models/worker_source_pipeline.py +0 -0
  35. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/models/worker_source_pipeline_config.py +0 -0
  36. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/models/worker_source_pipeline_debug.py +0 -0
  37. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/models/worker_source_pipeline_detection.py +0 -0
  38. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/protos/AIModelService_pb2.py +0 -0
  39. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/protos/AIModelService_pb2_grpc.py +0 -0
  40. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/protos/DatasetSourceService_pb2.py +0 -0
  41. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/protos/DatasetSourceService_pb2_grpc.py +0 -0
  42. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/protos/HumanDetectionService_pb2.py +0 -0
  43. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/protos/HumanDetectionService_pb2_grpc.py +0 -0
  44. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/protos/PPEDetectionService_pb2.py +0 -0
  45. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/protos/PPEDetectionService_pb2_grpc.py +0 -0
  46. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/protos/VisionWorkerService_pb2.py +0 -0
  47. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/protos/VisionWorkerService_pb2_grpc.py +0 -0
  48. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/protos/WorkerSourcePipelineService_pb2.py +0 -0
  49. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/protos/WorkerSourcePipelineService_pb2_grpc.py +0 -0
  50. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/protos/WorkerSourceService_pb2.py +0 -0
  51. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/protos/WorkerSourceService_pb2_grpc.py +0 -0
  52. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/protos/__init__.py +0 -0
  53. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/repositories/AIModelRepository.py +0 -0
  54. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/repositories/DatasetSourceRepository.py +0 -0
  55. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/repositories/PPEDetectionRepository.py +0 -0
  56. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/repositories/RestrictedAreaRepository.py +0 -0
  57. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/repositories/WorkerSourcePipelineDebugRepository.py +0 -0
  58. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/repositories/WorkerSourcePipelineDetectionRepository.py +0 -0
  59. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/repositories/WorkerSourcePipelineRepository.py +0 -0
  60. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/repositories/__init__.py +0 -0
  61. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/services/AIModelClient.py +0 -0
  62. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/services/ConnectionInfoClient.py +0 -0
  63. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/services/DatasetSourceClient.py +0 -0
  64. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/services/DirectDeviceToRTMPStreamer.py +0 -0
  65. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/services/FileToRTMPServer.py +0 -0
  66. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/services/GrpcClientManager.py +0 -0
  67. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/services/ImageUploadClient.py +0 -0
  68. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/services/PPEDetectionClient.py +0 -0
  69. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/services/RTSPtoRTMPStreamer.py +0 -0
  70. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/services/RestrictedAreaClient.py +0 -0
  71. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/services/SharedDirectDeviceClient.py +0 -0
  72. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/services/SharedVideoStreamServer.py +0 -0
  73. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/services/SystemUsageClient.py +0 -0
  74. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/services/SystemWideDeviceCoordinator.py +0 -0
  75. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/services/VideoSharingDaemon.py +0 -0
  76. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/services/WorkerSourceClient.py +0 -0
  77. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/services/WorkerStatusClient.py +0 -0
  78. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/services/__init__.py +0 -0
  79. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/util/HardwareID.py +0 -0
  80. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/util/ImageUploader.py +0 -0
  81. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/util/Networking.py +0 -0
  82. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/util/PlatformDetector.py +0 -0
  83. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/util/SystemMonitor.py +0 -0
  84. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/util/__init__.py +0 -0
  85. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/worker/CoreActionWorker.py +0 -0
  86. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/worker/DataSyncWorker.py +0 -0
  87. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/worker/DatasetFrameSender.py +0 -0
  88. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/worker/DatasetFrameWorker.py +0 -0
  89. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/worker/PPEDetectionManager.py +0 -0
  90. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/worker/PipelineActionWorker.py +0 -0
  91. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/worker/RabbitMQListener.py +0 -0
  92. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/worker/RestrictedAreaManager.py +0 -0
  93. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/worker/SystemUsageManager.py +0 -0
  94. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/worker/VideoStreamWorker.py +0 -0
  95. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/worker/WorkerManager.py +0 -0
  96. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/worker/__init__.py +0 -0
  97. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/worker_service.py +0 -0
  98. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker.egg-info/dependency_links.txt +0 -0
  99. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker.egg-info/entry_points.txt +0 -0
  100. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker.egg-info/requires.txt +0 -0
  101. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker.egg-info/top_level.txt +0 -0
  102. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/pyproject.toml +0 -0
  103. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/setup.cfg +0 -0
  104. {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nedo-vision-worker
3
- Version: 1.2.0
3
+ Version: 1.2.2
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:
@@ -6,5 +6,5 @@ A library for running worker agents in the Nedo Vision platform.
6
6
 
7
7
  from .worker_service import WorkerService
8
8
 
9
- __version__ = "1.2.0"
9
+ __version__ = "1.2.2"
10
10
  __all__ = ["WorkerService"]
@@ -49,7 +49,7 @@ Examples:
49
49
  parser.add_argument(
50
50
  "--version",
51
51
  action="version",
52
- version="nedo-vision-worker 1.2.0"
52
+ version="nedo-vision-worker 1.2.1"
53
53
  )
54
54
 
55
55
  subparsers = parser.add_subparsers(
@@ -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, 8)
91
- recommended_version = (3, 9)
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
@@ -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))
@@ -8,6 +8,7 @@ import fractions
8
8
  from urllib.parse import urlparse
9
9
  from .GrpcClientBase import GrpcClientBase
10
10
  from .SharedDirectDeviceClient import SharedDirectDeviceClient
11
+ from ..util.FFmpegUtil import get_rtsp_ffmpeg_options, get_rtsp_probe_options
11
12
  from ..protos.VisionWorkerService_pb2_grpc import VideoStreamServiceStub
12
13
  from ..protos.VisionWorkerService_pb2 import VideoFrame
13
14
 
@@ -47,8 +48,10 @@ class VideoStreamClient(GrpcClientBase):
47
48
  ]
48
49
 
49
50
  if stream_type == "rtsp":
50
- probe_cmd.insert(1, "-rtsp_transport")
51
- probe_cmd.insert(2, "tcp")
51
+ probe_options = get_rtsp_probe_options()
52
+ # Insert options at the beginning (after ffprobe)
53
+ for i, option in enumerate(probe_options):
54
+ probe_cmd.insert(1 + i, option)
52
55
 
53
56
  result = subprocess.run(probe_cmd, capture_output=True, text=True)
54
57
  probe_data = json.loads(result.stdout)
@@ -97,10 +100,8 @@ class VideoStreamClient(GrpcClientBase):
97
100
  logging.error(f"Failed to create ffmpeg input for direct device: {e}")
98
101
  return
99
102
  elif stream_type == "rtsp":
100
- ffmpeg_input = (
101
- ffmpeg
102
- .input(url, rtsp_transport="tcp", fflags="nobuffer", timeout="5000000")
103
- )
103
+ rtsp_options = get_rtsp_ffmpeg_options()
104
+ ffmpeg_input = ffmpeg.input(url, **rtsp_options)
104
105
  elif stream_type == "hls":
105
106
  ffmpeg_input = (
106
107
  ffmpeg
@@ -148,8 +149,13 @@ class VideoStreamClient(GrpcClientBase):
148
149
  if stream_type == "direct":
149
150
  self.shared_device_client.release_device_access(url)
150
151
 
151
- stderr_output = process.stderr.read().decode()
152
- logging.error(f"FFmpeg stderr: {stderr_output}")
152
+ try:
153
+ stderr_output = process.stderr.read().decode()
154
+ if stderr_output.strip(): # Only log if there's actual error content
155
+ logging.error(f"FFmpeg stderr for {stream_type} stream: {stderr_output}")
156
+ except Exception as e:
157
+ logging.warning(f"Could not read FFmpeg stderr: {e}")
158
+
153
159
  process.terminate()
154
160
  process.wait()
155
161