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