Implement audio file compression

This commit is contained in:
Abel Luck 2024-04-18 17:28:09 +02:00
parent 2f0adc8308
commit ca17e44687
6 changed files with 183 additions and 23 deletions

67
repub/media.py Normal file
View file

@ -0,0 +1,67 @@
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