
    v;3h!                        d dl mZ d dlZd dlZd dlZd dlmZm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Zd dlmZ 	 d dlmZ d d	lmZ 	 d d
lmZ ddlmZmZmZmZmZmZ ddl m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z' e	jP                  dk\  re)Z*e+Z,eZ G d de-      Z.d Z/dddZ0 edg d      Z1 edg d      Z2d Z3ddZ4d Z5 G d de-      Z6ddl7m8Z8 y#  d dlmZ Y xY w#  eZY xY w)    )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                   (    e Zd ZddZddZd Zd Zy)ClassPropertyDescriptorNc                      || _         || _        y N)fgetfset)selfr!   r"   s      S/var/www/html/audio-gradio/venv/lib/python3.12/site-packages/pydub/audio_segment.py__init__z ClassPropertyDescriptor.__init__5   s    		    c                 ^    |t        |      } | j                  j                  ||             S r    )typer!   __get__)r#   objklasss      r$   r)   zClassPropertyDescriptor.__get__9   s,    =IE,tyy  e,..r&   c                     | j                   st        d      t        |      } | j                   j                  ||      |      S )Nzcan't set attribute)r"   AttributeErrorr(   r)   )r#   r*   valuetype_s       r$   __set__zClassPropertyDescriptor.__set__>   s<    yy !677S	,tyy  e,U33r&   c                 V    t        |t        t        f      st        |      }|| _        | S r    )
isinstanceclassmethodstaticmethodr"   )r#   funcs     r$   setterzClassPropertyDescriptor.setterD   s'    $l ;<t$D	r&   r    )__name__
__module____qualname__r%   r)   r0   r6    r&   r$   r   r   3   s    /
4r&   r   c                 Z    t        | t        t        f      st        |       } t        |       S r    )r2   r3   r4   r   )r5   s    r$   classpropertyr<   K   s&    d[,784 "4((r&   mp4wav)m4awaveWavSubChunk)idpositionsizeWavData)audio_formatchannelssample_ratebits_per_sampleraw_datac                 8   d}g }|dz   t        |       k  rt        |      dk  rv| ||dz    }t        j                  d| |dz   |dz          d   }|j                  t	        |||             |dk(  r	 |S ||dz   z  }|dz   t        |       k  rt        |      dk  rv|S )N      
      <Ir      data)lenstructunpack_fromappendrA   )datapos	subchunkssubchunk_idsubchunk_sizes        r$   extract_wav_headersr[   \   s    
CI
'SY
3y>B#63sQw'**4cAgcAg1FGJ[#}EF'!  	}q   'SY
3y>B#6 r&   c           
         |st        |       }|D cg c]  }|j                  dk(  s| }}|r|d   j                  dk  rt        d      |d   }|j                  dz   }t        j                  d| ||dz          d   }|dk7  r|d	k7  rt        d
|z        t        j                  d| |dz   |dz          d   }t        j                  d| |dz   |dz          d   }t        j                  d| |dz   |dz          d   }|d   }	|	j                  dk7  rt        d      |	j                  dz   }t        ||||| |||	j                  z          S c c}w )Ns   fmt r      z$Couldn't find fmt header in wav datarM   z<H   r   i  z%Unknown audio format 0x%X in wav datarO   rP      rQ   z%Couldn't find data header in wav data)r[   rB   rD   r   rC   rS   rT   rE   )
rV   headersxfmtrW   rF   rG   rH   rI   data_hdrs
             r$   read_wav_audiore   l   s|   %d+
11
1C
1#a&++" !GHH
a&C
,,
C%%dDS1W,=>qALq\V3 !H!-". / 	/ !!$S1WS1W(=>qAH$$T4aa+@A!DK((tC"HS2X/FGJOr{H{{g !HII


a
C<;C(--/02 2' 2s
   E
E
c                 :   t        |       }|r|d   j                  dk7  ry t        |       dkD  rt        d      t	        j
                  dt        |       dz
        | dd |d   j                  }t	        j
                  dt        |       |z
  dz
        | |dz   |dz    y )Nr`   rQ   l        zUnable to process >4GB filesrP   rM   rO   )r[   rB   rR   r   rS   packrC   )rV   ra   rW   s      r$   fix_wav_headersrh      s    !$'Ggbknn/ 4y5 !?@@ D#d)a-0D1I "+

C"KKc$i#o.ABDqqr&   c                       e Zd ZdZ e       Zed        Zej                  d        ZddiZ	d: fd	Z
ed        Zd:dZed	        Zd
 Zd Zd Zd Zd Zd Zd;dZd Zd Zd Zd Zi fdZed        Zd Zed        Zed<d       Zed        Z ed=d       Z!ed=d       Z"ed:d       Z#ed:d       Z$ed:d       Z%ed:d        Z&ed!        Z'ed"        Z(	 	 d>d#Z)d$ Z*d:d%Z+d& Z,d' Z-d( Z.d) Z/ed*        Z0ed+        Z1ed,        Z2ed-        Z3ed.        Z4ed/        Z5d?d0Z6d;d1Z7d2 Z8d@d3Z9dAd4Z:	 	 dBd5Z;d6 Z<d7 Z=d8 Z>d9 Z? xZ@S )CAudioSegmentay  
    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                     | j                   S r    	converterclss    r$   ffmpegzAudioSegment.ffmpeg   s    }}r&   c                     || _         y r    rl   )ro   vals     r$   rp   zAudioSegment.ffmpeg   s	    r&   ogg	libvorbisc                    |j                  dd       | _        |j                  dd       | _        |j                  dd       | _        | j                  | j                  | j                  f}t	        |t
        j
                        r	 |j                         }t        |      rd |v rt        d      | j                  Zt        |      | j                  | j                  z  z  dk7  rt        d      | j                  | j                  z  | _        || _        n)|j                  dd      r<|| _        |j                  d      j                         D ]  \  }}t!        | ||        n	 t	        |t"        t$        f      r|n|j'                         }t+        |      }	|	st-        d      |	j                  | _        |	j.                  dz  | _        |	j0                  | _        | j                  | j                  z  | _        |	j2                  | _        | j                  dk(  r&t5        j6                  | j                  dd      | _        | j                  dk(  rt9               }
t	        | j                  d   t:              rdnd}t=        | j                        }ddd}t?        |||      D ]F  \  }}}|
jA                  ||dkD            tC        jD                  ||||      }|
jA                  |       H |
jG                         | _        d| _        | j                  | j                  z  | _        tI        tJ        |   |i | y #  |j                         }Y xY w# t(        $ r4 d	}|j'                  d
      }|r||z  }|j'                  d
      }|r|}Y w xY w)Nsample_width
frame_raterG   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 datarM   r   ir   BBBccc       )FT   rO   )'poprv   rw   rG   r2   arraytobytestostringanyr   rR   
ValueErrorframe_width_datagetitemssetattr
basestringbytesreadOSErrorre   r   rI   rH   rJ   r   biasr   intiterr   writerS   rg   getvaluesuperrj   r%   )r#   rV   argskwargsaudio_paramsattrrr   dreaderwav_databyte_bufferpack_fmtipaddingb0b1b2	old_bytes	__class__s                     r$   r%   zAudioSegment.__init__   s#   "JJ~t< **\48

:t4))4??DMMJdEKK('||~
 |!5'(ghh *4yD--=>!C !`aa#}}t/@/@@DDJ ZZ
E*DJ#ZZ
399; )	cdC())$U0C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"1am -
B!!'"z/":;"KK"b"=	!!),-
 %--/DJ !D#}}t/@/@@DlD*D;F;K'}}0  ;/KA!YY{3F  s$   L6 $(M 6M6NN
Nc                     | j                   S )zE
        public access to the raw audio data as a bytestring
        r   r#   s    r$   rJ   zAudioSegment.raw_data  s    
 zzr&   c                 ^    || j                   }t        j                  || j                        S )z=
        returns the raw_data as an array of samples
        )
array_typer   r   )r#   array_type_overrides     r$   get_array_of_samplesz!AudioSegment.get_array_of_samples  s*     &"&//{{.

;;r&   c                 2    t        | j                  dz        S )NrM   )r   rv   r   s    r$   r   zAudioSegment.array_type  s    d//!344r&   c                 T    t        d| j                         | j                  z  z        S )zJ
        returns the length of this audio segment in milliseconds
          )roundframe_countrw   r   s    r$   __len__zAudioSegment.__len__  s&     TT--/$//ABCCr&   c                 D    	 | j                   |j                   k(  S #  Y yxY w)NFr   r#   others     r$   __eq__zAudioSegment.__eq__  s$    	::,,	s    c                     t        t              t        | j                  | j                  | j                  | j
                  f      z  S r    )hashrj   rG   rw   rv   r   r   s    r$   __hash__zAudioSegment.__hash__#  s5    L!D$--$J[J[]a]g]g)h$iiir&   c                     | |k(   S r    r:   r   s     r$   __ne__zAudioSegment.__ne__&  s    EM""r&   c                 >      fdt        t                     D        S )Nc              3   (   K   | ]	  }|     y wr    r:   ).0r   r#   s     r$   	<genexpr>z(AudioSegment.__iter__.<locals>.<genexpr>*  s     3AQ3s   )xrangerR   r   s   `r$   __iter__zAudioSegment.__iter__)  s    3D	!233r&   c                     t        t              rj                  r* fdt        j	                  t                      D        S j                  j                  nd}j                  j                  n
t               }t        |t                     }t        |t                     }n}dz   } j                  |       j                  z  } j                  |       j                  z  } j                  || }||z
  }|t        |      z
   j                  z  }|rY| j                  d      kD  rt        d|z        t        j                  |d  j                    j                   d      }|||z  z  } j#                  |      S )Nc              3   B   K   | ]  }||j                   z      y wr    )step)r   r   millisecondr#   s     r$   r   z+AudioSegment.__getitem__.<locals>.<genexpr>/  s+       1{///0s   r   r   r^   mszVYou should never be filling in    more than 2 ms with silence here, missing frames: %s)r2   slicer   r   indicesrR   startstopmin_parse_positionr   r   r   r   r   mulrv   _spawn)r#   r   r   endrV   expected_lengthmissing_framessilences   ``      r$   __getitem__z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W~-.D{{4  r&   c                     t        | j                               fd} ||d      | j                  z  } ||      | j                  z  }| j                  || }| j	                  |      S )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                 *    | |S | dk  ry| kD  rS | S )Nr   r:   )rr   defaultmax_vals     r$   boundedz.AudioSegment.get_sample_slice.<locals>.bounded[  s(    {QwW}Jr&   r   )r   r   r   r   r   )r#   start_sample
end_sampler   start_iend_irV   r   s          @r$   get_sample_slicezAudioSegment.get_sample_sliceQ  sl     d&&()	 ,*T-=-==
G,t/?/??zz'%({{4  r&   c                 j    t        |t              r| j                  |d      S | j                  |      S )Nr   )	crossfade)r2   rj   rU   
apply_gainr#   args     r$   __add__zAudioSegment.__add__j  s.    c<(;;sa;00??3''r&   c                 &    |dk(  r| S t        d      )zO
        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__zAudioSegment.__radd__p  s"     19K ' ( 	(r&   c                 \    t        |t              rt        d      | j                  |       S )Nz8AudioSegment objects can't be subtracted from each other)r2   rj   r   r   r   s     r$   __sub__zAudioSegment.__sub__y  s1    c<( ) * * ??C4((r&   c                     t        |t              r| j                  |dd      S | j                  | j                  |z        S )aH  
        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)rC   looprV   )r2   rj   overlayr   r   r   s     r$   __mul__zAudioSegment.__mul__  s=     c<(<<ad<;;;;DJJ$4;55r&   c                    t        |t              rdj                  |      }t        |t        j                        r	 |j	                         }t        |d      r-t        |d      r|j                  d       |j                         }| j                  | j                  | j                  | j                  d}|j                  |       | j                  ||      S #  |j                         }Y xY w)a  
        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   )rv   rw   r   rG   rV   rx   )r2   listjoinr   r   r   hasattrr   r   rv   rw   r   rG   updater   )r#   rV   	overridesrx   s       r$   r   zAudioSegment._spawn  s     dD!88D>DdEKK('||~
 4 tV$		!99;D !--//++	
 		"~~4(~;;!'}}s   C C-c                     t        d |D              t        d |D              t        d |D              t        fd|D              S )Nc              3   4   K   | ]  }|j                     y wr    )rG   r   segs     r$   r   z%AudioSegment._sync.<locals>.<genexpr>  s     4s||4   c              3   4   K   | ]  }|j                     y wr    )rw   r   s     r$   r   z%AudioSegment._sync.<locals>.<genexpr>  s     8C8r   c              3   4   K   | ]  }|j                     y wr    rv   r   s     r$   r   z%AudioSegment._sync.<locals>.<genexpr>  s     <3++<r   c              3   |   K   | ]3  }|j                        j                        j                         5 y wr    )set_channelsset_frame_rateset_sample_width)r   r   rG   rw   rv   s     r$   r   z%AudioSegment._sync.<locals>.<genexpr>  s;      
 X&55jARRS_`
s   9<)maxtuple)ro   segsrG   rw   rv   s     @@@r$   _synczAudioSegment._sync  sM    4t448488
<t<< 

 
 	
r&   c                     |dk  rt        |       t        |      z
  }|t        d      k(  r| j                  t        |             n| j                  |      }t	        |      S )Nr   infr   )rR   absfloatr   r   )r#   rr   s     r$   r   zAudioSegment._parse_position  sZ    7d)c#h&C03uU|0Cd#d),$ 	3xr&   c                       | dddddd      S )Nr&   r   rG   rv   rw   r   rx   r:   rn   s    r$   emptyzAudioSegment.empty  s"    3	"
  	r&   c                 L    t        ||dz  z        }d|z  } | |dd|dd      S )z
        Generate a silent audio segment.
        duration specified in milliseconds (default duration: 1000ms, default frame_rate: 11025).
             @@s     r   r^   r  r  )r   )ro   durationrw   framesrV   s        r$   silentzAudioSegment.silent  sA     Z8f#4564q341;23#5 6 	6r&   c                    t        |      st        d       | j                  | }|d   j                  dk7  rt        d      t        |      }|d   j                  }|d   j
                  }t        d |D              }t        j                  |d   j                  d||z  |z  z        }t        |      D ]  \  }}	|	j                         ||d |<     | ||||      S )Nz.At least one AudioSegment instance is requiredr   r   z[AudioSegment.from_mono_audiosegments requires all arguments are mono AudioSegment instancesc              3   N   K   | ]  }t        |j                                 y wr    )r   r   r   s     r$   r   z7AudioSegment.from_mono_audiosegments.<locals>.<genexpr>  s     AS#coo/0As   #%r|   )rG   rv   rw   )rR   r   r  rG   rv   rw   r  r   r   	enumerater   )
ro   mono_segmentsr  rG   rv   rw   r   rV   r   r   s
             r$   from_mono_audiosegmentsz$AudioSegment.from_mono_audiosegments  s    =!MNNsyy-(7q mo o t9Aw++!W''
ADAA{{G[</(:;

  o 	;FAs # 8 8 :DH	; %!	
 	
r&   c                    |t        |dd      \  }}r&j                         t        j                        fd}	 |	d      rP	 | j	                  |      }
|r|j                          |||
S |
||
|dz  d  S |
||
d |dz   S |
|dz  ||z   dz   S  |	d      s |	d	      ro|d
   }|d   }|d   }|||||z  d} | |j                         |      }
|r|j                          |||
S |
||
|dz  d  S |
||
d |dz   S |
|dz  ||z   dz   S t        dd      }	 |j                  |j                                |j                          |r|j                          t        dd      }| j                  dg}r|dgz  }|r|d|gz  }|d|j                  dddgz  }||dt        |      gz  }||dt        |      gz  }||j                  gz  }||j!                  |       t#        |       t        t$        j&                  d      5 }t)        j*                  ||t(        j,                  t(        j,                        }d d d        j/                         \  }}t1        |       t1        |       	 |j2                  dk7  r5t5        dj7                  |j2                  |j9                  d                   | j	                  |      }
|j                          |j                          t%        j:                  |j                         t%        j:                  |j                         |||
S |||
dd  S |
||
d |dz   S |
d|dz   S #  |j                  d       Y PxY w# t        $ r |j                          |j                          t        ddd      }|r|j                          d}t        dd      }|j                  d      }|r%|j                  |       |j                  d      }|r%Y w xY w# 1 sw Y   xY w# |j                          |j                          t%        j:                  |j                         t%        j:                  |j                         w xY w)!NrbFtempfilec                 H   | j                         } | k(  ryt        t              r.j                         j                  dj	                  |             S t        t
              r=j                         j                  dj	                  |       j                  d            S y)NT.{0}utf8F)lowerr2   r   endswithformatr   encode)fr!  	orig_files    r$   	is_formatz?AudioSegment.from_file_using_temporary_files.<locals>.is_format  s|    	A{)Z0 (11&--2BCC)U+ (116==3C2K2KF2STTr&   r>   r   r   rawpcmrv   rw   rG   rv   rw   rG   r   r   wbmodedeletery   )r+  r,  	bufferingTi  )r-  r+  -y-f-acodec-i-vn-ss-tstdinstdoutstderrPDecoding failed. ffmpeg returned error code: {0}

Output from ffmpeg/avlib:

{1}ignoreerrors)r   r  AUDIO_FILE_EXT_ALIASESr   _from_safe_wavcloser   r   r   r   r   flushopenrm   namestrextendr   osdevnull
subprocessPopenPIPEcommunicater   
returncoder   r!  decodeunlink)ro   filer!  codec
parametersstart_secondr  r   
close_filer%  r*   rv   rw   rG   rx   
input_filer   outputconversion_commandrF  pp_outp_errr$  s     `                    @r$   from_file_using_temporary_filesz,AudioSegment.from_file_using_temporary_files  s   	24Nj\\^F+//?F	 U((.JJL'H,<J!-(2B|D0122!)h.B~..|D0,x2G1MNN u5!1!.1L-Jj)H ,($',6	H 499;:C

#(8
)h.><$./00%(*>+HtO,,<$.x0G4/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# 	tw  !37:??cmcrcrsA	t}}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	t 	t LLNIIjoo&IIfkk"sK   (M 6M M M )M. 6P?AP M+.BPPPA Q3c                    |}	 t        |      t        |dd      \  }}	r&j                         t        j                        fd}
 |
d      ri	 ||| j                  |      S ||| j                  |      |dz  d  S ||| j                  |      d |dz   S | j                  |      |dz  ||z   dz   S  |
d      s |
d	      r|d
   }|d   }|d   }|||||z  d}|| | |j                         |      S | | | |j                         |      |dz  d  S | | | |j                         |      d |dz   S  | |j                         |      |dz  ||z   dz   S | j                  dg}r|dgz  }|r|d|gz  }|j                  dd      }r|dgz  }d }d }nI| j                  dk(  r|dt        |      ddgz  }n|ddgz  }t        j                  }|j                         }|rd }nt        ||      }|rh|d   D cg c]  }|d   dk(  r| }}|d   j                  d      }|d   j                  d      dk(  r|d v rd!}n|d   d"   }|d#k(  rd$}nd%|z  }|d|gz  }|g d&z  }||d't        |      gz  }||d(t        |      gz  }|dgz  }||j                  |       t        |       t        j                   ||t        j                  t        j                  )      }|j#                  |*      \  }}|j$                  dk7  st'        |      dk(  rG|	r|j)                          t+        d+j-                  |j$                  |j/                  d,-                  t1        |      }t3        |       t5        |      } | |      }|	r|j)                          |||S |||dd  S |
||d |dz   S |d|dz   S # t        $ r d Y w xY w#  |j                  d       Y xY wc c}w ).Nr  Fr  c                     | j                         } | k(  ryr.j                         j                  dj                  |             S y)NTr  F)r  r   r!  )r#  filenamer!  s    r$   r%  z)AudioSegment.from_file.<locals>.is_format  s?    	A{~~'00q1ABBr&   r>   r   r   r&  r'  rv   rw   rG   r(  r   r.  r/  r0  read_ahead_limitr`   r1  rp   z-read_ahead_limitzcache:pipe:0-)r]  streams
codec_typeaudio
codec_name
sample_fmtfltp)mp3r=   aacwebmrs   r]   rI   rM   pcm_u8z	pcm_s%dle)r2  r/  r>   r3  r4  r5  )inputr9  r:  r;  )r
   r   r   r  r=  r   r>  r   r   rm   rC  rG  rI  r	   rD  r   rH  rJ  rK  rR   r?  r   r!  rL  	bytearrayrh   r   )ro   rN  r!  rO  rP  rQ  r  r   r$  rR  r%  rv   rw   rG   rx   rU  r]  stdin_parameter
stdin_datainforb   audio_streamsaudio_codecrI   acodecrV  rW  rX  r*   r\  s     `                          @r$   	from_filezAudioSegment.from_file  s   		~H 34Nj\\^F+//?F	 U
'H,<--d33!-(2B--d3L4E4FGG!)h.B--d3NXd]CC--d3L4E|T\G\^bFbcc u5!1!.1L-Jj)H ,($',6	H #(8		h??)h.>		h?T@Q@RSS%(*>		h?$OO		h?T@QS_`hShjnRn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<s5   O O  .O  	O  $O  O9OO O6c                 *    | j                  |d|      S )Nre  rP  rq  ro   rN  rP  s      r$   from_mp3zAudioSegment.from_mp3      }}T5Z}@@r&   c                 *    | j                  |d|      S )Nflvrs  rt  ru  s      r$   from_flvzAudioSegment.from_flv  rw  r&   c                 *    | j                  |d|      S )Nrs   rs  rt  ru  s      r$   from_oggzAudioSegment.from_ogg"  rw  r&   c                 *    | j                  |d|      S )Nr>   rs  rt  ru  s      r$   from_wavzAudioSegment.from_wav&  rw  r&   c                 @    | j                  |d|d   |d   |d         S )Nr&  rv   rw   rG   )rv   rw   rG   rt  )ro   rN  r   s      r$   from_rawzAudioSegment.from_raw*  s4    }}T5vn7MZ`amZn&,Z&8  : 	:r&   c                     t        |dd      \  }}|j                  d        | |      }|r|j                          |S )Nr  Fr  r   r   )r   r   r?  )ro   rN  rR  r*   s       r$   r>  zAudioSegment._from_safe_wav/  s:    24Nj		!tnJJL
r&   c	           
      R	   ddg}	|dk(  r||t        d      t        |d      \  }}
|j                  d       |dk(  r.|j                  | j                         |j                  d       |S |dk(  xr
 |du xr |du }|r|}nt        d	d
      }| j                  }| j                  dk(  r!t        j                  | j                  dd      }t        j                  |d	      }|j                  | j                         |j                  | j                         |j                  | j                         |j!                  t#        | j%                                      |j'                  |       |j)                          |r|j                  d       |S t        dd
      }| j*                  dddd|j,                  g}|| j.                  j1                  |d      }|I|j3                         j5                  d      r|dk(  r|j7                  d|ddddddg       nt        d      ||j7                  d|g       ||j7                  d|g       ||j7                  |       |t9        |t:              st=        d      |j?                         D ](  \  }}|j7                  ddjA                  ||      g       * |dk(  r%||	vrtC        d|	z        |j7                  d |g       tD        jF                  d!k(  r|dk(  r|j7                  d"dg       |j7                  d||j,                  g       tI        |       t        tJ        jL                  d#      5 }tO        jP                  ||tN        jR                  tN        jR                  $      }ddd       jU                         \  }}tW        |       tW        |       |jX                  dk7  r6t[        d%jA                  |jX                  ||j]                  d&'                  |j                  d       |j                  |j_                                |j)                          |j)                          tK        j`                  |j,                         tK        j`                  |j,                         |j                  d       |S # 1 sw Y   xY w)(aw  
        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4r&  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   r>   r)  Fr*  r      zw+br.  r/  r1  )z.pngz.jpgz.jpegz.bmpz.tifz.tiffre  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.r0  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  r5  zcEncoding failed. ffmpeg/avlib returned error code: {0}

Command:{1}

Output from ffmpeg/avlib:

{2}r:  r;  )1r-   r   r   r   r   r   rv   r   r   r@   rA  setnchannelsrG   setsampwidthsetframeraterw   
setnframesr   r   writeframesrawr?  rm   rB  DEFAULT_CODECSr   r  r   rD  r2   dictr   r   r!  r   sysplatformr   rE  rF  rG  rH  rI  rJ  r   rK  r   rL  r   rM  )r#   out_fr!  rO  bitraterP  tagsid3v2_versioncoverid3v2_allowed_versions_easy_wavrV   pcm_for_wav	wave_datarT  rU  keyr.   rF  rV  rW  rX  s                          r$   exportzAudioSegment.export8  s\   F #&sU? 1Z5K OP P
 +5%8q

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^dhm^m"))4VSRXZa*bc$ OP P %%y%&89%%vw&78!%%j1dD) !=>> #'**, EJC&--$i&6&6sE&BCEE U?$,BB2MPffh h&--(-/  <<8#%%}c&:;!!&&++#
 	 	)* "**d# 	tw  !37:??cmcrcrsA	t}}ue$e$<<1${  C  CLL"4ell(l6SVW W 	AFKKM"

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

1-	t 	ts   6RR&c                 \    || j                   z  }|| j                   z   }| j                  || S r    )r   r   )r#   indexframe_start	frame_ends       r$   	get_framezAudioSegment.get_frame  s3    d...$"2"22	zz+i00r&   c                     ||| j                   dz  z  S t        t        | j                        | j                  z        S )z
        returns the number of frames for the given number of milliseconds, or
            if not specified, the number of frames in the whole AudioSegment
        r  )rw   r	  rR   r   r   )r#   r   s     r$   r   zAudioSegment.frame_count  s;    
 >6122TZZD,<,<<==r&   c                     || j                   k(  r| S | j                  |z  }| j                  t        j                  | j
                  | j                   |      ||d      S )N)rv   r   r   )rv   rG   r   r   lin2linr   )r#   rv   r   s      r$   r  zAudioSegment.set_sample_width  s[    4,,,Kmml2{{OODJJ(9(9<H'3KP  
 	
r&   c                 
   || j                   k(  r| S | j                  rFt        j                  | j                  | j                  | j
                  | j                   |d       \  }}n| j                  }| j                  |d|i      S )Nrw   rV   r   )rw   r   r   ratecvrv   rG   r   )r#   rw   	convertedr  s       r$   r   zAudioSegment.set_frame_rate  sy    (K::">>$**d6G6G*.--*4d<LIq 

I{{	&2J%?  A 	Ar&   c                    || j                   k(  r| S |dk(  rQ| j                   dk(  rBt        j                  }| j                  dz  }d} || j                  | j
                  ||      }nd|dk(  rQ| j                   dk(  rBt        j                  }| j                  dz  }d} || j                  | j
                  ||      }n|dk(  r| j                         D cg c]  }|j                          }}t        | j                               }t        j                  |d   j                  d|| j
                  z  z        }|D ]/  }	t        |      D ]  }
||
xx   |	|
   | j                   z  z  cc<   ! 1 | j                  | j                   z  }nD| j                   dk(  r*t        |      D cg c]  }|  }}t        j                  | S t!        d      | j#                  |||d      S c c}w c c}w )	Nr^   r   g      ?r   r|   zbAudioSegment.set_channels only supports mono-to-multi channel and multi-to-mono channel conversionrG   r   r  )rG   r   tostereor   r   rv   tomonosplit_to_monor   r   r   r   typecoderangerj   r  r   r   )r#   rG   fnr   facr  r   channels_datar   raw_channel_datar   iChanneldup_channelss                r$   r   zAudioSegment.set_channels  s   t}}$Kq=T]]a/!!B**Q.KC4::t'8'8#sCI]t}}1B**a/KC4::t'8'8#sCI]CGCUCUCWXCS557XMXd..01Ka ))t'8'889I %2 I {+ IAaL$4Q$74==$HHLII **dmm;K]]a16xAXDALA77FFtv v {{	+3.9&;  < 	<# Y Bs   G"$	G'c           	      d   | j                   dk(  r| gS | j                         }g }t        | j                         D ]T  }||d | j                      }	 |j                         }|j                  | j                  |d| j                  d             V |S # t        $ r |j                         }Y Nw xY w)Nr   r  r  )	rG   r   r  r   r-   r   rU   r   rv   )r#   samplesmono_channelsr   samples_for_current_channel	mono_datas         r$   r  zAudioSegment.split_to_mono'  s    ==A6M++-t}}% 
	A*1!2BT]]2B*C'C7??A	   IaPTPaPa1bc
	  " C7@@B	Cs   BB/.B/c                 V    t        j                  | j                  | j                        S r    )r   rmsr   rv   r   s    r$   r  zAudioSegment.rms<      {{4::t'8'899r&   c                 z    | j                   }|st        d       S t        | j                   | j                  z        S )Ninfinity)r  r	  r   max_possible_amplitude)r#   r  s     r$   dBFSzAudioSegment.dBFS@  s6    hh*%%%488d&A&AABBr&   c                 V    t        j                  | j                  | j                        S r    )r   r  r   rv   r   s    r$   r  zAudioSegment.maxG  r  r&   c                 4    | j                   dz  }d|z  }|dz  S )NrM   r^   r   )r#   bitsmax_possible_vals      r$   r  z#AudioSegment.max_possible_amplitudeK  s)      1$I  !##r&   c                 B    t        | j                  | j                        S r    )r   r  r  r   s    r$   max_dBFSzAudioSegment.max_dBFSS  s    488T%@%@AAr&   c                 `    | j                   xr | j                         | j                   z  xs dS )Ng        )rw   r   r   s    r$   duration_secondszAudioSegment.duration_secondsW  s(    G4#3#3#5#GN3Nr&   c                    d|cxk  rdk  st        d       t        d      | j                  dk(  r| j                  }n^|dk(  r-t        j                  | j                  | j
                  dd      }n,t        j                  | j                  | j
                  dd      }t        t        j                  || j
                              | j                  z  S )z
        Returns a value between -1.0 and 1.0 representing the DC offset of a
        channel (1 for left, 2 for right).
        r   r^   z+channel value must be 1 (left) or 2 (right)r   )	r   rG   r   r   r  rv   r	  avgr  )r#   channelrV   s      r$   get_dc_offsetzAudioSegment.get_dc_offset[  s    
 G q JKK !JKK==A::D\>>$**d.?.?AFD>>$**d.?.?AFDW[[t'8'89:T=X=XXXr&   c                 "    |r"d|cxk  rdk  st        d       t        d      |r"d|cxk  rdk  st        d       t        d      |r!t        t        | j                  z              } fd} j                  dk(  r# j                   | j                  |            S t        j                   j                   j                  dd	      }t        j                   j                   j                  d	d      }|r|dk(  r	 |||      }|r|dk(  r	 |||      }t        j                  | j                  dd	      }t        j                  | j                  d	d      } j                  t        j                  || j                              S )
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   r^   z1channel value must be None, 1 (left) or 2 (right)g      g      ?z)offset value must be in range -1.0 to 1.0c                     |s t        j                  | j                        }t        j                  | j                  |       S r    )r   r  rv   r   )rV   offr#   s     r$   remove_data_dcz5AudioSegment.remove_dc_offset.<locals>.remove_data_dc{  s7    kk$(9(9:<<d&7&7#>>r&   r   r   )r   r   r   r  rG   r   r   r   r  rv   r  add)r#   r  offsetr  left_channelright_channels   `     r$   remove_dc_offsetzAudioSegment.remove_dc_offsetl  st    1,1,PQQ -PQQ$&/C/HII 0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                     | j                  t        j                  | j                  | j                  t        t        |                        S Nr   )r   r   r   r   rv   r   r	  )r#   volume_changes     r$   r   zAudioSegment.apply_gain  s>    {{DJJ8I8I,7m8L,M!O{ P 	Pr&   c           	          |rd}n%|d}n |dk(  r| j                  | j                        S t               }t        j	                  | |      \  }}|j
                  }	|j                   }
|j                  |d| j                         ||d j                  }|j                  }d}t        |      }t        |      }|rt        d||z
        }||k\  r	|d| }|}d}|rb||||z    }t        j                  || j
                  t        t        |                  }|j                  t        j                  |||	             n,|j                  t        j                  ||||z    ||	             ||z  }|dz  }|r|j                  ||d         |
|      S )a  
        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.
        r`   Nr   r   r   )r   r   r   rj   r  rv   r   rR   r  r   r   r   r	  r  )r#   r   rC   r   timesgain_during_overlayrT  seg1seg2rv   spawnrW   seg1_lenseg2_len	remainingseg1_overlaidseg1_adjusted_gains                    r$   r   zAudioSegment.overlay  s   4 E]EaZ;;tzz**!''c2
d((T)8_**+ HI$$zzt9t9Ax#~.I9$JY'$ " $Sx 8%,[[@Q@Q1<UCV=W1X&Z"W[[);T<PQW[[c#.)A4)57 88OC QJE) , 	T#$Z &!!r&   c                    t         j                  | |      \  }}|s(|j                  |j                  |j                  z         S |t	        |       kD  r$t        dj                  |t	        |                   |t	        |      kD  r$t        dj                  |t	        |                  || d  j                  ddt        d            }||d | j                  ddt        d            z  }t               }|j                  |d |  j                         |j                  |j                         |j                  ||d  j                         |j                  d       |j                  |      }|j                          |S )	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   )rj   r  r   r   rR   r   r!  fader	  r   r   r   r?  )r#   r   r   r  r  xfrT  r*   s           r$   rU   zAudioSegment.append  sZ   !''c2
d;;tzzDJJ677T"_ff3t9   S!_ff3s8   9*+##DuU|#L
d:I##d!u#NNT+I:&,,-RXXT)*%++,Akkvk&
r&   c                    d|||fvrt        d      |dk(  r|dk(  r| S |t        t        |       |      nd}|t        t        |       |      nd}||dk  r|t        |       z  }||dk  r|t        |       z  }||dk  rt        d      |r|||z   }n|||z
  }n||z
  }t	        |      }g }| d| j
                  }|dk7  r!t        j                  || j                  |      }|j                  |       t	        |      |z
  }	|dkD  rb|	|z  }
t        |      D ]N  }||
|z  z   }| ||z      }t        j                  |j
                  | j                  |      }|j                  |       P n| j                  |      }| j                  |      }||z
  }|	|z  }
t        t        |            D ]Y  }||
|z  z   }| j                  t        ||z               }t        j                  || j                  |      }|j                  |       [ | |d j
                  }|dk7  r*t        j                  || j                  t	        |            }|j                  |       | j                  |      S )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   rR   r   r   r   r   r   rv   rU   r  r   r   r  r   )r#   r  r  r   r   r  
from_powerrT  before_fade
gain_delta
scale_stepr   r  chunkstart_frame	end_framefade_framessample
after_fades                      r$   r  z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&hU{H +
 6El((>!++k&*&7&7&02K 	k" )J6

 c>#h.J8_ % *j1n =UQYEKK$($5$5$13 e$% **e*4K((C(0I#k1K#k1J3{+, & *j1n =K!O(<= VT->->Nf%& #$Z%%
a< Z%)%6%6%0%9;J 	j!{{{''r&   c                 <    | j                  d|t        d            S )Nr  r  )r  r  r   )r  r	  r#   r  s     r$   fade_outzAudioSegment.fade_out`  s    yyeElyKKr&   c                 *    | j                  d|d      S )Nr  r   )r  r  r   )r  r  s     r$   fade_inzAudioSegment.fade_inc  s    yy4(!yDDr&   c                 v    | j                  t        j                  | j                  | j                              S r  )r   r   reverser   rv   r   s    r$   r   zAudioSegment.reversef  s0    {{T->->?  
 	
r&   c                     d}| j                         }t        j                  |j                               j	                  d      }|j                  |      S )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  r  	b64encoder   rL  r!  )r#   srcfhrV   s       r$   _repr_html_zAudioSegment._repr_html_k  sH     [[]	*11':zzz&&r&   r    )NN)r   i+  )NNNNN)Nre  NNNNr  N)r   )r   FNN)r  )r   r   NNN)Ar7   r8   r9   __doc__r   rm   r<   rp   r6   r  r%   propertyrJ   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r3   r  r   r  r  r  rY  rq  rv  rz  r|  r~  r  r>  r  r  r   r  r   r   r  r  r  r  r  r  r  r  r  r   r   rU   r  r  r  r   r  __classcell__)r   s   @r$   rj   rj      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&   rj   )effectsr    )9
__future__r   r   rE  rG  r  r   r   r@   r  rS   logging_utilsr   r   utilsr	   r
   r  collectionsr   r   ior   	itertoolsr   zipr   r   r   r   r   r   
exceptionsr   r   r   r   r   r   r   version_inforC  r   r  r   objectr   r<   r=  rA   rE   r[   re   rh   rj    r  r:   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$