
    Cc                     *   d Z ddlZddlZddlmZmZ ddlmZ ddlm	Z	m
Z
 ddlmZ ddlmZmZ ddlmZmZmZmZ g d	Z G d
 de      Z G d de	      Z G d de      Z G d de      Z eee       edd      d               Z G d de      ZeZy)z;Microsoft WAVE/RIFF audio file/stream information and tags.    N)
StreamInfoFileType)ID3)RiffFileInvalidChunk)error)ID3NoHeaderErrorr   )convert_errorendswithloadfilereraise)WAVEOpendeletec                       e Zd ZdZy)r   zWAVE stream parsing errors.N)__name__
__module____qualname____doc__     ./usr/lib/python3/dist-packages/mutagen/wave.pyr   r      s    %r   r   c                       e Zd ZdZd Zy)	_WaveFilez"Representation of a RIFF/WAVE filec                     t        j                  | |       | j                  dk7  rt        d      d| v rd| d   _        y y )Nr   zExpected RIFF/WAVE.r   id3)r   __init__	file_typer   idselffileobjs     r   r   z_WaveFile.__init__%   sC    $(>>W$-.. T>$DLO r   N)r   r   r   r   r   r   r   r   r   r   "   s
    ,%r   r   c                   L    e Zd ZdZdZdZdZdZdZdZ	 e
ee      d        Zd Zy)WaveStreamInfoa  WaveStreamInfo()

    Microsoft WAVE file information.

    Information is parsed from the 'fmt' & 'data'chunk of the RIFF/WAVE file

    Attributes:
        length (`float`): audio length, in seconds
        bitrate (`int`): audio bitrate, in bits per second
        channels (`int`): The number of audio channels
        sample_rate (`int`): audio sample rate, in Hz
        bits_per_sample (`int`): The audio sample size
    g        r      c                 \   t        |      }	 |d   }|j	                         }t        |      dk  r
t               t        j                  d|d| j                         }|\  | _
        | _        | _        }}| _        | j                  | j                  z  | j                  z  | _        d| _        |dkD  r	 |d   }	|	j                   |z  | _        | j                  dkD  r| j                  | j                  z  | _        yy# t        $ r}t        t        |            d}~ww xY w# t        $ r Y _w xY w)zRaises errorfmtNr%   z<hhLLhhr   data)r   KeyErrorr   strreadlenr   structunpackSIZEaudio_formatchannelssample_ratebits_per_samplebitrate_number_of_samples	data_sizelength)
r!   r"   	wave_fileformat_chunker(   info	byte_rateblock_align
data_chunks
             r   r   zWaveStreamInfo.__init__G   s1    g&		 $V,L   "t9r>. 
 }}YZdii(8904	.4=$*:I-}}t';';;d>N>NN #$?&w/
*4*>*>*L' a11D4D4DDDK  1  	 A-	 *  s)   C: 2D :	DDD	D+*D+c                 d    d| j                   | j                  | j                  | j                  fz  S )Nz-%d channel RIFF @ %d bps, %s Hz, %.2f seconds)r1   r4   r2   r7   r!   s    r   pprintzWaveStreamInfo.pprinti   s3    ?MM4<<)9)94;;CH H 	Hr   N)r   r   r   r   r7   r4   r1   r2   r3   r/   r
   IOErrorr   r   rA   r   r   r   r$   r$   0   sI     FGHKOD7E"E #EBHr   r$   c                   T    e Zd ZdZd Z eee       ed      dd              Z	d Z
y)	_WaveID3zA Wave file with ID3v2 tagsc                     	 |j                  t        |      d   j                         y # t        t        f$ r t        d      w xY w)Nr   zNo ID3 chunk)seekr   data_offsetr   r)   r	   r    s     r   _pre_load_headerz_WaveID3._pre_load_headerq   sB    	3LL7+F3??@h' 	3">22	3s	   '* AT)writableNc                    |j                   }t        |      }d|vr|j                  d       |d   }	 | j                  ||j                  |j
                  |||      }	|j                  t        	             |j                  |	       y# t        $ r0}
t        t        |
t        j                         d          Y d}
~
`d}
~
ww xY w)z%Save ID3v2 data to the Wave/RIFF filer      N)r"   r   insert_chunk_prepare_datarG   r6   ID3Errorr   r   sysexc_inforesizer,   write)r!   	filethingv1
v2_versionv23_seppaddingr"   r8   chunkr(   r:   s              r   savez_WaveID3.savew   s    
 ##g&	"""6*&!	1%%**EOOZ"D 	SYD	  	1E1cllnQ/00	1s   *B	 		C&B==Cc                 :    t        |       | j                          y)8Completely removes the ID3 chunk from the RIFF/WAVE fileN)r   clear)r!   rS   s     r   r   z_WaveID3.delete   s     	y

r   )      /N)r   r   r   r   rH   r
   rB   r   r   rY   r   r   r   r   rD   rD   n   s7    %3 7E"t  #*r   rD   FT)methodrI   c                 l    	 t        | j                        j                  d       y# t        $ r Y yw xY w)r[   r   N)r   r"   delete_chunkr)   )rS   s    r   r   r      s2    
)##$11&9 s   $' 	33c                   `    e Zd ZdZddgZed        Zd Z ee	e
       e       d               Zy)r   zWAVE(filething)

    A Waveform Audio File Format
    (WAVE, or more commonly known as WAV due to its filename extension)

    Arguments:
        filething (filething)

    Attributes:
        tags (`mutagen.id3.ID3`)
        info (`WaveStreamInfo`)
    z	audio/wavz
audio/wavec                     | j                         } |j                  d      |dd dk(  z   t        | d      z   t        | d      z   S )Ns   RIFF      s   WAVEs   .wavs   .wave)lower
startswithr   )filenamer"   headers      r   scorez
WAVE.score   sQ    >>#!!'*fQrlg.EF8W-.0880LM 	Nr   c                 P    | j                   t               | _         yt        d      )z!Add an empty ID3 tag to the file.Nzan ID3 tag already exists)tagsrD   r   r@   s    r   add_tagszWAVE.add_tags   s!    99 
DI344r   c                    |j                   }t        |      | _        |j                  dd       	 t	        |fi || _        | j                  | j
                  _        y# t        $ r
 d| _        Y yt        $ r}t        |      d}~ww xY w)z,Load stream and tag information from a file.r   N)
r"   r$   r;   rF   rD   rm   ri   r	   rN   r   )r!   rS   kwargsr"   r:   s        r   loadz	WAVE.load   s{    
 ##"7+	Q	/ 3F3DI "&DII   	DI 	(N	s   A B/B7BBN)r   r   r   r   _mimesstaticmethodrk   rn   r
   rB   r   r   rq   r   r   r   r   r      sQ     <(FN N5 7E"Z/  #/r   r   )r   rO   r-   mutagenr   r   mutagen.id3r   mutagen._riffr   r   mutagen._iffr   IffErrormutagen.id3._utilr	   rN   mutagen._utilr
   r   r   r   __all__r   r$   rD   rB   r   r   r   r   r   r   <module>r|      s    B 
  (  0 * A  %&H &% %;HZ ;H|$s $N w	& ' ./8 ./b r   