49 lines
1.4 KiB
Python
49 lines
1.4 KiB
Python
__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
|