o
    ziK                     @   s   d dl Z d dlZd dlZd dlZd dlmZ d dlmZ d dlZd dl	Z
d dlZdedefddZded	eeef fd
dZG dd dZdS )    N)Path)Tuplefilepathquietc              	   C   s   ddd| dddddg	}|r|d	g7 }t j|t jd
d}| d }|d}||d  }t||dd  }t||dd  }t||dd  }	t||dd  }
t||dd  }t||dd  }|||	|
||d}|S )am  Takes a path to an audio file, returns a dict with the loudness
    stats computed by the ffmpeg ebur128 filter.

    Parameters
    ----------
    filepath : str
        Path to compute loudness stats on.
    quiet : bool
        Whether to show FFMPEG output during computation.

    Returns
    -------
    dict
        Dictionary containing loudness stats.
    ffmpegz-nostatsz-iz-filter_complexebur128z-fnull-z-hide_bannerT)stderruniversal_newlines   zSummary:NzI:   zLRA:zlow:zhigh:)IzI ThresholdLRAzLRA ThresholdzLRA LowzLRA High)
subprocessPopenPIPEcommunicaterfindsplitfloatindex)r   r   ffargsprocstatssummary_indexsummary_listi_lufsi_threshlra
lra_threshlra_lowlra_high
stats_dict r$   J/home/ubuntu/.local/lib/python3.10/site-packages/audiotools/core/ffmpeg.py	r128stats   s<   

	r&   pathreturnc                 C   sr   t j| didd}t|jtjdd d }d}d}|D ]}|d d	kr2|d
d}|d} nqt||fS )zcGiven a path to a file, returns the start time offset and codec of
    the first audio stream.
    Nzv-show_entries format=start_time:stream=duration,start_time,codec_type,codec_name,start_pts,time_base -of json -v quiet)inputsglobal_options)stdoutr   streams        
codec_typeaudio
start_time
codec_name)	ffmpyFFprobejsonloadsrunr   r   getr   )r'   ffr,   seconds_offsetcodecstreamr$   r$   r%   ffprobe_offset_and_codecA   s   
r<   c                   @   sL   e Zd ZdZddefddZddedefddZedd	e	defd
dZ
dS )FFMPEGMixinNTr   c                 C   s   g }t jdd&}t| jD ]}| | |j t|j|d}||d  qW d   n1 s1w   Y  t	t
| | _|  S )a^  Computes loudness of audio file using FFMPEG.

        Parameters
        ----------
        quiet : bool, optional
            Whether to show FFMPEG output during computation,
            by default True

        Returns
        -------
        torch.Tensor
            Loudness of every item in the batch, computed via
            FFMPEG.
        .wavsuffix)r   r   N)tempfileNamedTemporaryFilerange
batch_sizewritenamer&   appendtorch
from_numpynparrayr   	_loudnessloudness)selfr   rM   filoudness_statsr$   r$   r%   ffmpeg_loudnessZ   s   zFFMPEGMixin.ffmpeg_loudnesssample_ratec                 C   s   ddl m} || jkr| S tjdd;}| |j |jdd}d|j d| d	| }|r3|d
7 }t	t
| ||}tt| W d   |S 1 sQw   Y  |S )a  Resamples AudioSignal using FFMPEG. More memory-efficient
        than using julius.resample for long audio files.

        Parameters
        ----------
        sample_rate : int
            Sample rate to resample to.
        quiet : bool, optional
            Whether to show FFMPEG output during computation,
            by default True

        Returns
        -------
        AudioSignal
            Resampled AudioSignal.
        r   )AudioSignalr>   r?   wavzrs.wavz
ffmpeg -i z -ar  z -hide_banner -loglevel errorN)
audiotoolsrT   rS   rA   rB   rE   rF   replacer   
check_callshlexr   r   unlink)rN   rS   r   rT   rO   f_outcommand	resampledr$   r$   r%   ffmpeg_resamplet   s    

		zFFMPEGMixin.ffmpeg_resample
audio_pathc                 K   s   t |}t _}t t|d }t t|d }d}|r!|d7 }tj|di|di|d}|  t|\}	}
|
dkrA|	d	k rAd
}	tj|di|d|	d  di|d}|  | |fi |}W d   |S 1 sjw   Y  |S )a1  Loads AudioSignal object after decoding it to a wav file using FFMPEG.
        Useful for loading audio that isn't covered by librosa's loading mechanism. Also
        useful for loading mp3 files, without any offset.

        Parameters
        ----------
        audio_path : str
            Path to load AudioSignal from.
        quiet : bool, optional
            Whether to show FFMPEG output during computation,
            by default True

        Returns
        -------
        AudioSignal
            AudioSignal loaded from file with FFMPEG.
        zextracted.wavz
padded.wavz-yz -loglevel errorNz-af aresample=async=1000)r)   outputsr*   mp3gS㥛?r-   z-af 'adelay=i  z
:all=true')strrA   TemporaryDirectoryr   r2   FFmpegr6   r<   )clsr`   r   kwargsdwav_file
padded_wavr*   r8   padr:   signalr$   r$   r%   load_from_file_with_ffmpeg   s6   

**z&FFMPEGMixin.load_from_file_with_ffmpeg)T)__name__
__module____qualname__rL   boolrR   intr_   classmethodrc   rm   r$   r$   r$   r%   r=   W   s    !r=   )r4   rZ   r   rA   pathlibr   typingr   r2   numpyrJ   rH   rc   rq   r&   r   r<   r=   r$   r$   r$   r%   <module>   s    4