B
    jnd!                 @   sp   d dl Z d dlZd dlZdZG dd deZG dd deZG dd deZG d	d
 d
eZ	dd Z
dd ZdS )    Nz0.3.0c               @   s,   e Zd ZdZd
ddZdd Zddd	ZdS )FFmpegzhWrapper for various `FFmpeg <https://www.ffmpeg.org/>`_ related applications (ffmpeg,
    ffprobe).
    ffmpegNc             C   s   || _ |g| _|pg }t|r@g }x&|D ]}|t|7 }q(W n
t|}|  j|7  _|  jt|dd7  _|  jt|7  _t| j| _d| _	dS )aJ  Initialize FFmpeg command line wrapper.

        Compiles FFmpeg command line from passed arguments (executable path, options, inputs and
        outputs). ``inputs`` and ``outputs`` are dictionares containing inputs/outputs as keys and
        their respective options as values. One dictionary value (set of options) must be either a
        single space separated string, or a list or strings without spaces (i.e. each part of the
        option is a separate item of the list, the result of calling ``split()`` on the options
        string). If the value is a list, it cannot be mixed, i.e. cannot contain items with spaces.
        An exception are complex FFmpeg command lines that contain quotes: the quoted part must be
        one string, even if it contains spaces (see *Examples* for more info).
        For more info about FFmpeg command line format see `here
        <https://ffmpeg.org/ffmpeg.html#Synopsis>`_.

        :param str executable: path to ffmpeg executable; by default the ``ffmpeg`` command will be
            searched for in the ``PATH``, but can be overridden with an absolute path to ``ffmpeg``
            executable
        :param iterable global_options: global options passed to ``ffmpeg`` executable (e.g.
            ``-y``, ``-v`` etc.); can be specified either as a list/tuple/set of strings, or one
            space-separated string; by default no global options are passed
        :param dict inputs: a dictionary specifying one or more input arguments as keys with their
            corresponding options (either as a list of strings or a single space separated string) as
            values
        :param dict outputs: a dictionary specifying one or more output arguments as keys with their
            corresponding options (either as a list of strings or a single space separated string) as
            values
        T)add_input_optionN)

executable_cmd_is_sequenceshlexsplit_merge_args_opts
subprocesslist2cmdlinecmdprocess)selfr   global_optionsinputsoutputsZnormalized_global_optionsopt r   )/tmp/pip-unpacked-wheel-wssbpeae/ffmpy.py__init__   s    

zFFmpeg.__init__c             C   s   d | jj| jS )Nz<{0!r} {1!r}>)format	__class____name__r   )r   r   r   r   __repr__<   s    zFFmpeg.__repr__c          
   C   s   yt j| jt j|||d| _W nB tk
r` } z$|jtjkrNtd	| j
n W dd}~X Y nX | jj|d}| jjdkrt| j| jj|d |d |S )a  Execute FFmpeg command line.

        ``input_data`` can contain input for FFmpeg in case ``pipe`` protocol is used for input.
        ``stdout`` and ``stderr`` specify where to redirect the ``stdout`` and ``stderr`` of the
        process. By default no redirection is done, which means all output goes to running shell
        (this mode should normally only be used for debugging purposes). If FFmpeg ``pipe`` protocol
        is used for output, ``stdout`` must be redirected to a pipe by passing `subprocess.PIPE` as
        ``stdout`` argument. You can pass custom environment to ffmpeg process with ``env``.

        Returns a 2-tuple containing ``stdout`` and ``stderr`` of the process. If there was no
        redirection or if the output was redirected to e.g. `os.devnull`, the value returned will
        be a tuple of two `None` values, otherwise it will contain the actual ``stdout`` and
        ``stderr`` data returned by ffmpeg process.

        More info about ``pipe`` protocol `here <https://ffmpeg.org/ffmpeg-protocols.html#pipe>`_.

        :param str input_data: input data for FFmpeg to deal with (audio, video etc.) as bytes (e.g.
            the result of reading a file in binary mode)
        :param stdout: redirect FFmpeg ``stdout`` there (default is `None` which means no
            redirection)
        :param stderr: redirect FFmpeg ``stderr`` there (default is `None` which means no
            redirection)
        :param env: custom environment for ffmpeg process
        :return: a 2-tuple containing ``stdout`` and ``stderr`` of the process
        :rtype: tuple
        :raise: `FFRuntimeError` in case FFmpeg command exits with a non-zero code;
            `FFExecutableNotFoundError` in case the executable path passed was not valid
        )stdinstdoutstderrenvzExecutable '{0}' not foundN)inputr      )r   Popenr   PIPEr   OSErrorerrnoENOENTFFExecutableNotFoundErrorr   r   communicate
returncodeFFRuntimeErrorr   )r   Z
input_datar   r   r   eoutr   r   r   run?   s    z
FFmpeg.run)r   NNN)NNNN)r   
__module____qualname____doc__r   r   r,   r   r   r   r   r      s   
.r   c                   s"   e Zd ZdZd fdd	Z  ZS )FFprobez=Wrapper for `ffprobe <https://www.ffmpeg.org/ffprobe.html>`_.ffprobe Nc                s   t t| j|||d dS )a  Create an instance of FFprobe.

        Compiles FFprobe command line from passed arguments (executable path, options, inputs).
        FFprobe executable by default is taken from ``PATH`` but can be overridden with an
        absolute path. For more info about FFprobe command line format see
        `here <https://ffmpeg.org/ffprobe.html#Synopsis>`_.

        :param str executable: absolute path to ffprobe executable
        :param iterable global_options: global options passed to ffmpeg executable; can be specified
            either as a list/tuple of strings or a space-separated string
        :param dict inputs: a dictionary specifying one or more inputs as keys with their
            corresponding options as values
        )r   r   r   N)superr0   r   )r   r   r   r   )r   r   r   r   r   s    
zFFprobe.__init__)r1   r2   N)r   r-   r.   r/   r   __classcell__r   r   )r   r   r0   o   s   r0   c               @   s   e Zd ZdZdS )r&   z3Raise when FFmpeg/FFprobe executable was not found.N)r   r-   r.   r/   r   r   r   r   r&      s   r&   c                   s    e Zd ZdZ fddZ  ZS )r)   zRaise when FFmpeg/FFprobe command line execution returns a non-zero exit code.

    The resulting exception object will contain the attributes relates to command line execution:
    ``cmd``, ``exit_code``, ``stdout``, ``stderr``.
    c                sN   || _ || _|| _|| _d| j ||p(d |p2d }tt| | d S )Nz6`{0}` exited with status {1}

STDOUT:
{2}

STDERR:
{3}    )	r   	exit_coder   r   r   decoder3   r)   r   )r   r   r6   r   r   message)r   r   r   r      s    zFFRuntimeError.__init__)r   r-   r.   r/   r   r4   r   r   )r   r   r)      s   r)   c             C   s   t | dot| t S )zCheck if the object is a sequence (list, tuple etc.).

    :param object obj: an object to be checked
    :return: True if the object is iterable but is not a string, False otherwise
    :rtype: bool
    __iter__)hasattr
isinstancestr)objr   r   r   r      s    r   c             K   sf   g }| s|S xT|   D ]H\}}t|s4t|p0d}||7 }|sBqd|krT|d || qW |S )a  Merge options with their corresponding arguments.

    Iterates over the dictionary holding arguments (keys) and options (values). Merges each
    options string with its corresponding argument.

    :param dict args_opts_dict: a dictionary of arguments and options
    :param dict kwargs: *input_option* - if specified prepends ``-i`` to input argument
    :return: merged list of strings with arguments and their corresponding options
    :rtype: list
    r2   r   z-i)itemsr   r   r	   append)Zargs_opts_dictkwargsmergedargr   r   r   r   r
      s    
r
   )r$   r   r   __version__objectr   r0   	Exceptionr&   r)   r   r
   r   r   r   r   <module>   s   g
