nedo-vision-worker 1.1.3__tar.gz → 1.2.0__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 (109) hide show
  1. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/PKG-INFO +1 -3
  2. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/README.md +0 -2
  3. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/__init__.py +1 -1
  4. nedo_vision_worker-1.2.0/nedo_vision_worker/cli.py +224 -0
  5. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/database/DatabaseManager.py +3 -3
  6. nedo_vision_worker-1.2.0/nedo_vision_worker/doctor.py +1133 -0
  7. nedo_vision_worker-1.2.0/nedo_vision_worker/models/ai_model.py +62 -0
  8. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/protos/AIModelService_pb2.py +12 -10
  9. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/protos/AIModelService_pb2_grpc.py +1 -1
  10. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/protos/DatasetSourceService_pb2.py +2 -2
  11. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/protos/DatasetSourceService_pb2_grpc.py +1 -1
  12. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/protos/HumanDetectionService_pb2.py +2 -2
  13. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/protos/HumanDetectionService_pb2_grpc.py +1 -1
  14. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/protos/PPEDetectionService_pb2.py +2 -2
  15. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/protos/PPEDetectionService_pb2_grpc.py +1 -1
  16. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/protos/VisionWorkerService_pb2.py +2 -2
  17. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/protos/VisionWorkerService_pb2_grpc.py +1 -1
  18. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/protos/WorkerSourcePipelineService_pb2.py +2 -2
  19. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/protos/WorkerSourcePipelineService_pb2_grpc.py +1 -1
  20. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/protos/WorkerSourceService_pb2.py +2 -2
  21. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/protos/WorkerSourceService_pb2_grpc.py +1 -1
  22. nedo_vision_worker-1.2.0/nedo_vision_worker/services/AIModelClient.py +386 -0
  23. nedo_vision_worker-1.2.0/nedo_vision_worker/services/DirectDeviceToRTMPStreamer.py +534 -0
  24. nedo_vision_worker-1.2.0/nedo_vision_worker/services/GrpcClientBase.py +189 -0
  25. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/services/PPEDetectionClient.py +0 -7
  26. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/services/RestrictedAreaClient.py +0 -5
  27. nedo_vision_worker-1.2.0/nedo_vision_worker/services/SharedDirectDeviceClient.py +278 -0
  28. nedo_vision_worker-1.2.0/nedo_vision_worker/services/SharedVideoStreamServer.py +315 -0
  29. nedo_vision_worker-1.2.0/nedo_vision_worker/services/SystemWideDeviceCoordinator.py +236 -0
  30. nedo_vision_worker-1.2.0/nedo_vision_worker/services/VideoSharingDaemon.py +832 -0
  31. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/services/VideoStreamClient.py +30 -13
  32. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/services/WorkerSourceClient.py +1 -1
  33. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/services/WorkerSourcePipelineClient.py +28 -6
  34. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/services/WorkerSourceUpdater.py +30 -3
  35. nedo_vision_worker-1.2.0/nedo_vision_worker/util/VideoProbeUtil.py +327 -0
  36. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/worker/DataSyncWorker.py +1 -0
  37. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/worker/PipelineImageWorker.py +1 -1
  38. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/worker/VideoStreamWorker.py +27 -3
  39. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/worker/WorkerManager.py +2 -29
  40. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/worker_service.py +22 -5
  41. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker.egg-info/PKG-INFO +1 -3
  42. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker.egg-info/SOURCES.txt +5 -0
  43. nedo_vision_worker-1.1.3/nedo_vision_worker/cli.py +0 -195
  44. nedo_vision_worker-1.1.3/nedo_vision_worker/doctor.py +0 -453
  45. nedo_vision_worker-1.1.3/nedo_vision_worker/models/ai_model.py +0 -29
  46. nedo_vision_worker-1.1.3/nedo_vision_worker/services/AIModelClient.py +0 -362
  47. nedo_vision_worker-1.1.3/nedo_vision_worker/services/GrpcClientBase.py +0 -155
  48. nedo_vision_worker-1.1.3/nedo_vision_worker/util/VideoProbeUtil.py +0 -120
  49. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/config/ConfigurationManager.py +0 -0
  50. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/config/__init__.py +0 -0
  51. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/database/__init__.py +0 -0
  52. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/initializer/AppInitializer.py +0 -0
  53. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/initializer/__init__.py +0 -0
  54. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/models/__init__.py +0 -0
  55. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/models/auth.py +0 -0
  56. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/models/config.py +0 -0
  57. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/models/dataset_source.py +0 -0
  58. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/models/logs.py +0 -0
  59. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/models/ppe_detection.py +0 -0
  60. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/models/ppe_detection_label.py +0 -0
  61. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/models/restricted_area_violation.py +0 -0
  62. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/models/user.py +0 -0
  63. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/models/worker_source.py +0 -0
  64. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/models/worker_source_pipeline.py +0 -0
  65. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/models/worker_source_pipeline_config.py +0 -0
  66. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/models/worker_source_pipeline_debug.py +0 -0
  67. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/models/worker_source_pipeline_detection.py +0 -0
  68. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/protos/__init__.py +0 -0
  69. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/repositories/AIModelRepository.py +0 -0
  70. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/repositories/DatasetSourceRepository.py +0 -0
  71. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/repositories/PPEDetectionRepository.py +0 -0
  72. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/repositories/RestrictedAreaRepository.py +0 -0
  73. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/repositories/WorkerSourcePipelineDebugRepository.py +0 -0
  74. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/repositories/WorkerSourcePipelineDetectionRepository.py +0 -0
  75. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/repositories/WorkerSourcePipelineRepository.py +0 -0
  76. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/repositories/WorkerSourceRepository.py +0 -0
  77. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/repositories/__init__.py +0 -0
  78. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/services/ConnectionInfoClient.py +0 -0
  79. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/services/DatasetSourceClient.py +0 -0
  80. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/services/FileToRTMPServer.py +0 -0
  81. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/services/GrpcClientManager.py +0 -0
  82. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/services/ImageUploadClient.py +0 -0
  83. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/services/RTSPtoRTMPStreamer.py +0 -0
  84. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/services/SystemUsageClient.py +0 -0
  85. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/services/WorkerStatusClient.py +0 -0
  86. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/services/__init__.py +0 -0
  87. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/util/HardwareID.py +0 -0
  88. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/util/ImageUploader.py +0 -0
  89. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/util/Networking.py +0 -0
  90. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/util/PlatformDetector.py +0 -0
  91. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/util/SystemMonitor.py +0 -0
  92. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/util/__init__.py +0 -0
  93. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/worker/CoreActionWorker.py +0 -0
  94. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/worker/DataSenderWorker.py +0 -0
  95. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/worker/DatasetFrameSender.py +0 -0
  96. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/worker/DatasetFrameWorker.py +0 -0
  97. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/worker/PPEDetectionManager.py +0 -0
  98. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/worker/PipelineActionWorker.py +0 -0
  99. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/worker/RabbitMQListener.py +0 -0
  100. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/worker/RestrictedAreaManager.py +0 -0
  101. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/worker/SystemUsageManager.py +0 -0
  102. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/worker/__init__.py +0 -0
  103. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker.egg-info/dependency_links.txt +0 -0
  104. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker.egg-info/entry_points.txt +0 -0
  105. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker.egg-info/requires.txt +0 -0
  106. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker.egg-info/top_level.txt +0 -0
  107. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/pyproject.toml +0 -0
  108. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/setup.cfg +0 -0
  109. {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nedo-vision-worker
3
- Version: 1.1.3
3
+ Version: 1.2.0
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>
@@ -179,10 +179,8 @@ This will check:
179
179
  - ✅ Python version and dependencies
180
180
  - ✅ FFmpeg installation and functionality
181
181
  - ✅ OpenCV installation and optimizations
182
- - ✅ gRPC connectivity
183
182
  - ✅ NVIDIA GPU support and capabilities
184
183
  - ✅ Storage permissions
185
- - ✅ Network connectivity
186
184
 
187
185
  ## 📖 Quick Start
188
186
 
@@ -126,10 +126,8 @@ This will check:
126
126
  - ✅ Python version and dependencies
127
127
  - ✅ FFmpeg installation and functionality
128
128
  - ✅ OpenCV installation and optimizations
129
- - ✅ gRPC connectivity
130
129
  - ✅ NVIDIA GPU support and capabilities
131
130
  - ✅ Storage permissions
132
- - ✅ Network connectivity
133
131
 
134
132
  ## 📖 Quick Start
135
133
 
@@ -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.1.3"
9
+ __version__ = "1.2.0"
10
10
  __all__ = ["WorkerService"]
@@ -0,0 +1,224 @@
1
+ import argparse
2
+ import signal
3
+ import sys
4
+ import traceback
5
+ import logging
6
+ from typing import NoReturn
7
+
8
+ from .worker_service import WorkerService
9
+
10
+
11
+ class NedoWorkerCLI:
12
+ """Main CLI application for Nedo Vision Worker Service."""
13
+
14
+ def __init__(self):
15
+ self.logger = logging.getLogger(__name__)
16
+ self._setup_signal_handlers()
17
+
18
+ def _setup_signal_handlers(self) -> None:
19
+ """Set up signal handlers for graceful shutdown."""
20
+ signal.signal(signal.SIGINT, self._signal_handler)
21
+ signal.signal(signal.SIGTERM, self._signal_handler)
22
+
23
+ def _signal_handler(self, signum: int, frame) -> NoReturn:
24
+ """Handle system signals for graceful shutdown."""
25
+ self.logger.info(f"Received signal {signum}, shutting down...")
26
+ sys.exit(0)
27
+
28
+ def create_parser(self) -> argparse.ArgumentParser:
29
+ """Create and configure the argument parser."""
30
+ parser = argparse.ArgumentParser(
31
+ description="Nedo Vision Worker Service",
32
+ formatter_class=argparse.RawDescriptionHelpFormatter,
33
+ epilog="""
34
+ Examples:
35
+ # Check system dependencies and requirements
36
+ nedo-worker doctor
37
+
38
+ # Start worker service
39
+ nedo-worker run --token your-token-here
40
+
41
+ # Start with custom configuration
42
+ nedo-worker run --token your-token-here \\
43
+ --rtmp-server rtmp://custom.server.com:1935/live \\
44
+ --server-host custom.server.com \\
45
+ --storage-path /custom/storage/path
46
+ """
47
+ )
48
+
49
+ parser.add_argument(
50
+ "--version",
51
+ action="version",
52
+ version="nedo-vision-worker 1.2.0"
53
+ )
54
+
55
+ subparsers = parser.add_subparsers(
56
+ dest='command',
57
+ help='Available commands',
58
+ required=True
59
+ )
60
+
61
+ self._add_doctor_command(subparsers)
62
+ self._add_run_command(subparsers)
63
+
64
+ return parser
65
+
66
+ def _add_doctor_command(self, subparsers) -> None:
67
+ """Add the doctor command."""
68
+ subparsers.add_parser(
69
+ 'doctor',
70
+ help='Check system dependencies and requirements',
71
+ description='Run diagnostic checks for FFmpeg, OpenCV, gRPC and other dependencies'
72
+ )
73
+
74
+ def _add_run_command(self, subparsers) -> None:
75
+ """Add the run command with its arguments."""
76
+ run_parser = subparsers.add_parser(
77
+ 'run',
78
+ help='Start the worker service',
79
+ description='Start the Nedo Vision Worker Service'
80
+ )
81
+
82
+ run_parser.add_argument(
83
+ "--token",
84
+ required=True,
85
+ help="Authentication token for the worker (obtained from frontend)"
86
+ )
87
+
88
+ run_parser.add_argument(
89
+ "--server-host",
90
+ default="be.vision.sindika.co.id",
91
+ help="Server hostname for communication (default: %(default)s)"
92
+ )
93
+
94
+ run_parser.add_argument(
95
+ "--server-port",
96
+ type=int,
97
+ default=50051,
98
+ help="Server port for gRPC communication (default: %(default)s)"
99
+ )
100
+
101
+ run_parser.add_argument(
102
+ "--rtmp-server",
103
+ default="rtmp://live.vision.sindika.co.id:1935/live",
104
+ help="RTMP server URL for video streaming (default: %(default)s)"
105
+ )
106
+
107
+ run_parser.add_argument(
108
+ "--storage-path",
109
+ default="data",
110
+ help="Storage path for databases and files (default: %(default)s)"
111
+ )
112
+
113
+ run_parser.add_argument(
114
+ "--system-usage-interval",
115
+ type=int,
116
+ default=30,
117
+ metavar="SECONDS",
118
+ help="System usage reporting interval in seconds (default: %(default)s)"
119
+ )
120
+
121
+ run_parser.add_argument(
122
+ "--log-level",
123
+ choices=["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"],
124
+ default="INFO",
125
+ help="Set the logging level (default: %(default)s)"
126
+ )
127
+
128
+ def run_doctor_command(self) -> int:
129
+ """Execute the doctor command."""
130
+ try:
131
+ from .doctor import main as doctor_main
132
+ return doctor_main()
133
+ except ImportError as e:
134
+ self.logger.error(f"Failed to import doctor module: {e}")
135
+ return 1
136
+ except Exception as e:
137
+ self.logger.error(f"Doctor command failed: {e}")
138
+ return 1
139
+
140
+ def run_worker_service(self, args: argparse.Namespace) -> int:
141
+ """Start and run the worker service."""
142
+ # Configure logging
143
+ logging.basicConfig(
144
+ level=getattr(logging, args.log_level),
145
+ format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
146
+ )
147
+
148
+ try:
149
+ # Create the worker service
150
+ service = WorkerService(
151
+ server_host=args.server_host,
152
+ token=args.token,
153
+ system_usage_interval=args.system_usage_interval,
154
+ rtmp_server=args.rtmp_server,
155
+ storage_path=args.storage_path,
156
+ server_port=args.server_port
157
+ )
158
+
159
+ # Log startup information
160
+ self._log_startup_info(args)
161
+
162
+ # Start the service
163
+ service.run()
164
+
165
+ # Keep the service running
166
+ self._wait_for_service(service)
167
+
168
+ return 0
169
+
170
+ except KeyboardInterrupt:
171
+ self.logger.info("Shutdown requested by user")
172
+ return 0
173
+ except Exception as e:
174
+ self.logger.error(f"Service failed: {e}")
175
+ if args.log_level == "DEBUG":
176
+ traceback.print_exc()
177
+ return 1
178
+
179
+ def _log_startup_info(self, args: argparse.Namespace) -> None:
180
+ """Log service startup information."""
181
+ self.logger.info("🚀 Starting Nedo Vision Worker Service...")
182
+ self.logger.info(f"🌐 Server: {args.server_host}")
183
+ self.logger.info(f"🔑 Token: {args.token[:8]}{'*' * (len(args.token) - 8)}")
184
+ self.logger.info(f"⏱️ System Usage Interval: {args.system_usage_interval}s")
185
+ self.logger.info(f"📡 RTMP Server: {args.rtmp_server}")
186
+ self.logger.info(f"💾 Storage Path: {args.storage_path}")
187
+ self.logger.info("Press Ctrl+C to stop the service")
188
+
189
+ def _wait_for_service(self, service: WorkerService) -> None:
190
+ """Wait for the service to run and handle shutdown."""
191
+ import time
192
+
193
+ try:
194
+ while getattr(service, 'running', False):
195
+ time.sleep(1)
196
+ except KeyboardInterrupt:
197
+ self.logger.info("🛑 Shutdown requested...")
198
+ finally:
199
+ if hasattr(service, 'stop'):
200
+ service.stop()
201
+ self.logger.info("✅ Service stopped successfully")
202
+
203
+ def run(self) -> int:
204
+ """Main entry point for the CLI application."""
205
+ parser = self.create_parser()
206
+ args = parser.parse_args()
207
+
208
+ if args.command == 'doctor':
209
+ return self.run_doctor_command()
210
+ elif args.command == 'run':
211
+ return self.run_worker_service(args)
212
+ else:
213
+ parser.print_help()
214
+ return 1
215
+
216
+
217
+ def main() -> int:
218
+ """Main CLI entry point."""
219
+ cli = NedoWorkerCLI()
220
+ return cli.run()
221
+
222
+
223
+ if __name__ == "__main__":
224
+ sys.exit(main())
@@ -20,13 +20,13 @@ _storage_path = None # Global storage path
20
20
  def set_storage_path(storage_path: str):
21
21
  """Set the global storage path for the application."""
22
22
  global _storage_path
23
- _storage_path = Path(storage_path)
23
+ _storage_path = Path(storage_path).resolve() # Convert to absolute path
24
24
 
25
25
  def _get_storage_paths():
26
26
  """Get storage paths using the configured storage path."""
27
27
  global _storage_path
28
28
  if _storage_path is None:
29
- _storage_path = Path("data") # Default fallback
29
+ _storage_path = Path("data").resolve() # Default fallback as absolute path
30
30
 
31
31
  return {
32
32
  "db": _storage_path / "sqlite",
@@ -38,7 +38,7 @@ def get_storage_path(subdir: str = None) -> Path:
38
38
  """Get a storage path for a specific subdirectory."""
39
39
  global _storage_path
40
40
  if _storage_path is None:
41
- _storage_path = Path("data") # Default fallback
41
+ _storage_path = Path("data").resolve() # Default fallback as absolute path
42
42
 
43
43
  if subdir:
44
44
  return _storage_path / subdir