nedo-vision-worker 1.3.13__py3-none-any.whl → 1.3.14__py3-none-any.whl

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.
@@ -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.3.13"
9
+ __version__ = "1.3.14"
10
10
  __all__ = ["WorkerService"]
@@ -1,6 +1,7 @@
1
1
  import subprocess
2
2
  import logging
3
3
  import os
4
+ import threading
4
5
  from ..util.EncoderSelector import EncoderSelector
5
6
  from ..util.RTMPUrl import RTMPUrl
6
7
 
@@ -53,6 +54,7 @@ class FileToRTMPStreamer:
53
54
  "-g", str(self.fps),
54
55
  "-vf", f"scale={self.resolution}",
55
56
 
57
+ "-loglevel", "error",
56
58
  "-an", # Disable audio
57
59
 
58
60
  "-f", "flv",
@@ -63,11 +65,17 @@ class FileToRTMPStreamer:
63
65
  with open(os.devnull, "w") as devnull:
64
66
  self.process = subprocess.Popen(
65
67
  ffmpeg_command,
66
- stdout=devnull,
67
- stderr=devnull,
68
- text=True
68
+ stdout=subprocess.DEVNULL,
69
+ stderr=subprocess.PIPE,
70
+ text=True,
71
+ bufsize=1
69
72
  )
70
73
 
74
+ threading.Thread(
75
+ target=self._monitor_ffmpeg_errors,
76
+ daemon=True
77
+ ).start()
78
+
71
79
  logging.info("✅ [APP] FFmpeg file stream process started successfully.")
72
80
  self.process.wait() # Block until process is terminated
73
81
 
@@ -81,3 +89,43 @@ class FileToRTMPStreamer:
81
89
  self.process.terminate()
82
90
  self.process.wait()
83
91
  logging.info("🛑 [APP] FFmpeg file stream process terminated.")
92
+
93
+ def _classify_ffmpeg_error(self, msg: str):
94
+ if "No such file or directory" in msg:
95
+ return "FILE_NOT_FOUND"
96
+
97
+ if "Invalid data found" in msg:
98
+ return "INVALID_MEDIA"
99
+
100
+ if "encoder" in msg.lower() or "nvenc" in msg.lower():
101
+ return "ENCODER_ERROR"
102
+
103
+ if "server returned" in msg.lower() or "rtmp" in msg.lower():
104
+ return "RTMP_ERROR"
105
+
106
+ if "broken pipe" in msg.lower():
107
+ return "PIPE_BROKEN"
108
+
109
+ return "UNKNOWN_ERROR"
110
+
111
+ def _monitor_ffmpeg_errors(self):
112
+ """Read FFmpeg stderr and log meaningful errors."""
113
+ try:
114
+ for line in iter(self.process.stderr.readline, ''):
115
+ if not line:
116
+ break
117
+
118
+ msg = line.strip()
119
+ if not msg:
120
+ continue
121
+
122
+ error_type = self._classify_ffmpeg_error(msg)
123
+ logging.error(f"🔥 [FFMPEG][{error_type}] {msg}")
124
+
125
+ # Stop on critical errors
126
+ if error_type != "UNKNOWN_ERROR":
127
+ logging.error("🛑 [APP] Critical FFmpeg error detected. Stopping stream.")
128
+ self.stop_stream()
129
+ break
130
+ except Exception as e:
131
+ logging.error(f"🚨 [APP] Error while reading FFmpeg stderr: {e}")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nedo-vision-worker
3
- Version: 1.3.13
3
+ Version: 1.3.14
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>
@@ -1,4 +1,4 @@
1
- nedo_vision_worker/__init__.py,sha256=Ak7YKEch0y2VxlTvFuNJfC-MJuCqgfQ93qvsIBqYDu8,204
1
+ nedo_vision_worker/__init__.py,sha256=YIYYzNgmWVZKH7nI0wZ4bsn5ApvbaM7xF0hpBGOC6V8,204
2
2
  nedo_vision_worker/bootstrap.py,sha256=5zqrR8rJL7SbYcpoDOT_fisXU7XcvXzRaBnBvOrJzSQ,1711
3
3
  nedo_vision_worker/cli.py,sha256=Yov2_YqZzOEPn6Ce-zZu5exCRCxg93l7xPgISL79Jf8,2769
4
4
  nedo_vision_worker/doctor.py,sha256=wNkpe8gLVd76Y_ViyK2h1ZFdqeSl37MnzZN5frWKu30,48410
@@ -52,7 +52,7 @@ nedo_vision_worker/services/AIModelClient.py,sha256=lxRNax6FR-pV0G1NpJnlaqjbQeu3
52
52
  nedo_vision_worker/services/ConnectionInfoClient.py,sha256=toC9zuY2Hrx1Cwq8Gycy_iFlaG1DvFT4qewlLlitpEQ,2214
53
53
  nedo_vision_worker/services/DatasetSourceClient.py,sha256=O5a7onxFl0z47zXaMXWxHAMPuuc-i_vzkd2w5fwrukc,3319
54
54
  nedo_vision_worker/services/DirectDeviceToRTMPStreamer.py,sha256=YO_z1DPQgVoR2hakmd5vP07D8_DYkWYaWT68mOT4rUk,24731
55
- nedo_vision_worker/services/FileToRTMPServer.py,sha256=ZxcV1sjvvTqfeIuRuwa8uxKbKATYnxP7xwxX5cWdlTc,2904
55
+ nedo_vision_worker/services/FileToRTMPServer.py,sha256=YSMB0rYqQo5T1lmglqo3PYXOMOJx5cSXjO7lbGbnkmg,4492
56
56
  nedo_vision_worker/services/GrpcClientBase.py,sha256=RkJDGRsXu5HalMDR8cOsIaoFf5tA_cLTkh5euBPyo2M,6852
57
57
  nedo_vision_worker/services/GrpcClientManager.py,sha256=DLXekmxlQogLo8V9-TNDXtyHT_UG-BaggqwsIups55k,5568
58
58
  nedo_vision_worker/services/GrpcConnection.py,sha256=UNjaUC4ZcXuteHQx8AAAL5ymYkT1OpoIvyCYPUc3tCI,4915
@@ -97,8 +97,8 @@ nedo_vision_worker/worker/SystemUsageManager.py,sha256=mkh4sT-HkIEY1CJHMEG6LP9AT
97
97
  nedo_vision_worker/worker/VideoStreamWorker.py,sha256=0g36xplrJSA2h_dDzlxFD4Yi1p5OyCjY1ZQ_drqRcTA,7567
98
98
  nedo_vision_worker/worker/WorkerManager.py,sha256=2bxXi19fp3p1qjYBStYRdVVgko8dnevXx1_M_sqH5og,5521
99
99
  nedo_vision_worker/worker/__init__.py,sha256=Nqnn8clbgv-5l0PgxcTOldg8mkMKrFn4TvPL-rYUUGg,1
100
- nedo_vision_worker-1.3.13.dist-info/METADATA,sha256=MeTj7KNm6cgTCdCcYnfFUfB4KRKUMc264T3X1CW8lgQ,14654
101
- nedo_vision_worker-1.3.13.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
102
- nedo_vision_worker-1.3.13.dist-info/entry_points.txt,sha256=LrglS-8nCi8C_PL_pa6uxdgCe879hBETHDVXAckvs-8,60
103
- nedo_vision_worker-1.3.13.dist-info/top_level.txt,sha256=vgilhlkyD34YsEKkaBabmhIpcKSvF3XpzD2By68L-XI,19
104
- nedo_vision_worker-1.3.13.dist-info/RECORD,,
100
+ nedo_vision_worker-1.3.14.dist-info/METADATA,sha256=9UhVy5tES0eLkOQz9vHjD19YxZ9TdEIX7YWkUz_PnkU,14654
101
+ nedo_vision_worker-1.3.14.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
102
+ nedo_vision_worker-1.3.14.dist-info/entry_points.txt,sha256=LrglS-8nCi8C_PL_pa6uxdgCe879hBETHDVXAckvs-8,60
103
+ nedo_vision_worker-1.3.14.dist-info/top_level.txt,sha256=vgilhlkyD34YsEKkaBabmhIpcKSvF3XpzD2By68L-XI,19
104
+ nedo_vision_worker-1.3.14.dist-info/RECORD,,