From 14757807aa38f2803f1122f8c19fcd20a1a74522 Mon Sep 17 00:00:00 2001 From: Alireza Vaezi Date: Tue, 5 Aug 2025 13:53:28 -0400 Subject: [PATCH] Enhance video file handling: support multiple formats (AVI, MP4, WEBM) in storage manager --- convert_avi_to_mp4.sh | 4 +- usda_vision_system/storage/manager.py | 65 +++++++++++++++------------ 2 files changed, 39 insertions(+), 30 deletions(-) diff --git a/convert_avi_to_mp4.sh b/convert_avi_to_mp4.sh index 7d2396e..4be2d0c 100755 --- a/convert_avi_to_mp4.sh +++ b/convert_avi_to_mp4.sh @@ -97,7 +97,7 @@ while IFS= read -r -d '' avi_file; do if [ -z "$duration" ] || [ "$duration" -eq 0 ]; then print_warning "Could not determine video duration, converting without progress bar..." # Fallback to simple conversion without progress - if ffmpeg -i "$avi_file" -c:v libx264 -c:a aac -preset medium -crf 18 "$mp4_file" -y 2>/dev/null; then + if ffmpeg -i "$avi_file" -c:v libx264 -c:a aac -preset medium -crf 18 -nostdin "$mp4_file" -y 2>/dev/null; then echo print_success "Converted: $avi_file -> $mp4_file" converted_files=$((converted_files + 1)) @@ -117,7 +117,7 @@ while IFS= read -r -d '' avi_file; do # Start ffmpeg conversion in background with progress output ffmpeg -i "$avi_file" -c:v libx264 -c:a aac -preset medium -crf 18 \ - -progress "$progress_file" -nostats -loglevel 0 "$mp4_file" -y & + -progress "$progress_file" -nostats -loglevel 0 -nostdin "$mp4_file" -y & ffmpeg_pid=$! diff --git a/usda_vision_system/storage/manager.py b/usda_vision_system/storage/manager.py index 0293ea6..8c36204 100644 --- a/usda_vision_system/storage/manager.py +++ b/usda_vision_system/storage/manager.py @@ -211,21 +211,24 @@ class StorageManager: storage_path = Path(camera_config.storage_path) if storage_path.exists(): - for video_file in storage_path.glob("*.avi"): - if video_file.is_file() and str(video_file) not in indexed_files: - # Get file stats - stat = video_file.stat() - file_mtime = datetime.fromtimestamp(stat.st_mtime) + # Scan for all supported video formats + video_extensions = ["*.avi", "*.mp4", "*.webm"] + for pattern in video_extensions: + for video_file in storage_path.glob(pattern): + if video_file.is_file() and str(video_file) not in indexed_files: + # Get file stats + stat = video_file.stat() + file_mtime = datetime.fromtimestamp(stat.st_mtime) - # Apply date filters - if start_date and file_mtime < start_date: - continue - if end_date and file_mtime > end_date: - continue + # Apply date filters + if start_date and file_mtime < start_date: + continue + if end_date and file_mtime > end_date: + continue - # Create file info for unindexed file - file_info = {"camera_name": camera_config.name, "filename": str(video_file), "file_id": video_file.name, "start_time": file_mtime.isoformat(), "end_time": None, "file_size_bytes": stat.st_size, "duration_seconds": None, "machine_trigger": None, "status": "unknown", "created_at": file_mtime.isoformat()} # We don't know if it's completed or not - files.append(file_info) + # Create file info for unindexed file + file_info = {"camera_name": camera_config.name, "filename": str(video_file), "file_id": video_file.name, "start_time": file_mtime.isoformat(), "end_time": None, "file_size_bytes": stat.st_size, "duration_seconds": None, "machine_trigger": None, "status": "unknown", "created_at": file_mtime.isoformat()} # We don't know if it's completed or not + files.append(file_info) # Sort by start time (newest first) files.sort(key=lambda x: x["start_time"], reverse=True) @@ -261,18 +264,21 @@ class StorageManager: # Scan for video files in camera directory if storage_path.exists(): - for video_file in storage_path.glob("*.avi"): - if video_file.is_file(): - stats["total_files"] += 1 - stats["cameras"][camera_name]["file_count"] += 1 + # Scan for all supported video formats + video_extensions = ["*.avi", "*.mp4", "*.webm"] + for pattern in video_extensions: + for video_file in storage_path.glob(pattern): + if video_file.is_file(): + stats["total_files"] += 1 + stats["cameras"][camera_name]["file_count"] += 1 - # Get file size - try: - file_size = video_file.stat().st_size - stats["total_size_bytes"] += file_size - stats["cameras"][camera_name]["total_size_bytes"] += file_size - except Exception as e: - self.logger.warning(f"Could not get size for {video_file}: {e}") + # Get file size + try: + file_size = video_file.stat().st_size + stats["total_size_bytes"] += file_size + stats["cameras"][camera_name]["total_size_bytes"] += file_size + except Exception as e: + self.logger.warning(f"Could not get size for {video_file}: {e}") # Add duration information from index if available for file_info in self.file_index["files"].values(): @@ -389,10 +395,13 @@ class StorageManager: for camera_config in self.config.cameras: storage_path = Path(camera_config.storage_path) if storage_path.exists(): - for video_file in storage_path.glob("*.avi"): - file_id = video_file.name - if file_id not in self.file_index["files"]: - integrity_report["orphaned_files"].append(str(video_file)) + # Check for all supported video formats + video_extensions = ["*.avi", "*.mp4", "*.webm"] + for pattern in video_extensions: + for video_file in storage_path.glob(pattern): + file_id = video_file.name + if file_id not in self.file_index["files"]: + integrity_report["orphaned_files"].append(str(video_file)) # Save updated index if fixes were made if integrity_report["fixed_issues"] > 0: