Fix completed runs not appearing in list + add purge-failed endpoint
- Update save_run_cache to also update actor_id, recipe, inputs on conflict - Add logging for actor_id when saving runs to run_cache - Add admin endpoint DELETE /runs/admin/purge-failed to delete all failed runs Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -55,9 +55,13 @@ class VideoSource:
|
||||
self._proc.kill()
|
||||
self._proc = None
|
||||
|
||||
# Check file exists before trying to open
|
||||
if not self.path.exists():
|
||||
raise FileNotFoundError(f"Video file not found: {self.path}")
|
||||
|
||||
w, h = self._frame_size
|
||||
cmd = [
|
||||
"ffmpeg", "-v", "quiet",
|
||||
"ffmpeg", "-v", "error", # Show errors instead of quiet
|
||||
"-ss", f"{seek_time:.3f}",
|
||||
"-i", str(self.path),
|
||||
"-f", "rawvideo", "-pix_fmt", "rgb24",
|
||||
@@ -65,9 +69,18 @@ class VideoSource:
|
||||
"-r", str(self.fps), # Output at specified fps
|
||||
"-"
|
||||
]
|
||||
self._proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL)
|
||||
self._proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||
self._stream_time = seek_time
|
||||
|
||||
# Check if process started successfully by reading first bit of stderr
|
||||
import select
|
||||
import sys
|
||||
readable, _, _ = select.select([self._proc.stderr], [], [], 0.5)
|
||||
if readable:
|
||||
err = self._proc.stderr.read(4096).decode('utf-8', errors='ignore')
|
||||
if err:
|
||||
print(f"ffmpeg error for {self.path.name}: {err}", file=sys.stderr)
|
||||
|
||||
def _read_frame_from_stream(self) -> np.ndarray:
|
||||
"""Read one frame from the stream."""
|
||||
w, h = self._frame_size
|
||||
@@ -130,8 +143,12 @@ class VideoSource:
|
||||
frame = self._read_frame_from_stream()
|
||||
if frame is None:
|
||||
import sys
|
||||
print(f"NULL FRAME {self.path.name}: t={t:.2f} seek={seek_time:.2f}", file=sys.stderr)
|
||||
frame = np.zeros((h, w, 3), dtype=np.uint8)
|
||||
# Check for ffmpeg errors
|
||||
if self._proc and self._proc.stderr:
|
||||
err = self._proc.stderr.read(4096).decode('utf-8', errors='ignore')
|
||||
if err:
|
||||
raise RuntimeError(f"Failed to read video frame from {self.path.name}: {err}")
|
||||
raise RuntimeError(f"Failed to read video frame from {self.path.name} at t={t:.2f} - file may be corrupted or inaccessible")
|
||||
else:
|
||||
self._stream_time += self._frame_time
|
||||
|
||||
|
||||
Reference in New Issue
Block a user