
    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
 ddlmZmZmZmZ  G d d	e      Zg d
ZddZd Zd Z G d de      Z G d de      ZeZy)zMusepack audio streams with APEv2 tags.

Musepack is an audio format originally based on the MPEG-1 Layer-2
algorithms. Stream versions 4 through 7 are supported.

For more information, see http://www.musepack.net/.
)MusepackOpendelete    N)
StreamInfo)	APEv2Fileerrorr   )BitPaddedInt)cdataconvert_errorintroundendswithc                       e Zd Zy)MusepackHeaderErrorN)__name__
__module____qualname__     2/usr/lib/python3/dist-packages/mutagen/musepack.pyr   r      s    r   r   )D  i  i  i }  c                     d}t        |      D ]Q  }| j                  d      }t        |      dk7  rt        t	        |      }|dz  |d   dz  z  }|d   dz  rJ||dz   fc S  |dkD  rt
        y)a  Reads (max limit) bytes from fileobj until the MSB is zero.
    All 7 LSB will be merged to a big endian uint.

    Raises ValueError in case not MSB is zero, or EOFError in
    case the file ended before limit is reached.

    Returns (parsed number, number of bytes read)
    r               )r   r   )rangereadlenEOFError	bytearray
ValueError)fileobjlimitnumics        r   _parse_sv8_intr'   "   s     C5\ LLOq6Q;NaLaxAaD4K(td{A: qyr   c                     d| dz  z
  S )NgGz4P@g      p@r   )gains    r   _calc_sv8_gainr*   :   s    4%<r   c                     d| dz  z  dz  S )N
   g      @    @r   )peaks    r   _calc_sv8_peakr/   ?   s    4<()G34r   c                   L    e Zd ZdZ eee      d        Zd Zd Z	d Z
d Zd Zy)	MusepackInfoac  MusepackInfo()

    Musepack 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
        bitrate (`int`): audio bitrate, in bits per second
        version (`int`) Musepack stream version

    Optional Attributes:

    Attributes:
        title_gain (`float`): Replay Gain for this song
        title_peak (`float`): Peak data for this song
        album_gain (`float`): Replay Gain for this album
        album_peak (`float`): Peak data for this album

    These attributes are only available in stream version 7/8. The
    gains are a float, +/- some dB. The peaks are a percentage [0..1] of
    the maximum amplitude. This means to get a number comparable to
    VorbisGain, you must multiply the peak by 2.
    c                 v   |j                  d      }t        |      dk7  rt        d      |dd dk(  rv|j                  d      }t        |      dk7  rt        d      dt        |dd       z   }|j	                  |       |j                  d      }t        |      dk7  rt        d      |j                  d	      r| j                  |       n| j                  |       | j                  sQ| j                  d
k7  rA|j	                  d
d       t        |j                         dz  | j                  z        | _        yyy)zRaises MusepackHeaderError   not a Musepack fileN   s   ID3   r,         MPCKr      )r   r   r   r	   seek
startswith_MusepackInfo__parse_sv8_MusepackInfo__parse_sv467bitratelengthr   tell)selfr"   headersizes       r   __init__zMusepackInfo.__init__]   s    av;!%&;<< "1:\\!_F6{a)*?@@VAa[11DLL\\!_F6{a)*?@@W%W%w'||q 0LLA#GLLNQ$6$DEDL !1|r   c           	         dddg}fd}|j                         |       dvr|r	 t        |      \  }}|z
  |z
  }dk(  r3|vrt	        d      |j                         | j                  ||       nJdk(  r3|vrt	        d      |j                         | j                  ||       n|j                  |d	       |j                         |       dvr|r|r+t	        d
dj                  t        t        |            z        t        | j                        | j                  z  | _        d| _        y # t        t        f$ r t	        d      w xY w)Nr7   s   SHs   RGc                 f    t              k7  sdcxk  rdk  st        d       t        d      y )Ns   AAs   ZZzInvalid frame key.)r   r   )key
frame_typekey_sizes    r   check_frame_keyz1MusepackInfo.__parse_sv8.<locals>.check_frame_key   s>    ZH,*55)*>?? 6)*>?? 6r   )s   APs   SEzInvalid packet size.zDuplicate SH packetzDuplicate RG packetr   zMissing mandatory packets: %s., r   )r   r'   r   r!   r   remove"_MusepackInfo__parse_stream_header&_MusepackInfo__parse_replaygain_packetr:   joinmapreprfloatsamplessample_rater?   r>   )	rA   r"   mandatory_packetsrJ   
frame_sizeslen	data_sizerH   rI   s	          @@r   __parse_sv8zMusepackInfo.__parse_sv8y   s    "EN	@
 \\(+

#.3DB#1'#: 
D #X-4I U"%66-.CDD!((4**7I>u$%66-.CDD!((4..w	BY* h/JJ'- .3D0 %&F&*iiD:K0L&M'N O O DLL)D,<,<<5 j) B)*@AABs   E Ec                 j   |j                  dd       |dz
  }	 t        |j                  d            d   | _        |dz  }	 t        |      \  }}t        |      \  }}||z
  | _
        |||z   z  }|j                  |      }t        |      |k7  st        |      dk  rt        d      t        |      d   dz	  }		 t        |	   | _        t        |      d   dz	  dz   | _        y # t        t
        f$ r t        d      w xY w# t        t        f$ r t        d      w xY w# t
        $ r t        d      w xY w)	Nr3   r   r   zSH packet ended unexpectedly.z!SH packet: Invalid sample counts.r7      zInvalid sample rate)r:   r    r   version	TypeError
IndexErrorr   r'   r   r!   rS   r   RATESrT   channels)
rA   r"   rX   remaining_sizerS   l1samples_skipl2data
rate_indexs
             r   __parse_stream_headerz"MusepackInfo.__parse_stream_header   sX   Q"Q	G$W\\!_5a8DL 	!	5(1KGR-g6L"
 -"r'!||N+t9&#d)a-%&EFFoa(A-
	=$Z0D #4+q0A5/ :& 	G%&EFF	G *% 	5%35 5	5  	=%&;<<	=s#   "C! C? 9D !C<?DD2c                    |j                  |      }|dk  rt        d      t        |      |k7  rt        d      t        j                  |dd       }t        j                  |dd       }t        j                  |dd       }t        j                  |dd       }|rt        |      | _        |rt        |      | _        |rt        |      | _	        |rt        |      | _
        y y )N	   zInvalid RG packet size.zRG packet ended unexpectedly.r   r5   r[   r   )r   r   r   r
   short_ber*   
title_gainr/   
title_peak
album_gain
album_peak)rA   r"   rX   re   rk   rl   rm   rn   s           r   __parse_replaygain_packetz&MusepackInfo.__parse_replaygain_packet   s    ||I&q=%&?@@t9	!%&EFF^^D1I.
^^D1I.
^^D1I.
^^D1I.
,Z8DO,Z8DO,Z8DO,Z8DO r   c                    |j                  dd       |j                  d      }t        |      dk7  rt        d      |j	                  d      rt        |      d   dz  | _        | j                  dk  rt        d      t        j                  |d	d
       }t        j                  |d
d       }t        j                  d|dd       \  | _        | _        t        j                  d|dd       \  | _        | _        | xj                  dz  c_        | xj                  dz  c_        | xj                  dz  c_        | xj                  dz  c_        t        |dz	  dz     | _        d| _        nt        j                  |dd	       }|dz	  dz  | _        | j                  d	k  s| j                  dkD  rt        d      |dz	  dz  | _        d| _        | j                  dk\  rt        j                  |d	d
       }nt        j$                  |dd
       }| j                  dk  r|dz  }d| _        t)        |dz  dz
        | j                   z  | _        y )Nr       r4      MP+r5      r   r3   r9      z<Hh      g      Y@r-   r      i  r6      i  r   r[   r7   i  i@  )r:   r   r   r   r;   r    r\   r
   uint_lestructunpackrl   rk   rn   rm   r_   rT   r>   	ushort_ler`   rR   r?   )rA   r"   rB   framesflagsheader_dwords         r   __parse_sv467zMusepackInfo.__parse_sv467   s   Rb!v;"%&;<< V$$V,Q/#5DL||a)*?@@]]6!A;/FMM&2,/E/5}}vb}0&,DOT_/5}}vb}0&,DOT_OOu$OOOu$OOOw&OOOw&O$erkV%;<DDL !==!5L(B.&8DL||a4<<!#3)*?@@(B.&8DL$D||q va{3!5||a!FTMC/043C3CCr   c                 J   g }t        | d      r|j                  d| j                  z         t        | d      r|j                  d| j                  z         |xr ddj	                  |      z   xs d}d| j
                  | j                  | j                  | j                  |fz  S )	Nrk   z%+0.2f (title)rm   z%+0.2f (album)z, Gain: rK    z,Musepack SV%d, %.2f seconds, %d Hz, %d bps%s)	hasattrappendrk   rm   rO   r\   r?   rT   r>   )rA   rg_datas     r   pprintzMusepackInfo.pprint  s    4&NN,t>?4&NN,t>?>zDIIg,>>E2>LL$++t'7'7wBP P 	Pr   N)r   r   r   __doc__r   IOErrorr   rD   r<   rM   rN   r=   r   r   r   r   r1   r1   C   sC    2 7/0F 1F6+Z6@9&(DT	Pr   r1   c                   ,    e Zd ZdZeZddgZed        Zy)r   zuMusepack(filething)

    Arguments:
        filething (filething)

    Attributes:
        info (`MusepackInfo`)
    zaudio/x-musepackzaudio/x-mpcc                     | j                         } |j                  d      |j                  d      z   t        | d      z   S )Nrs   r8   s   .mpc)lowerr;   r   )filenamer"   rB   s      r   scorezMusepack.score  s@    >>#!!&)F,=,=g,FF7+, 	-r   N)	r   r   r   r   r1   _Info_mimesstaticmethodr   r   r   r   r   r     s*     E -0F- -r   r   )ri   )r   __all__r{   mutagenr   mutagen.apev2r   r   r   mutagen.id3._utilr	   mutagen._utilr
   r   r   r   r   r_   r'   r*   r/   r1   r   r   r   r   r   <module>r      sl    )   2 2 * B B	% 	 	%0 
5IP: IPX-y -* r   