
    Cch>                     *   d Z ddlmZm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 g dZ G d d	eee      Z G d
 dee      Z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$d Z%d Z&d Z'd Z(d  Z)d! Z*d" Z+d# Z,d$ Z-d% Z.i d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTj_                         D ]  \  Z0Z1eje                  e1e0        ejg                  dUeee       ejg                  dVeee       ejg                  dWeee       ejg                  dXeee e!       ejg                  dYe"e#e$       ejg                  dZe%e&e'       ejg                  d[e(e)e*e.       ejg                  d\e+e,e-       i d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdLdtdudvdwdxdydzd{d|d}d~dddj_                         D ]  \  Z4Z1ejk                  e1e4         G d de      Z6y)zEasier access to ID3 tags.

EasyID3 is a wrapper around mutagen.id3.ID3 to make ID3 tags appear
more like Vorbis or APEv2 tags.
    )CallableDictN)Metadata)	DictMixin
dict_matchloadfile)ID3errordeleteID3FileType)EasyID3Openr   c                       e Zd ZdZy)EasyID3KeyErrorzRaised when trying to get/set an invalid key.

    Subclasses both KeyError and ValueError for API compatibility,
    catching KeyError is preferred.
    N)__name__
__module____qualname____doc__     1/usr/lib/python3/dist-packages/mutagen/easyid3.pyr   r      s    r   r   c                   X   e Zd ZU dZi Zeeef   ed<   i Z	eeef   ed<   i Z
eeef   ed<   i Zeeef   ed<   e	ZdZdZdZdZe	 dd       Zed        Zed	        Zdd
Z ed d       Z edd      	 	 dd       Z ed d       Z ed d       Zed        Zd Zd Zd Zd Z d Z!y)r   a  EasyID3(filething=None)

    A file with an ID3 tag.

    Like Vorbis comments, EasyID3 keys are case-insensitive ASCII
    strings. Only a subset of ID3 frames are supported by default. Use
    EasyID3.RegisterKey and its wrappers to support more.

    You can also set the GetFallback, SetFallback, and DeleteFallback
    to generic key getter/setter/deleter functions, which are called
    if no specific handler is registered for a key. Additionally,
    ListFallback can be used to supply an arbitrary list of extra
    keys. These can be set on EasyID3 or on individual instances after
    creation.

    To use an EasyID3 class with mutagen.mp3.MP3::

        from mutagen.mp3 import EasyMP3 as MP3
        MP3(filename)

    Because many of the attributes are constructed on the fly, things
    like the following will not work::

        ezid3["performer"].append("Joe")

    Instead, you must do::

        values = ezid3["performer"]
        values.append("Joe")
        ezid3["performer"] = values

    SetGetDeleteListNc                     |j                         }||| j                  |<   ||| j                  |<   ||| j                  |<   ||| j                  |<   yy)a  Register a new key mapping.

        A key mapping is four functions, a getter, setter, deleter,
        and lister. The key may be either a string or a glob pattern.

        The getter, deleted, and lister receive an ID3 instance and
        the requested key name. The setter also receives the desired
        value, which will be a list of strings.

        The getter, setter, and deleter are used to implement __getitem__,
        __setitem__, and __delitem__.

        The lister is used to implement keys(). It should return a
        list of keys that are actually in the ID3 instance, provided
        by its associated getter.
        N)lowerr   r   r   r   )clskeygettersetterdeleterlisters         r   RegisterKeyzEasyID3.RegisterKeyQ   s`    & iik!CGGCL!CGGCL%CJJsO"CHHSM r   c                 L    fd}fd}fd}| j                  ||||       y)zRegister a text key.

        If the key you need to register is a simple one-to-one mapping
        of ID3 frame name to EasyID3 key, then you can use this
        function::

            EasyID3.RegisterTextKey("title", "TIT2")
        c                      t        |          S Nlistid3r    frameids     r   r!   z'EasyID3.RegisterTextKey.<locals>.getterx       G%%r   c                     	 |    }d|_         ||_        y # t        $ r6 | j                  t	        j
                  j                     d|             Y y w xY wN   encodingtext)r3   r4   KeyErroraddmutagenr,   Frames)r,   r    valueframer-   s       r   r"   z'EasyID3.RegisterTextKey.<locals>.setter{   sV    #G "#"
	  M**73QUKLMs    <AAc                     | = y r(   r   r+   s     r   r#   z(EasyID3.RegisterTextKey.<locals>.deleter   
    Gr   Nr%   )r   r    r-   r!   r"   r#   s     `   r   RegisterTextKeyzEasyID3.RegisterTextKeyn   s&    	&	#	 	VVW5r   c                 X    dz   fd}fd}fd}| j                  ||||       y)a   Register a user-defined text frame key.

        Some ID3 tags are stored in TXXX frames, which allow a
        freeform 'description' which acts as a subkey,
        e.g. TXXX:BARCODE.::

            EasyID3.RegisterTXXXKey('barcode', 'BARCODE').
        zTXXX:c                      t        |          S r(   r)   r+   s     r   r!   z'EasyID3.RegisterTXXXKey.<locals>.getter   r.   r   c                     d}|D ]  }|st        |      dkD  sd} n | j                  t        j                  j	                  ||             y )Nr   r1   )r3   r4   desc)maxr6   r7   r,   TXXX)r,   r    r9   encvrC   s        r   r"   z'EasyID3.RegisterTXXXKey.<locals>.setter   sQ    C Q')C
 GGGKK$$cD$IJr   c                     | = y r(   r   r+   s     r   r#   z(EasyID3.RegisterTXXXKey.<locals>.deleter   r<   r   Nr=   )r   r    rC   r!   r"   r#   r-   s     `   @r   RegisterTXXXKeyzEasyID3.RegisterTXXXKey   s2     D.	&	K	 	VVW5r   c                 J    t               | _        || j                  |       y y r(   )r	   _EasyID3__id3load)selffilenames     r   __init__zEasyID3.__init__   s"    U
IIh  r   c                 .    | j                   j                  S r(   )rK   rL   ss    r   <lambda>zEasyID3.<lambda>   s    aggll r   c                 0    t        | j                  d|      S )NrL   setattrrK   rR   rG   s     r   rS   zEasyID3.<lambda>   s    &!!< r   T)writablecreatec                 p   |dk(  rq| j                   j                         }	 | j                   j                          | j                   j                  |||||       | j                   j	                  |       y| j                   j                  |||||       y# | j                   j	                  |       w xY w)zsave(filething=None, v1=1, v2_version=4, v23_sep='/', padding=None)

        Save changes to a file.
        See :meth:`mutagen.id3.ID3.save` for more info.
        r1   )v1
v2_versionv23_seppaddingN)rK   _copyupdate_to_v23save_restore)rM   	filethingr[   r\   r]   r^   backups          r   ra   zEasyID3.save   s     ?
 ZZ%%'F,

((*

"W#   % 

##F+JJOOI"$+W  > 

##F+s   :B B5c                 .    | j                   j                  S r(   )rK   r   rQ   s    r   rS   zEasyID3.<lambda>   s     r   c                 0    t        | j                  d|      S )Nr   rU   rW   s     r   rS   zEasyID3.<lambda>   s    7177Ha#@ r   c                 .    | j                   j                  S r(   )rK   rN   rQ   s    r   rS   zEasyID3.<lambda>   s    !''"2"2 r   c                 0    t        | j                  d|      S )NrN   rU   )rR   fns     r   rS   zEasyID3.<lambda>   s    gaggz2&F r   c                 .    | j                   j                  S r(   )rK   size)rM   s    r   rk   zEasyID3.size   s    zzr   c                     t        | j                  |j                         | j                        }| || j                  |      S t        d|z        Nz%r is not a valid key)r   r   r   GetFallbackrK   r   rM   r    funcs      r   __getitem__zEasyID3.__getitem__   sH    $((CIIK1A1AB

C((!"9C"?@@r   c                     t        |t              r|g}t        | j                  |j	                         | j
                        }| || j                  ||      S t        d|z        rm   )
isinstancestrr   r   r   SetFallbackrK   r   )rM   r    r9   rp   s       r   __setitem__zEasyID3.__setitem__   s[    eS!GE$((CIIK1A1AB

C//!"9C"?@@r   c                     t        | j                  |j                         | j                        }| || j                  |      S t        d|z        rm   )r   r   r   DeleteFallbackrK   r   ro   s      r   __delitem__zEasyID3.__delitem__   sH    $++syy{D4G4GH

C((!"9C"?@@r   c                 ^   g }| j                   j                         D ]V  }|| j                  v r0|j                   | j                  |   | j                  |             A|| v sF|j                  |       X | j                  +|j                  | j                  | j                  d             |S )N )r   keysr   extendrK   appendListFallback)rM   r|   r    s      r   r|   zEasyID3.keys   s    88==? 	!CdiiNDIIcN4::s;<C 		!
 (KK))$**b9:r   c                     g }t        | j                               D ]$  }| |   }|D ]  }|j                  |d|        & dj                  |      S )zPrint tag key=value pairs.=
)sortedr|   r~   join)rM   stringsr    valuesr9   s        r   pprintzEasyID3.pprint   s[    $))+& 	7C#YF 7#u567	7 yy!!r   )NNNNr(   )N      /N)"r   r   r   r   r   r   rt   r   __annotations__r   r   r   
valid_keysrn   ru   rx   r   classmethodr%   r>   rI   rO   propertyrL   r   ra   r   rN   rk   rq   rv   ry   r|   r   r   r   r   r   r   "   s<   B  "Cc8m	!!Cc8m	!"$FDh$ "D$sH}
" JKKNLCG# #8 6 64 6 6: 
 *<>D tD)?B> *>2 .@BF 2FHH  AAA	"r   r   c                      | d   j                   S NTCON)genresr,   r    s     r   	genre_getr     s    v;r   c                     	 | d   }d|_         ||_        y # t        $ r3 | j                  t        j
                  j                  d|             Y y w xY w)Nr   r1   r2   )r3   r   r5   r6   r7   r,   r   r,   r    r9   r:   s       r   	genre_setr     sQ    F 	  :  !% 89:s    9AAc                 
    | d= y r   r   r   s     r   genre_deleter     	    Fr   c                 Z    | d   j                   D cg c]  }|j                    c}S c c}w NTDRCr4   r,   r    stamps      r   date_getr     $    $'K$4$455EJJ555   (c                 d    | j                  t        j                  j                  d|             y r0   )r6   r7   r,   r   r,   r    r9   s      r   date_setr     "    GGGKKae45r   c                 
    | d= y r   r   r   s     r   date_deleter     r   r   c                 Z    | d   j                   D cg c]  }|j                    c}S c c}w NTDORr   r   s      r   original_date_getr      r   r   c                 d    | j                  t        j                  j                  d|             y r0   )r6   r7   r,   r   r   s      r   original_date_setr   $  r   r   c                 
    | d= y r   r   r   s     r   original_date_deleter   (  r   r   c                     g }|j                  dd      d   }	 | d   }|j                  D ]  \  }}||k(  s|j                  |        |r|S t        |      # t        $ r t        |      w xY w)N:r   TMCL)splitr5   peopler~   )r,   r    r   wanted_rolemclrolepersons          r   performer_getr   ,  s    F))C#A&K&k 

 "f;MM&!" sm  sms   A A-c                 Z   |j                  dd      d   }	 | d   }d|_        |j                  D cg c]  }|d   |k7  s| }}|D ]  }|j                  ||f        ||_        y # t        $ r5 t        j                  j	                  dg       }| j                  |       Y w xY wc c}w )Nr   r   r   r1   )r3   r   r   )	r   r5   r7   r,   r   r6   r3   r   r~   )r,   r    r9   r   r   pr   rG   s           r   performer_setr   <  s    ))C#A&K&k CL;Aqt{':a;F; ({A&'(CJ  kk"5 <s   A' B(B(';B%$B%c                    |j                  dd      d   }	 | d   }|j                  D cg c]  }|d   |k7  s| }}||j                  k(  rt        |      |r||_        y | d= y # t        $ r t        |      w xY wc c}w )Nr   r   r   r   )r   r5   r   )r,   r    r   r   r   r   s         r   performer_deleter   J  s    ))C#A&K&k ;Aqt{':a;F;sm	
K  sm;s   A& A>A>&A;c                 z    	 | d   }t        t        d |j                  D                    S # t        $ r g cY S w xY w)Nr   c              3   ,   K   | ]  }d |d   z     yw)z
performer:r   Nr   ).0r   s     r   	<genexpr>z!performer_list.<locals>.<genexpr>_  s     @qt+@s   )r*   setr   r5   )r,   r    r   s      r   performer_listr   Y  sC    B&k C@SZZ@@AA  	s   , ::c                 @    | d   j                   j                  d      gS )NUFID:http://musicbrainz.orgascii)datadecoder   s     r   musicbrainz_trackid_getr   b  s"    -.33::7CDDr   c                     t        |      dk7  rt        d      |d   j                  d      }	 | d   }||_        y # t        $ r5 t
        j                  j                  d|      }| j                  |       Y y w xY w)Nr   z%only one track ID may be set per songr   r   r   zhttp://musicbrainz.org)ownerr   )	len
ValueErrorencoder   r5   r7   r,   UFIDr6   r   s       r   musicbrainz_trackid_setr   f  sz    
5zQ@AA!HOOG$E12
 
	    '?e Ls   < ;A:9A:c                 
    | d= y )Nr   r   r   s     r   musicbrainz_trackid_deleter   s  s    )*r   c                 z    | j                  d      D cg c]  }|j                   }}|r|S t        |      c c}w NWOAR)getallurlr   )r,   r    r:   urlss       r   website_getr   w  s:    #&::f#56%EII6D6c""	 7s   8c                     | j                  d       |D ]1  }| j                  t        j                  j	                  |             3 y )Nr   )r   )delallr6   r7   r,   r   )r,   r    r9   rG   s       r   website_setr     s;    JJv )  Q '()r   c                 &    | j                  d       y r   )r   r   s     r   website_deleter     s    JJvr   c                 j    	 | d|dd z      }d|j                   z  gS # t        $ r t        |      w xY w)NRVA2:   z%+f dB)gainr5   r   r,   r    r:   s      r   gain_getr     sL    (Gc"Rj() EJJ&''  #c""#    2c                 6   t        |      dk7  rt        d|      t        |d   j                         d         }	 | d|dd z      }||_	        y # t        $ rA t
        j                  j                  |dd ddd      }| j                  |       Y ||_	        y w xY w)Nr   z-there must be exactly one gain value, not %r.r   r   r   r   rC   r   peakchannel)
r   r   floatr   r5   r7   r,   RVA2r6   r   )r,   r    r9   r   r:   s        r   gain_setr     s    
5zQ;UD 	Dq!!$%DGc"Rj() EJ    c"Rjqq! LEJs   A A BBc                 t    	 | d|dd z      }|j                   rd|_        y | d|dd z   = y # t        $ r Y y w xY wNr   r   r   g        )r   r   r5   r   s      r   gain_deleter     S    +Gc"Rj() ::EJGc"Rj()     + 	77c                 j    	 | d|dd z      }d|j                   z  gS # t        $ r t        |      w xY w)Nr   r   r   z%f)r   r5   r   r   s      r   peak_getr     sL    $Gc"Rj() 

"##  #c""#r   c                 >   t        |      dk7  rt        d|      t        |d         }|dk\  s|dk  rt        d      	 | d|dd z      }||_        y # t        $ rA t        j
                  j                  |dd ddd	      }| j                  |       Y ||_        y w xY w)
Nr   z-there must be exactly one peak value, not %r.r      zpeak must be => 0 and < 2.r   r   r   r   )	r   r   r   r5   r7   r,   r   r6   r   )r,   r    r9   r   r:   s        r   peak_setr     s    
5zQ;UD 	Dq?DqyD1H566Gc"Rj() EJ    c"Rjqq! LEJs   A A BBc                 t    	 | d|dd z      }|j                   rd|_        y | d|dd z   = y # t        $ r Y y w xY wr   )r   r   r5   r   s      r   peak_deleter     r   r   c                     g }| j                  d      D ]>  }|j                  d|j                  z         |j                  d|j                  z         @ |S )Nr   zreplaygain_%s_gainzreplaygain_%s_peak)r   r~   rC   )r,   r    r|   r:   s       r   peakgain_listr     sR    DF# 7(5::56(5::567 Kr   TALBalbumTBPMbpmTCMPcompilationTCOMcomposerTCOP	copyrightTENC	encodedbyTEXTlyricistTLENlengthTMEDmediaTMOOmoodTIT1groupingTIT2titleTIT3versionTPE1artistTPE2albumartistTPE3	conductorTPE4arranger
discnumberorganizationtracknumberauthoralbumartistsort	albumsortcomposersort
artistsort	titlesortisrcdiscsubtitlelanguage)TPOSTPUBTRCKTOLYTSO2TSOATSOCTSOPTSOTTSRCTSSTTLANgenredateoriginaldatezperformer:*musicbrainz_trackidwebsitezreplaygain_*_gainzreplaygain_*_peakzMusicBrainz Artist Idmusicbrainz_artistidzMusicBrainz Album Idmusicbrainz_albumidzMusicBrainz Album Artist Idmusicbrainz_albumartistidzMusicBrainz TRM Idmusicbrainz_trmidzMusicIP PUIDmusicip_puidzMusicMagic Fingerprintmusicip_fingerprintzMusicBrainz Album Statusmusicbrainz_albumstatuszMusicBrainz Album Typemusicbrainz_albumtypez!MusicBrainz Album Release CountryreleasecountryzMusicBrainz Disc Idmusicbrainz_discidASINasinALBUMARTISTSORT	PERFORMER	performerBARCODEbarcodeCATALOGNUMBERcatalognumberzMusicBrainz Release Track Idmusicbrainz_releasetrackidzMusicBrainz Release Group Idmusicbrainz_releasegroupidmusicbrainz_workidacoustid_fingerprintacoustid_id)zMusicBrainz Work IdzAcoustid FingerprintzAcoustid Idc                       e Zd ZdZeZy)EasyID3FileTypezEasyID3FileType(filething=None)

    Like ID3FileType, but uses EasyID3 for tags.

    Arguments:
        filething (filething)

    Attributes:
        tags (`EasyID3`)
    N)r   r   r   r   r   r	   r   r   r   rW  rW  "  s    	 Cr   rW  )7r   typingr   r   mutagen.id3r7   r   mutagen._utilr   r   r   r	   r
   r   r   __all__r5   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   itemsr-   r    r>   r%   rC   rI   rW  r   r   r   <module>r]     s   "   9 9 7 7 (h
E Z"i Z"z 6666 BE
,#)(
	+$	+
G
E M J	
 K K J H G F J G I H M  K!" J#$ ;< %'=*LGS> C)?*B   GY	< @   FHh <   N$57H(*   =-1A   )+B+-GI   I{K H   8[-I   '8[ I42 #$? .	
 ^ 4  !: 6 )*: 0 V ) + 	 o  $%A!" $%A#$ 13!)* %'+'ID#, C&-'2k r   