
    M@c;5                        d Z ddlZddlZ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dZdZeefZdZd	Zd
ZdZdZdZdZdZeeeeeeegZdZdZdZ edd      Zej@                   G d d             Z!ej@                   G d d             Z" G d d      Z# G d d      Z$ejJ                   G d d             Z&d"d Z'd#de	e$   fd!Z(y)$zBasic core types and utilities.    N)
namedtuple)Optional   )LOCAL_FS_ENCODING)	getLoggerlpep   compilationlivevariousdemosinglezVarious ArtistszeyeD3#album_typezeyeD3#artist_originCountAndTotalTuplezcount, totalc                   8    e Zd ZU eed<   eed<   eed<   d Zd Zy)ArtistOrigincitystatecountryc                 d    t        | j                  xs | j                  xs | j                        S N)boolr   r   r   selfs    ,/usr/lib/python3/dist-packages/eyed3/core.py__bool__zArtistOrigin.__bool__4   s#    DII;;t||<<    c                 x    dj                  t        j                  |       D cg c]  }|r|nd
 c}      S c c}w )N	 )joindataclassesastuple)r   os     r   	id3EncodezArtistOrigin.id3Encode7   s0    yyK4G4G4MNq1r>NOONs   7N)__name__
__module____qualname__str__annotations__r   r%    r   r   r   r   .   s    
IJL=Pr   r   c                   ,    e Zd ZU dZeed<   eed<   d Zy)	AudioInfoz*A base container for common audio details.	time_secs
size_bytesc                 D    t        | j                  dz        dz  | _        y )Ng      Y@)intr.   r   s    r   __post_init__zAudioInfo.__post_init__D   s    T^^e34u<r   N)r&   r'   r(   __doc__floatr*   r1   r2   r+   r   r   r-   r-   ;   s    4 O=r   r-   c                   t   e Zd ZU dZdZeed<   d Zd Zd Z	d Z
d Zd	 Zd
 Zd Zd ZdefdZed        Zej(                  d        Zed        Zej(                  d        Zed        Zej(                  d        Zed        Zej(                  d        Zedefd       Zej(                  d        ZddZy)TagzSAn abstract interface for audio tag (meta) data (e.g. artist, title,
    etc.)
    F	read_onlyc                     t               r   NotImplementedErrorr   vals     r   
_setArtistzTag._setArtistO       !##r   c                     t               r   r9   r   s    r   
_getArtistzTag._getArtistR   r>   r   c                     t               r   r9   r   s    r   _getAlbumArtistzTag._getAlbumArtistU   r>   r   c                     t               r   r9   r;   s     r   _setAlbumArtistzTag._setAlbumArtistX   r>   r   c                     t               r   r9   r;   s     r   	_setAlbumzTag._setAlbum[   r>   r   c                     t               r   r9   r   s    r   	_getAlbumzTag._getAlbum^   r>   r   c                     t               r   r9   r;   s     r   	_setTitlezTag._setTitlea   r>   r   c                     t               r   r9   r   s    r   	_getTitlezTag._getTitled   r>   r   c                     t               r   r9   r;   s     r   _setTrackNumzTag._setTrackNumg   r>   r   returnc                     t               r   r9   r   s    r   _getTrackNumzTag._getTrackNumj   r>   r   c                 "    | j                         S r   )r@   r   s    r   artistz
Tag.artistm   s      r   c                 &    | j                  |       y r   )r=   r   vs     r   rS   z
Tag.artistq   s    r   c                 "    | j                         S r   )rB   r   s    r   album_artistzTag.album_artistu   s    ##%%r   c                 &    | j                  |       y r   )rD   rU   s     r   rX   zTag.album_artisty   s    Qr   c                 "    | j                         S r   )rH   r   s    r   albumz	Tag.album}       ~~r   c                 &    | j                  |       y r   )rF   rU   s     r   r[   z	Tag.album       qr   c                 "    | j                         S r   )rL   r   s    r   titlez	Tag.title   r\   r   c                 &    | j                  |       y r   )rJ   rU   s     r   r`   z	Tag.title   r^   r   c                 "    | j                         S )zTrack number property.
        Must return a 2-tuple of (track-number, total-number-of-tracks).
        Either tuple value may be ``None``.
        )rQ   r   s    r   	track_numzTag.track_num   s       ""r   c                 &    | j                  |       y r   )rN   rU   s     r   rc   zTag.track_num   s    !r   Nc                 J    || _         || _        || _        || _        || _        y r   )r`   rS   r[   rX   rc   )r   r`   rS   r[   rX   rc   s         r   __init__zTag.__init__   s&    

("r   NNNNN)r&   r'   r(   r3   r7   r   r*   r=   r@   rB   rD   rF   rH   rJ   rL   rN   r   rQ   propertyrS   setterrX   r[   r`   rc   rf   r+   r   r   r6   r6   H   s:    It$$$$$$$$$$0 $ ! ! ]]  & &         \\      \\  #- # #  #r   r6   c                       e Zd ZU dZdZeed<   d ZddZe	dfdZ
ed        Zej                  d	        Zed
efd       Zed        Zej                  d        Zd Zd Zy)	AudioFilez:Abstract base class for audio file types (AudioInfo + Tag)Ntagc                     t               )znSubclasses MUST override this method and set ``self._info``,
        ``self._tag`` and ``self.type``.
        r9   r   s    r   _readzAudioFile._read   s     "##r   c                     t               r   r9   )r   versions     r   initTagzAudioFile.initTag   r>   r   Fc                    t        j                  | j                        }|j                  }|j                   dj
                  di t               z  }|j                         rt        d| d      |j                  j                         st        d|j                  z        t        j                  | j                  t        |             | j                  r$t        |      | j                  j                  _        |rc| j                  j                  j                  | j                  j                  j                   | j                  j                  j"                  f       t        |      | _        y)a  Rename the file to ``name``.
        The encoding used for the file name is :attr:`eyed3.LOCAL_FS_ENCODING`
        unless overridden by ``fsencoding``. Note, if the target file already
        exists, or the full path contains non-existent directories the
        operation will fail with :class:`IOError`.
        File times are not modified when ``preserve_file_time`` is ``True``,
        ``False`` is the default.
        z{name}{ext}zFile 'z' exists, will not overwritez6Target directory '%s' does not exists, will not createNr+   )pathlibPathpathsuffixparentformatlocalsexistsIOErrorosrenamer)   rl   	file_infonametouchatimemtime)r   r   
fsencodingpreserve_file_time	curr_pathextnew_paths          r   r}   zAudioFile.rename   s    LL+	##&:m&:&:&FVX&FF??F8*,HIJJ'') #%-__5 6 6 			$))S]+88&)(mDHH#HH$$dhh&8&8&>&>&*hh&8&8&>&>&@ A M	r   c                     | j                   S )zThe absolute path of this file.)_pathr   s    r   ru   zAudioFile.path        zzr   c                 \    t        |t        j                        rt        |      }|| _        y)zSet the pathN)
isinstancers   rt   r)   r   r   ru   s     r   ru   zAudioFile.path   s"     dGLL)t9D
r   rO   c                     | j                   S )zBReturns a concrete implementation of :class:`eyed3.core.AudioInfo`)_infor   s    r   infozAudioFile.info   r   r   c                     | j                   S )z<Returns a concrete implementation of :class:`eyed3.core.Tag`_tagr   s    r   rl   zAudioFile.tag   s     yyr   c                     || _         y r   r   )r   ts     r   rl   zAudioFile.tag   s	    	r   c                     t        |t        j                        rt        |      }|| _        d| _        d| _        d| _        | j                          y)zVConstruct with a path and invoke ``_read``.
        All other members are set to None.N)	r   rs   rt   r)   ru   typer   r   rn   r   s     r   rf   zAudioFile.__init__   s@     dGLL)t9D		
	

r   c                 ,    t        | j                        S r   )r)   ru   r   s    r   __str__zAudioFile.__str__   s    499~r   r   )r&   r'   r(   r3   rl   r6   r*   rn   rq   r   r}   rh   ru   ri   r-   r   rf   r   r+   r   r   rk   rk      s    DCO$$ '8"'":   
[[  i     	ZZ 
r   rk   c                       e Zd ZdZg dZ	 	 	 ddZed        Zed        Zed        Z	ed        Z
ed	        Zed
        Zd Zd Zd Zd Zed        Zed        Zd Zy)Datea  
    A class for representing a date and time (optional). This class differs
    from ``datetime.datetime`` in that the default values for month, day,
    hour, minute, and second is ``None`` and not 'January 1, 00:00:00'.
    This allows for an object that is simply 1987, and not January 1 12AM,
    for example. But when more resolution is required those vales can be set
    as well.
    )z%Yz%Y-%mz%Y-%m-%dz%Y-%m-%dT%Hz%Y-%m-%dT%H:%Mz%Y-%m-%dT%H:%M:%Sz%Y-%m-%dT%HZz%Y-%m-%dT%H:%MZz%Y-%m-%dT%H:%M:%SZz%Y-%m-%d %H:%M:%Sz%Y-00-00z%Y%m%dNc                     ddl m }  ||||nd||nd||nd||nd||nd      }|| _        || _        || _        || _        || _        || _        t        j                  t        |             }y )Nr   )datetimer   )
r   _year_month_day_hour_minute_secondr   _validateFormatr)   )	r   yearmonthdayhourminutesecondr   _s	            r   rf   zDate.__init__  s     	&TE$551OS!-T1%1Vq%1Vq	: 
	
   T+r   c                     | j                   S r   )r   r   s    r   r   z	Date.year&      zzr   c                     | j                   S r   )r   r   s    r   r   z
Date.month*  s    {{r   c                     | j                   S r   )r   r   s    r   r   zDate.day.  s    yyr   c                     | j                   S r   )r   r   s    r   r   z	Date.hour2  r   r   c                     | j                   S r   )r   r   s    r   r   zDate.minute6      ||r   c                     | j                   S r   )r   r   s    r   r   zDate.second:  r   r   c                 H   |sy| j                   |j                   k(  xr | j                  |j                  k(  xrj | j                  |j                  k(  xrO | j                  |j                  k(  xr4 | j                  |j                  k(  xr | j
                  |j
                  k(  S )NFr   r   r   r   r   r   r   rhss     r   __eq__zDate.__eq__>  s    		SXX% *

cii'*CGG#* 		SXX%* szz)	*
 szz)	+r   c                     | |k(   S r   r+   r   s     r   __ne__zDate.__ne__I  s    3;r   c                 f   |sy| j                   |j                   f| j                  |j                  f| j                  |j                  f| j                  |j                  f| j                  |j                  f| j
                  |j
                  ffD ]  \  }}||nd}||nd}||k  r y||kD  s y y)NFTr   )r   r   leftrights       r   __lt__zDate.__lt__L  s    !YY1!ZZ3!XXsww/!YY1![[#**5![[#**57 	KD%  +4D".EBEe|	 r   c                 *    t        t        |             S r   )hashr)   r   s    r   __hash__zDate.__hash__a  s    CIr   c                     d\  }}t         j                  D ]  }	 t        j                  | |      } n |t	        d|        |sJ ||fS # t        $ r Y @w xY w)N)NNzInvalid date string: )r   TIME_STAMP_FORMATStimestrptime
ValueError)spdatefmts      r   r   zDate._validateFormatd  sw    
s** 	Ca-	 =4QC899ucz  s   A	AAc                    t        | t              s| j                  d      } | j                  d      } t        j                  |       \  }}i }d|v r|j                  |d<   d|v r|j                  |d<   d|v r|j                  |d<   d	|v r|j                  |d
<   d|v r|j                  |d<   t	        |j                  fi |S )z-Parses date strings that conform to ISO-8601.ascii z%mr   %dr   z%Hr   z%Mr   z%Sr   )r   r)   decodestripr   r   tm_montm_mdaytm_hourtm_mintm_sectm_year)r   r   r   kwargss       r   parsez
Date.parseu  s     !S!!AGGFO))!,
s 3;#llF7O3;!MMF5M3;"]]F6N3;$||F83;$||F8EMM,V,,r   c                 L   d| j                   z  }| j                  r|dt        | j                        j                  dd      z  z  }| j                  r|dt        | j                        j                  dd      z  z  }| j
                  |dt        | j
                        j                  dd      z  z  }| j                  b|dt        | j                        j                  dd      z  z  }| j                  +|dt        | j                        j                  dd      z  z  }|S )zpReturns date strings that conform to ISO-8601.
        The returned string will be no larger than 17 characters.r   z-%s   0zT%sz:%s)r   r   r)   rjustr   r   r   r   )r   r   s     r   r   zDate.__str__  s     499::TZZ..q#666AxxUS]00C88899(TYY!5!5a!===A{{.US%5%;%;As%CCC;;2T[[)9)?)?3)G!GGAr   rg   )r&   r'   r(   r3   r   rf   rh   r   r   r   r   r   r   r   r   r   r   staticmethodr   r   r   r+   r   r   r   r      s     H-104,*            	+ *    - -0r   r   rO   c                 .    t         j                  |        y)zA function that is invoked when non-fatal parse, format, etc. errors
    occur. In most cases the invalid values will be ignored or possibly fixed.
    This function simply logs the error.N)logwarning)exs    r   
parseErrorr     s     KKOr   c                    ddl m}m}m} t	        | t
        j                        st        j                  |       } t        j                  d|         | j                         r| j                         st        d|        t        d|        |j                  |       }t        j                  d|        ||j                  v r|j                  | |      S ||j                  k(  r|j!                  | |      S y)ab  Loads the file identified by ``path`` and returns a concrete type of
    :class:`eyed3.core.AudioFile`. If ``path`` is not a file an ``IOError`` is
    raised. ``None`` is returned when the file type (i.e. mime-type) is not
    recognized.
    The following AudioFile types are supported:

      * :class:`eyed3.mp3.Mp3AudioFile` - For mp3 audio files.
      * :class:`eyed3.id3.TagFile` - For raw ID3 data files.

    If ``tag_version`` is not None (the default) only a specific version of
    metadata is loaded. This value must be a version constant specific to the
    eventual format of the metadata.
    r   )mimetypemp3id3zLoading file: znot a file: zfile not found: zFile mime-type: N)r    r   r   r   r   rs   rt   r   debugrz   is_filer{   guessMimetype
MIME_TYPESMp3AudioFileID3_MIME_TYPETagFile)ru   tag_versionr   r   r   mtypes         r   loadr     s     %$dGLL)||D!IItf%&{{}||~L/00(/00""4(EII ()k22	###	#{{4--r   )rO   Nr   ))r3   r|   r   	functoolsrs   r"   collectionsr   typingr   r    r   	utils.logr   r&   r   
AUDIO_NONE	AUDIO_MP3AUDIO_TYPESLP_TYPEEP_TYPEEP_MAX_SIZE_HINT	COMP_TYPE	LIVE_TYPEVARIOUS_TYPE	DEMO_TYPESINGLE_TYPEALBUM_TYPE_IDSVARIOUS_ARTISTSTXXX_ALBUM_TYPETXXX_ARTIST_ORIGINr   	dataclassr   r-   r6   rk   total_orderingr   r   r   r+   r   r   <module>r     s;   % 	     "     
	9%

 			7Iy,[*# %
 +    4nE  	P 	P 	P 	= 	= 	=V# V#rQ Qh f f fR"HY$7 "r   