import cv2 import os from pathlib import Path from PIL import Image import tempfile def generate_video_thumbnail(video_path: str, output_path: str, frame_time: float = 1.0) -> bool: """ Generate a thumbnail from a video at a specific time. Args: video_path: Path to the video file output_path: Path where to save the thumbnail frame_time: Time in seconds to extract the frame (default: 1 second) Returns: bool: True if successful, False otherwise """ try: # Open video file cap = cv2.VideoCapture(video_path) if not cap.isOpened(): return False # Get video properties fps = cap.get(cv2.CAP_PROP_FPS) total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) if total_frames == 0: return False # Calculate frame number for the specified time frame_number = min(int(fps * frame_time), total_frames - 1) # Set position to the specified frame cap.set(cv2.CAP_PROP_POS_FRAMES, frame_number) # Read the frame ret, frame = cap.read() if not ret: return False # Convert BGR to RGB frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) # Convert to PIL Image pil_image = Image.fromarray(frame_rgb) # Resize to thumbnail size (400x400) pil_image.thumbnail((400, 400), Image.Resampling.LANCZOS) # Save thumbnail pil_image.save(output_path, "JPEG", quality=85, optimize=True) # Release video capture cap.release() return True except Exception as e: print(f"Error generating thumbnail: {e}") return False def get_video_duration(video_path: str) -> float: """ Get the duration of a video file in seconds. Args: video_path: Path to the video file Returns: float: Duration in seconds, or 0 if error """ try: cap = cv2.VideoCapture(video_path) if not cap.isOpened(): return 0 fps = cap.get(cv2.CAP_PROP_FPS) total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) cap.release() if fps > 0 and total_frames > 0: return total_frames / fps return 0 except Exception as e: print(f"Error getting video duration: {e}") return 0