__author__ = "asantoni"

import subprocess
from typing import Any, Dict

from loguru import logger


class UnplayableFileError(Exception):
    pass


LIQUIDSOAP_EXECUTABLE = "liquidsoap"


def analyze_playability(filename: str, metadata: Dict[str, Any]):
    """Checks if a file can be played by Liquidsoap.
    :param filename: The full path to the file to analyzer
    :param metadata: A metadata dictionary where the results will be put
    :return: The metadata dictionary
    """
    command = [
        LIQUIDSOAP_EXECUTABLE,
        "-v",
        "-c",
        "output.dummy(audio_to_stereo(single(argv(1))))",
        "--",
        filename,
    ]
    try:
        subprocess.check_output(command, stderr=subprocess.STDOUT, close_fds=True)

    except OSError as e:  # liquidsoap was not found
        logger.warning(
            "Failed to run: %s - %s. %s"
            % (command[0], e.strerror, "Do you have liquidsoap installed?")
        )
    except (
        subprocess.CalledProcessError,
        Exception,
    ) as e:  # liquidsoap returned an error code
        logger.warning(e)
        raise UnplayableFileError()

    return metadata