"""FFmpeg/FFprobe interaction utilities for the web backend.""" import subprocess import json def get_stream_info(input_file: str): """ Retrieve stream information (audio, video, subtitle presence) from a media file. Returns a dict with keys: has_audio, has_video, has_subtitle, audio_codec. """ # Get audio codec (if any) audio_codec = None try: cmd = [ 'ffprobe', '-v', 'error', '-select_streams', 'a:0', '-show_entries', 'stream=codec_name', '-of', 'default=noprint_wrappers=1:nokey=1', input_file ] result = subprocess.run(cmd, capture_output=True, text=True, check=False) codec = result.stdout.strip().lower() if codec: audio_codec = codec except Exception: pass # Check for video stream has_video = False try: cmd = [ 'ffprobe', '-v', 'error', '-select_streams', 'v', '-show_entries', 'stream=codec_type', '-of', 'default=noprint_wrappers=1:nokey=1', input_file ] result = subprocess.run(cmd, capture_output=True, text=True, check=False) has_video = bool(result.stdout.strip()) except Exception: pass # Check for subtitle stream has_subtitle = False try: cmd = [ 'ffprobe', '-v', 'error', '-select_streams', 's', '-show_entries', 'stream=codec_type', '-of', 'default=noprint_wrappers=1:nokey=1', input_file ] result = subprocess.run(cmd, capture_output=True, text=True, check=False) has_subtitle = bool(result.stdout.strip()) except Exception: pass return { 'has_audio': audio_codec is not None, 'has_video': has_video, 'has_subtitle': has_subtitle, 'audio_codec': audio_codec, } def get_audio_duration(input_file: str) -> float: """Get the duration of the audio file in seconds.""" cmd = [ 'ffprobe', '-v', 'error', '-show_entries', 'format=duration', '-of', 'default=noprint_wrappers=1:nokey=1', input_file ] result = subprocess.run(cmd, capture_output=True, text=True, check=False) try: return float(result.stdout.strip()) except ValueError: return 0.0