from subprocess import CalledProcessError
from typing import Any, Dict

from ._ffmpeg import compute_replaygain, probe_replaygain


def analyze_replaygain(filepath: str, metadata: Dict[str, Any]):
    """
    Extracts the Replaygain loudness normalization factor of a track using ffmpeg.
    """
    try:
        # First probe for existing replaygain metadata.
        track_gain = probe_replaygain(filepath)
        if track_gain is not None:
            metadata["replay_gain"] = track_gain
            return metadata
    except (CalledProcessError, OSError):
        pass

    try:
        track_gain = compute_replaygain(filepath)
        if track_gain is not None:
            metadata["replay_gain"] = track_gain
    except (CalledProcessError, OSError):
        pass

    return metadata