
    v;3hP0                     |   d dl mZ d dlZd dlZd dlZd dlZd dlmZmZ d dl	m
Z
mZ d dlmZ d dlmZ d dlmZ 	 d dlZej*                  dk\  reZd	d
ddZddddZddddZd Zd)dZd Zd*dZd)dZd+dZ d,dZ!d Z"d Z#d Z$d Z%d Z&d Z'd  Z(d-d!Z)d" Z*d# Z+e+d$        Z,d% Z-d& Z.d' Z/d( Z0y# e$ r d dlZY |w xY w).    )divisionN)PopenPIPE)logceil)TemporaryFile)warnwraps)   r            )          bhi)i   )i i  )i   ic                     t         |    S N)FRAME_WIDTHS	bit_depths    K/var/www/html/audio-gradio/venv/lib/python3.12/site-packages/pydub/utils.pyget_frame_widthr   &       	""    c                 <    t         |    }|s|j                         }|S r   )ARRAY_TYPESupper)r   signedts      r   get_array_typer%   *   s    IAGGIHr   c                     t         |    S r   )ARRAY_RANGESr   s    r   get_min_max_valuer(   1   r   r   c                     d}| |rt        |      } d}t        | t              rt        | |      } d}	 t        | t        j
                        rt        | |      } d}| |fS # t        $ r Y | |fS w xY w)NF)modeT)r   
isinstance
basestringopenosPathLikeAttributeError)fdr*   tempfileclose_fds       r   _fd_or_path_or_tempfiler4   5   s    H	zh%"j!"4 b"++&bt$BH x<   	x<s   )A" "	A10A1c                 <    t        |       } |rd| dz  z  S d| dz  z  S )z_
    Converts the input db to a float, which represents the equivalent
    ratio in power.
    
      )float)dbusing_amplitudes     r   db_to_floatr;   K   s,    
 
rBb2gb2gr   c                     t        |       } || |z  } | dk(  rt        d       S |rdt        | d      z  S dt        | d      z  S )z
    Converts the input float to db, which represents the equivalent
    to the ratio in power represented by the multiplier passed in.
    r   infr7   r6   )r8   r   )ratioval2r:   s      r   ratio_to_dbr@   W   sX    
 %LE  ze}CrN""CrN""r   c                 x    t        | t              r| fdS | j                  ddlm} t        ||        | S )a>  
    decorator for adding pydub effects to the AudioSegment objects.
    example use:
        @register_pydub_effect
        def normalize(audio_segment):
            ...
    or you can specify a name:
        @register_pydub_effect("normalize")
        def normalize_audio_segment(audio_segment):
            ...
    c                     t        |       S r   )register_pydub_effect)fnnames    r   <lambda>z'register_pydub_effect.<locals>.<lambda>z   s    /D9 r   r   )AudioSegment)r+   r,   __name__audio_segmentrG   setattr)rD   rE   rG   s    ` r   rC   rC   l   s<     "j!99|{{+L$#Ir   c                     t        t        |       t        |      z        }t        t	        |            D cg c]  }| ||z  |dz   |z    c}S c c}w )z
    Breaks an AudioSegment into chunks that are <chunk_length> milliseconds
    long.
    if chunk_length is 50 then you'll get a list of 50 millisecond long audio
    segments back (except the last one, which can be shorter)
    r   )r   lenr8   rangeint)rI   chunk_lengthnumber_of_chunksr   s       r   make_chunksrQ      s^     C.|1DDE3/013 !l*AE\+AB 3 3 3s   Ac                    t         j                  dk(  r| j                  d      s| dz  } t         j                  gt         j                  d   j                  t         j                        z   }|D ]j  }t         j                  j                  ||       }t         j                  j                  |      sCt        j                  |t         j                        sh|c S  y)z0
    Mimics behavior of UNIX which command.
    ntz.exePATHN)r.   rE   endswithcurdirenvironsplitpathseppathjoinisfileaccessX_OK)programenvdir_listenvdirprogram_paths       r   whichrc      s    
 
ww$w//7699+

6 2 8 8 DDK  ww||FG477>>,'BIIlBGG,L r   c                  T    t        d      ryt        d      ryt        dt               y)Q
    Return enconder default application for system, either avconv or ffmpeg
    avconvffmpegzGCouldn't find ffmpeg or avconv - defaulting to ffmpeg, but may not workrc   r	   RuntimeWarning r   r   get_encoder_namerk      )     X	x 	VXfgr   c                  T    t        d      ryt        d      ryt        dt               y)re   avplayffplayzGCouldn't find ffplay or avplay - defaulting to ffplay, but may not workrh   rj   r   r   get_player_namerp      rl   r   c                  T    t        d      ryt        d      ryt        dt               y)z;
    Return probe application, either avconv or ffmpeg
    avprobeffprobezJCouldn't find ffprobe or avprobe - defaulting to ffprobe, but may not workrh   rj   r   r   get_prober_namert      s+     Y	y	 	Y[ijr   c                    t         j                  dk\  rTt        t        f}t         j                  dk\  r|t        j
                  fz  }t        | |      rZt	        j                  |       S t        | t              r#| j                  t        j                               S t        | t              r| S t        dj                  t        |                   )z<Wrapper for os.fsdecode which was introduced in python 3.2 .)r   r   )r      z!type {0} not accepted by fsdecode)sysversion_infor,   bytesr.   r/   r+   fsdecodedecodegetfilesystemencoding	TypeErrorformattype)filenamePathLikeTypess     r   rz   rz      s     6!#U+v%bkk^+Mh.;;x((h&??3#<#<#>??h
+O
7>>tH~N
OOr   c                    i }d}t        j                  ||       D ]  }|j                  d      gt        |j                  d            t        |j                  d            k  r2dj	                  |j                  d      |j                  d      g      }n|j                  d      }t        j
                  d|      D cg c]  }|s|j                          }}||t        |j                  d            <    |S c c}w )	a|  
    avprobe sometimes gives more information on stderr than
    on the json output. The information has to be extracted
    from stderr of the format of:
    '    Stream #0:0: Audio: flac, 88200 Hz, stereo, s32 (24 bit)'
    or (macOS version):
    '    Stream #0:0: Audio: vorbis'
    '      44100 Hz, stereo, fltp, 320 kb/s'

    :type stderr: str
    :rtype: list of dict
    z}(?P<space_start> +)Stream #0[:\.](?P<stream_id>([0-9]+))(?P<content_0>.+)\n?(?! *Stream)((?P<space_end> +)(?P<content_1>.+))?	space_endspace_start,	content_0	content_1z[:,]	stream_id)refinditergrouprL   r[   rX   striprN   )stderr
extra_info	re_streamr   content_linextokenss          r   get_extra_infor      s     J QI[[F+ 777;+AGGM4J0Ks$P& 1&88QWW[%9177;;O$PQL77;/L%'XXfl%CIq!'')II06
3qww{+,-7  Js   ?C<C<c           
      n   t               }g d}	 |t        |       gz  }d}d}|ddg|z   }t        ||t        t              }	|	j                  |      \  }
}|
j                  dd      }
|j                  dd      }t        j                  |
      }|s|S t        |      }|d   D cg c]  }|d   dk(  s| }}t        |      d
k(  r|S |d
   }d }||d      D ][  }t!        j"                  d|      }t!        j"                  d|      }|r^ ||d|j%                  d              ||dt'        |j%                  d                    ||dt'        |j%                  d                   |r^ ||d|j%                  d              ||dt'        |j%                  d                    ||dt'        |j%                  d                   t!        j"                  d|      r  ||d|        ||dd        ||dd       &t!        j"                  d |      s> ||d|        ||dd!        ||dd!       ^ |S # t        $ rk |dk(  r|dt        |      dgz  }n|dgz  }t        }t        | dd	      \  }}|j                  d
       |j                         }|r|j                          Y w xY wc c}w )"z\Return json dictionary with media info(codec, duration, size, bitrate...) from filepath
    )-vinfo-show_format-show_streamsNrs   z-read_ahead_limitzcache:pipe:0-rbF)r2   r   -ofjson)stdinstdoutr   )inpututf-8ignorestreams
codec_typeaudioc                 (    || vs| |   dk(  r|| |<   y y Nr   rj   )streampropvalues      r   set_propertyz$mediainfo_json.<locals>.set_property'  s#    v!2 F4L "3r   indexz*([su]([0-9]{1,2})p?) \(([0-9]{1,2}) bit\)$z$([su]([0-9]{1,2})p?)( \(default\))?$
sample_fmtr   bits_per_sampler   bits_per_raw_sampler   z(flt)p?( \(default\))?$r   z(dbl)p?( \(default\))?$@   )rt   rz   r}   strr   r4   seekreadcloser   communicater{   r   loadsr   rL   r   matchr   rN   )filepathread_ahead_limitprobercommand_argsstdin_parameter
stdin_datafile
close_filecommandresoutputr   r   r   r   audio_streamsr   r   tokenmm2s                        r   mediainfo_jsonr      s    FL
(+,,
 uf%4G
tD
IC__:_6NFF]]7H-F]]7H-F::fD 'J $YN11\?g3MQNMN
=Q 1F! F7O, <HHA5IXX<eDqwwqz:!2C
OD!6AGGAJHrxx{;!2C4DE!6BHHQK8HIXX/7u5!2B7!6;XX/7u5!2B7!6;%<& Ku  Y0#6F2G+- -L SE!L28TERj		!YY[
JJL8 Os   H; &J24J2;A0J/.J/c                 r   t               }dddd| g}|ddg|z   }t        |t              }|j                         d   j	                  d	      }|j
                  dk7  r7|g|z   }t        |t              j                         d   j	                  d	      }t        j                  d
      }i }t        j                  dk(  r|j                  dd      }|j                  d      D ]@  }|j                  |      }	|	s|	j                         \  }
}}|
r	 ||
    |||
   |<   <|||<   B |S # t        $ r i ||
<   Y "w xY w)zWReturn dictionary with media info(codec, duration, size, bitrate...) from filepath
    r   quietr   r   r   old)r   r   r   z6(?:(?P<inner_dict>.*?):)?(?P<key>.*?)\=(?P<value>.*?)$win32 
)rt   r   r   r   r{   
returncoder   compilerw   platformreplacerX   r   groupsKeyError)r   r   r   r   r   r   rgxr   linemobj
inner_dictkeyr   s                r   	mediainfor   A  sO    Fg	L ue$|3G

%C__q!((1F
~~(\)wt,88:1=DDWM
**N
OCD
||wb)T" "yy%)[[]"JU*$ ).Z %!S	"" K   *')D$*s   D%%D65D6c                 6     i t                fd       }|S )Nc                  <    	  d   S #           d<    d   cY S xY wr   rj   )cachefunctions   r   wrapperzcache_codecs.<locals>.wrapperr  s,    	8O	zE!H8Os    r
   )r   r   r   s   ` @r   cache_codecsr   o  s%    E
8_  Nr   c                  R   t               } | dg}t        |t        t              }|j                         d   j	                  d      }|j
                  dk7  rg S t        j                  dk(  r|j                  dd      }t        j                  d      }t               }t               }|j                  d	      D ]k  }|j                  |j                               }|s%|j                         \  }	}
}|	d   d
k(  r|j!                  |
       |	d   dk(  s[|j!                  |
       m ||fS )Nz-codecs)r   r   r   r   r   r   r   z)^([D.][E.][AVS.][I.][L.][S.]) (\w*) +(.*)r   Dr   E)rk   r   r   r   r{   r   rw   r   r   r   r   setrX   r   r   r   add)encoderr   r   r   r   decodersencodersr   r   flagscodecrE   s               r   get_supported_codecsr   }  s	    G	"G
T
2C__q!((1F
~~	
||wb) **A
BCuHuHT" 
 		$**,'"\\^ud8s?LL8s?LL
  hr   c                      t               d   S r   r   rj   r   r   get_supported_decodersr         !!$$r   c                      t               d   S )Nr   r   rj   r   r   get_supported_encodersr     r   r   c                     | j                         }|d   j                  |d         |d   j                  |d   j                               g}t        j	                  |d   |d         S )z
	Left-Right -> Mid-Side
	r   r   split_to_monooverlayinvert_phaserG   from_mono_audiosegmentsrI   channels     r   stereo_to_msr     sf     &&(AJwqz*GAJ,>,>wqz?V?V?X,YZ,,WQZDDr   c                     | j                         }|d   j                  |d         dz
  |d   j                  |d   j                               dz
  g}t        j	                  |d   |d         S )z
	Mid-Side -> Left-Right
	r   r   r   r   r   s     r   ms_to_stereor     sq     &&(AJwqz*Q.
0B0B71:CZCZC\0]`a0ab,,WQZDDr   )T)zw+bT)NTr   ))1
__future__r   r   r.   r   rw   
subprocessr   r   mathr   r   r2   r   warningsr	   	functoolsr   audioopImportError	pyaudiooprx   r   r,   r   r!   r'   r   r%   r(   r4   r;   r@   rC   rQ   rc   rk   rp   rt   rz   r   r   r   r   r   r   r   r   r   rj   r   r   <module>r     s     	 	 
 "  "    vJ 			  !##,	#*0	3  P$6GT+\    <%%EEy    s   B/ /	B;:B;