67 lines
1.5 KiB
Python
67 lines
1.5 KiB
Python
import logging
|
|
import math
|
|
|
|
import ffmpeg
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
def media_info(file_path):
|
|
return ffmpeg.probe(file_path)
|
|
|
|
|
|
def bitrate(info) -> float:
|
|
try:
|
|
return int(info["format"]["bit_rate"])
|
|
except KeyError | ValueError:
|
|
return math.inf
|
|
|
|
|
|
def format(info):
|
|
try:
|
|
return info["format"]["format_name"]
|
|
except KeyError | ValueError:
|
|
return None
|
|
|
|
|
|
def compression_settings(input_file, settings):
|
|
info = media_info(input_file)
|
|
br = settings.get("REPUBLISHER_AUDIO_BITRATE", 96000)
|
|
fmt = settings.get("REPUBLISHER_AUDIO_FORMAT", "mp3")
|
|
if bitrate(info) <= br:
|
|
is_br = True
|
|
else:
|
|
is_br = False
|
|
if format(info) == fmt:
|
|
is_fmt = True
|
|
else:
|
|
is_fmt = False
|
|
|
|
if is_br and is_fmt:
|
|
return None
|
|
|
|
if is_br:
|
|
target_br = bitrate(info)
|
|
else:
|
|
target_br = br
|
|
return {"bitrate": target_br, "ext": "mp3"}
|
|
|
|
|
|
def compress_audio(input_file, output_file_base, settings):
|
|
ext = settings["ext"]
|
|
br = settings["bitrate"]
|
|
output_file = f"{output_file_base}.{ext}"
|
|
try:
|
|
logger.info(f"Compressing audio {input_file} to {output_file} target_br={br}")
|
|
out, _ = (
|
|
ffmpeg.input(input_file)
|
|
.output(
|
|
output_file,
|
|
**{"b:a": f"{br}", "map": "0:a:0"},
|
|
loglevel="quiet",
|
|
)
|
|
.run()
|
|
)
|
|
return output_file
|
|
except ffmpeg.Error as e:
|
|
raise RuntimeError(f"Failed to load audio: {e.stderr.decode()}") from e
|