
    rh!                        S SK Jr  S SKrS SKrS SKrS SKJrJr  S SKrS SK	r	S SK
r
SSKJrJr  SSKJrJr  S SKrS SKJr   S SKJr  S S	KJr   S S
KJr  SSKJrJrJrJrJrJr  SSK J!r!J"r"J#r#J$r$J%r%J&r&J'r'  \	RP                  S:  a  \)r*\+r,\r " S S\-5      r.S r/SSS.r0\" S/ SQ5      r1\" S/ SQ5      r2S r3SS jr4S r5 " S S\-5      r6SSK7J8r8  g!   S SKJr   N= f!   \r N= f)    )divisionN)TemporaryFileNamedTemporaryFile   )log_conversionlog_subprocess_output)mediainfo_jsonfsdecode)
namedtuple)StringIO)BytesIO)izip)_fd_or_path_or_tempfiledb_to_floatratio_to_dbget_encoder_nameget_array_typeaudioop)TooManyMissingFramesInvalidDurationInvalidID3TagVersion
InvalidTagCouldntDecodeErrorCouldntEncodeErrorMissingAudioParameter)   r   c                   4    \ rS rSrSS jrSS jrS rS rSrg)	ClassPropertyDescriptor3   Nc                     Xl         X l        g Nfgetfset)selfr#   r$   s      M/home/james-whalen/.local/lib/python3.13/site-packages/pydub/audio_segment.py__init__ ClassPropertyDescriptor.__init__5   s    		    c                 ^    Uc  [        U5      nU R                  R                  X5      " 5       $ r!   )typer#   __get__)r%   objklasss      r&   r,   ClassPropertyDescriptor.__get__9   s(    =IEyy  ,..r)   c                     U R                   (       d  [        S5      e[        U5      nU R                   R                  X5      " U5      $ )Nzcan't set attribute)r$   AttributeErrorr+   r,   )r%   r-   valuetype_s       r&   __set__ClassPropertyDescriptor.__set__>   s8    yy !677S	yy  ,U33r)   c                 ^    [        U[        [        45      (       d  [        U5      nXl        U $ r!   )
isinstanceclassmethodstaticmethodr$   )r%   funcs     r&   setterClassPropertyDescriptor.setterD   s(    $l ;<<t$D	r)   r"   r!   )	__name__
__module____qualname____firstlineno__r'   r,   r4   r;   __static_attributes__ r)   r&   r   r   3   s    /
4r)   r   c                 d    [        U [        [        45      (       d  [        U 5      n [        U 5      $ r!   )r7   r8   r9   r   )r:   s    r&   classpropertyrD   K   s)    d[,7884 "4((r)   mp4wav)m4awaveWavSubChunk)idpositionsizeWavData)audio_formatchannelssample_ratebits_per_sampleraw_datac                 >   Sn/ nUS-   [        U 5      ::  a  [        U5      S:  aw  XUS-    n[        R                  " SXS-   US-    5      S   nUR                  [	        X1U5      5        US:X  a   U$ XS-   -  nUS-   [        U 5      ::  a  [        U5      S:  a  Mw  U$ )N      
      <Ir      data)lenstructunpack_fromappendrI   )datapos	subchunkssubchunk_idsubchunk_sizes        r&   extract_wav_headersrc   \   s    
CI
'SY
3y>B#6sQw'**4AgcAg1FGJ[}EF'!  	q   'SY
3y>B#6 r)   c           
         U(       d  [        U 5      nU Vs/ s H  o"R                  S:X  d  M  UPM     nnU(       a  US   R                  S:  a  [        S5      eUS   nUR                  S-   n[
        R                  " SXUS-    5      S   nUS:w  a  US	:w  a  [        S
U-  5      e[
        R                  " SXS-   US-    5      S   n[
        R                  " SXS-   US-    5      S   n[
        R                  " SXS-   US-    5      S   nUS   n	U	R                  S:w  a  [        S5      eU	R                  S-   n[        XVXxXXIR                  -    5      $ s  snf )Ns   fmt r      z$Couldn't find fmt header in wav datarU   z<H   r   i  z%Unknown audio format 0x%X in wav datarW   rX      rY   z%Couldn't find data header in wav data)rc   rJ   rL   r   rK   r[   r\   rM   )
r^   headersxfmtr_   rN   rO   rP   rQ   data_hdrs
             r&   read_wav_audiorm   l   sk   %d+
1g1gC
1#a&++" !GHH
a&C
,,
C%%dDS1W,=>qALq\V3 !H!-". / 	/ !!$1WS1W(=>qAH$$T4aa+@A!DK((t"HS2X/FGJOr{H{{g !HII


a
C<;C--/02 2' 2s
   EEc                 J   [        U 5      nU(       a  US   R                  S:w  a  g [        U 5      S:  a  [        S5      e[        R
                  " S[        U 5      S-
  5      U SS& US   R                  n[        R
                  " S[        U 5      U-
  S-
  5      XS-   US-   & g )Nrh   rY   l        zUnable to process >4GB filesrX   rU   rW   )rc   rJ   rZ   r   r[   packrK   )r^   ri   r_   s      r&   fix_wav_headersrp      s    !$'Ggbknn/ 4y5 !?@@ D#d)a-0D1I "+

C"KKc$i#o.ABDqqr)   c                     ^  \ rS rSrSr\" 5       r\S 5       r\R                  S 5       rSS0r
S<U 4S jjr\S 5       rS<S	 jr\S
 5       rS rS rS rS rS rS rS=S jrS rS rS rS r0 4S jr\S 5       rS r\S 5       r\S>S j5       r \S 5       r!\S?S j5       r"\S?S j5       r#\S<S j5       r$\S<S j5       r%\S<S  j5       r&\S<S! j5       r'\S" 5       r(\S# 5       r)  S@S$ jr*S% r+S<S& jr,S' r-S( r.S) r/S* r0\S+ 5       r1\S, 5       r2\S- 5       r3\S. 5       r4\S/ 5       r5\S0 5       r6SAS1 jr7S=S2 jr8S3 r9SBS4 jr:SCS5 jr;  SDS6 jr<S7 r=S8 r>S9 r?S: r@S;rAU =rB$ )EAudioSegment   aY  
AudioSegments are *immutable* objects representing segments of audio
that can be manipulated using python code.

AudioSegments are slicable using milliseconds.
for example:
    a = AudioSegment.from_mp3(mp3file)
    first_second = a[:1000] # get the first second of an mp3
    slice = a[5000:10000] # get a slice from 5 to 10 seconds of an mp3
c                     U R                   $ r!   	converterclss    r&   ffmpegAudioSegment.ffmpeg   s    }}r)   c                     Xl         g r!   ru   )rx   vals     r&   ry   rz      s    r)   ogg	libvorbisc                 z  > UR                  SS 5      U l        UR                  SS 5      U l        UR                  SS 5      U l        U R                  U R                  U R                  4n[	        U[
        R
                  5      (       a   UR                  5       n[        U5      (       a  S U;   a  [        S5      eU R                  bZ  [        U5      U R                  U R                  -  -  S:w  a  [        S5      eU R                  U R                  -  U l        Xl        GO9UR                  SS5      (       a;  Xl        UR                  S5      R                  5        H  u  pV[!        XU5        M     O [	        U["        [$        45      (       a  UOUR'                  5       n[+        U5      n	U	(       d  [-        S5      eU	R                  U l        U	R.                  S-  U l        U	R0                  U l        U R                  U R                  -  U l        U	R2                  U l        U R                  S:X  a'  [4        R6                  " U R                  SS5      U l        U R                  S:X  a  [9        5       n
[	        U R                  S   [:        5      (       a  SOSn[=        U R                  5      nSSS.n[?        XU5       HF  u  pnU
RA                  UUS:     5        [B        RD                  " XUU5      nU
RA                  U5        MH     U
RG                  5       U l        SU l        U R                  U R                  -  U l        [H        [J        U ]  " U0 UD6  g !   UR                  5       n GN= f! [(         a>    S	nUR'                  S
5      nU(       a  Xx-  nUR'                  S
5      nU(       a  M  Un GNf = f)Nsample_width
frame_raterO   z=Either all audio parameters or no parameter must be specifiedr   z=data length must be a multiple of '(sample_width * channels)'metadataFr)   z!Couldn't read wav audio from datarU   r   ir   BBBccc       )FT   rW   )'popr   r   rO   r7   arraytobytestostringanyr   rZ   
ValueErrorframe_width_datagetitemssetattr
basestringbytesreadOSErrorrm   r   rQ   rP   rR   r   biasr   intiterr   writer[   ro   getvaluesuperrr   r'   )r%   r^   argskwargsaudio_paramsattrr|   dreaderwav_databyte_bufferpack_fmtipaddingb0b1b2	old_bytes	__class__s                     r&   r'   AudioSegment.__init__   s   "JJ~t< **\48

:t4))4??DMMJdEKK(('||~
 |!5'(ghh *4yD--=>!C !`aa#}}t/@/@@DJ ZZ
E**J#ZZ
399;	C( <)$U0CDDt$))+ &d+H()LMM$--DM ( 8 8A =D&22DO#}}t/@/@@D!**DJ  A%$\\$**a>
 !!)K !+4::a=# > >uEH
 TZZ A%W5G"1m
!!'"z/":;"KKb"=	!!), ,
 %--/DJ !D#}}t/@/@@DlD*D;F;K'}}0  ;/KA!YY{3F f s%   
M 5-M2 M/2A N:4N:9N:c                     U R                   $ )z5
public access to the raw audio data as a bytestring
r   r%   s    r&   rR   AudioSegment.raw_data  s    
 zzr)   c                 `    Uc  U R                   n[        R                  " XR                  5      $ )z-
returns the raw_data as an array of samples
)
array_typer   r   )r%   array_type_overrides     r&   get_array_of_samples!AudioSegment.get_array_of_samples  s(     &"&//{{.

;;r)   c                 2    [        U R                  S-  5      $ )NrU   )r   r   r   s    r&   r   AudioSegment.array_type  s    d//!344r)   c                 T    [        SU R                  5       U R                  -  -  5      $ )z:
returns the length of this audio segment in milliseconds
  )roundframe_countr   r   s    r&   __len__AudioSegment.__len__  s&     TT--/$//ABCCr)   c                 D     U R                   UR                   :H  $ !    g= f)NFr   r%   others     r&   __eq__AudioSegment.__eq__  s$    	::,,	s    c                     [        [        5      [        U R                  U R                  U R                  U R
                  45      -  $ r!   )hashrr   rO   r   r   r   r   s    r&   __hash__AudioSegment.__hash__#  s5    L!D$--$J[J[]a]g]g)h$iiir)   c                     X:X  + $ r!   rB   r   s     r&   __ne__AudioSegment.__ne__&  s    ""r)   c                 @   ^  U 4S j[        [        T 5      5       5       $ )Nc              3   .   >#    U  H
  nTU   v   M     g 7fr!   rB   ).0r   r%   s     r&   	<genexpr>(AudioSegment.__iter__.<locals>.<genexpr>*  s     3!2AQ!2s   )xrangerZ   r   s   `r&   __iter__AudioSegment.__iter__)  s    3D	!233r)   c                 :  ^ ^ [        T[        5      (       a  TR                  (       a+  UU 4S j[        TR	                  [        T 5      5      6  5       $ TR                  b  TR                  OSnTR                  b  TR                  O
[        T 5      n[        U[        T 5      5      n[        U[        T 5      5      nOTnTS-   nT R                  U5      T R                  -  nT R                  U5      T R                  -  nT R                  X# nX2-
  nU[        U5      -
  T R                  -  nU(       aW  UT R                  SS9:  a  [        SU-  5      e[        R                  " US T R                   T R                   S5      nXGU-  -  nT R#                  U5      $ )Nc              3   F   >#    U  H  nTXTR                   -    v   M     g 7fr!   )step)r   r   millisecondr%   s     r&   r   +AudioSegment.__getitem__.<locals>.<genexpr>/  s(      D {///0Ds   !r   r   rf   mszVYou should never be filling in    more than 2 ms with silence here, missing frames: %s)r7   slicer   r   indicesrZ   startstopmin_parse_positionr   r   r   r   r   mulr   _spawn)r%   r   r   endr^   expected_lengthmissing_framessilences   ``      r&   __getitem__AudioSegment.__getitem__,  s   k5))#[%8%8T%CD 
 *5):):)FK%%AE&1&6&6&B+""Y  s4y)Ec3t9%CE/C$$U+d.>.>>""3'$*:*::zz%$ +)CI5$:J:JJ 0 0A 0 66*)+9:; ; kk$'8(8(8"9"&"3"3Q8G~-.D{{4  r)   c                    ^ [        U R                  5       5      mU4S jnU" US5      U R                  -  nU" UT5      U R                  -  nU R                  XE nU R	                  U5      $ )z
Get a section of the audio segment by sample index.

NOTE: Negative indices do *not* address samples backword
from the end of the audio segment like a python list.
This is intentional.
c                 0   > U c  U$ U S:  a  gU T:  a  T$ U $ )Nr   rB   )r|   defaultmax_vals     r&   bounded.AudioSegment.get_sample_slice.<locals>.bounded[  s(    {QwW}Jr)   r   )r   r   r   r   r   )r%   start_sample
end_sampler   start_iend_ir^   r   s          @r&   get_sample_sliceAudioSegment.get_sample_sliceQ  sj     d&&()	 ,*T-=-==
G,t/?/??zz'({{4  r)   c                 n    [        U[        5      (       a  U R                  USS9$ U R                  U5      $ )Nr   )	crossfade)r7   rr   r]   
apply_gainr%   args     r&   __add__AudioSegment.__add__j  s1    c<((;;sa;00??3''r)   c                 (    US:X  a  U $ [        S5      e)z?
Permit use of sum() builtin with an iterable of AudioSegments
r   z6Gains must be the second addend after the AudioSegment)	TypeError)r%   rargs     r&   __radd__AudioSegment.__radd__p  s"     19K ' ( 	(r)   c                 f    [        U[        5      (       a  [        S5      eU R                  U* 5      $ )Nz8AudioSegment objects can't be subtracted from each other)r7   rr   r   r   r   s     r&   __sub__AudioSegment.__sub__y  s4    c<(( ) * * ??C4((r)   c                     [        U[        5      (       a  U R                  USSS9$ U R                  U R                  U-  S9$ )a  
If the argument is an AudioSegment, overlay the multiplied audio
segment.

If it's a number, just use the string multiply operation to repeat the
audio.

The following would return an AudioSegment that contains the
audio of audio_seg eight times

`audio_seg * 8`
r   T)rK   loopr^   )r7   rr   overlayr   r   r   s     r&   __mul__AudioSegment.__mul__  s@     c<((<<ad<;;;;DJJ$4;55r)   c                     [        U[        5      (       a  SR                  U5      n[        U[        R                  5      (       a   UR	                  5       n[        US5      (       a2  [        US5      (       a  UR                  S5        UR                  5       nU R                  U R                  U R                  U R                  S.nUR                  U5        U R                  XS9$ !   UR                  5       n N= f)z
Creates a new audio segment using the metadata from the current one
and the data passed in. Should be used whenever an AudioSegment is
being returned by an operation that would alters the current one,
since AudioSegment objects are immutable.
r)   r   seekr   )r   r   r   rO   r^   r   )r7   listjoinr   r   r   hasattrr  r   r   r   r   rO   updater   )r%   r^   	overridesr   s       r&   r   AudioSegment._spawn  s     dD!!88D>DdEKK(('||~
 4  tV$$		!99;D !--//++	
 		"~~4~;;!'}}s   C) )C=c                    ^^^ [        S U 5       5      m[        S U 5       5      m[        S U 5       5      m[        UUU4S jU 5       5      $ )Nc              3   8   #    U  H  oR                   v   M     g 7fr!   )rO   r   segs     r&   r   %AudioSegment._sync.<locals>.<genexpr>  s     4t||t   c              3   8   #    U  H  oR                   v   M     g 7fr!   )r   r  s     r&   r   r    s     84C4r  c              3   8   #    U  H  oR                   v   M     g 7fr!   r   r  s     r&   r   r    s     <t++tr  c              3      >#    U  H4  nUR                  T5      R                  T5      R                  T5      v   M6     g 7fr!   )set_channelsset_frame_rateset_sample_width)r   r  rO   r   r   s     r&   r   r    s=      
 X&55jARRS_``s   <?)maxtuple)rx   segsrO   r   r   s     @@@r&   _syncAudioSegment._sync  sM    4t448488
<t<< 

 
 	
r)   c                     US:  a  [        U 5      [        U5      -
  nU[        S5      :X  a  U R                  [        U 5      S9OU R                  US9n[	        U5      $ )Nr   infr   )rZ   absfloatr   r   )r%   r|   s     r&   r   AudioSegment._parse_position  sZ    7d)c#h&C03uU|0Cd#d),$ 	3xr)   c                     U " SSSSSS.S9$ )Nr)   r   rO   r   r   r   r   rB   rw   s    r&   emptyAudioSegment.empty  s"    3	"
  	r)   c                 D    [        X!S-  -  5      nSU-  nU " USSUSS.S9$ )z|
Generate a silent audio segment.
duration specified in milliseconds (default duration: 1000ms, default frame_rate: 11025).
     @@s     r   rf   r+  r,  )r   )rx   durationr   framesr^   s        r&   silentAudioSegment.silent  s?     Zf#4564q341;23#5 6 	6r)   c                    [        U5      (       d  [        S5      eU R                  " U6 nUS   R                  S:w  a  [        S5      e[        U5      nUS   R                  nUS   R
                  n[        S U 5       5      n[        R                  " US   R                  SXd-  U-  -  5      n[        U5       H  u  pU	R                  5       XxS U2'   M     U " UUUUS9$ )Nz.At least one AudioSegment instance is requiredr   r   z[AudioSegment.from_mono_audiosegments requires all arguments are mono AudioSegment instancesc              3   T   #    U  H  n[        UR                  5       5      v   M      g 7fr!   )r   r   r  s     r&   r   7AudioSegment.from_mono_audiosegments.<locals>.<genexpr>  s     ADS#coo/00Ds   &(r   )rO   r   r   )rZ   r   r#  rO   r   r   r   r   r   	enumerater   )
rx   mono_segmentsr"  rO   r   r   r   r^   r   r  s
             r&   from_mono_audiosegments$AudioSegment.from_mono_audiosegments  s    =!!MNNyy-(7q mo o t9Aw++!W''
ADAA{{G[/(:;

  oFA # 8 8 :DH & %!	
 	
r)   c           	      j	  ^^ Um[        USSS9u  pT(       a&  TR                  5       m[        R                  TT5      mUU4S jn	U	" S5      (       aX   U R	                  U5      n
U(       a  UR                  5         Uc  Uc  U
$ Ub
  Uc  XS-  S  $ Uc  Ub  U
S US-   $ XS-  XV-   S-   $ U	" S5      (       d  U	" S	5      (       as  US
   nUS   nUS   nUUUX-  S.nU " UR                  5       US9n
U(       a  UR                  5         Uc  Uc  U
$ Ub
  Uc  XS-  S  $ Uc  Ub  U
S US-   $ XS-  XV-   S-   $ [        SSS9n UR                  UR                  5       5        UR                  5         U(       a  UR                  5         [        SSS9nU R                  S/nT(       a  UST/-  nU(       a  USU/-  nUSUR                  SSS/-  nUb  US[        U5      /-  nUb  US[        U5      /-  nUUR                  /-  nUb  UR!                  U5        [#        U5        [        [$        R&                  S5       n[(        R*                  " UU[(        R,                  [(        R,                  S9nS S S 5        WR/                  5       u  nn[1        U5        [1        U5         UR2                  S:w  a2  [5        SR7                  UR2                  UR9                  SS 95      5      eU R	                  U5      n
UR                  5         UR                  5         [$        R:                  " UR                  5        [$        R:                  " UR                  5        Uc  Uc  U
$ Ub  Uc  U
SS  $ Uc  Ub  U
S US-   $ U
SUS-   $ !   UR                  S5         GN`= f! [         a    UR                  5         UR                  5         [        SSSS9nU(       a  UR                  5         Sn[        TSSS9nUR                  S5      nU(       a+  UR                  U5        UR                  S5      nU(       a  M+   GNf = f! , (       d  f       GN= f! UR                  5         UR                  5         [$        R:                  " UR                  5        [$        R:                  " UR                  5        f = f)!NrbFtempfilec                 ^  > U R                  5       n TU :X  a  g[        T[        5      (       a.  TR                  5       R                  SR	                  U 5      5      $ [        T[
        5      (       a=  TR                  5       R                  SR	                  U 5      R                  S5      5      $ g)NT.{0}utf8F)lowerr7   r   endswithformatr   encode)frE  	orig_files    r&   	is_format?AudioSegment.from_file_using_temporary_files.<locals>.is_format  s    	A{)Z00 (11&--2BCC)U++ (116==3C2K2KF2STTr)   rF   r   r   rawpcmr   r   rO   r   r   rO   r   r  wbmodedeleter   )rP  rQ  	bufferingTi  )rR  rP  -y-f-acodec-i-vn-ss-tstdinstdoutstderrPDecoding failed. ffmpeg returned error code: {0}

Output from ffmpeg/avlib:

{1}ignoreerrors)r   rC  AUDIO_FILE_EXT_ALIASESr   _from_safe_wavcloser  r   r   r   r   flushopenrv   namestrextendr   osdevnull
subprocessPopenPIPEcommunicater   
returncoder   rE  decodeunlink)rx   filerE  codec
parametersstart_secondr1  r   
close_filerI  r-   r   r   rO   r   
input_filer   outputconversion_commandrk  pp_outp_errrH  s     `                    @r&   from_file_using_temporary_files,AudioSegment.from_file_using_temporary_files  s   	24N\\^F+//?F	 U((.JJL'H,<J!-(2BD0122!)h.B~..D0,2G1MNN u5!1!1!.1L-Jj)H ,($'6	H 499;:C

#(8
)h.>$./00%(*>+HtO,,$.0G4/OPP'T%@
	0TYY[) 	JJL#e<!mm"  4.09e"44*//%
 	
 #5#l*;"<<4X"77v{{m+!%%j1)*"**d#w  !37:??cmcrcrsA $}}ue$e$
	#||q (jqqell(l&CFG G $$V,CLLNIIjoo&IIfkk"H$4J%(*:qr7N!h&:'4((qD))Q		!4  	0+e{[J

J	[tDDYY{+F  (;/ &	0f $# LLNIIjoo&IIfkk"sK   /N N N N N  4P>&AQ NBP;:P;>
QA"R2c           	      v  ^^ Un [        U5      m[        USSS9u  pT(       a&  TR                  5       m[        R                  TT5      mUU4S jn
U
" S5      (       an   Uc  Uc  U R                  U5      $ Ub  Uc  U R                  U5      US-  S  $ Uc  Ub  U R                  U5      S US-   $ U R                  U5      US-  XV-   S-   $ U
" S5      (       d  U
" S	5      (       a  US
   nUS   nUS   nUUUX-  S.nUc  Uc  U " UR                  5       US9$ Ub  Uc  U " UR                  5       US9US-  S  $ Uc  Ub  U " UR                  5       US9S US-   $ U " UR                  5       US9US-  XV-   S-   $ U R                  S/nT(       a  UST/-  nU(       a  USU/-  nUR                  SS5      nT(       a  UST/-  nS nS nOJU R                  S:X  a  US[        U5      SS/-  nOUSS/-  n[        R                  nUR                  5       nU(       a  S nO
[        UUS9nU(       ar  US    Vs/ s H  nUS   S:X  d  M  UPM     nnUS   R                  S5      nUS   R                  S5      S:X  a	  US ;   a  S!nOUS   S"   nUS#:X  a  S$nOS%U-  nUSU/-  nU/ S&Q-  nUb  US'[        U5      /-  nUb  US([        U5      /-  nUS/-  nUb  UR                  U5        [        U5        [        R                   " UU[        R                  [        R                  S)9nUR#                  US*9u  nnUR$                  S:w  d  ['        U5      S:X  aI  U	(       a  UR)                  5         [+        S+R-                  UR$                  UR/                  S,S-95      5      e[1        U5      n[3        U5        [5        U5      nU " U5      nU	(       a  UR)                  5         Uc  Uc  U$ Ub  Uc  USS  $ Uc  Ub  US US-   $ USUS-   $ ! [         a    S m GNf = f!   UR                  S5         GN= fs  snf ).Nr=  Fr>  c                    > U R                  5       n TU :X  a  gT(       a.  TR                  5       R                  SR                  U 5      5      $ g)NTrA  F)rC  rD  rE  )rG  filenamerE  s    r&   rI  )AudioSegment.from_file.<locals>.is_format  s?    	A{~~'00q1ABBr)   rF   r   r   rK  rL  r   r   rO   rM  r  rS  rT  rU  read_ahead_limitrh   rV  ry   z-read_ahead_limitzcache:pipe:0-)r  streams
codec_typeaudio
codec_name
sample_fmtfltp)mp3rE   aacwebmr}   re   rQ   rU   pcm_u8z	pcm_s%dle)rW  rT  rF   rX  rY  rZ  )inputr^  r_  r`  )r
   r   r   rC  rb  r   rc  r  r   rv   rh  rl  rn  r	   ri  r   rm  ro  rp  rZ   rd  r   rE  rq  	bytearrayrp   r   )rx   rs  rE  rt  ru  rv  r1  r   rH  rw  rI  r   r   rO   r   rz  r  stdin_parameter
stdin_datainforj   audio_streamsaudio_codecrQ   acodecr{  r|  r}  r-   r  s     `                          @r&   	from_fileAudioSegment.from_file  s   		~H 34N\\^F+//?F	 U
'H,<--d33!-(2B--d3L4E4FGG!)h.B--d3NXd]CC--d3L4E|G\^bFbcc u5!1!1!.1L-Jj)H ,($'6	H #(8		h??)h.>		h?T@Q@RSS%(*>		h?$OO		h?T@QS_ShjnRnoo!mm"  4.09e"44!::&8"=4"22"OJ}}("':C@P<Q'+^'= =" #tSk1"(ooOJD!)>NOD(,Y <1 !,7 : M < (*..|<Ka $$\2f<#GG"$"/"23D"E!#!$69f"55 
 	

 #5#l*;"<<4X"77se#!%%j1)*/$.OOJOOM}}:}6u<<1E
a

$fmmLL%,,h,"?BC C % e%jJJLH$4J%(*:qr7N!h&:'4((qD))_  	H	8		!h<s;   P
  P 7P P 1P 7P6P6
PPP3c                 $    U R                  USUS9$ )Nr  ru  r  rx   rs  ru  s      r&   from_mp3AudioSegment.from_mp3      }}T5Z}@@r)   c                 $    U R                  USUS9$ )Nflvr  r  r  s      r&   from_flvAudioSegment.from_flv  r  r)   c                 $    U R                  USUS9$ )Nr}   r  r  r  s      r&   from_oggAudioSegment.from_ogg"  r  r)   c                 $    U R                  USUS9$ )NrF   r  r  r  s      r&   from_wavAudioSegment.from_wav&  r  r)   c                 :    U R                  USUS   US   US   S9$ )NrK  r   r   rO   )r   r   rO   r  )rx   rs  r   s      r&   from_rawAudioSegment.from_raw*  s4    }}T5vn7MZ`amZn&,Z&8  : 	:r)   c                 |    [        USSS9u  pUR                  S5        U " US9nU(       a  UR                  5         U$ )Nr=  Fr>  r   r  )r   r  rd  )rx   rs  rw  r-   s       r&   rc  AudioSegment._from_safe_wav/  s8    24N		!tnJJL
r)   c	           
      	   SS/n	US:X  a  Uc  Ub  [        S5      e[        US5      u  pUR                  S5        US:X  a.  UR                  U R                  5        UR                  S5        U$ US:H  =(       a    USL =(       a    USL nU(       a  UnO
[        S	S
S9nU R                  nU R                  S:X  a"  [        R                  " U R                  SS5      n[        R                  " US	5      nUR                  U R                  5        UR                  U R                  5        UR                  U R                  5        UR!                  [#        U R%                  5       5      5        UR'                  U5        UR)                  5         U(       a  UR                  S5        U$ [        SS
S9nU R*                  SSSSUR,                  /nUc  U R.                  R1                  US5      nUbO  UR3                  5       R5                  S5      (       a   US:X  a  UR7                  SUSSSSSS/5        O[        S5      eUb  UR7                  SU/5        Ub  UR7                  SU/5        Ub  UR7                  U5        Ub  [9        U[:        5      (       d  [=        S5      eUR?                  5        H)  u  nnUR7                  SSRA                  UU5      /5        M+     US:X  a&  Xy;  a  [C        SU	-  5      eUR7                  S U/5        [D        RF                  S!:X  a  US:X  a  UR7                  S"S/5        UR7                  SX/R,                  /5        [I        U5        [        [J        RL                  S#5       n[N        RP                  " UU[N        RR                  [N        RR                  S$9nSSS5        WRU                  5       u  nn[W        U5        [W        U5        URX                  S:w  a3  [[        S%RA                  URX                  UUR]                  S&S'95      5      eUR                  S5        UR                  UR_                  5       5        UR)                  5         UR)                  5         [J        R`                  " UR,                  5        [J        R`                  " UR,                  5        UR                  S5        U$ ! , (       d  f       GN= f)(a  
Export an AudioSegment to a file with given options

out_f (string):
    Path to destination audio file. Also accepts os.PathLike objects on
    python >= 3.6

format (string)
    Format for destination audio file.
    ('mp3', 'wav', 'raw', 'ogg' or other ffmpeg/avconv supported files)

codec (string)
    Codec used to encode the destination file.

bitrate (string)
    Bitrate used when encoding destination file. (64, 92, 128, 256, 312k...)
    Each codec accepts different bitrate arguments so take a look at the
    ffmpeg documentation for details (bitrate usually shown as -b, -ba or
    -a:b).

parameters (list of strings)
    Aditional ffmpeg/avconv parameters

tags (dict)
    Set metadata information to destination files
    usually used as tags. ({title='Song Title', artist='Song Artist'})

id3v2_version (string)
    Set ID3v2 version for tags. (default: '4')

cover (file)
    Set cover for audio file from image file. (png or jpg)
34rK  NzCan not invoke ffmpeg when export format is "raw"; specify an ffmpeg raw format like format="s16le" instead or call export(format="raw") with no codec or parameterszwb+r   rF   rN  FrO  r      zw+brS  rT  rV  )z.pngz.jpgz.jpegz.bmpz.tifz.tiffr  z-map01z-c:vmjpegzxCurrently cover images are only supported by MP3 files. The allowed image formats are: .tif, .jpg, .bmp, .jpeg and .png.rU  z-b:azTags must be a dictionary.z	-metadataz{0}={1}z/id3v2_version not allowed, allowed versions: %sz-id3v2_versiondarwinz-write_xingr=  rZ  zcEncoding failed. ffmpeg/avlib returned error code: {0}

Command:{1}

Output from ffmpeg/avlib:

{2}r_  r`  )1r1   r   r  r   r   r   r   r   r   rH   rf  setnchannelsrO   setsampwidthsetframerater   
setnframesr   r   writeframesrawrd  rv   rg  DEFAULT_CODECSr   rC  rD  ri  r7   dictr   r   rE  r   sysplatformr   rj  rk  rl  rm  rn  ro  r   rp  r   rq  r   rr  )r%   out_frE  rt  bitrateru  tagsid3v2_versioncoverid3v2_allowed_versions_easy_wavr^   pcm_for_wav	wave_datary  rz  keyr2   rk  r{  r|  r}  s                          r&   exportAudioSegment.export8  sI   F #&sU? 1Z5K OP P
 +5%8

1U?KK

#JJqML U?Ku}Kt9KD%4>Djj!!,,tzz1c:KIIdD)	t}}-t001t/ 	S!1!1!345  - JJqML#u= NN%tyy
 =''++FD9E{{}%%&XYY^dhm^m"))4VSRXZa*bc$ OP P %%y%&89%%vw&78!%%j1dD)) !=>> #'**,JC&--$i&6&6sE&BCE #/ U?$B2MPffh h&--(-/  <<8#%%}c&:;!!&++#
 	 	)* "**d#w  !37:??cmcrcrsA $}}ue$e$<<1${  C  CLL"4ell(l6SVW W 	AFKKM"


		$))
		&++

1- $#s   94S
Sc                 V    XR                   -  nX R                   -   nU R                  X# $ r!   )r   r   )r%   indexframe_start	frame_ends       r&   	get_frameAudioSegment.get_frame  s-    ..."2"22	zz+00r)   c                     Ub  XR                   S-  -  $ [        [        U R                  5      U R                  -  5      $ )z
returns the number of frames for the given number of milliseconds, or
    if not specified, the number of frames in the whole AudioSegment
r0  )r   r(  rZ   r   r   )r%   r   s     r&   r   AudioSegment.frame_count  s9    
 >6122TZZD,<,<<==r)   c                     XR                   :X  a  U $ U R                  U-  nU R                  [        R                  " U R
                  U R                   U5      XS.S9$ )N)r   r   r  )r   rO   r   r   lin2linr   )r%   r   r   s      r&   r  AudioSegment.set_sample_width  sW    ,,,Kmml2{{OODJJ(9(9<H'3P  
 	
r)   c                    XR                   :X  a  U $ U R                  (       aF  [        R                  " U R                  U R                  U R
                  U R                   US 5      u  p#OU R                  nU R                  USU0S9$ )Nr   r^   r  )r   r   r   ratecvr   rO   r   )r%   r   	convertedr  s       r&   r  AudioSegment.set_frame_rate  sw    (K::">>$**d6G6G*.--*4d<LIq 

I{{	&2J%?  A 	Ar)   c                    XR                   :X  a  U $ US:X  aQ  U R                   S:X  aA  [        R                  nU R                  S-  nSnU" U R                  U R
                  XD5      nGOnUS:X  aQ  U R                   S:X  aA  [        R                  nU R                  S-  nSnU" U R                  U R
                  XD5      nGOUS:X  a  U R                  5        Vs/ s H  ofR                  5       PM     nn[        U R                  5       5      n[        R                  " US   R                  SXR
                  -  -  5      nU H0  n	[        U5       H  n
XZ==   X   U R                   -  -  ss'   M      M2     U R                  U R                   -  nOHU R                   S:X  a-  [        U5       Vs/ s H  oPM     nn[        R                  " U6 $ [!        S5      eU R#                  UUUS.S9$ s  snf s  snf )	Nrf   r   g      ?r   r   zbAudioSegment.set_channels only supports mono-to-multi channel and multi-to-mono channel conversionrO   r   r  )rO   r   tostereor   r   r   tomonosplit_to_monor   r   r   r   typecoderangerr   r:  r   r   )r%   rO   fnr   facr  r  channels_datar   raw_channel_datar   iChanneldup_channelss                r&   r  AudioSegment.set_channels  s   }}$Kq=T]]a/!!B**Q.KC4::t'8'8#CI]t}}1B**a/KC4::t'8'8#CI]CGCUCUCWXCWC557CWMXd..01Ka ))'8'889I %2 {+AL$4$74==$HHL , %2 **dmm;K]]a16xAXDLA77FFtv v {{	+3.9&;  < 	<# Y Bs   G*,G/c           	      d   U R                   S:X  a  U /$ U R                  5       n/ n[        U R                   5       HQ  nXS U R                   2   n UR                  5       nUR                  U R                  USU R                  S.S95        MS     U$ ! [         a    UR                  5       n NNf = f)Nr   r  r  )	rO   r   r  r   r1   r   r]   r   r   )r%   samplesmono_channelsr   samples_for_current_channel	mono_datas         r&   r  AudioSegment.split_to_mono'  s    ==A6M++-t}}%A*12BT]]2B*C'C7??A	   IaPTPaPa1bc &  " C7@@B	Cs   BB/.B/c                 X    [         R                  " U R                  U R                  5      $ r!   )r   rmsr   r   r   s    r&   r  AudioSegment.rms<      {{4::t'8'899r)   c                     U R                   nU(       d  [        S5      * $ [        U R                   U R                  -  5      $ )Ninfinity)r  r(  r   max_possible_amplitude)r%   r  s     r&   dBFSAudioSegment.dBFS@  s6    hh*%%%488d&A&AABBr)   c                 X    [         R                  " U R                  U R                  5      $ r!   )r   r   r   r   r   s    r&   r   AudioSegment.maxG  r  r)   c                 4    U R                   S-  nSU-  nUS-  $ )NrU   rf   r  )r%   bitsmax_possible_vals      r&   r  #AudioSegment.max_possible_amplitudeK  s)      1$I  !##r)   c                 B    [        U R                  U R                  5      $ r!   )r   r   r  r   s    r&   max_dBFSAudioSegment.max_dBFSS  s    488T%@%@AAr)   c                 t    U R                   =(       a    U R                  5       U R                   -  =(       d    S$ )Ng        )r   r   r   s    r&   duration_secondsAudioSegment.duration_secondsW  s(    G4#3#3#5#GN3Nr)   c                    SUs=::  a  S::  d  O  [        S5      eU R                  S:X  a  U R                  nOaUS:X  a.  [        R                  " U R                  U R
                  SS5      nO-[        R                  " U R                  U R
                  SS5      n[        [        R                  " X R
                  5      5      U R                  -  $ )zi
Returns a value between -1.0 and 1.0 representing the DC offset of a
channel (1 for left, 2 for right).
r   rf   z+channel value must be 1 (left) or 2 (right)r   )	r   rO   r   r   r  r   r(  avgr  )r%   channelr^   s      r&   get_dc_offsetAudioSegment.get_dc_offset[  s    
 G q JKK==A::D\>>$**d.?.?AFD>>$**d.?.?AFDW[['8'89:T=X=XXXr)   c                 4  ^  U(       a  SUs=::  a  S::  d  O  [        S5      eU(       a  SUs=::  a  S::  d  O  [        S5      eU(       a!  [        [        UT R                  -  5      5      nU 4S jnT R                  S:X  a   T R                  U" T R                  U5      S9$ [        R                  " T R                  T R                  SS	5      n[        R                  " T R                  T R                  S	S5      nU(       a  US:X  a  U" XB5      nU(       a  US:X  a  U" XR5      n[        R                  " UT R                  SS	5      n[        R                  " UT R                  S	S5      nT R                  [        R                  " XET R                  5      S9$ )
z
Removes DC offset of given channel. Calculates offset if it's not given.
Offset values must be in range -1.0 to 1.0. If channel is None, removes
DC offset from all available channels.
r   rf   z1channel value must be None, 1 (left) or 2 (right)g      g      ?z)offset value must be in range -1.0 to 1.0c                    > U(       d!  [         R                  " U TR                  5      n[         R                  " U TR                  U* 5      $ r!   )r   r	  r   r   )r^   offr%   s     r&   remove_data_dc5AudioSegment.remove_dc_offset.<locals>.remove_data_dc{  s7    kk$(9(9:<<d&7&7#>>r)   r  r   )r   r   r   r  rO   r   r   r   r  r   r  add)r%   r
  offsetr  left_channelright_channels   `     r&   remove_dc_offsetAudioSegment.remove_dc_offsetl  sL    1,1,PQQ$&/C/HIIv(C(CCDEF	?
 ==A;;N4::v$F;GG~~djj$2C2CQJtzz43D3DaK'Q,),?L'Q,*=AM''d6G6GAN((8I8I1aP{{L,0,=,=!?{ @ 	@r)   c                     U R                  [        R                  " U R                  U R                  [        [        U5      5      5      S9$ Nr  )r   r   r   r   r   r   r(  )r%   volume_changes     r&   r   AudioSegment.apply_gain  s>    {{DJJ8I8I,7m8L,M!O{ P 	Pr)   c           	      6   U(       a  SnO'Uc  SnO!US:X  a  U R                  U R                  5      $ [        5       n[        R	                  X5      u  pxUR
                  n	UR                   n
UR                  USU R                  5        XrS R                  nUR                  nSn[        U5      n[        U5      nU(       a  [        SX-
  5      nX:  a	  USU nUnSnU(       a`  X{X-    n[        R                  " XR
                  [        [        U5      5      5      nUR                  [        R                  " UX5      5        O+UR                  [        R                  " X{X-    UU	5      5        X-  nUS-  nU(       a  M  UR                  X{S 5        U
" US9$ )aL  
Overlay the provided segment on to this segment starting at the
specificed position and using the specfied looping beahvior.

seg (AudioSegment):
    The audio segment to overlay on to this one.

position (optional int):
    The position to start overlaying the provided segment in to this
    one.

loop (optional bool):
    Loop seg as many times as necessary to match this segment's length.
    Overrides loops param.

times (optional int):
    Loop seg the specified number of times or until it matches this
    segment's length. 1 means once, 2 means twice, ... 0 would make the
    call a no-op
gain_during_overlay (optional int):
    Changes this segment's volume by the specified amount during the
    duration of time that seg is overlaid on top of it. When negative,
    this has the effect of 'ducking' the audio under the overlay.
rh   Nr   r   r  )r   r   r   rr   r#  r   r   rZ   r   r   r   r   r(  r  )r%   r  rK   r  timesgain_during_overlayry  seg1seg2r   spawnr_   seg1_lenseg2_len	remainingseg1_overlaidseg1_adjusted_gains                    r&   r  AudioSegment.overlay  s}   4 E]EaZ;;tzz**!''2
((T)8_**+ I$$zzt9t9Ax~.I$JY'$ " $ 8%,[[@Q@Q1<UCV=W1X&Z"W[[);TPQW[[#.)A4)57 8OC QJE) e, 	T$Z &!!r)   c                    [         R                  X5      u  p4U(       d(  UR                  UR                  UR                  -   5      $ U[	        U 5      :  a$  [        SR                  U[	        U 5      5      5      eU[	        U5      :  a$  [        SR                  U[	        U5      5      5      eX2* S  R                  SS[        S5      S9nXTS U R                  SS[        S5      S9-  n[        5       nUR                  US U*  R                  5        UR                  UR                  5        UR                  XBS  R                  5        UR                  S5        UR                  US9nUR                  5         U$ )	Nz@Crossfade is longer than the original AudioSegment ({}ms > {}ms)z@Crossfade is longer than the appended AudioSegment ({}ms > {}ms)r   r&  )to_gainr   r   )	from_gainr   r   r  )rr   r#  r   r   rZ   r   rE  fader(  r   r   r  rd  )r%   r  r   r  r   xfry  r-   s           r&   r]   AudioSegment.append  sP   !''2
;;tzzDJJ677T"_ff3t9   S!_ff3s8   *+##DuU|#L
:I##d!u#NNT+I:&,,-RXXT*%++,Akkvk&
r)   c                    SXTU4;  a  [        S5      eUS:X  a  US:X  a  U $ Ub  [        [        U 5      U5      OSnUb  [        [        U 5      U5      OSnUb  US:  a  U[        U 5      -  nUb  US:  a  U[        U 5      -  nUb  US:  a  [        S5      eU(       a  Ub  X5-   nOUb  XE-
  nOXC-
  n[	        U5      n/ nU SU R
                  nUS:w  a"  [        R                  " UU R                  U5      nUR                  U5        [	        U5      U-
  n	US:  ab  X-  n
[        U5       HN  nXjU-  -   nXU-      n[        R                  " UR
                  U R                  U5      nUR                  U5        MP     OU R                  US9nU R                  US9nX-
  nU	U-  n
[        [        U5      5       HY  nXjU-  -   nU R                  [        X-   5      5      n[        R                  " UU R                  U5      nUR                  U5        M[     XS R
                  nUS:w  a+  [        R                  " UU R                  [	        U5      5      nUR                  U5        U R                  US9$ )a  
Fade the volume of this audio segment.

to_gain (float):
    resulting volume_change in db

start (int):
    default = beginning of the segment
    when in this segment to start fading in milliseconds

end (int):
    default = end of the segment
    when in this segment to start fading in milliseconds

duration (int):
    default = until the end of the audio segment
    the duration of the fade
NzPOnly two of the three arguments, "start", "end", and "duration" may be specifiedr   z#duration must be a positive integerd   r   r  )r   r   rZ   r   r   r   r   r   r   r]   r  r   r   r  r   )r%   r*  r+  r   r   r1  
from_powerry  before_fade
gain_delta
scale_stepr   r  chunkstart_frame	end_framefade_framessample
after_fades                      r&   r,  AudioSegment.fade  s   ( u-- E F F a<INK).):CIu%%(_c#d)S!$SYE?sQw3t9CHqL!"GHH &{H +
 6El((>!++k&*&7&7&02K 	k" )J6

 c>#.J8_ *1n =QYEKK$($5$5$13 e$ % **e*4K((C(0I#1K#k1J3{+, *1n =KO(<= VT->->Nf% - $Z%%
a< Z%)%6%6%0%9;J 	j!{{{''r)   c                 6    U R                  SU[        S5      S9$ )Nr)  r&  )r*  r1  r   )r,  r(  r%   r1  s     r&   fade_outAudioSegment.fade_out`  s    yyeElyKKr)   c                 $    U R                  SUSS9$ )Nr)  r   )r+  r1  r   )r,  r=  s     r&   fade_inAudioSegment.fade_inc  s    yy4(!yDDr)   c                 r    U R                  [        R                  " U R                  U R                  5      S9$ r  )r   r   reverser   r   r   s    r&   rD  AudioSegment.reversef  s0    {{T->->?  
 	
r)   c                     SnU R                  5       n[        R                  " UR                  5       5      R	                  S5      nUR                  US9$ )Nz
                    <audio controls>
                        <source src="data:audio/mpeg;base64,{base64}" type="audio/mpeg"/>
                        Your browser does not support the audio element.
                    </audio>
                  ascii)base64)r  rH  	b64encoder   rq  rE  )r%   srcfhr^   s       r&   _repr_html_AudioSegment._repr_html_k  sH     [[]	*11':zzz&&r)   )r   rO   r   r   r   r!   )NN)r   i+  )NNNNN)Nr  NNNNr  N)r   )r   FNN)r0  )r   r   NNN)Cr=   r>   r?   r@   __doc__r   rv   rD   ry   r;   r  r'   propertyrR   r   r   r   r   r   r   r   r   r   r   r   r  r  r   r8   r#  r   r-  r3  r:  r~  r  r  r  r  r  r  rc  r  r  r   r  r  r  r  r  r  r   r  r  r  r  r  r   r  r]   r,  r>  rA  rD  rL  rA   __classcell__)r   s   @r&   rr   rr      s   	 !"I   ]]  	{NO<b  < 5 5Dj#4#!J!2(()6$ &( <@ 
 
   
6 
6 
 
< G* G*T S* S*j A A A A A A A A : :   tw`D1
>	
A#<J* : : C C : : $ $ B B O OY"$@LPJ"X8 <@`(DLE

	' 	'r)   rr   )effectsr!   )9
__future__r   r   rj  rl  r?  r   r   rH   r  r[   logging_utilsr   r   utilsr	   r
   rH  collectionsr   r   ior   	itertoolsr   zipr   r   r   r   r   r   
exceptionsr   r   r   r   r   r   r   version_inforh  r   r  r   objectr   rD   rb  rI   rM   rc   rm   rp   rr    rQ  rB   r)   r&   <module>r]     s      	  6  
  @ +  "!     vJFHf 0)  
 (BC
Y !@ A 26C"\'6 \'~& M+Ds   C C  C C&