import tempfile import subprocess import os from moviepy.editor import VideoFileClip import streamlit as st import traceback import shutil # -------------------------- # Utility: Trim videos to 2 minutes # -------------------------- def trim_video(video_path, max_duration=120): """Trims video to max_duration (in seconds) and extracts audio.""" try: video = VideoFileClip(video_path) duration = video.duration video.close() audio_path = tempfile.NamedTemporaryFile(delete=False, suffix=".wav").name command = [ "ffmpeg", "-i", video_path, "-t", str(min(duration, max_duration)), "-ar", "16000", "-ac", "1", "-acodec", "pcm_s16le", "-y", audio_path ] result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) if result.returncode != 0: st.error("ffmpeg audio extraction failed.") os.remove(audio_path) # Clean up failed temp file st.code(result.stderr.decode()) return None return audio_path except Exception as e: st.error(f"Error trimming video: {e}") os.remove(audio_path) st.code(traceback.format_exc()) return None finally: # Clean up input video if it was a temp file if "tmp" in video_path and os.path.exists(video_path): try: os.remove(video_path) except Exception: pass # Avoid crashing on cleanup