
    M@c                         d dl Z d dl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  ee	      Z
 G d de      Zd	Zg d
Zg dZdgZ G d dej                         Z G d dej$                        Zy)    N   )Error)id3)core)	getLoggerc                       e Zd ZdZy)Mp3Exceptionz"Used to signal mp3-related errors.N)__name__
__module____qualname____doc__     4/usr/lib/python3/dist-packages/eyed3/mp3/__init__.pyr	   r	      s    ,r   r	   mpeg)
z
audio/mpegz	audio/mp3zaudio/x-mp3zaudio/x-mpegzaudio/mpeg3zaudio/x-mpeg3z	audio/mpgzaudio/x-mpgzaudio/x-mpegaudiozaudio/mpegapplication/x-tar)zapplication/octet-streamzaudio/x-hx-aac-adtszaudio/x-wavz.mp3c                   .     e Zd Z fdZed        Z xZS )Mp3AudioInfoc                 T	   ddl m} ddlm} t        j	                  d|z         d | _        d | _        d | _        d | _        d| _	        d}| j
                  w|j                  ||      \  }}}|s!	 |j                  }	|j                  d|	z        	 |j                  |      | _        t        j	                  d	||fz         | j
                  w|j!                  |       |j#                  | j
                  j$                        }t'        j(                  d      j+                  |      rM|j-                         | _        | j                  j/                  |      s}t        j	                  d       d | _        n`|j1                  d      dk\  rL|j3                         | _        | j                  j/                  |      st        j	                  d       d | _        |j5                  |      | _        t7        j8                  |j                        t8        j:                     }| j                  rD| j                  j<                  r. || j
                  d      }|| j                  j>                  z  }n| j                  rF| j                  j@                  dk(  r- || j
                  d      }|| j                  jB                  z  }n || j
                  d      }|}|rl|jE                         r\||jF                  jH                  |jF                  jJ                  z   z  }|j!                  dd       |j#                  d      dk(  r|dz  }n|r|jM                         r|dz  }|| j
                  j$                  z  |z  }| j                  rn| j                  j<                  rX| j                  j>                  rBtO        | j                  jP                  dz  || j                  j>                  z  dz  z        }d}n| j
                  j                  }d}||f| _	        | j
                  jR                  | _)        | j
                  jT                  | _*        tV        |   ||       y # t        $ r d}	Y w xY w# |j                  $ r1}
t        j	                  d
t        |
      z         |dz  }Y d }
~
d }
~
ww xY w)N   )headers)timePerFramezmp3 header search starting @ %x)NNr   unknownz(Unable to find a valid mp3 frame in '%s'z%mp3 header %x found at position: 0x%xzInvalid mp3 header: %s   s	   Xing|InfozIgnoring corrupt Xing headers   VBRIzIgnoring corrupt VBRI headerTFir      TAG      i  )- r   r   logdebug
mp3_headerxing_headervbri_headerlame_tagbit_rate
findHeadernameAttributeErrorr	   	Mp3Headerstrseekreadframe_lengthrecompilesearch
XingHeaderdecodefind
VbriHeader
LameHeaderosstatST_SIZEvbr	numFramesversion
num_framesisV2headerSIZEtag_sizeisV1intnumBytessample_freqmodesuper__init__)selffile_objstart_offsettagr   r   
header_pos
header_intheader_bytesfnameex	mp3_frame
size_bytestpf	time_secslengthbrr9   	__class__s                     r   rG   zMp3AudioInfo.__init__$   s   )		3lBC $
oo% %//,GZ&$MME **>FH H"")"3"3J"?		A%z23 4 oo%, 	j!MM$//">">?	::l#**95&113D##**95		89#' ^^G$)&113D##**95		89#'   **95 WWX]]+DLL9
  0 0 4 4t5Cd..888I$"2"2":":a"?t5Cd..999It6CFsxxz#**//CJJ,?,???dA&==#u,cMF#$//">">>#EI !1!1!5!5  **d&&//!3D,,666=? @BC))BCb	??66OO((	J/K & &%E& '' "		2SW<=!"s*   0Q 0Q' Q$#Q$'R'6&R""R'c                 6    | j                   \  }}|rdnd | dS )N~r   z kb/s)r%   )rH   r9   r%   s      r   bit_rate_strzMp3AudioInfo.bit_rate_str   s%    --h#"%hZu55r   )r
   r   r   rG   propertyrZ   __classcell__rW   s   @r   r   r   #   s    ]0D 6 6r   r   c                        e Zd ZdZej
                  f fd	Zd Zej                  fdZ	e
j                  j                  j                  d        Z xZS )Mp3AudioFilez#Audio file container for mp3 files.c                 p    || _         t        | 	  |       | j                  t        j
                  k(  sJ y N)_tag_versionrF   rG   typer   	AUDIO_MP3)rH   pathr;   rW   s      r   rG   zMp3AudioFile.__init__   s.    #yyDNN***r   c                    t        | j                  d      5 }t        j                         | _        | j                  j                  || j                        }|r| j                  j                         rd}ng|r\| j                  j                         rB| j                  j                  j                  | j                  j                  j                  z   }n	d}d | _        	 t        ||| j                        | _        t"        j$                  | _        d d d        y # t        $ r&}t        j!                  |       d | _        Y d }~Hd }~ww xY w# 1 sw Y   y xY w)Nrbr   )openre   r   Tag_tagparserb   rA   r=   r>   r?   r@   r   _infor	   r   warningr   rd   rc   )rH   rI   	tag_found
mp3_offsetrP   s        r   _readzMp3AudioFile._read   s    $))T" 	'h	DI		$2C2CDI TYY^^-
tyy~~/!YY--22TYY5E5E5N5NN

 	")(J		J
 DI+	' 	'   " B!

	"	' 	's6   CE
D:E
	E!E=E
EE

Ec                     t        j                         | _        || j                  _        t        j                  | j
                        | j                  _        | j                  S )zDAdd a id3.Tag to the file (removing any existing tag if one exists).)r   ri   rK   r;   FileInfore   	file_info)rH   r;   s     r   initTagzMp3AudioFile.initTag   s=    779" \\$))4xxr   c                 ^   |rt        j                  | j                        |_        | j                  rt| j                  j                  r^| j                  j                  j
                  |j                  _        | j                  j                  j                  |j                  _        || _        y ra   )r   rr   re   rs   rj   r@   tag_padding_size)rH   ts     r   rK   zMp3AudioFile.tag   sn    ,,tyy1AKyyTYY00'+yy':':'C'C$II''88 ,	r   )r
   r   r   r   r   ID3_ANY_VERSIONrG   rp   ID3_DEFAULT_VERSIONrt   r   	AudioFilerK   setterr\   r]   s   @r   r_   r_      sM    -%(%8%8 +'0 "55  
^^ r   r_   )r6   r.   r7   r   r   r   r   	utils.logr   r
   r   r	   NAME
MIME_TYPESOTHER_MIME_TYPES
EXTENSIONS	AudioInfor   rz   r_   r   r   r   <module>r      sr    	 	     !	5 	
 
  X
f64>> f6R04>> 0r   