Tracs validation added. A warning is thrown if the input contains a video strem, but the requested output format doesn't support it
This commit is contained in:
@@ -0,0 +1,79 @@
|
||||
"""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
|
||||
Reference in New Issue
Block a user