
    M@cP                     D   d dl Z d dlm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  e
e      Zd	 Zd'd
Zd Z e j$                  dded      d        Z G d d      Z G d de      Z G d d      Z G d de      Zd ZdZdZdZdZdZdZ d Z!d!Z"d"Z#d#Z$dZ%dZ&d$Z'd%Z(d& Z)y)(    N)log10   )Mp3Exception   )	bytes2bin	bytes2decbin2dec)	getLogger)__version__c                 6   | dz	  }|dz  dk7  ry| dz	  dz  }|dk(  rt         j                  d       y| dz	  dz  }|d	k(  rt         j                  d
       y| dz	  dz  }|dv rt         j                  d       y| dz	  dz  }|dk(  rt         j                  d       yy)zWDetermine if ``header`` (an integer, 4 bytes compared) is a valid mp3
    frame header.   i  F      r   zinvalid mpeg version   r   zinvalid mpeg layer      )r   r   zinvalid mpeg bitrate
   zinvalid mpeg sample rateT)logdebug)headersyncversionlayerbitratesample_rates         3/usr/lib/python3/dist-packages/eyed3/mp3/headers.pyisValidHeaderr      s     bLDf} 
 |s"G!|		()r\S Ez		&'|s"G(		()R<3&Kc		,-    c                     d dfd	} || |      \  }}|9t        |      }t        |      rt        |||g      S  || ||z   dz         \  }}|9y)a  Locate the first mp3 header in file stream ``fp`` starting a offset
    ``start_pos`` (defaults to 0). Returned is a 3-tuple containing the offset
    where the header was found, the header as an integer, and the header as 4
    bytes. If no header is found header_int will equal 0.
    c                 `    	 |dz
  dk\  r| |dz
     dk(  ry| |dz      dk(  S # t         $ r Y yw xY w)zCheck for unicode BOMr   r      TF)
IndexError)bufferposs     r   isBOMzfindHeader.<locals>.isBOM;   sJ    	Qw!|#'?c)#'?c)) 		s   ! 
! 	--c                 j   d}| j                  |       | j                  |      }|rd}d|cxk  r|k  r]n nZ|j                  d|      }|dk(  rnB ||      s&|||dz    }t        |      dk(  rt	        ||z   |g      S |dz  }d|cxk  r|k  rXn |t        |      z  }| j                  |      }|ry)Ni    r         r   )NN)seekreadfindlentuple)_fp_poschunk_szdatar$   hr%   s         r   	find_synczfindHeader.<locals>.find_syncE   s    xx!Cs%X%ii-"9T3'Sq)A1v{$dSj!_55q s%X% CID88H%D " r   r   NNNr   )r   r   r.   )fp	start_posr4   sync_posheader_bytesr   r%   s         @r   
findHeaderr;   4   sr    2 'r95Hl

<( (FL9::!*2y8/Ca/G!H,	 
 r   c                     | j                   dk\  r|rt        | j                         }nd}t        t        |   | j                           t        | j
                        z  S )aX  Computes the number of seconds per mp3 frame. It can be used to
    compute overall playtime and bitrate. The mp3 layer and sample
    rate from ``mp3_header`` are used to compute the number of seconds
    (fractional float point value) per mp3 frame. Be sure to set ``vbr`` True
    when dealing with VBR, otherwise playtimes may be incorrect.       @r   )r   _mp3VersionKeyfloatSAMPLES_PER_FRAME_TABLEr   sample_freq)
mp3_headervbrrows      r   timePerFramerE   h   sZ     S SZ//0)#.z/?/?@A*(()* +r   z0.9a2z1.0zUse timePerFrame instead)deprecated_in
removed_incurrent_versiondetailsc                      | t        | d      S y )NF)rE   )rB   s    r   compute_time_per_framerK   w   s     J.. r   c                       e Zd ZdZddZd Zy)	Mp3Headerz Header container for MP3 frames.Nc                     d | _         d | _        d | _        d | _        d | _        d | _        d | _        d | _        d | _        d | _	        d | _
        d | _        d | _        |r| j                  |       y y N)r   r   error_protectionbit_raterA   paddingprivate_bit	copyrightoriginalemphasismodemode_extensionframe_lengthdecode)selfheader_datas     r   __init__zMp3Header.__init__   sx    
 $	 # KK$ r   c                    t        |      st        d      |dz	  dz  }g d|   | _        | j                  t        d      d|dz	  dz  z
  | _        | j                  dk(  rt        d      |d	z	  d
z   | _        |dz	  d
z  | _        |dz	  d
z  | _        |dz	  d
z  | _        |dz	  d
z  | _        |dz	  dz  }t        |   t        | j                           | _        | j                  st        d      |dz	  dz  }t        | j                        d
k(  r| j                  d
k(  rd}nt        | j                        d
k(  r| j                  dk(  rd
}nt        | j                        d
k(  r| j                  dk(  rd}nt        | j                        dk(  r| j                  d
k(  rd}n]t        | j                        dk(  r!| j                  dk(  s| j                  dk(  rd}n$t        d| j                  | j                  fz        t        |   |   | _        | j                  t        d      |dz  }|dk(  rt        | _        n0|d
k(  rt"        | _        n|dk(  rt$        | _        nt        d|z        |dz	  dz  }|dk(  rt&        | _        n-|d
k(  rt*        | _        n|dk(  rt,        | _        nt.        | _        |dz	  dz  | _        | j                  dk(  rH| j(                  }| j                  }	|	dv r|t.        k7  rt        d      |	dv r|t.        k(  rt        d      | j                  dz  }	| j                  }
| j
                  }| j                  d
k(  r,| j
                  dz  }t        d|	z  |
z  |z   dz        | _        n(| j
                  d
z  }t        d|	z  |
z  |z         | _        t4        j7                  dt9        | j                        z          t4        j7                  dd| j                  z  z          t4        j7                  dt9        | j                        z          t4        j7                  d t9        | j                        z          t4        j7                  d!| j(                  z          t4        j7                  d"t9        | j0                        z          t4        j7                  d#t9        | j                        z          t4        j7                  d$t9        | j                        z          t4        j7                  d%t9        | j                        z          t4        j7                  d&t9        | j                        z          t4        j7                  d't9        | j
                        z          t4        j7                  d(t9        | j                         z          t4        j7                  d)t9        | j2                        z          y )*NzInvalid MPEG headerr   r   )      @Nr=   g      ?zIllegal MPEG versionr)   r   zIllegal MPEG layerr   r   	      r   r   zIllegal MPEG sampling frequencyr   r   r   z5Mp3 version %f and layer %d is an invalid combinationzInvalid bit ratezIllegal mp3 emphasis value: %d   )    0   8   P   z-Invalid mode/bitrate combination for layer II)      @         zMPEG audio version: zMPEG audio layer: IzMPEG sampling frequency: zMPEG bit rate: zMPEG channel mode: zMPEG channel mode extension: zMPEG CRC error protection: zMPEG original: zMPEG copyright: zMPEG private bit: zMPEG padding: zMPEG emphasis: zMPEG frame length: )r   r   r   r   rP   rR   rS   rT   rU   SAMPLE_FREQ_TABLEr>   rA   intBIT_RATE_TABLErQ   EMPHASIS_NONErV   EMPHASIS_5015EMPHASIS_CCITMODE_STEREOrW   MODE_JOINT_STEREOMODE_DUAL_CHANNEL_STEREO	MODE_MONOrX   rY   r   r   str)r[   r   r   sample_bitsbit_rate_rowbit_rate_colemph	mode_bitsmbrsfps               r   rZ   zMp3Header.decode   s   V$455 R<3&,W5<<566 6R<3./
::?344 &,r\S$8 8!s*"aK3. A+,1+ |s*k*>$,,+GH 	@AA "+t||!djjAoL!#

aL!#

aL!#

aL!#q)-qL  -04djj/I J K K&|4\B== 122 |19)DMQY)DMQY)DM?$FGG q[C'	>#DI!^)DI!^0DI!DI%{c1 ::?		AB&&AN" $( ) )**Y" $( ) ) ]]T!LL::?q A #rBw"n%9Q$> ?D q A #cBh"_$9 :D 			(3t||+<<=		&#

*:;<		-D4D4D0EEF		#c$--&889		'$))34		1C8K8K4LLM		/#d6K6K2LLM		#c$--&889		$s4>>'::;		&T-=-=)>>?		"S%667		#c$--&889		'#d.?.?*@@Ar   rO   __name__
__module____qualname____doc__r]   rZ    r   r   rM   rM   ~   s    *%*qBr   rM   c                       e Zd Zd Zd Zy)
VbriHeaderc                      d| _         d | _        y )NT)rC   r   r[   s    r   r]   zVbriHeader.__init__
  s    r   c                    d}|||dz    }|dk7  ryt         j                  d|z         |dz  }t        t        |||dz                | _        |dz  }t        t        |||dz                | _        |dz  }t        t        |||dz                | _        |dz  }t        t        |||dz                | _        |dz  }t        t        |||dz                | _        |dz  }y)N$   r)   VBRIFzVBRI header detected @ %xr   T)	r   r   r	   r   r   delayquality	num_bytes
num_frames)r[   frameoffsetheads       r   rZ   zVbriHeader.decode  s     VFQJ'6>		-89!yvfqj)ABC!YuVFQJ'?@A
!yvfqj)ABC! 5
+C!DE!!)E&!,D"EF!r   N)r   r   r   r]   rZ   r   r   r   r   r   	  s    r   r   c                       e Zd ZdZd Zd Zy)
XingHeaderz,Header class for the Xing header extensions.c                 t    t               | _        t               | _        dgdz  | _        t               | _        y )Nr   d   )ro   	numFramesnumBytestocvbrScaler   s    r   r]   zXingHeader.__init__1  s*    39r   c                    |d   dz	  dz  }|d   dz	  dz  }|r|dk7  rd}nd}n
|dk7  rd}nd}|||dz    }|dk(  xr d	xs d
| _         |dvry
t        j                  d||fz         |dz  }t        t	        |||dz                }|dz  }t        j                  d||fz         |t
        z  rHt        t	        |||dz                | _        |dz  }t        j                  d|| j                  fz         |t        z  rHt        t	        |||dz                | _        |dz  }t        j                  d|| j                  fz         |t        z  r+|||dz    | _
        |dz  }t        j                  d|z         nt        j                  d|z         |t        z  rM|dk(  rHt        t	        |||dz                | _        |dz  }t        j                  d|| j                  fz         y	)Nr   r   rb   r         r)      XingTF)r   s   Infoz%s header detected @ %xz%s header flags: 0x%xz%s numFrames: %dz%s numBytes: %dr   z%s TOC (100 bytes): PRESENTz%s TOC (100 bytes): NOT PRESENTz%s vbrScale: %d)rC   r   r   r	   r   FRAMES_FLAGr   
BYTES_FLAGr   TOC_FLAGr   VBR_SCALE_FLAGr   )r[   r   r   rW   r$   r   	headFlagss          r   rZ   zXingHeader.decode;  s	   8q=C'aA$ qyqySq!GO-6))		+tSk9:q IeCa&89:	q		)T9,==> {"$YuSq/A%BCDN1HCII(D$..+AAB z!#IeCa.@$ABDM1HCII'4*??@ xSs+DH3JCII3d:;II7$>? ~%$'/#IeCa.@$ABDM1HCII'4*??@r   Nr   r   r   r   r   r   .  s    68r   r   c                   *    e Zd ZdZg dZdddddZi dd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,Zd-d.d/d0Zd-d1d2d3d4d5Zd6d7d8d9d:Z	d;d<d=d>d?d@dAdBdCZ
dDdEdFdGdHdIZd	dJdKdLdMdNdOdPdQdHdR
Z fdSZdWdTZdU ZdV Z xZS )X
LameHeadera   Mp3 Info tag (AKA LAME Tag)

    Lame (and some other encoders) write a tag containing various bits of info
    about the options used at encode time.  If available, the following are
    parsed and stored in the LameHeader dict:

    * encoder_version: short encoder version [str]
    * tag_revision:    revision number of the tag [int]
    * vbr_method:      VBR method used for encoding [str]
    * lowpass_filter:  lowpass filter frequency in Hz [int]
    * replaygain:      if available, radio and audiofile gain (see below) [dict]
    * encoding_flags:  encoding flags used [list]
    * nogap:           location of gaps when --nogap was used [list]
    * ath_type:        ATH type [int]
    * bitrate:         bitrate and type (Constant, Target, Minimum) [tuple]
    * encoder_delay:   samples added at the start of the mp3 [int]
    * encoder_padding: samples added at the end of the mp3 [int]
    * noise_shaping:   noise shaping method [int]
    * stereo_mode:     stereo mode used [str]
    * unwise_settings: whether unwise settings were used [boolean]
    * sample_freq:     source sample frequency [str]
    * mp3_gain:        mp3 gain adjustment (rarely used) [float]
    * preset:          preset used [str]
    * surround_info:   surround information [str]
    * music_length:    length in bytes of original mp3 [int]
    * music_crc:       CRC-16 of the mp3 music data [int]
    * infotag_crc:     CRC-16 of the info tag [int]

    Prior to ~3.90, Lame simply stored the encoder version in the first frame.
    If the infotag_crc is invalid, then we try to read this version string.  A
    simple way to tell if the LAME Tag is complete is to check for the
    infotag_crc key.

    Replay Gain data is only available since Lame version 3.94b.  If set, the
    replaygain dict has the following structure:

    .. code-block::

       peak_amplitude: peak signal amplitude [float]
       radio:
          name:       name of the gain adjustment [str]
          adjustment: gain adjustment [float]
          originator: originator of the gain adjustment [str]
       audiofile: [same as radio]

    Note that as of 3.95.1, Lame uses 89dB as a reference level instead of the
    83dB that is specified in the Replay Gain spec.  This is not automatically
    compensated for.  You can do something like this if you want:

    .. code-block::

       import eyeD3
       af = eyeD3.mp3.Mp3AudioFile('/path/to/some.mp3')
       lamever = af.lameTag['encoder_version']
       name, ver = lamever[:4], lamever[4:]
       gain = af.lameTag['replaygain']['radio']['adjustment']
       if name == 'LAME' and eyeD3.mp3.lamevercmp(ver, '3.95') > 0:
           gain -= 6

    Radio and Audiofile Replay Gain are often referred to as Track and Album
    gain, respectively.  See https://replaygain.hydrogenaudio.org/ for further
    details on Replay Gain.

    See http://gabriel.mp3-tech.org/mp3infotag.html for the gory details of the
    LAME Tag.
    (   r   i  i  ri   i  i  i  iA  i  i  i  iA  i   i  i  i@  i  i  i  iA  i   i  i  i@  i 
  i  i  i@  i  i	  i  iA  i  i  i  iA  i   i  i  i@  i   i  i  @  i  i  i  iA  i   i  i  i@  i  i  i  iA  i  i  i  iA  i   i  i  i@  i  i0  i1  iA  i 3  i  i  i@2  i 6  i  i  i@7  i  i5  i4  iA  i <  i  i  i@=  i  i?  >  iA  i  i:  i;  iA  i 9  i  i  i@8  i (  i  i  i@)  i  i+  i*  iA  i  i.  i/  iA  i -  i  i  i@,  i  i$  i%  iA  i '  i  i  i@&  i "  i  i  i@#  i  i!  i   iA  i  i`  ia  iA  i c  i  i  i@b  i f  i  i  i@g  i  ie  id  iA  i l  i  i  i@m  i  io  in  iA  i  ij  ik  iA  i i  i  i  i@h  i x  i  i  i@y  i  i{  iz  iA  i  i~  i  iA   }  i  i  i@|  i  it  iu  iA  i w  i  i  i@v  i r  i  i  i@s  i  iq  ip  iA  i P  i  i  i@Q  i  iS  iR  iA  i  iV  iW  iA  i U  i  i  i@T  i  i\  i]  iA  i _  i  i  i@^  i Z  i  i  i@[  i  iY  iX  iA  i  iH  iI  iA  i K  i  i  i@J  i N  i  i  i@O  i  iM  iL  iA  i D  i  i  i@E  i  iG  iF  iA  i  iB  iC  iA  i A  i  i  i@@  r   r   r)   ra   )	NSPSYTUNENSSAFEJOINT
NOGAP_NEXT
NOGAP_PREVr   Unknowni  V9i  V8i  V7i  V6i  V5i  V4i  V3i  V2i  V1i  V0rk   r3mixi  standardi  extremei  insanei  zstandard/fasti  zextreme/fastmediumzmedium/fast)i  i  zNot setRadio	Audiofile)r   r   r   zSet by artistzSet by userzSet automaticallyzSet by simple RMS average)r   r   r   r   r   z	<= 32 kHzz44.1 kHzz48 kHzz> 48 kHz)r   r   r   r   MonoStereoDualJointForceAuto	Intensity	Undefined)r   r   r   r   r)      rb      NonezDPL encodingzDPL2 encodingzAmbisonic encodingReserved)r   r   r   r   ra   zConstant BitratezAverage Bitratez!Variable Bitrate method1 (old/rh)zVariable Bitrate method2 (mtrh)zVariable Bitrate method3 (mt)zVariable Bitrate method4zConstant Bitrate (2 pass)zAverage Bitrate (2 pass))
r   r   r   r   r)   r   rb   ra   r`   r   c                 D    t         |           | j                  |       y)zSRead the LAME info tag.
        frame should be the first frame of an mp3.
        N)superr]   rZ   )r[   r   	__class__s     r   r]   zLameHeader.__init__)  s     	Er   c                     |D cg c]  }t        |g       c}D ]&  }| j                  t        |      |dz  z     |dz	  z  }( |S c c}w )z+Compute a CRC-16 checksum on a data stream.   ra   )bytes_crc16_tableord)r[   r2   valbcs        r   _crc16zLameHeader._crc160  sT    &*+%*+ 	HA##CFcDj$9:cQhGC	H
 ,s   Ac           
      j   	 |j                  d      }t        j                  d|        t	        t        |dd             }| j                  |dd       |k7  rt        j                  d       nt        j                  d       	 t        |||dz    j                         d	      | d
<   t        j                  d| d
   z         |dz  }t	        t        |||dz          dd       | d<   t	        t        |||dz          dd       }| j                  j                  |d      | d<   t        j                  d| d   z         t        j                  d| d   z         |dz  }t	        t        |||dz                dz  | d<   t        j                  d| d   z         |dz  }i }t	        t        |||dz                dz  }|dkD  r;|t        d      z  }dt        |      z  }||d<   t        j                  d||fz         |dz  }dD ]  }t	        t        |||dz          dd       }	t	        t        |||dz          dd       }
t	        t        |||dz          dd        }t	        t        |||dz          d d       d!z  }|r|d"z  }| d
   }|dd d#k(  rt        |dd d$      dkD  r|dz  }|
r`| j                  j                  |	d      }	| j                   j                  |
d      }
|	||
d%||<   t        j                  d&|	d'|d(|
d)       |dz  } |r|| d*<   t	        t        |||dz          dd       }| j#                  |      \  | d+<   | d,<   t	        t        |||dz          dd       | d-<   t        j                  d.d/j%                  | d+         z         | d,   r*t        j                  d0d1j%                  | d,         z         t        j                  d2| d-   z         |dz  }d3}d4| d   v rd5}n	d6| d   v rd7}t	        t        |||dz                |f| d8<   t        j                  d9|d:| d8   d          |dz  }t	        t        |||dz          dd;       | d<<   t	        t        |||dz          d;d       | d=<   t        j                  d>| d<   z         t        j                  d?| d=   z         |dz  }t	        t        |||dz          dd       }t	        t        |||dz          dd       }t	        t        |||dz          dd       }t	        t        |||dz          dd       | d@<   | j&                  j                  |d      | dA<   t)        |      | dB<   | j*                  j                  |d      | dC<   t        j                  dD| dA   z         t        j                  dE| dB   z         t        j                  dF| dC   z         t        j                  dG| d@   z         |dz  }t        |||dz          d   }t	        t        |||dz          dd       }|r|d"z  }|| dH<   |dIz  }t        j                  dJ| dH   |fz         |dz  }t	        t        |||dz          dd       }t	        t        |||dz          dd       }|t-        dKdL      v rF| d8   d   dMk\  r(||f| d8<   t        j                  d9|d:| d8   d          d4| d   v rdN|z  }n"dO|z  }n| j.                  j                  ||      }| j0                  j                  ||      | dP<   || dQ<   t        j                  dR| dP   z         t        j                  dS| dQ   z         |dz  }t	        t        |||dz                | dT<   t        j                  dU| dT   z         |dz  }t	        t        |||dz                | dV<   t        j                  dW| dV   z         |dz  }|| dX<   t        j                  dY| dX   z         |dz  }y# t        $ r Y yw xY w# t2        $ r t        j                  dZ       Y yw xY w)[zDecode the LAME info tag.s   LAMENz Lame info tag found at position       zLame tag CRC check failedzLame tag CRC OKr`   latin1encoder_versionzLame Encoder Version: %sr   r   tag_revisionr   
vbr_methodzLame info tag version: %szLame VBR method: %sr   lowpass_filterz Lame Lowpass filter value: %s Hzr)   r   i      peak_amplitudez+Lame Peak signal amplitude: %.8f (%+.1f dB))radio	audiofiler   r   rb   r   g      $@r(   LAMEz3.95)name
adjustment
originatorzLame z Replay Gain: z dB ()
replaygainencoding_flagsnogapath_typezLame Encoding flags: %s zLame No gap: %sz and zLame ATH type: %sConstantAverageTargetVariableMinimumr   zLame Bitrate (z): r   encoder_delayencoder_paddingzLame Encoder delay: %s samplesz Lame Encoder padding: %s samplesnoise_shapingrA   unwise_settingsstereo_modez Lame Source Sample Frequency: %szLame Unwise settings used: %szLame Stereo mode: %szLame Noise Shaping: %smp3_gaing      ?zLame MP3 Gain: %s (%+.1f dB)ra   iA  r   zABR %szCBR %ssurround_infopresetzLame Surround Info: %szLame Preset: %smusic_lengthzLame Music Length: %s bytes	music_crczLame Music CRC: %04Xinfotag_crczLame Info Tag CRC: %04Xz.Truncated LAME info header, values incomplete.)index
ValueErrorr   r   r	   r   r   warningrx   rstripVBR_METHODSgetr?   r   
lamevercmpREPLAYGAIN_NAMEREPLAYGAIN_ORIGINATOR_parse_encflagsjoinSAMPLE_FREQUENCIESboolSTEREO_MODESrangePRESETSSURROUND_INFOr"   )r[   r   r$   lamecrcr   r   peakdbgaintyper   origsignadjlameverencflagsbtyperA   r   r   gainsurroundr   s                         r   rZ   zLameHeader.decode6  s 	   	++g&C 			4SE:; )E#cN34;;uTc{#w.KK34II'(Y	J&)%C!G*<*C*C*Ex&PD"#II048I3JJK1HC $+9U3sQw5G+H!+L#MD  5S1W+=!>qr!BCJ!%!1!1!5!5j)!LDII1D4HHIII+d<.@@A1HC &-'0s371C'D&FHK&LD!"II8+,- .1HC J 9U3sQw%789Q>Daxg&%+%/3
+,		G*% &1HC 3 ys37);<Ra@Ays37);<QqABys37);<QqABic#'(:;AB?@4G2IC 012A;&(ZV-Lq-P1HC//33D)DD5599$	JD48:>,@Jx(II#S$0 1q+, %/\" ys37);<Ra@AH"228<T"#']&ys371C'DQR'HIDII/hht$4567 8G}		+gll4=.IIJII)D,<<=1HC ED.. tL11!&ys371C'DEuMDOIIY8JKL1HC %,IeCa6H,I#2,N$OD!&-(1%C!G2D(Ebc(J'LD"#II6o9NNOII8,-. /1HC ")E#cAg,>"?"CDK%ic#'0B&CAa&HIO!)E#cAg,>"?!"DEK$+IeCa6H,I!",M$ND!"&"9"9"="=k>G#ID&*?&;D"#"&"3"3"7"7Y"ODII84;NNOII5=N8OOPII,tM/BBCII.o1FFG1HC U3sQw/03D9U3sQw%78<=D
#DBII4Z8H"7MMN1HC ys37);<QqABHYuSq'9:12>?Fq#&	?1%,'-uoDOII$d9oa&8: ;\ 22%.F%.F))&&9$($6$6$:$:8X$ND!#DNII.o1FFGII'$x.891HC $+9U3sQw5G+H#ID II3d>6JJK1HC !(	%C!G2D(E FDII,tK/@@A1HC #*DII/$}2EEF1HCG  		H  	JKKHI	Js$   ` ]<` 	```21`2c                 p   g g }}|s||fS || j                   d   z  r|j                  d       || j                   d   z  r|j                  d       | j                   d   }| j                   d   }|||z  z  r=|j                  d       ||z  r|j                  d       ||z  r|j                  d	       ||fS )
zParse encoder flags.

        Returns a tuple containing lists of encoder flags and nogap data in
        human readable format.
        r   z--nspsytuner   z--nssafejointr   r   z--nogapbeforeafter)ENCODER_FLAGSappend)r[   flagsencoder_flagsr   NEXTPREVs         r   r	  zLameHeader._parse_encflags  s      "2u %''4%%k22  /4%%m44  1!!,/!!,/D4K   +t|X&t|W%e##r   r6   )r   r   r   r   r   r   r  r  r  r  r  r  r  r]   r   rZ   r	  __classcell__)r   s   @r   r   r   v  s   AJ FLF 	M 
4 
4	
 
4 
4 
4 
4 
4 
4 
4 
4 G J I  H!" O#$ N%& )G. 
		O 
			&( 
				 
							L 
				M 
			,	*	(	#	$	#

KiJV$r   r   c                    d }| j                  d      } |j                  d      }| dd |dd k(  ry || dd |dd       }|r|S | j                  d      dd \  }}|j                  d      dd \  }}dg}|dk(  r|d	k\  s
|dk(  r|d	k\  r|j                  d
       | d   |v ry|d   |v ry| d   dk(  ry|d   dk(  ry || d   |d         S )a<  Compare LAME version strings.

    alpha and beta versions are considered older.
    Versions with sub minor parts or end with 'r' are considered newer.

    :param x: The first version to compare.
    :param y: The second version to compare.
    :returns: Return negative if x<y, zero if x==y, positive if x>y.
    c                     | |kD  | |k  z
  S rO   r   )ar   s     r   cmpzlamevercmp.<locals>.cmp  s     A!a%  r   r   Nr   r)   .r   396rr   r(   r   )ljustsplitr!  )	xyr*  retxmajxminymajyminminpartss	            r   r  r    s   !
 	

A	
A!u"1~
aeQrU
C

bq!JD$bq!JD$uH$#+$$,txtxts{ts{qtQqT?r   ))iD  i"V  i+  )i  i]  i.  )r   r   r   r5   ))r   r   r   r   r   )rc   rc   rc   rc   ra   )@   rd   (   rd   r   )`   re   rd   re      )   r9  re   r9  rc   )   rf   r9  rf   r:  )r   r;  rf   r;  rd   )rg   p   r;  r?  re   )rh   r=  r?  r=  r9  )i   r>  r=  rl   rf   )ri   r   r>  r>  r;  )i`  rg   r      r?  )rj   rh   rg   r   r=  )i  ri   rh   rg   rl   )i  rj   ri   rh   r>  )NNNNN))Nrj     rA  Nrj   rA  i@  rB  r   z50/15 msz	CCIT J.17r   zJoint stereozDual channel stereor   r)   ra   c                 h    | dk(  rd}nt        | dz
        }d|cxk  rdk  sn t        d|       |S )zRMap mp3 version float to a data structure index.
    1 -> 0, 2 -> 1, 2.5 -> 2
    r_   r   r   r   zInvalid mp3 version key value: )ro   r  )r   keys     r   r>   r>   V  sA     #~'A+=q=:3%@AAJr   r6   )*deprecationmathr    r   utils.binfuncsr   r   r	   	utils.logr
   	__about__r   r   r   r   r;   rE   
deprecatedrK   rM   objectr   r   dictr   r  rn   rp   r@   rq   rr   rs   rt   ru   rv   rw   r   r   r   r   r>   r   r   r   <module>rN     s       : : ! #%P1h+ g%Q\ :</</
HB HBV" "JE EPD$ D$N%R) 2&   " 0 	 
r   