o
    cBj                     @  s   d Z ddlmZ ddlZ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mZ ddlmZ ddlmZ eeZe	G d	d
 d
Zd$ddZd%ddZd&ddZd'ddZd(ddZd)d"d#ZdS )*zFDownload and normalize recording files for Sarvam STT (WAV, OGG, MP3).    )annotationsN)	dataclass)ListOptional)urlparse   )wav_duration_secondsc                   @  s&   e Zd ZU ded< ded< ded< dS )PreparedAudiostrpathfloatdurationz	List[str]cleanup_pathsN)__name__
__module____qualname____annotations__ r   r   H/home/aiteam/pcaa-dev/call-proccessing/stt_pipeline/stt/audio_prepare.pyr	      s   
 r	   urlr
   returnc                 C  s6   t t| pdj }dD ]}||r|  S qdS )N ).wav.ogg.mp3z.mpegz.m4az.flacr   )r   r
   r   lowerendswith)r   r   extr   r   r   _suffix_from_url   s   
r   databytesc                 C  s   t | dkr| dd dkrdS t | dkr | dd dkr dS t | dkr0| dd dkr0d	S t | d
krF| d dkrF| d d@ dkrFd	S t|S )N   r   s   RIFFr   s   OggSr      s   ID3r         r      )lenr   )r   r   r   r   r   _detect_format"   s   (r'   r   suffixr   c              
   C  s   |dkrt | S z'ddlm} || }|d ur.t|dd d ur.t|jjp%d}|dkr.|W S W n tyH } zt	d| | W Y d }~nd }~ww |dkrQt | S t
d| )Nr   r   )Fileinfoz"mutagen duration failed for %s: %sz'Could not determine audio duration for )r   mutagenr)   getattrr   r*   length	ExceptionloggerdebugRuntimeError)r   r(   MutagenFilemetar-   excr   r   r   _duration_for_path.   s"   r5   src_pathcallidc                 C  s   t d}|stdtjddd\}}t| |dddd	d
| dddddd|g}ztj|ddddd W n) tj	y^ } ztj
|rIt| |jpMd }td|pU| |d }~ww td|tj
|  |S )Nffmpegu5   ffmpeg not installed — cannot convert non-WAV audior   /tmpr(   dirz-yz-hide_bannerz	-loglevelerrorz-iz-acodec	pcm_s16lez-ar16000z-ac1Tx   )checkcapture_outputtexttimeoutr   zffmpeg conversion failed: u$   [%s] Converted %s → WAV via ffmpeg)shutilwhichr1   tempfilemkstemposclose
subprocessrunCalledProcessErrorr   existsunlinkstderrstripr/   r*   basename)r6   r7   r8   out_fdout_pathcmdr4   rP   r   r   r   _ffmpeg_convert_to_wav@   s>   


rV   contentc                 C  s  t | |}g }tj|dd\}}t| || t|d}||  W d   n1 s/w   Y  z(|dkrFt||}t	|||dW S t||}t
||}	||	 t	|	||dW S  ty   |D ]}
z|
rutj|
rut|
 W qe ty   Y qew  w )z
    Save downloaded bytes with the correct extension and return a WAV path for Sarvam.

    WAV inputs are used as-is. OGG/MP3/etc. are converted with ffmpeg when available.
    r9   r:   wbNr   )r   r   r   )r'   rG   rH   rI   rJ   appendopenwriter5   r	   rV   r.   r   rN   rO   OSError)rW   r   r7   r(   cleanupsrc_fdr6   fhr   wav_pathr   r   r   r   prepare_audioa   s6   







ra   preparedNonec              	   C  s@   | j D ]}z|rtj|rt| W q ty   Y qw d S )N)r   rI   r   rN   rO   r\   )rb   r   r   r   r   cleanup_prepared   s   

rd   )r   r
   r   r
   )r   r    r   r
   r   r
   )r   r
   r(   r
   r   r   )r6   r
   r7   r
   r   r
   )rW   r    r   r
   r7   r
   r   r	   )rb   r	   r   rc   )__doc__
__future__r   loggingrI   rE   rK   rG   dataclassesr   typingr   r   urllib.parser   audio_chunkerr   	getLoggerr   r/   r	   r   r'   r5   rV   ra   rd   r   r   r   r   <module>   s(    





!"