
    Cc!                     $   d dl mZmZ d dlmZ d dl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d
dddddddddddddddj%                         D ]  \  ZZej+                  ee        ddddddd d!d"j%                         D ]  \  ZZej/                  ee        d#d$ij%                         D ]  \  ZZej1                  ee        d%d&d'j%                         D ]  \  ZZej3                  ee         G d( d)e	      Zy*)+    )DictCallable)Tags)	DictMixin
dict_match)MP4MP4Tagserrordelete)EasyMP4TagsEasyMP4r   r
   c                       e Zd Zy)EasyMP4KeyErrorN)__name__
__module____qualname__     1/usr/lib/python3/dist-packages/mutagen/easymp4.pyr   r      s    r   r   c                      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<   d Z ed d       Zed	        Ze	 dd       Zed        Zedd       Ze	 	 dd       Zedd       Zd Zd Zd Zd Zd Zy
)r   aN  EasyMP4Tags()

    A file with MPEG-4 iTunes metadata.

    Like Vorbis comments, EasyMP4Tags keys are case-insensitive ASCII
    strings, and values are a list of Unicode strings (and these lists
    are always of length 0 or 1).

    If you need access to the full MP4 metadata feature set, you should use
    MP4, not EasyMP4.
    SetGetDeleteListc                     t        |i || _        | j                  j                  | _        | j                  j                  | _        | j                  j                  | _        y N)r	   _EasyMP4Tags__mp4loadsaver   )selfargskwargss      r   __init__zEasyMP4Tags.__init__(   sB    d-f-
JJOO	JJOO	jj''r   c                 .    | j                   j                  S r   )r   filename)ss    r   <lambda>zEasyMP4Tags.<lambda>.   s    !''"2"2 r   c                 0    t        | j                  d|      S )Nr%   )setattrr   )r&   fns     r   r'   zEasyMP4Tags.<lambda>/   s    gaggz2&F r   c                 .    | j                   j                  S r   )r   _padding)r    s    r   r,   zEasyMP4Tags._padding1   s    zz"""r   Nc                     |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 MP4Tags 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 MP4 instance, provided
        by its associated getter.
        N)lowerr   r   r   r   )clskeygettersetterdeleterlisters         r   RegisterKeyzEasyMP4Tags.RegisterKey5   s`    & iik!CGGCL!CGGCL%CJJsO"CHHSM r   c                 L    fd}fd}fd}| j                  ||||       y)u   Register a text key.

        If the key you need to register is a simple one-to-one mapping
        of MP4 atom name to EasyMP4Tags key, then you can use this
        function::

            EasyMP4Tags.RegisterTextKey("artist", "©ART")
        c                     |    S r   r   tagsr0   atomids     r   r1   z+EasyMP4Tags.RegisterTextKey.<locals>.getter\   s    <r   c                     || <   y r   r   )r9   r0   valuer:   s      r   r2   z+EasyMP4Tags.RegisterTextKey.<locals>.setter_   s     DLr   c                     | = y r   r   r8   s     r   r3   z,EasyMP4Tags.RegisterTextKey.<locals>.deleterb   
    Vr   Nr5   )r/   r0   r:   r1   r2   r3   s     `   r   RegisterTextKeyzEasyMP4Tags.RegisterTextKeyR   s&    	 	!	 	VVW5r   c                 T    fd}fd}fd}| j                  ||||       y)z'Register a scalar integer key.
        c                 <    t        t        t        |                S r   )listmapstrr8   s     r   r1   z*EasyMP4Tags.RegisterIntKey.<locals>.getterl   s    Cf.//r   c                 j    fd}t        t        |      D cg c]
  } ||       c}| <   y c c}w )Nc                 B    t        t        t        |                   S r   intminmaxx	max_value	min_values    r   r'   z<EasyMP4Tags.RegisterIntKey.<locals>.setter.<locals>.<lambda>p       c#c)Q&7"CD r   )rD   rI   )r9   r0   r<   clampvr:   rN   rO   s        r   r2   z*EasyMP4Tags.RegisterIntKey.<locals>.settero   s)    DE.1#uo>E!H>DL>s   0c                     | = y r   r   r8   s     r   r3   z+EasyMP4Tags.RegisterIntKey.<locals>.deleters   r>   r   Nr?   r/   r0   r:   rO   rN   r1   r2   r3   s     ```   r   RegisterIntKeyzEasyMP4Tags.RegisterIntKeyg   s&    
	0	?	 	VVW5r   c                 T    fd}fd}fd}| j                  ||||       y )Nc                     g }|    D ]8  \  }}|r|j                  d||fz         |j                  t        |             : |S )Nz%d/%d)appendrE   )r9   r0   rettracktotalr:   s        r   r1   z.EasyMP4Tags.RegisterIntPairKey.<locals>.getter{   sN    C"&v, +JJx5%.89JJs5z*	+
 Jr   c                    	
fd}g }|D ]L  }	 |j                  d      \  }} |t        |            } |t        |            }|j	                  ||f       N || <   y # t        t        f$ r  |t        |            }
}Y ?w xY w)Nc                 B    t        t        t        |                   S r   rH   rL   s    r   r'   z@EasyMP4Tags.RegisterIntPairKey.<locals>.setter.<locals>.<lambda>   rP   r   /)splitrI   
ValueError	TypeErrorrX   )r9   r0   r<   rQ   datarR   tracksr[   r:   rN   rO   s           r   r2   z.EasyMP4Tags.RegisterIntPairKey.<locals>.setter   s    DED -&$%GGCLMFE"3v;/F!#e*-E VUO,-  DL	 #I. &"3q6]F%E&s   6A!!"BBc                     | = y r   r   r8   s     r   r3   z/EasyMP4Tags.RegisterIntPairKey.<locals>.deleter   r>   r   r?   rT   s     ```   r   RegisterIntPairKeyzEasyMP4Tags.RegisterIntPairKeyx   s&    		 	 	VVW5r   c                 b    d|z   dz   |z   fd}fd}fd}| j                  ||||       y)a>  Register a text key.

        If the key you need to register is a simple one-to-one mapping
        of MP4 freeform atom (----) and name to EasyMP4Tags key, then
        you can use this function::

            EasyMP4Tags.RegisterFreeformKey(
                "musicbrainz_artistid", "MusicBrainz Artist Id")
        z----::c                 T    |    D cg c]  }|j                  dd       c}S c c}w )Nutf-8replace)decode)r9   r0   r&   r:   s      r   r1   z/EasyMP4Tags.RegisterFreeformKey.<locals>.getter   s&    :>v,GQAHHWi0GGGs   %c                     g }|D ]@  }t        |t              st        d|z        |j                  |j	                  d             B || <   y )Nz
%r not strri   )
isinstancerE   ra   rX   encode)r9   r0   r<   encodedrR   r:   s        r   r2   z/EasyMP4Tags.RegisterFreeformKey.<locals>.setter   sQ    G 2!!S)#L1$455qxx012 #DLr   c                     | = y r   r   r8   s     r   r3   z0EasyMP4Tags.RegisterFreeformKey.<locals>.deleter   r>   r   Nr?   )r/   r0   namemeanr1   r2   r3   r:   s          @r   RegisterFreeformKeyzEasyMP4Tags.RegisterFreeformKey   s<     4#%,	H	#	 	VVW5r   c                     |j                         }t        | j                  |      }| || j                  |      S t	        d|z        Nz%r is not a valid key)r.   r   r   r   r   r    r0   funcs      r   __getitem__zEasyMP4Tags.__getitem__   sE    iik$((C(

C((!"9C"?@@r   c                     |j                         }t        |t              r|g}t        | j                  |      }| || j
                  ||      S t        d|z        ru   )r.   rm   rE   r   r   r   r   )r    r0   r<   rw   s       r   __setitem__zEasyMP4Tags.__setitem__   sX    iikeS!GE$((C(

C//!"9C"?@@r   c                     |j                         }t        | j                  |      }| || j                  |      S t	        d|z        ru   )r.   r   r   r   r   rv   s      r   __delitem__zEasyMP4Tags.__delitem__   sE    iik$++s+

C((!"9C"?@@r   c                     g }| j                   j                         D ]V  }|| j                  v r0|j                   | j                  |   | j                  |             A|| v sF|j                  |       X |S r   )r   keysr   extendr   rX   )r    r~   r0   s      r   r~   zEasyMP4Tags.keys   sg    88==? 	!CdiiNDIIcN4::s;<C 		!
 r   c                     g }t        | j                               D ]$  }| |   }|D ]  }|j                  |d|        & dj                  |      S )zPrint tag key=value pairs.=
)sortedr~   rX   join)r    stringsr0   valuesr<   s        r   pprintzEasyMP4Tags.pprint   s[    $))+& 	7C#YF 7#u567	7 yy!!r   )NNNN)r   i  )zcom.apple.iTunes)r   r   r   __doc__r   r   rE   r   __annotations__r   r   r   r#   propertyr%   r,   classmethodr5   r@   rU   re   rs   rx   rz   r|   r~   r   r   r   r   r   r      s
   
  "Cc8m	!!Cc8m	!"$FDh$ "D$sH}
"( 2FHH # # CG# #8 6 6( 6 6  78%26 6< 6 68A
AA"r   r   titlealbumartistalbumartistdatecommentdescriptiongroupinggenre	copyright	albumsortalbumartistsort
artistsort	titlesortcomposersort)u   ©namu   ©albu   ©ARTaARTu   ©dayu   ©cmtdescu   ©grpu   ©gencprtsoalsoaasoarsonmsocomusicbrainz_artistidmusicbrainz_trackidmusicbrainz_albumidmusicbrainz_albumartistidmusicip_puidmusicbrainz_albumstatusmusicbrainz_albumtypereleasecountry)zMusicBrainz Artist IdzMusicBrainz Track IdzMusicBrainz Album IdzMusicBrainz Album Artist IdzMusicIP PUIDzMusicBrainz Album StatuszMusicBrainz Album TypezMusicBrainz Release Countrytmpobpmtracknumber
discnumber)trkndiskc                       e Zd ZdZeZej                  Zej                  Zej                  Zej                  Z	ej                  Z
ej                  Zy)r   zEasyMP4(filelike)

    Like :class:`MP4 <mutagen.mp4.MP4>`, but uses :class:`EasyMP4Tags` for
    tags.

    Attributes:
        info (`mutagen.mp4.MP4Info`)
        tags (`EasyMP4Tags`)
    N)r   r   r   r   r   r	   r   r   r   r   r@   r5   r   r   r   r   r     sL     G
//C
//CFD!11O))Kr   r   N)typingr   r   mutagenr   mutagen._utilr   r   mutagen.mp4r   r	   r
   r   __all__KeyErrorr`   r   r   itemsr:   r0   r@   rq   rs   rU   re   r   r   r   r   <module>r      s`   "  / 3 3 8	eXz 	J")T J"Z   %'!-KFC" V,#-( 411#>" 95#3	 %'
/ID# ##C.
/ E%'*ID# sD)*  %'.ID# ""3-	.*c *r   