
    Cc~                     `   d Z g dZddlZddlmZ ddlmZmZmZ ddl	m
Z
mZmZmZmZ e G d de             Zd	Zd
ZdZeez   ZdZdZeez   Zd	ZdZdZdZdZdZdZdZdZ dZ!eez   ez   Z"eez   ez   Z#e"dz   dz  Z$e#dz   dz  Z% G d de
      Z& G d de      Z' G d de      Z( G d de      Z)e)Z*y)zTom's lossless Audio Kompressor (TAK) streams with APEv2 tags.

TAK is a lossless audio compressor developed by Thomas Becker.

For more information, see:

* http://www.thbeck.de/Tak/Tak.html
* http://wiki.hydrogenaudio.org/index.php?title=TAK
)TAKOpendelete    N)
StreamInfo)	APEv2Filer   error)	BitReaderBitReaderErrorconvert_errorenumendswithc                   ,    e Zd ZdZdZdZdZdZdZdZ	dZ
y	)
TAKMetadatar                        N)__name__
__module____qualname__ENDSTREAM_INFO
SEEK_TABLESIMPLE_WAVE_DATAENCODER_INFOUNUSED_SPACEMD5LAST_FRAME_INFO     -/usr/lib/python3/dist-packages/mutagen/tak.pyr   r   &   s+    
CKJLL
COr#   r   r   r   r   #      r   r         ip     r   c                       e Zd ZdZd Zd Zy)_LSBBitReaderzLBitReader implementation which reads bits starting at LSB in each byte.
    c                     | j                   dd|z
  z	  z  }| j                   |z	  | _         | xj                  |z  c_        |S )N   r)   )_buffer_bits)selfcountvalues      r$   _lsbz_LSBBitReader._lsbW   s<    tE	22||u,

e
r#   c                 z   |dk  rt         d}|| j                  k  r| j                  |      }nd}|}| j                  dkD  rG|| j                  z  }| j                  }| j                  | j                        }| j                  dk(  sJ || j                  z
  dz   dz  }| j                  j	                  |      }t        |      |k7  rt        d      t        |      D ]A  }|dkD  r|dz  }||z  |z  }|dz  }|| _        d| _        | j                  |      }||z  |z  }C d| j                  cxk  rdk  sJ  J |S )zReads `count` bits and returns an uint, LSB read first.

        May raise BitReaderError if not enough data could be read or
        IOError by the underlying file object.
        r   r   r)   znot enough data)	
ValueErrorr/   r3   _fileobjreadlenr
   	bytearrayr.   )r0   r1   r2   shift	remainingn_bytesdatabs           r$   bitsz_LSBBitReader.bits]   sN    19DJJIIe$E EIzzA~TZZ'	

		$**-zzQ& !4::-1a7G==%%g.D4yG#$%677t_ 	1q=NI%Z50EQJE#$DL!"DJ		),A%Z50E	1 DJJ""""""r#   N)r   r   r   __doc__r3   r?   r"   r#   r$   r+   r+   S   s    'r#   r+   c                       e Zd Zy)TAKHeaderErrorN)r   r   r   r"   r#   r$   rB   rB      s    r#   rB   c                   l    e Zd ZdZdZdZdZdZdZ e	e
e       e	ee      d               Zd Zd Zd Zy)	TAKInfoa4  TAK stream information.

    Attributes:
      channels (`int`): number of audio channels
      length (`float`): file length in seconds, as a float
      sample_rate (`int`): audio sampling rate in Hz
      bits_per_sample (`int`): audio sample size
      encoder_info (`mutagen.text`): encoder version
    r    c                    |j                  d      }t        |      dk7  s|dk(  st        d      t        |      }	 t	        |j                  d            }|j                  d       t        j                  d|j                  d      dz         d	   }|t        z
  }|j                         }|t        j                  k(  rnr|t        j                  k(  r| j                  ||       n%|t        j                  k(  r| j!                  ||       |j#                         sJ |j%                  ||z          | j&                  d	kD  r(| j(                  t+        | j&                        z  | _        y y )
Nr      tBaKznot a TAK filer   r   z<Ir       r   )r7   r8   rB   r+   r   r?   skipstructunpackbytesCRC_SIZEtellr   r   _parse_stream_infor   _parse_encoder_info
is_alignedseeksample_ratenumber_of_samplesfloatlength)r0   fileobj	stream_id	bitreadertypesize	data_sizeposs           r$   __init__zTAKInfo.__init__   s7    LLO	y>Qi7&: !122!'*	y~~a01DNN1==yq'9E'AB1EDxI,,.C{&000''	48111((I>'')))LLt$ " a0059I9I3JJDK  r#   c                 
   |t         k  s	|t        kD  rt        d      |j                  t               |j                  t
               |j                  t               |j                  t              | _	        |j                  t               |j                  t              t        z   | _        |j                  t              t        z   | _        |j                  t"              t$        z   | _        |j                  t(               y )Nzstream info has invalid length)STREAM_INFO_SIZE_MINSTREAM_INFO_SIZE_MAXrB   rI   ENCODER_INFO_CODEC_BITSENCODER_INFO_PROFILE_BITSSIZE_INFO_FRAME_DURATION_BITSr?   SIZE_INFO_SAMPLE_NUM_BITSrT   AUDIO_FORMAT_DATA_TYPE_BITSAUDIO_FORMAT_SAMPLE_RATE_BITSSAMPLE_RATE_MINrS   AUDIO_FORMAT_SAMPLE_BITS_BITSSAMPLE_BITS_MINbits_per_sampleAUDIO_FORMAT_CHANNEL_NUM_BITSCHANNEL_NUM_MINchannelsAUDIO_FORMAT_HAS_EXTENSION_BITS)r0   rY   r[   s      r$   rO   zTAKInfo._parse_stream_info   s    &&$1E*E !ABB 	./01 	45!*0I!J 	23%NN+HI-. )/L M"1!2"(EF*+67r#   c                     |j                  d      }|j                  d      }|j                  d      }d|||fz  | _        y )Nr)   zTAK %d.%d.%d)r?   encoder_info)r0   rY   r[   patchminormajors         r$   rP   zTAKInfo._parse_encoder_info   s@    q!q!q!*eUE-BBr#   c                     d| j                   xs d| j                  | j                  | j                  | j                  fz  S )Nz/%s, %d Hz, %d bits, %.2f seconds, %d channel(s)r   )rq   rS   rk   rV   rn   )r0   s    r$   pprintzTAKInfo.pprint   s@    A&(8(8$:N:NKKE( ( 	(r#   N)r   r   r   r@   rn   rV   rS   bitraterq   r   IOErrorrB   r
   r^   rO   rP   rv   r"   r#   r$   rD   rD      s\     HFKGL7N+>>2K 3 ,K48,C(r#   rD   c                   *    e Zd ZdZeZdgZed        Zy)r   zkTAK(filething)

    Arguments:
        filething (filething)

    Attributes:
        info (`TAKInfo`)
    zaudio/x-takc                 Z    |j                  d      t        | j                         d      z   S )NrG   z.tak)
startswithr   lower)filenamerW   headers      r$   scorez	TAK.score   s&      )HX^^5Ev,NNNr#   N)	r   r   r   r@   rD   _Info_mimesstaticmethodr   r"   r#   r$   r   r      s)     E_FO Or#   r   )+r@   __all__rJ   mutagenr   mutagen.apev2r   r   r   mutagen._utilr	   r
   r   r   r   objectr   rM   rb   rc   ENCODER_INFO_TOTAL_BITSrd   re   SIZE_INFO_TOTAL_BITSrf   rg   ri   rl   ro   AUDIO_FORMAT_BITS_MINAUDIO_FORMAT_BITS_MAXrh   rj   rm   STREAM_INFO_BITS_MINSTREAM_INFO_BITS_MAXr`   ra   r+   rB   rD   r   r   r"   r#   r$   <module>r      sG   $   
  &     14MM  !  534     "  !  ! "#    /.//0  0.//0  -q0A5 ,q0A5 1I 1h	U 	M(j M(`O) O$ r#   