__author__ = "asantoni"

import logging
import subprocess

from .analyzer import Analyzer


class UnplayableFileError(Exception):
    pass


class PlayabilityAnalyzer(Analyzer):
    """This class checks if a file can actually be played with Liquidsoap."""

    LIQUIDSOAP_EXECUTABLE = "liquidsoap"

    @staticmethod
    def analyze(filename, metadata):
        """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 = [
            PlayabilityAnalyzer.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
            logging.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
            logging.warning(e)
            raise UnplayableFileError()

        return metadata