
    gm                        d dl Z d dlmc mZ d dlZddlmZ d ZdddZ	 ej                  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$d" Z%d# Z&d$ Z'd% Z(d& Z)d' Z*d( Z+d) Z,d* Z-d+ Z.d, Z/d- Z0d. Z1d/ Z2d0 Z3d1 Z4d2 Z5d3 Z6d4 Z7d5 Z8d6 Z9d7 Z:d8 Z;d9 Z<d: Z=d; Z>d< Z?d= Z@d> ZAd? ZBd@ ZCdA ZDdB ZEdC ZFdD ZGdE ZHdF ZIdG ZJdH ZKdI ZLdJ ZMdK ZNdL ZOdM ZPdN ZQdO ZRy)P    N   )utilc                     t        | t        j                        r| j                  } | dd  j	                  dd      \  }} |j                  |      }|#dt        |      z  }|||<   |dk(  rd }n
d|z  |f}nd }|d| |fS )Nr   }zns%dxmlzxmlns:%s:)
isinstanceETQNametextsplitgetlen)tag
namespacesnamespace_uriprefixxmlnss        )/opt/Tautulli/lib/musicbrainzngs/mbxml.pyfixtagr      s     #rxx hhQRsA.M3^^M*F~#j/)$*
=!U?E&(-8Ec"E))    ws2ext)"http://musicbrainz.org/ns/mmd-2.0#z"http://musicbrainz.org/ns/ext#-2.0musicbrainzngsc                 
   	 t        j                  |       }|j                         }g }|j                  dk(  r2|D ]-  }|j                  dk(  s|j	                  |j
                         / |S # t        j                  $ r Y yw xY w)z Given an error XML message from the webservice containing
    <error><text>x</text><text>y</text></error>, return a list
    of [x, y]errorr   N)r   bytes_to_elementtreegetrootr   appendr   r
   
ParseError)r   treerooterrorschs        r   get_error_messager&   $   s{    
((/||~88w +66V#MM"''*+ == s   A
A, A, ,BBc                 (   g }| D ]{  }t        |t              rXd|v r"|j                  |j                  dd             9|j                  |j                  di       j                  dd             k|j                  |       } dj	                  |      S )Nname artist)r	   dictr    r   join)artistsnamesr*   s      r   make_artist_creditr/   4   s    E %fd#VZZ34VZZ"599&"EFV$% 775>r   c                 ^   i }|D ]$  }t        |j                  t              d   }d|v r|j                  d      d   }|| v r|j                  xs d||<   Q||j                         v r ||   |      }t        |t              r|d   r|j                  |d          n|||<   t        j                  d|      }|sd|j                  v st        |j                  d         |d|j                  d      z  <   t        j                  dt        |j                  t              d   |       ' |S )	a   Extract single level subelements from an element.
        For example, given the element:
        <element>
            <subelement>Text</subelement>
        </element>
        and a list valid_els that contains "subelement",
        return a dict {'subelement': 'Text'}

        Delegate the parsing of multi-level subelements to another function.
        For example, given the element:
        <element>
            <subelement>
                <a>Foo</a><b>Bar</b>
            </subelement>
        </element>
        and a dictionary {'subelement': parse_subelement},
        call parse_subelement(<subelement>) and
        return a dict {'subelement': <result>}
        if parse_subelement returns a tuple of the form
        (True, {'subelement-key': <result>})
        then merge the second element of the tuple into the
        result (which may have a key other than 'subelement' or
        more than 1 key)
    r   r   r   r)   z([a-z0-9-]+)-listcountz%s-countzin <%s>, uncaught <%s>)r   r   NS_MAPr   r   keysr	   tupleupdaterematchattribintgroup_loginfo)	valid_els	inner_elselementresultsubtinner_resultms           r   parse_elementsrE   @   s   2 F 9377F#A&!8QA	>BF1I)..""'9Q<,L,.<?l1o.(q	-q1AW

*25cjj6I2JzAGGAJ./II.W[[&1!4a9#9& Mr   c                     i }|j                   D ]e  }d|v rt        |t              d   }n|}|| v r|j                   |   ||<   4t        j	                  dt        |j
                  t              d   |       g |S )z Extract attributes from an element.
        For example, given the element:
        <element type="Group" />
        and a list attributes that contains "type",
        return a dict {'type': 'Group'}
    {r   zin <%s>, uncaught attribute %s)r8   r   r2   r;   r<   r   )
attributesr?   r@   attras        r   parse_attributesrK   o   s~     F ^$;tV$Q'AA
?t,F1III6w{{F8STU8VX\]^ Mr   c                    t        j                  |       }|j                         }i }i dt        dt        dt
        dt        dt        dt        dt        dt        d	t        d
t        dt        dt        dt        dt         dt"        dt$        dt&        t(        t*        t,        t.        t0        t2        t4        t6        t8        t:        t<        t>        t@        tB        d}|jE                  tG        g ||             |S )Narear*   
instrumentlabelplaceeventreleaserelease-groupseries	recordingworkurldisccdstubisrczannotation-listz	area-list)artist-listz
label-list
place-list
event-listzinstrument-listrelease-listrelease-group-listzseries-listrecording-list	work-listzurl-listzcollection-list
collectionmessage)$r   r   r   
parse_areaparse_artistparse_instrumentparse_labelparse_placeparse_eventparse_releaseparse_release_groupparse_seriesparse_recording
parse_work	parse_url
parse_discparse_cdstub
parse_isrcparse_annotation_listparse_area_listparse_artist_listparse_label_listparse_place_listparse_event_listparse_instrument_listparse_release_listparse_release_group_listparse_series_listparse_recording_listparse_work_listparse_url_listparse_collection_listparse_collectionparse_response_messager5   rE   )rc   r"   r#   r@   valid_elementss        r   parse_messager      s@   $$W-D<<>DF#fj ##"$4# {# {	#
 {#  # &':# # "?# j# Y# j# # j#" ()>##$ "?%#& &7$4$4$4)>&8,D%6(<#2"0)>$4!7E#NH MM.^T:;Mr   c                     t        dgi |       S )Nr   rE   )rc   s    r   r   r      s    6(B00r   c                 >    | D cg c]  }t        |       c}S c c}w N)r   )clcs     r   r   r          )+,AQ,,,   c                     i }g d}ddg}t         t        t        t        t        t
        d}|j                  t        ||              |j                  t        |||              |S )N)idtypezentity-typer(   editor)r^   r[   r]   r\   r`   ra   )	rz   ru   rx   rw   r}   r~   r5   rK   rE   )rb   r@   attribselementsr>   s        r   r   r      s_    F+G!H!3 1//#7-/I MM"7J78
MM.9jABMr   c                 >    | D cg c]  }t        |       c}S c c}w r   )parse_annotationalrJ   s     r   rs   rs      r   r   c                     i }ddg}g d}|j                  t        ||              |j                  t        |i |              |S )Nr   	ext:score)entityr(   r   r5   rK   rE   )
annotationr@   r   r   s       r   r   r      sD    F{#G)H
MM"7J78
MM.2z:;Mr   c                 $    t        g di |       }|S )N)beginendendedr   )lifespanpartss     r   parse_lifespanr      s    4b(CELr   c                 >    | D cg c]  }t        |       c}S c c}w r   )rd   r   s     r   rt   rt          #%&aJqM&&&r   c                     i }g d}g d}t         t        t        t        t        t        t        d}|j                  t        ||              |j                  t        |||              |S )Nr   r   r   )r(   	sort-namedisambiguation)	life-span
alias-listrelation-listr   ziso-3166-1-code-listziso-3166-2-code-listziso-3166-3-code-list)r   parse_alias_listparse_relation_listr   parse_element_listr5   rK   rE   )rM   r@   r   r   r>   s        r   rd   rd      s]    F)G6H,/"5/);););=I MM"7D12
MM.9d;<Mr   c                 >    | D cg c]  }t        |       c}S c c}w r   )re   r   s     r   ru   ru          %'(LO(((r   c                 l   i }g d}g d}i dt         dt         dt         dt        dt        dt        d	t        d
t
        dt        dt        dt        dt        dt        dt        dt        dt        }|j                  t        ||              |j                  t        |||              |S )Nr   )r(   r   countryuser-ratingr   genderipirM   z
begin-areazend-arear   r`   r   r^   r_   ra   tag-listuser-tag-listratingipi-listz	isni-listr   r   )rd   r   r}   r   rz   r{   r~   parse_tag_listparse_ratingr   r   r   r5   rK   rE   )r*   r@   r   r   r>   s        r   re   re      s   F)G3H1 1z1Z1 n1 "#7	1
 !"51  !31 &'?1 o1 ^1 !.1 <1 /1 01 /1 /1I" MM"7F34
MM.9f=>Mr   c                      t        ddgi |       S )Nlatitude	longituder   )r   s    r   parse_coordinatesr     s    :{3R;;r   c                 >    | D cg c]  }t        |       c}S c c}w r   )rh   plps     r   rw   rw         $&'qKN'''r   c           	          i }g d}g d}t         t        t        t        t        t        t
        t        d}|j                  t        ||              |j                  t        |||              |S )Nr   )r(   addressr   r   )rM   coordinatesr   r   r   r   r   r   )
rd   r   r   r   r   r   r   r5   rK   rE   )rP   r@   r   r   r>   s        r   rh   rh     sb    F)G)H# 1,+"0/"5/1I MM"7E23
MM.9e<=Mr   c                 >    | D cg c]  }t        |       c}S c c}w r   )ri   eles     r   rx   rx     r   r   c                     i }g d}g d}t         t        t        t        t        t        d}|j                  t        ||              |j                  t        |||              |S )Nr   )r(   timesetlist	cancelledr   r   )r   r   r   r   r   r   )r   r   r   r   r   r5   rK   rE   )rQ   r@   r   r   r>   s        r   ri   ri   !  sZ    F)GXH,"5/+"0')I MM"7E23
MM.9e<=Mr   c                     i }g d}g d}t         t        t        t        d}|j	                  t        ||              |j	                  t        |||              |S )Nr   )r(   descriptionr   )r   r   r   r   )r   r   r   r   r5   rK   rE   )rN   r@   r   r   r>   s        r   rf   rf   1  sT    F)G8H"5+//1I MM"7J78
MM.9jABMr   c                 >    | D cg c]  }t        |       c}S c c}w r   )rg   )llls     r   rv   rv   >  r   r   c                     i }g d}g d}t         t        t        t        t        t        t
        t        t        t        d
}|j                  t        ||              |j                  t        |||              |S )Nr   )r(   r   r   z
label-coder   r   r   )
rM   r   r^   r   r   r   r   r   r   r   )rd   r   rz   r   r   r   r   r   r   r5   rK   rE   )rO   r@   r   r   r>   s        r   rg   rg   A  sh    F)G)H#,!3+"0'//"5/	1I MM"7E23
MM.9e<=Mr   c                 V    t        dg|       }d|v r	dd|d   ifS dd| j                  ifS )Nr   Tz	target-idrK   r   )tgtrH   s     r   parse_relation_targetr   V  sA    !4&#.Jz{Jt$4566{CHH-..r   c                 t    dg}t        ||       }d|d   z  }d|| D cg c]  }t        |       c}ifS c c}w )Nztarget-typez%s-relation-listT)rK   parse_relation)rlr   ttypekeyrs        r   r   r   ]  sG    oGWb)E
u]3
3C3B7q*78997s   5c                 V   i }ddg}g d}t         t        t        t        t        t
        t        t        t        t        t        t        t        d}|j                  t        ||              |j                  t        |||              |j                  t        dgdt         i|              |S )Nr   ztype-id)target	directionr   r   r   zordering-key)rM   r*   rN   rO   rP   rQ   rU   rR   rS   rT   attribute-listrV   r   ztarget-creditr   )rd   re   rf   rg   rh   ri   rm   rj   rk   rl   r   rn   r   r5   rK   rE   parse_relation_attribute_list)relationr@   r   r   r>   s        r   r   r   c  s    Fy!GOH#'/%%%-)"5'#5#0I MM"7H56
MM.9h?@ MM./!25EGd4egopqMr   c                 T    g }| D ]  }|j                  t        |              dd|ifS )NTrH   )r     parse_relation_attribute_element)attributelistret	attributes      r   r   r   }  s:    
C" @	

3I>?@<%&&r   c                     i }| j                   D ].  }d|v rt        |t              d   }n|}| j                   |   ||<   0 | j                  |d<   |S )NrG   r   r   )r8   r   r2   r   )r?   r@   rI   rJ   s       r   r   r     s`     F )$;tV$Q'AANN4(q	) ",,F;Mr   c                 &   i }ddg}g d}t         t        t        t        t        t
        t
        t        t        t        t        d}|j                  t        ||              |j                  t        |||              d|v rt        |d         |d<   |S )Nr   r   )	titlestatusr   qualityr   barcodedate	packagingasin)ztext-representationartist-creditzlabel-info-listmedium-listrS   r   r   r   r   zcover-art-archivezrelease-event-listr   artist-credit-phrase)parse_text_representationparse_artist_creditparse_label_info_listparse_medium_listrk   r   r   r   	parse_caaparse_release_event_listr5   rK   rE   r/   )rR   r@   r   r   r>   s        r   rj   rj     s    F[!G8H(A"5$9 1"5+"0"5/&/'?
AI MM"7G45
MM.9g>?& );8>8O*Q%& Mr   c                     g }d}| D ]Z  }t        |j                  t              d   }|dk(  r|j                  t	        |             @|dk(  sFt        |j                        }\ d|i}|||d<   d|fS )zmedium-list results from search have an additional
    <track-count> element containing the number of tracks
    over all mediums. Optionally add thisNr   z
ws2:mediumzws2:track-countr   zmedium-track-countT)r   r   r2   r    parse_mediumr9   r   )mlmedium_listtrack_countrD   r   r   s         r   r   r     s     KK &QUUF#A&,|A/%%aff+K& +
&C$/ !#;r   c                 >    | D cg c]  }t        |       c}S c c}w r   )parse_release_event)relr6   s     r   r   r     s    .12#222r   c                 X    i }dg}dt         i}|j                  t        |||              |S )Nr   rM   )rd   r5   rE   )rQ   r@   r   r>   s       r   r  r    s2    FxH$I
MM.9e<=Mr   c                 x    i }g d}t         t        t        t        d}|j                  t	        |||              |S )N)positionformatr   )z	disc-listpregap
track-listzdata-track-list)parse_disc_listparse_trackparse_track_listr5   rE   )mediumr@   r   r>   s       r   r   r     s;    F.H-&/$46I
 MM.9f=>Mr   c                 >    | D cg c]  }t        |       c}S c c}w r   )rp   )dlds     r   r  r    r   r   c                      t        ddgi |       S )Nlanguagescriptr   )textrs    r   r   r     s    :x0"e<<r   c           	         i }g d}g d}t         t        t        t        t        t        t
        t        d}|j                  t        ||              |j                  t        |||              d|v rt        |d         |d<   |S )Nr   )r   r   zfirst-release-datezprimary-typer   )r   r^   r   r   zsecondary-type-listr   r   r   r   r   )r   rz   r   r   r   r   r   r5   rK   rE   r/   )rgr@   r   r   r>   s        r   rk   rk     s    F)G"H"5!3+"0(:"5'/1I MM"7B/0
MM.9b9:& );F?<S)T%&Mr   c           	         i }ddg}g d}t         t        t        t        t        t        t
        t        d}|j                  t        ||              |j                  t        |||              d|v rt        |d         |d<   |S )Nr   r   )r   lengthr   r   video)r   r^   r   r   r   z	isrc-listr   r   r   r   )r   rz   r   r   parse_external_id_listr   r   r5   rK   rE   r/   )rU   r@   r   r   r>   s        r   rm   rm     s    F[!GLH"5!3+"0'4"5/1I MM"7I67
MM.9i@A& );F?<S)T%&Mr   c                 >    | D cg c]  }t        |       c}S c c}w r   )rl   )slss     r   r|   r|     r   r   c                     i }g d}ddg}t         t        t        d}|j                  t	        ||              |j                  t        |||              |S )Nr   r(   r   )r   r   r   )r   r   r   r5   rK   rE   )rT   r@   r   r   r>   s        r   rl   rl     sW    F)G()H/"5/1I MM"7F34
MM.9f=>Mr   c                 H    | D cg c]  }t        dg|      d    c}S c c}w )Nr   )rK   r   s     r   r  r    s%    79:!dVQ'-:::s   c                 @    | D cg c]  }|j                    c}S c c}w r   )r   r   s     r   r   r     s    qAFFs   c                 >    | D cg c]  }t        |       c}S c c}w r   )rn   )wlws     r   r~   r~     r   r   c           	          i }g d}g d}t         t         t        t        t        t        t
        t        d}|j                  t        ||              |j                  t        |||              |S )N)r   r   r   )r   r   r  iswcr   )r   r   r   r   z	iswc-listr   r   r   )
r   r   r   r   r   r   parse_work_attribute_listr5   rK   rE   )rV   r@   r   r   r>   s        r   rn   rn     s`    F)GMH+"0'/0"55#<I MM"7D12
MM.9d;<Mr   c                 >    | D cg c]  }t        |       c}S c c}w r   )parse_work_attribute)walwas     r   r'  r'  /  s    /23 $333r   c                 P    dg}t        ||       }i }|r|d   | j                  d}|S )Nr   )r   valuer   )r+  r   typeinfor@   s       r   r)  r)  2  s:    hG,HF'/77$ Mr   c                 >    | D cg c]  }t        |       c}S c c}w r   )ro   )ulus     r   r   r   =      "$%QIaL%%%r   c                     i }dg}dg}dt         i}|j                  t        ||              |j                  t        |||              |S )Nr   resourcer   )r   r5   rK   rE   )rW   r@   r   r   r>   s        r   ro   ro   @  sN    FfG|H "56I
MM"7C01
MM.9c:;Mr   c                     i }dg}dg}t         t        d}|j                  t        ||              |j                  t	        |||              |S )Nr   sectors)r^   zoffset-list)rz   parse_offset_listr5   rK   rE   )rX   r@   r   r   r>   s        r   rp   rp   K  sR    FfG{H!3 1I MM"7D12
MM.9d;<Mr   c                     i }dg}g d}dt         i}|j                  t        ||              |j                  t        |||              |S )Nr   )r   r*   r   r
  )r  r5   rK   rE   )rY   r@   r   r   r>   s        r   rq   rq   X  sL    FfG-H/0I
MM"7F34
MM.9f=>Mr   c                 R    | D cg c]  }t        |j                         c}S c c}w r   )r9   r   )olos     r   r7  r7  c  s    !#$ACK$$$s   $c                 L    g }| D ]  }|j                  t        |              |S r   )r    rf   r   r@   r   s      r   ry   ry   f  s-    F +&q)*+Mr   c                 L    g }| D ]  }|j                  t        |              |S r   )r    rj   r=  s      r   rz   rz   l  s,    F (mA&'(Mr   c                 L    g }| D ]  }|j                  t        |              |S r   )r    rk   )rglr@   r  s      r   r{   r{   r  s-    F /)"-./Mr   c                     i }dg}dt         i}|j                  t        ||              |j                  t        g ||              |S )Nr   r`   )r}   r5   rK   rE   )rZ   r@   r   r>   s       r   rr   rr   x  sG    FfG!#78I
MM"7D12
MM.Y56Mr   c                 L    g }| D ]  }|j                  t        |              |S r   )r    rm   )recsr@   r   s      r   r}   r}     s,    F *oa()*Mr   c                     g }| D ]B  }|j                  t        |             t        dg|      }d|v s/|j                  |d          D |S )N
joinphrase)r    parse_name_creditrK   )acr@   
namecreditr,   s       r   r   r     sV    F .
'
34
;4MM$|,-	.
 Mr   c                 X    i }dg}dt         i}|j                  t        |||              |S )Nr(   r*   )re   r5   rE   )ncr@   r   r>   s       r   rF  rF    s2    FxH<(I
MM.9b9:Mr   c                 L    g }| D ]  }|j                  t        |              |S r   )r    parse_label_info)lilr@   lis      r   r   r     s-    F ,&r*+,Mr   c                 X    i }dg}dt         i}|j                  t        |||              |S )Nzcatalog-numberrO   )rg   r5   rE   )rN  r@   r   r>   s       r   rL  rL    s3    F !H+&I
MM.9b9:Mr   c                 L    g }| D ]  }|j                  t        |              |S r   )r    r  )tlr@   rB   s      r   r  r    s+    F &k!n%&Mr   c                    i }dg}g d}t         t        d}|j                  t        ||              |j                  t	        |||              d|j                  di       v rd|vr|d   d   |d<   d|v rt        |d         |d<   d }d|v r|d   }nB|j                  di       j                  d      r!|j                  di       j                  d      }|r||d<   |S )	Nr   )numberr  r   r  )rU   r   r   rU   r   r  track_or_recording_length)rm   r   r5   rK   rE   r   r/   )trackr@   r   r   r>   track_or_recordings         r   r  r    s    FfG8H-"57I MM"7E23
MM.9e<=&**["55/QW:W"("5o"F& );F?<S)T%&6#H-	K	$	(	(	2#ZZR8<<XF.@*+Mr   c                 >    | D cg c]  }t        |       c}S c c}w r   )	parse_tag)rQ  rB   s     r   r   r     r2  r   c                     i }dg}dg}|j                  t        ||              |j                  t        |i |              |S )Nr1   r(   r   )r   r@   r   r   s       r   rX  rX    sC    FiGxH
MM"7C01
MM.2s34Mr   c                 d    i }dg}|j                  t        ||              | j                  |d<   |S )Nzvotes-countr   r5   rK   r   )r   r@   r   s      r   r   r     s5    FoG
MM"7F34{{F8Mr   c                 >    | D cg c]  }t        |       c}S c c}w r   )parse_aliasr   s     r   r   r     r   r   c                 f    i }g d}|j                  t        ||              | j                  |d<   |S )N)localer   r   primaryz
begin-datezend-datealiasr[  )ra  r@   r   s      r   r]  r]    s6    F)G MM"7E23jjF7OMr   c                 J    i }g d}|j                  t        |i |              |S )N)artworkr1   frontbackdarkened)r5   rE   )caa_elementr@   r   s      r   r   r     s&    F@H
MM.2{;<Mr   c                 `   d}t        j                  d|z        }t        j                  |d|z        }| j                         D ]S  \  }}t        j                  |d|z        }t        j                  |d|z        }|j	                  d|z  |       ||_        U t        j                  |d      S )Nr   {%s}metadataz{%s}release-listz{%s}releasez{%s}barcode{%s}idutf-8)r
   Element
SubElementitemssetr   tostring)release2barcodeNSr#   rel_listrR   r   rel_xmlbar_xmls           r   make_barcode_requestrv    s    	-B::nr)*D}}T#5#:;H+113 ---"*<=--);<HrM7+	 ;;tW%%r   c                     d}t        j                  d|z        }dD ]  }| j                  |dz   d       }|t        j                  |d|d|j	                  dd      d	      }|j                         D ]  \  }}t        j                  |d|d|j	                  dd            }|j                  d
|z  |       t        j                  |d|z        }	|D ];  }
t        j                  |	d|z        }t        j                  |d|z        }|
|_        =   | j                         rt        d| j                         d   z        t        j                  |d      S )Nr   ri  )r*   rO   rP   rU   rR   release_grouprV   _tagsrG   r   _--listrj  z{%s}user-tag-listz{%s}user-tagz{%s}namez:make_tag_request() got an unexpected keyword argument '%s'r   rk  )r
   rl  poprm  replacern  ro  r   r3   	TypeErrorpopitemrp  )kwargsrr  r#   entity_typeentity_tagse_listr   tagse_xmltaglistr   usertag_xmlname_xmls                r   make_tag_requestr    sL   	-B::nr)*Dd (jjw!6="]]4"k>Q>QRUWZ>[)\]F&,,. (4f"k>Q>QRUWZ>[.\]		(R-+--/BR/GH (C"$--"9L"MK!}}[*r/JH$'HM(	(	( {{}TW]WeWeWghiWjjkk;;tW%%r   c                  \   d}t        j                  d|z        }dD ]  }| j                  |dz   d       }|t        j                  |d|d|j	                  dd      d	      }|j                         D ]o  \  }}t        j                  |d|d|j	                  dd            }|j                  d
|z  |       t        j                  |d|z        }	t        |      |	_        q  | j                         rt        d| j                         d   z        t        j                  |d      S )Nr   ri  )r*   rO   rU   rx  rV   _ratingsrG   r   rz  r{  r|  rj  z{%s}user-ratingz=make_rating_request() got an unexpected keyword argument '%s'r   rk  )r
   rl  r}  rm  r~  rn  ro  strr   r3   r  r  rp  )
r  rr  r#   r  entity_ratingsr  r   r   r  
rating_xmls
             r   make_rating_requestr    s   	-B::nr)*DP .K*$<dC%]]4"k>Q>QRUWZ>[)\]F+113 .	6f"k>Q>QRUWZ>[.\]		(R-+]]52Cb2HI
"%f+
	.	. {{}WZ`ZhZhZjklZmmnn;;tW%%r   c           	      (   d}t        j                  d|z        }t        j                  |d|z        }| j                         D ]  \  }}t	        |      dkD  st        j                  |d|z        }|j                  d|z  |       t        j                  |d|z        }|j                  d|z  t        t	        |                   |D ]0  }t        j                  |d	|z        }	|	j                  d|z  |       2  t        j                  |d
      S )Nr   ri  z{%s}recording-listr   z{%s}recordingrj  z{%s}isrc-listz	{%s}countz{%s}isrcrk  )r
   rl  rm  rn  r   ro  r  rp  )
recording2isrcsrr  r#   rec_listrecisrcsrec_xmlisrc_list_xmlrZ   isrc_xmls
             r   make_isrc_requestr  $  s    	-B::nr)*D}}T#7"#<=H%++- 2
Uu:>mmHo.BCGKK2s+MM'?R3GHMkB.CJ@ 2==
RHX]D122 ;;tW%%r   )Sr6   xml.etree.ElementTreeetreeElementTreer
   loggingr)   r   r   r2   	getLoggerr;   r&   r/   rE   rK   r   r   r   r   rs   r   r   rt   rd   ru   re   r   rw   rh   rx   ri   rf   rv   rg   r   r   r   r   r   rj   r   r   r  r   r  r   rk   rm   r|   rl   r  r   r~   rn   r'  r)  r   ro   rp   rq   r7  ry   rz   r{   rr   r}   r   rF  r   rL  r  r  r   rX  r   r   r]  r   rv  r  r  r   r   r   <module>r     s   
 " "  *& 1605
7w)* 
-^()V1--
'")6<(&( (*/:4' 2$3	'=*(); '&4&		%.&(
&&(&"&r   