Initial commit. Basic featues are implemented
This commit is contained in:
+55
@@ -0,0 +1,55 @@
|
||||
"""Container format decision and validation."""
|
||||
|
||||
from .constants import FORMAT_INFO
|
||||
|
||||
|
||||
def determine_output_format(stream_info, user_format, transcode_audio):
|
||||
"""
|
||||
Decide which container format to use.
|
||||
|
||||
Args:
|
||||
stream_info: Dict from get_stream_info().
|
||||
user_format: User‑requested format (or None).
|
||||
transcode_audio: Audio codec to transcode to (or None).
|
||||
|
||||
Returns:
|
||||
A format name that exists in FORMAT_INFO.
|
||||
"""
|
||||
if user_format:
|
||||
return user_format
|
||||
|
||||
# If video or subtitles exist, use MKV (which supports everything).
|
||||
if stream_info['has_video'] or stream_info['has_subtitle']:
|
||||
return 'matroska'
|
||||
|
||||
# Audio‑only: choose based on the current audio codec.
|
||||
audio_codec = stream_info.get('audio_codec', '')
|
||||
if audio_codec == 'mp3':
|
||||
return 'mp3'
|
||||
else:
|
||||
return 'mp4' # .m4a
|
||||
|
||||
|
||||
def validate_format_compatibility(format_name, stream_info, drop_video, drop_subs):
|
||||
"""
|
||||
Ensure the chosen container can accommodate the streams we intend to keep.
|
||||
|
||||
Raises:
|
||||
ValueError: If the format is incompatible with the intended streams.
|
||||
"""
|
||||
info = FORMAT_INFO.get(format_name)
|
||||
if not info:
|
||||
print(f"Warning: Unknown format '{format_name}'. Proceeding, but may fail.")
|
||||
return
|
||||
|
||||
if info['audio_only']:
|
||||
if stream_info['has_video'] and not drop_video:
|
||||
raise ValueError(
|
||||
f"Format '{format_name}' does not support video streams. "
|
||||
"Please use --drop-video or choose a container that supports video."
|
||||
)
|
||||
if stream_info['has_subtitle'] and not drop_subs:
|
||||
raise ValueError(
|
||||
f"Format '{format_name}' does not support subtitle streams. "
|
||||
"Please use --drop-subs or choose a container that supports subtitles."
|
||||
)
|
||||
Reference in New Issue
Block a user