§
   (µ‚}ê‰ã                   ó^  — d Z ddlZddlZddlZddlmZmZmZ ddlZddl	Z	dZ
dZ e	j        d                     e
¦  «        ¦  «        ZdZedz   Zd	Zd,d
„Zd-d„Z G d„ de¦  «        Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd.d„Zd/d„Zd„ Zd„ Zd„ Z d„ Z!d0d „Z"d1d"„Z#d2d#„Z$d2d$„Z%d3d&„Z&d4d(„Z'd5d*„Z(d-d+„Z)dS )6zDVinyl REST client. Account credentials stay in Kodi's addon profile.é    N)ÚquoteÚ	urlencodeÚurlsplitzplugin.video.milionarz8https://hosting.pilsfree.net/chudy/proxy/4017/api/vinyl/z special://profile/addon_data/{}/)ÚcuratorÚdiscoverÚradiosÚ
top_tracks)	ÚsongsÚfavorite_songsÚ	playlistsÚfavorite_playlistsÚalbumsÚartistsÚgenresÚfavorite_albumsÚfavorite_artistsé   c                 ó\  — d| v rdnd}t          d                     | |t          |¦  «        ¦  «        }|d         }t          |t          ¦  «        r1t          |¦  «        t          k    st          d„ |D ¦   «         ¦  «        st          d¦  «        ‚||t          |¦  «        z   |d         k     fS )zFRead exactly one server page; never prefetch the rest of a collection.ú?ú&ú{}{}limit={}&offset={}r
   c              3   ó@   K  — | ]}t          |t          ¦  «        V — Œd S ©N©Ú
isinstanceÚdict)Ú.0Úss     ú^/Users/chudy/Library/Application Support/Kodi/addons/plugin.video.milionar/wcs/vinyl/client.pyú	<genexpr>zsong_page.<locals>.<genexpr>   s/   è è € ÐGkÐGkÐ`aÍ
ÐSTÕVZÑH[ÔH[ÐGkÐGkÐGkÐGkÐGkÐGkó    zInvalid Vinyl pageÚtotal)ÚrequestÚformatÚ	PAGE_SIZEr   ÚlistÚlenÚallÚ
ValueError)ÚpathÚoffsetÚ	separatorÚresultr
   s        r   Ú	song_pager.      s¬   € à˜d�{�{��¨€IÝÐ-×4Ò4°T¸9ÅiÐQWÑXÔXÑYÔY€FØ�7ŒO€EÝ�e�TÑ"Ô"ð /¥c¨%¡j¤jµ9Ò&<Ð&<ÅCÐGkÐGkÐejÐGkÑGkÔGkÑDkÔDkÐ&<ÝÐ-Ñ.Ô.Ð.Ø�&�3˜u™:œ:Ñ%¨¨w¬Ò7Ð7Ð7r!   Ú c                 óŒ   — d                      | t          |d¬¦  «        ¦  «        }| dk    r|dt          ||dœ¦  «        z   z  }|S )Nzbrowse/{}/{}/songsr/   ©ÚsafeÚalbumr   )ÚalbumIdÚartist)r$   r   r   )ÚkindÚidentityÚnamer5   r*   s        r   Úcollection_pathr9      sQ   € Ø×&Ò& t­U°4¸bÐ-AÑ-AÔ-AÑBÔB€DØˆw‚€Ø�•i¨HÀÐ GÐ GÑHÔHÑHÑHˆØ€Kr!   c                   ó   — e Zd ZdS )ÚLoginRequiredN)Ú__name__Ú
__module__Ú__qualname__© r!   r   r;   r;   %   s   € € € € € Ø€Dr!   r;   c                  ó4   — t          j        t          ¦  «        S r   )Ú	xbmcaddonÚAddonÚADDON_IDr?   r!   r   ÚaddonrD   )   s   € ÝŒ?�8Ñ$Ô$Ð$r!   c                  óv   — t          ¦   «         } |                      d¦  «        r|                      d¦  «        ndS )NÚvinyl_tokenÚvinyl_user_idr/   )rD   Ú
getSetting)Úsettingss    r   ÚaccountrJ   -   s8   € Ý‰wŒw€HØ3;×3FÒ3FÀ}Ñ3UÔ3UÐ]ˆ8×Ò˜Ñ/Ô/Ð/Ð[]Ð]r!   c                  ó`   — t          ¦   «         t          ¦   «                              d¦  «        fS )zJIn-memory session identity; never serialize the token into a cache or URL.rF   )rJ   rD   rH   r?   r!   r   ÚscoperL   2   s#   € å‰9Œ9•e‘g”g×(Ò(¨Ñ7Ô7Ð7Ð7r!   c                 ó   — | dv rdS | dv rdS d S )N)Té   Ú1ÚtrueT)Fr   Ú0ÚfalseFr?   )Úvalues    r   Úfavorite_valuerT   7   s)   € ØÐ&Ð&Ð&ØˆtØÐ(Ð(Ð(ØˆuØˆ4r!   c                 ó®   — |d         t          | ¦  «        t          j        |d                              d¦  «        ¦  «                             ¦   «         dœS )Nr   rN   úutf-8)ÚuserÚsongÚsession)ÚstrÚhashlibÚsha256ÚencodeÚ	hexdigest)r7   rY   s     r   Ú_favorite_keyr_   ?   sN   € Ø˜A”J­¨H©¬Ý”~ g¨a¤j×&7Ò&7¸Ñ&@Ô&@ÑAÔA×KÒKÑMÔMðOð Oð Or!   c                 ór   — ddl m} |                     dt          | t	          ¦   «         ¦  «        d¬¦  «        S )zMShort-lived per-session delta/detail cache; None means no recent observation.r   ©Ú	TMDbCacheúvinyl:song-favoriteé   )Úexpire_seconds)Úwcs.metadatarb   Úget_from_cacher_   rL   )r7   rb   s     r   Úfavorite_staterh   D   sB   € à&Ð&Ð&Ð&Ð&Ð&Ø×#Ò#Ð$9½=ÈÕSXÑSZÔSZÑ;[Ô;[ÐlnÐ#ÑoÔoÐor!   Fc                 óž   — ddl m} |d         r<t          ¦   «         |k    r,|                     dt	          | |¦  «        ||dœ¦  «         d S d S d S )Nr   ra   rc   )ÚstateÚfailed)rf   rb   rL   Úset_to_cacher_   )r7   rS   rY   rk   rb   s        r   Úremember_favoriterm   J   st   € Ø&Ð&Ð&Ð&Ð&Ð&Øˆq„zð |•e‘g”g Ò(Ð(à×ÒÐ4µmÀHÈgÑ6VÔ6VÐbgÐsyÐXzÐXzÑ{Ô{Ð{Ð{Ð{ð|ð |Ð(Ð(r!   ÚGETT©é   é   c                 óØ  — dd l }t          ¦   «         }|r!t          ¦   «                              d¦  «        nd}|                     |t
          |                      d¦  «        z   |dd|pdz   i|¬¦  «        }|j        d	k    r.t          t          ¦   «          	                    d
¦  «        ¦  «        ‚|j
        s't          d                     |j        ¦  «        ¦  «        ‚|j        dk    rd n|                     ¦   «         }	|dk    rèt          | |¦  «        }
|
rÖt          | ¦  «        j                             d¦  «                             d¦  «        }|dk    ryt'          |¦  «        dk    rf|d         dk    rZ|d         dk    rNt)          |d         t+          |	t,          ¦  «        r"t/          |	                     d¦  «        ¦  «        nd |¦  «         ddlm}  |d„ |
D ¦   «         d¬¦  «         |	S )Nr   rF   r/   ú/ÚAuthorizationzBearer Ú	anonymous)ÚjsonÚheadersÚtimeouti‘  i  zVinyl HTTP {}éÌ   rn   ÚPATCHé   r
   é   ÚfavoriterN   Úis_favorite©r#   c                 ó   — g | ]}d |z   ‘ŒS )Úvinyl_r?   )r   Úsources     r   ú
<listcomp>zrequest.<locals>.<listcomp>d   s   € ÐFÐFÐF°6˜X¨Ñ.ÐFÐFÐFr!   T)Úforce)ÚrequestsrL   rD   rH   r#   ÚBASEÚlstripÚstatus_coder;   ÚgetLocalizedStringÚokÚRuntimeErrorr$   rv   Úmutation_sourcesr   r*   ÚstripÚsplitr'   rm   r   r   rT   ÚgetÚwcs.skin.refresh)r*   ÚmethodÚdataÚauthenticatedrx   r…   rY   ÚtokenÚresponser-   ÚaffectedÚrouteÚrequest_refreshs                r   r#   r#   Q   s  € Ø€O€O€OÝ‰gŒg€GØ1>ÐF�E‰GŒG×Ò˜}Ñ-Ô-Ð-ÀB€EØ×Ò ­¨t¯{ª{¸3Ñ/?Ô/?Ñ(?ÀdØ)8¸)ÀuÐG[ÐP[Ñ:\Ð(]Ðgnð  ñ pô p€HàÔ˜sÒ"Ð"Ý�E™GœG×6Ò6°uÑ=Ô=Ñ>Ô>Ð>ØŒ;ð Iå˜?×1Ò1°(Ô2FÑGÔGÑHÔHÐHØÔ)¨SÒ0Ð0ˆTˆT°h·m²m±o´o€FØ�‚€Ý# D¨&Ñ1Ô1ˆØð 	TÝ˜T‘N”NÔ'×-Ò-¨cÑ2Ô2×8Ò8¸Ñ=Ô=ˆEØ˜Ò Ð ¥S¨¡Z¤Z°1¢_ _¸¸q¼ÀWÒ9LÐ9LÐQVÐWXÔQYÐ]gÒQgÐQgÝ! %¨¤(ÕYcÐdjÕlpÑYqÔYqÐ,{­N¸6¿:º:ÀmÑ;TÔ;TÑ,UÔ,UÐ,UÐw{ð  ~Eñ  Fô  Fð  FØCÐCÐCÐCÐCÐCØˆOÐFÐF¸XÐFÑFÔFÈdÐSÑSÔSÐSØ€Mr!   c                 óv  — t          | ¦  «        j                             d¦  «        } |dk    rb|                      d¦  «        rM|                      d¦  «        rdS |                      d¦  «        rdS |                      d¦  «        rd	S | d
k    rdS | dk    r|dk    rdS |                      d¦  «        r|dv rdS dS )zRDependencies of successful favorite/playlist writes, including context.py callers.rs   rz   z	/favoritezsongs/)r   r
   z
playlists/)r   r   zbrowse/albums/)r   r   zbrowse/artists/favorite)r   r   r   ÚPOST)r   )rš   rz   ÚDELETE)r   r   r   r   r   r	   r?   )r   r*   r�   ÚendswithÚ
startswith)r*   r‘   s     r   rŒ   rŒ   h   sà   € å�D‰>Œ>Ô×$Ò$ SÑ)Ô)€DØ�ÒÐ˜TŸ]š]¨;Ñ7Ô7ÐØ�?Š?˜8Ñ$Ô$ð 	/Ø.Ð.Ø�?Š?˜<Ñ(Ô(ð 	7Ø6Ð6Ø�?Š?Ð+Ñ,Ô,ð 	1Ø0Ð0ØÐ,Ò,Ð,Ø2Ð2Øˆ{ÒÐ˜v¨Ò/Ð/Øˆ~Ø‡‚�|Ñ$Ô$ð b¨Ð3NÐ)NÐ)NàaÐaØˆ2r!   c                 ód  — t          dd|                      ¦   «         |dœd¬¦  «        }t          ¦   «         }|                     d|d         ¦  «         |                     dt	          |d	         d
         ¦  «        ¦  «         |                     d|d	         d         ¦  «         |d	         d         S )Nz
auth/loginrš   )r8   ÚpinF)r“   rF   r”   rG   rW   ÚidÚvinyl_statusr8   )r#   r�   rD   Ú
setSettingrZ   )r8   rŸ   r-   rI   s       r   Úloginr£   |   s¡   € Ý�\ 6°D·J²J±L´LÈÐ+MÐ+MÐ]bÐcÑcÔc€FÝ‰wŒw€HØ×Ò˜ v¨g¤Ñ7Ô7Ð7Ø×Ò˜­¨V°F¬^¸DÔ-AÑ)BÔ)BÑCÔCÐCØ×Ò˜¨¨v¬°vÔ(>Ñ?Ô?Ð?Ø�&Œ>˜&Ô!Ð!r!   c            	      ó  — t          ¦   «         } 	 t          ¦   «         rt          dd¦  «         dD ]$}t          ¦   «                              |d¦  «         Œ%| r=t          D ]7}	 t          j        t          || ¦  «        ¦  «         Œ&# t          $ r Y Œ2w xY wd S d S # dD ]$}t          ¦   «                              |d¦  «         Œ%| r=t          D ]6}	 t          j        t          || ¦  «        ¦  «         Œ&# t          $ r Y Œ2w xY ww w xY w)Nzauth/logoutrš   )rF   rG   r¡   r/   )	rJ   r#   rD   r¢   ÚSOURCESÚosÚremoveÚ
cache_pathÚFileNotFoundError)rW   Úkeyr‚   s      r   Úlogoutr«   …   s[  € Ý‰9Œ9€DðÝ‰9Œ9ð 	+Ý�M 6Ñ*Ô*Ð*àCð 	(ð 	(ˆCÝ‰GŒG×Ò˜s BÑ'Ô'Ð'Ð'Øð 	Ý!ð ð �ðÝ”I�j¨°Ñ6Ô6Ñ7Ô7Ð7Ð7øÝ(ð ð ð Ø�Dðøøøð		ð 	ðð øð Dð 	(ð 	(ˆCÝ‰GŒG×Ò˜s BÑ'Ô'Ð'Ð'Øð 	Ý!ð ð �ðÝ”I�j¨°Ñ6Ô6Ñ7Ô7Ð7Ð7øÝ(ð ð ð Ø�Dðøøøð		ðøøøsA   �B Á!"BÂ
BÂBÂ3DÃ"C/Ã.DÃ/
C<	Ã9DÃ;C<	Ã<Dc                 óB   — t           |                      d¦  «        z   dz   S )Nrs   z!|Authorization=Bearer%20anonymous)r†   r‡   )r*   s    r   Úmediar­   •   s   € å�$—+’+˜cÑ"Ô"Ñ"Ð%HÑHÐHr!   éX  c                 óÌ  — |                       d¦  «        pd}d|i}|r||d<   |dv �rœ|dk    rwt          | | d         |                       d¦  «        ¬	¦  «        } |                       d
¦  «        pg }t          |t          ¦  «        rd„ |                     d¦  «        D ¦   «         }n|                       d¦  «        pg }|                       d¦  «        dk    r6t          d                     | d         t          |¦  «        ¦  «        ¦  «        S |                       d¦  «        pg }|rft          d                     |d         d         t          t          ||d                               d¦  «        pd¬¦  «        ¦  «        ¦  «        ¦  «        S |r6t          d                     |d         t          |¦  «        ¦  «        ¦  «        S �n;|dk    r6t          d                     | d         t          |¦  «        ¦  «        ¦  «        S |dk    r¯|                       d¦  «        p|                       d¦  «        pd|d<   |                       d¦  «        pg }|                       d¦  «        p|r|d         nd|d<   t          d                     t          | d         d¬¦  «        t          |¦  «        ¦  «        ¦  «        S |dk    rDt          d                      t          t          || d         ¬!¦  «        ¦  «        ¦  «        ¦  «        S |d"k    rW|                       d¦  «        pg }|                       d¦  «        pg }|s|r%|r|d         n	d|d         i}t          |d|¦  «        S |d"k    rd#nd$S )%NÚcover_versionr   ÚvÚsize)ÚplaylistÚradior´   Úplaylist_idÚplaylist_cover_mode)r    Ú
cover_modeÚplaylist_cover_song_idsc                 ó0   — g | ]}|¯t          |¦  «        ‘ŒS r?   )Úint)r   Úis     r   rƒ   zcover.<locals>.<listcomp>¤   s#   € Ð;Ð;Ð; !¸Ð;•s˜1‘v”vÐ;Ð;Ð;r!   ú,Úcover_song_idsr·   Úcustomzplaylists/{}/cover?{}r    Úcover_songszcover/{}?{})r±   rX   r3   Úalbum_idr/   r4   r   Úprimary_artistr5   zbrowse/albums/{}/cover?{}r8   r1   zbrowse/artists/cover?{})r5   ÚgenrezDefaultMusicGenres.pngzDefaultAlbumCover.png)
r�   r   r   rZ   rŽ   r­   r$   r   r   Úcover)	Úentryr6   r²   ÚversionÚqueryÚidsÚrefsr   rX   s	            r   rÃ   rÃ   š   sf  € Ø�iŠi˜Ñ(Ô(Ð-¨A€GØ�'ˆN€EØð Øˆˆf‰ØÐ$Ð$Ñ$Ø�7Š?ˆ?Ý˜ 5¨Ô#7ÀEÇIÂIÐNcÑDdÔDdÐeÑeÔeˆEØ—)’)Ð5Ñ6Ô6Ð<¸"ˆCÝ˜#�sÑ#Ô#ð <Ø;Ð; s§y¢y°¡~¤~Ð;Ñ;Ô;�øà—)’)Ð,Ñ-Ô-Ð3°ˆCØ�9Š9�\Ñ"Ô" hÒ.Ð.ÝÐ0×7Ò7¸¸d¼ÅYÈuÑEUÔEUÑVÔVÑWÔWÐWØ�yŠy˜Ñ'Ô'Ð-¨2ˆØð 	{Ý˜×-Ò-¨d°1¬g°d¬m½YÅtÈEÐUYÐZ[ÔU\×U`ÒU`ÐapÑUqÔUqÐUvÐuvÐGwÑGwÔGwÑ=xÔ=xÑyÔyÑzÔzÐzØð 	IÝ˜×-Ò-¨c°!¬fµiÀÑ6FÔ6FÑGÔGÑHÔHÐHñ	Ià	�ŠˆÝ�]×)Ò)¨%°¬+µyÀÑ7GÔ7GÑHÔHÑIÔIÐIØ	�ŠˆØ Ÿ9š9 ZÑ0Ô0ÐI°E·I²I¸d±O´OÐIÀrˆˆiÑØ—)’)˜IÑ&Ô&Ð,¨"ˆØŸ)š)Ð$4Ñ5Ô5ÐXÈÐ:W¸'À!¼*¸*ÐUWˆˆh‰ÝÐ0×7Ò7½¸eÀF¼mÐRTÐ8UÑ8UÔ8UÕW`ÐafÑWgÔWgÑhÔhÑiÔiÐiØ	�Ò	Ð	ÝÐ.×5Ò5µiÅÀUÐSXÐY_ÔS`Ð@aÑ@aÔ@aÑ6bÔ6bÑcÔcÑdÔdÐdØˆw‚€Ø�yŠy˜Ñ'Ô'Ð-¨2ˆØ�iŠiÐ(Ñ)Ô)Ð/¨RˆØð 	-�3ð 	-Ø"Ð6�4˜”7�7¨¨s°1¬v¨ˆDÝ˜˜v tÑ,Ô,Ð,Ø'+¨w¢ Ð#Ð#Ð<SÐSr!   é°  c           
      óà   — |dk    rgt          |                      d¦  «        pd¦  «        dk    r?t          d                     | d         t	          | d         |dœ¦  «        ¦  «        ¦  «        S dS )Nr³   Útitle_image_versionr   zplaylists/{}/title-image?{}r    )r±   Úwr/   )rº   r�   r­   r$   r   )rÄ   r6   Úwidths      r   Útitle_imagerÎ   À   s€   € ØˆzÒÐ�c %§)¢)Ð,AÑ"BÔ"BÐ"GÀaÑHÔHÈ1ÒLÐLÝÐ2×9Ò9¸%À¼+ÅyØÐ-Ô.°UÐ;Ð;ñH=ô H=ñ >ô >ñ ?ô ?ð 	?àˆ2r!   c                 óš   — t           j                             t          dd                     |€t          ¦   «         n|pd| ¦  «        ¦  «        S )NÚ
skin_cachezvinyl_{}_{}.jsonÚpublic)r¦   r*   ÚjoinÚPROFILEr$   rJ   )r‚   rW   s     r   r¨   r¨   Ç   sT   € ÝŒ7�<Š<� Ð/A×/HÒ/HÐW[ÐWcÍ'É)Ì)È)ÐimÐIzÐrzð  }Cñ  0Dô  0Dñ  Eô  Eð  Er!   c                 ó†  — |€t          ¦   «         }|s| t          vrd S 	 t          t          | |¦  «        d¬¦  «        5 }t	          j        |¦  «        }d d d ¦  «         n# 1 swxY w Y   t          |t          ¦  «        r*t          |                     d¦  «        t          ¦  «        r|nd S # t          t          f$ r Y d S w xY w)NrV   )ÚencodingÚitems)rJ   ÚPUBLIC_SOURCESÚopenr¨   rv   Úloadr   r   r�   r&   ÚOSErrorr)   )r‚   rW   Úhandler’   s       r   ÚsnapshotrÜ   Ë   s  € Ø€|Ý‰yŒyˆØð �F¥.Ð0Ð0ØˆtðÝ•*˜V TÑ*Ô*°WÐ=Ñ=Ô=ð 	%ÀÝ”9˜VÑ$Ô$ˆDð	%ð 	%ð 	%ñ 	%ô 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%øøøð 	%ð 	%ð 	%ð 	%å! $­Ñ-Ô-Ð_µ*¸T¿XºXÀgÑ=NÔ=NÕPTÑ2UÔ2UÐ_ˆtˆtÐ[_Ð_øÝ•ZÐ ð ð ð Øˆtˆtðøøøs5   ŸB+ ¾AÁB+ ÁA#Á#B+ Á&A#Á'AB+ Â+C Â?C r‚   c                 óˆ   — t          | ¦  «        }|€g S |                     di ¦  «                             ||d         ¦  «        S )NÚsortsrÖ   )rÜ   r�   )r‚   Úsortr’   s      r   Úcachedrà   Ø   sA   € Ý�FÑÔ€DØ€|Øˆ	Ø�8Š8�G˜RÑ Ô ×$Ò$ T¨4°¬=Ñ9Ô9Ð9r!   é2   c                 ó~  ‡‡‡‡‡‡— t          | €t          nt          | t          ¦  «        r| gn| ¦  «        Š‰                     t          ¦  «         t          ¦   «         Ši Šˆˆˆˆfd„}d„ } |d|¦  «         ‰d         rpd„ } |d|¦  «         dD ]B\  }}	|	d	                     |d
k    rd
nd|d
k    rdnd¦  «        z  }	 ||f|	|fˆˆfd„	¦  «         ŒCdD ]\  }}	}
 ||f||	|
fd„¦  «         Œn‰                     d„ ‰D ¦   «         ¦  «          |dd„ ¦  «         t          ¦   «         ‰k    rt          d¦  «        ‚‰S )a  Fetch only selected sources; Home songs are bounded, interactive lists can page fully.

    With strict=False failed sources are omitted, so an empty list always denotes success.
    Non-song endpoints return their metadata collection in one request (no song expansion).
    Nc                 ó”  •‡— ‰                      | ¦  «        } | sd S t          ¦   «         ‰k    rt          d¦  «        ‚	  || ¦  «        Š| D ]G}‰|         }t          |t          ¦  «        rt          d„ |D ¦   «         ¦  «        st          d¦  «        ‚ŒH‰                     ˆfd„| D ¦   «         ¦  «         d S # t          $ r ‰r‚ Y d S w xY w)NúVinyl account changedc              3   ó@   K  — | ]}t          |t          ¦  «        V — Œd S r   r   ©r   Úes     r   r    z)sources.<locals>.fetch.<locals>.<genexpr>ô   s-   è è € Ð;aÐ;aÐTU½JÀqÍ$Ñ<OÔ<OÐ;aÐ;aÐ;aÐ;aÐ;aÐ;ar!   zInvalid Vinyl sourcec                 ó"   •— i | ]}|‰|         “ŒS r?   r?   )r   r8   r’   s     €r   ú
<dictcomp>z*sources.<locals>.fetch.<locals>.<dictcomp>ö   s   ø€ Ð>Ð>Ð>°˜4  d¤Ð>Ð>Ð>r!   )	ÚintersectionrL   r‹   r   r&   r(   r)   ÚupdateÚ	Exception)	ÚnamesrÙ   r8   Úentriesr’   r-   ÚselectedrY   Ústricts	       @€€€€r   Úfetchzsources.<locals>.fetchê   s  øø€ Ø×%Ò% eÑ,Ô,ˆØð 	ØˆFÝ‰7Œ7�gÒÐÝÐ6Ñ7Ô7Ð7ð		Ø�4˜‘;”;ˆDØð =ð =�Ø˜tœ*�Ý! '­4Ñ0Ô0ð =½Ð;aÐ;aÐY`Ð;aÑ;aÔ;aÑ8aÔ8að =Ý$Ð%;Ñ<Ô<Ð<ð=à�MŠMÐ>Ð>Ð>Ð>¸Ð>Ñ>Ô>Ñ?Ô?Ð?Ð?Ð?øÝð 	ð 	ð 	Øð Øðð ð ð	øøøs   ¾A6B6 Â6CÃCc                 óN   ‡‡— t          d¦  «        ŠddddœŠˆˆfd„| D ¦   «         S )Nzfeatured?slim=1&curatorLimit=80ÚcuratorPlaylistsr   Ú	topTracks©r   r   r	   c                 ó.   •— i | ]}|‰‰|                  “ŒS r?   r?   )r   r8   r’   Úkeyss     €€r   ré   z-sources.<locals>.featured.<locals>.<dictcomp>þ   s$   ø€ Ð9Ð9Ð9¨4��d˜4 œ:Ô&Ð9Ð9Ð9r!   r   )rí   r’   r÷   s    @@r   Úfeaturedzsources.<locals>.featuredû   s?   øø€ ÝÐ8Ñ9Ô9ˆØ-¸;ÐVaÐbÐbˆØ9Ð9Ð9Ð9Ð9°5Ð9Ñ9Ô9Ð9r!   rõ   r   c                 óJ   ‡— t          d¦  «        d         Šˆfd„| D ¦   «         S )Nr   c                 ó0   •‡— i | ]Š‰ˆfd „‰D ¦   «         “ŒS )c                 óN   •— g | ]!}|                      ‰d k    rdnd¦  «        ¯|‘Œ"S )r   Úis_ownerr~   )r�   )r   Úpr8   s     €r   rƒ   z9sources.<locals>.playlists.<locals>.<dictcomp>.<listcomp>  s9   ø€ ÐmÐmÐm °·²ÀTÈ[ÒEXÐEX°z°zÐ^kÑ1lÔ1lÐm˜1ÐmÐmÐmr!   r?   )r   r8   rî   s    @€r   ré   z.sources.<locals>.playlists.<locals>.<dictcomp>  sA   øø€ ð 'ð 'ð 'Øð ÐmÐmÐmÐm gÐmÑmÔmð 'ð 'ð 'r!   r   )rí   rî   s    @r   r   zsources.<locals>.playlists  s@   ø€ Ý˜kÑ*Ô*¨;Ô7ˆGð'ð 'ð 'ð 'Ø %ð'ñ 'ô 'ð 'r!   )r   r   ))r
   r
   )r   zsongs/favoritesz?sort={}&order={}ÚtitleÚ
created_atÚASCÚDESCc                 ó4   •— |t          |‰‰rdn‰¬¦  «        iS )NéÈ   )Ú	all_itemsÚlimit)Úpaged_songs)rí   r*   r‚   r  r  s      €€r   ú<lambda>zsources.<locals>.<lambda>
  s*   ø€ Ø� D°IÈIÐE`ÀSÀSÐ[`ÐaÑaÔaðFc€ r!   ))r   zbrowse/albumsr   )r   zbrowse/artistsr   )r   zbrowse/genresr   )r   zbrowse/favorites/albumsr   )r   zbrowse/favorites/artistsr   c                 ó0   — |t          |¦  «        |         iS r   r   )rí   r‚   r*   rª   s       r   r  zsources.<locals>.<lambda>  s   € ÈvÕW^Ð_cÑWdÔWdÐehÔWiÐNj€ r!   c                 ó&   — i | ]}|t           v¯|g “ŒS r?   )r×   )r   r8   s     r   ré   zsources.<locals>.<dictcomp>  s$   € ÐSÐSÐS D¸ÅNÐ8RÐ8R�t˜RÐ8RÐ8RÐ8Rr!   )r   c                 ó0   — dt          d¦  «        d         iS )Nr   zradio/sessions/allÚsessionsr   )rí   s    r   r  zsources.<locals>.<lambda>  s   €  hµÐ8LÑ0MÔ0MÈjÔ0YÐ%Z€ r!   rä   )	Úsetr¥   r   rZ   Úintersection_updaterL   r$   rë   r‹   )Úsourcesr  rß   r  rð   rñ   rø   r   r‚   r*   rª   r-   rï   rY   s    ` ``      @@@r   r  r  ß   s  øøøøøø€ õ ˜g˜o•7�7ÅÈGÕUXÑAYÔAYÐ4f°W°I°IÐ_fÑhÔh€HØ× Ò ¥Ñ)Ô)Ð)Ý‰gŒg€GØ€Fðð ð ð ð ð ð ð ð":ð :ð :ð
 
€EÐ
/°Ñ:Ô:Ð:Øˆq„zð Uð	'ð 	'ð 	'ð 	ˆÐ1°9Ñ=Ô=Ð=ØWð 	dð 	d‰LˆF�DØÐ'×.Ò.¸$À'º/¸/¨w¨wÈ|Ø6:¸g²o°o¨U¨UÈ6ñSô Sñ SˆDàˆE�6�)°¸Vð cð cð cð cð cð cñ dô dð dð dð"Mð 	lð 	lÑˆF�D˜#ð ˆE�6�)°&¸tÈÐjÐjÐjÑkÔkÐkÐkð		lð 	�ŠÐSÐS¨HÐSÑSÔSÑTÔTÐTØ	€Eˆ+ÐZÐZÑ[Ô[Ð[Ý�w„w�'ÒÐÝÐ2Ñ3Ô3Ð3Ø€Mr!   r  c           	      óº  — g d}}t          ¦   «         }t          dt          dt          |¦  «        ¦  «        ¦  «        }	 t          ¦   «         |k    rt	          d¦  «        ‚|                      d¦  «        rdnd| v rd	nd}t          d
                     | |||¦  «        ¦  «        }|d         }t          |t          ¦  «        rt          d„ |D ¦   «         ¦  «        st          d¦  «        ‚t          ¦   «         |k    rt	          d¦  «        ‚|s
|d |…         S |                     |¦  «         |t          |¦  «        z  }|r||                     d|¦  «        k    r|S �Œ)Nr   r  rN   Trä   )r   r   r/   r   r   r   r
   c              3   ó@   K  — | ]}t          |t          ¦  «        V — Œd S r   r   ræ   s     r   r    zpaged_songs.<locals>.<genexpr>#  s,   è è € Ð1UÐ1UÈ!µ*¸QÅÑ2EÔ2EÐ1UÐ1UÐ1UÐ1UÐ1UÐ1Ur!   zInvalid Vinyl songsr"   )rL   ÚminÚmaxrº   r‹   rœ   r#   r$   r   r&   r(   r)   Úextendr'   r�   )	r*   r  r  rÖ   r+   rY   r,   r-   Úchunks	            r   r  r    sh  € Ø˜ˆ6€EÝ‰gŒg€GÝ�•S˜�C ™JœJÑ'Ô'Ñ(Ô(€EðÝ‰7Œ7�gÒÐÝÐ6Ñ7Ô7Ð7ØŸ-š-¨
Ñ3Ô3ÐT�B�BÀÀtÀÀ¸¸ÐQTˆ	ÝÐ1×8Ò8¸¸yÈ%ÐQWÑXÔXÑYÔYˆØ�w”ˆÝ˜%¥Ñ&Ô&ð 	4­cÐ1UÐ1UÈuÐ1UÑ1UÔ1UÑ.UÔ.Uð 	4ÝÐ2Ñ3Ô3Ð3Ý‰7Œ7�gÒÐÝÐ6Ñ7Ô7Ð7Øð 	!Ø˜˜%˜”=Ð Ø�Š�UÑÔÐØ•#�e‘*”*ÑˆØð 	˜ &§*¢*¨W°fÑ"=Ô"=Ò=Ð=ØˆLñr!   c                 óŽ  — | dk    rCt          d                     t          |¦  «        ¦  «        ¦  «                             dg ¦  «        S | dk    rKt          d                     t          |¦  «        ¦  «        ¦  «        }t	          d|d         d         ¦  «        S t          | |||¦  «        }t          |d|v rd	ndz   d
¬¦  «        S )Nr³   zplaylists/{}r
   r´   zradio/sessions/{}/timelinerY   rµ   r   r   T)r  )r#   r$   rº   r�   Ú
collectionr9   r  )r6   r7   r8   r5   Útimeliner*   s         r   r  r  /  s»   € ØˆzÒÐÝ�~×,Ò,­S°©]¬]Ñ;Ô;Ñ<Ô<×@Ò@ÀÈ"ÑMÔMÐMØˆw‚€ÝÐ7×>Ò>½sÀ8¹}¼}ÑMÔMÑNÔNˆÝ˜* h¨yÔ&9¸-Ô&HÑIÔIÐIÝ˜4 ¨4°Ñ8Ô8€DÝ�t c¨T k k˜s˜s°sÑ;ÀtÐLÑLÔLÐLr!   )r   )r/   r/   )F)rn   NTro   )r®   )rÉ   r   )r‚   )Nrá   r‚   FT)Fr  )*Ú__doc__r[   rv   r¦   Úurllib.parser   r   r   rA   ÚxbmcvfsrC   r†   ÚtranslatePathr$   rÓ   r×   r¥   r%   r.   r9   rì   r;   rD   rJ   rL   rT   r_   rh   rm   r#   rŒ   r£   r«   r­   rÃ   rÎ   r¨   rÜ   rà   r  r  r  r?   r!   r   ú<module>r     sy  ðà JÐ JØ €€€Ø €€€Ø 	€	€	€	Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3à Ð Ð Ð Ø €€€à"€ØA€Ø
ˆ'Ô
Ð B× IÒ IÈ(Ñ SÔ SÑ
TÔ
T€Ø@€Ø
ð bñ b€à€	ð8ð 8ð 8ð 8ðð ð ð ð	ð 	ð 	ð 	ð 	�Iñ 	ô 	ð 	ð%ð %ð %ð^ð ^ð ^ð
8ð 8ð 8ð
ð ð ðOð Oð Oð
pð pð pð|ð |ð |ð |ðð ð ð ð.ð ð ð("ð "ð "ðð ð ð Ið Ið Ið
#Tð #Tð #Tð #TðLð ð ð ðEð Eð Eð Eð
ð 
ð 
ð 
ð:ð :ð :ð :ð7ð 7ð 7ð 7ðtð ð ð ð,Mð Mð Mð Mð Mð Mr!   