80 lines
2.3 KiB
Python
80 lines
2.3 KiB
Python
"""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
|