§
    øžyj‘=  ã                  ó  — d Z ddlmZ ddlZddlmZmZmZmZ ddl	m
Z
 ddlZddlmZmZ  G d„ de¦  «        Z G d	„ d
e¦  «        Z G d„ de¦  «        Z G d„ d¦  «        Zd,d„Zd-d„Zd.d „Zd/d0d#„Zd/d0d$„Zd/d1d(„Zd2d+„ZdS )3z8Thin Spotify Web API helper used by Hermes native tools.é    )ÚannotationsN)ÚAnyÚDictÚIterableÚOptional)Úurlparse)Ú	AuthErrorÚ#resolve_spotify_runtime_credentialsc                  ó   — e Zd ZdZdS )ÚSpotifyErrorzBase Spotify tool error.N©Ú__name__Ú
__module__Ú__qualname__Ú__doc__© ó    ú</home/ragecks/.hermes/hermes-agent/plugins/spotify/client.pyr   r      s   € € € € € Ø"Ð"Ð"Ð"r   r   c                  ó   — e Zd ZdZdS )ÚSpotifyAuthRequiredErrorz>Raised when the user needs to authenticate with Spotify first.Nr   r   r   r   r   r      s   € € € € € ØHÐHÐHÐHr   r   c                  ó,   ‡ — e Zd ZdZdddœdˆ fd„Zˆ xZS )ÚSpotifyAPIErrorzStructured Spotify API failure.N©Ústatus_codeÚresponse_bodyÚmessageÚstrr   úOptional[int]r   úOptional[str]ÚreturnÚNonec               ót   •— t          ¦   «                              |¦  «         || _        || _        d | _        d S ©N)ÚsuperÚ__init__r   r   Úpath)Úselfr   r   r   Ú	__class__s       €r   r%   zSpotifyAPIError.__init__   s8   ø€ õ 	‰Œ×Ò˜Ñ!Ô!Ð!Ø&ˆÔØ*ˆÔØˆŒ	ˆ	ˆ	r   )r   r   r   r   r   r   r    r!   )r   r   r   r   r%   Ú__classcell__)r(   s   @r   r   r      sU   ø€ € € € € Ø)Ð)ð &*Ø'+ð
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
r   r   c                  ó  — e Zd Zdkd„Zdddœdld„Zedmd„¦   «         Zdnd„Zdddddœdod„Zdpd„Z	dqd„Z
ddœdrd"„Zdd#œdsd&„Zdd#œdsd'„Zdddddd(œdtd/„Zdd0œdud1„Zdd0œdud2„Zdd0œdud3„Zdd0œdvd5„Zdd0œdwd7„Zdd0œdxd8„Zdd0œdyd:„Zdqd;„Zdd0œdzd=„Zd>d?ddd@œd{dF„ZdGd?dHœd|dI„Zdd#œd}dK„ZddddLœd~dQ„ZddRœddT„ZddUœd€dW„ZdddddXœd�dZ„Zdd#œd‚d\„ZdGd?dd]œdƒd^„Z dGd?dd]œd„d_„Z!d…d`„Z"d…da„Z#dGd?dd]œd„db„Z$d†dd„Z%d‡df„Z&dGdddgœdˆdj„Z'dS )‰ÚSpotifyClientr    r!   c                ó<   — |                       d¬¦  «        | _        d S )NT)Úrefresh_if_expiring)Ú_resolve_runtimeÚ_runtime©r'   s    r   r%   zSpotifyClient.__init__*   s   € Ø×-Ò-À$Ð-ÑGÔGˆŒˆˆr   FT©Úforce_refreshr-   r2   Úboolr-   úDict[str, Any]c               ó„   — 	 t          ||¬¦  «        S # t          $ r"}t          t          |¦  «        ¦  «        |‚d }~ww xY w)Nr1   )r
   r	   r   r   )r'   r2   r-   Úexcs       r   r.   zSpotifyClient._resolve_runtime-   s[   € ð	>Ý6Ø+Ø$7ðñ ô ð øõ ð 	>ð 	>ð 	>Ý*­3¨s©8¬8Ñ4Ô4¸#Ð=øøøøð	>øøøs   ‚ “
?�:º?r   c                óz   — t          | j                             d¦  «        pd¦  «                             d¦  «        S )NÚbase_urlÚ ú/)r   r/   ÚgetÚrstripr0   s    r   r8   zSpotifyClient.base_url6   s3   € å�4”=×$Ò$ ZÑ0Ô0Ð6°BÑ7Ô7×>Ò>¸sÑCÔCÐCr   úDict[str, str]c                ó(   — d| j         d         › �ddœS )NzBearer Úaccess_tokenúapplication/json)ÚAuthorizationzContent-Type)r/   r0   s    r   Ú_headerszSpotifyClient._headers:   s&   € àF t¤}°^Ô'DÐFÐFØ.ð
ð 
ð 	
r   N)ÚparamsÚ	json_bodyÚallow_retry_on_401Úempty_responseÚmethodr&   rC   úOptional[Dict[str, Any]]rD   rE   rF   r   c          	     ó,  — | j         › |› �}t          j        |||                      ¦   «         t	          |¦  «        |�t	          |¦  «        nd d¬¦  «        }|j        dk    r8|r6|                      dd¬¦  «        | _        |                      ||||d¬¦  «        S |j        dk    r|                      |||¬	¦  «         |j        d
k    s|j	        s|p
d|j        ddœS d|j
                             dd¦  «        v r|                     ¦   «         S d|j        dœS )Ng      >@)ÚheadersrC   ÚjsonÚtimeouté‘  Tr1   F)rC   rD   rE   i�  )rG   r&   éÌ   )Úsuccessr   Úemptyr@   zcontent-typer9   )rO   Útext)r8   ÚhttpxÚrequestrB   Ú_strip_noner   r.   r/   Ú_raise_api_errorÚcontentrJ   r;   rK   rQ   )	r'   rG   r&   rC   rD   rE   rF   ÚurlÚresponses	            r   rS   zSpotifyClient.request@   sQ  € ð ”Ð& Ð&Ð&ˆÝ”=ØØØ—M’M‘O”OÝ˜vÑ&Ô&Ø+4Ð+@•˜YÑ'Ô'Ð'ÀdØð
ñ 
ô 
ˆð Ô 3Ò&Ð&Ð+=Ð&Ø ×1Ò1ÀÐZ^Ð1Ñ_Ô_ˆDŒMØ—<’<ØØØØ#Ø#(ð  ñ ô ð ð Ô 3Ò&Ð&Ø×!Ò! (°6ÀÐ!ÑEÔEÐEØÔ 3Ò&Ð&¨hÔ.>Ð&Ø!Ðj°ÀhÔFZÐeiÐ%jÐ%jÐjØ Ô!1×!5Ò!5°nÀbÑ!IÔ!IÐIÐIØ—=’=‘?”?Ð"Ø¨¬Ð7Ð7Ð7r   rX   úhttpx.Responsec          	     óô   — |j                              ¦   «         }t          |j        t	          ||¬¦  «        |||j                             d¦  «        ¬¦  «        }t          ||j        |¬¦  «        }||_        |‚)N)ÚfallbackzRetry-After)r   ÚdetailrG   r&   Úretry_afterr   )	rQ   ÚstripÚ_friendly_spotify_error_messager   Ú_extract_spotify_error_detailrJ   r;   r   r&   )r'   rX   rG   r&   r\   r   Úerrors          r   rU   zSpotifyClient._raise_api_errord   s   € Ø”×$Ò$Ñ&Ô&ˆÝ1Ø Ô,Ý0°ÀFÐKÑKÔKØØØ Ô(×,Ò,¨]Ñ;Ô;ð
ñ 
ô 
ˆõ   °XÔ5IÐY_Ð`Ñ`Ô`ˆØˆŒ
Øˆr   c                ó.   — |                       dd¦  «        S )NÚGETz/me/player/devices©rS   r0   s    r   Úget_deviceszSpotifyClient.get_devicesq   s   € Ø�|Š|˜EÐ#7Ñ8Ô8Ð8r   )ÚplayÚ	device_idrf   c               ó:   — |                       dd|g|dœ¬¦  «        S )NÚPUTú
/me/player)Ú
device_idsrf   ©rD   rd   )r'   rg   rf   s      r   Útransfer_playbackzSpotifyClient.transfer_playbackt   s0   € Ø�|Š|˜E <Ø$˜+Øð<
ð <
ˆ|ñ ô ð 	r   )Úmarketrn   r   c          	     ó@   — |                       ddd|iddddœ¬¦  «        S )	Nrc   rj   rn   rN   Tz‡No active Spotify playback session was found. Open Spotify on a device and start playback, or transfer playback to an available device.©r   rP   r   ©rC   rF   rd   ©r'   rn   s     r   Úget_playback_statez SpotifyClient.get_playback_statez   sA   € Ø�|Š|ØØØ˜fÐ%à"Øð eðð ð	 ñ 	
ô 	
ð 		
r   c          	     ó@   — |                       ddd|iddddœ¬¦  «        S )	Nrc   z/me/player/currently-playingrn   rN   TzSSpotify is not currently playing anything. Start playback in Spotify and try again.rp   rq   rd   rr   s     r   Úget_currently_playingz#SpotifyClient.get_currently_playing†   s>   € Ø�|Š|ØØ*Ø˜fÐ%à"ØØpðð ð	 ñ 	
ô 	
ð 		
r   )rg   Úcontext_uriÚurisÚoffsetÚposition_msrv   rw   úOptional[list[str]]rx   ry   r   c          
     óB   — |                       ddd|i||||dœ¬¦  «        S )Nri   z/me/player/playrg   )rv   rw   rx   ry   )rC   rD   rd   )r'   rg   rv   rw   rx   ry   s         r   Ústart_playbackzSpotifyClient.start_playback’   sC   € ð �|Š|ØØØ Ð+à*ØØ Ø*ð	ð ð	 ñ 

ô 

ð 
	
r   )rg   c               ó6   — |                       ddd|i¬¦  «        S )Nri   z/me/player/pauserg   ©rC   rd   ©r'   rg   s     r   Úpause_playbackzSpotifyClient.pause_playback§   s    € Ø�|Š|˜EÐ#5¸{ÈIÐ>Vˆ|ÑWÔWÐWr   c               ó6   — |                       ddd|i¬¦  «        S )NÚPOSTz/me/player/nextrg   r~   rd   r   s     r   Ú	skip_nextzSpotifyClient.skip_nextª   s    € Ø�|Š|˜FÐ$5¸{ÈIÐ>Vˆ|ÑWÔWÐWr   c               ó6   — |                       ddd|i¬¦  «        S )Nr‚   z/me/player/previousrg   r~   rd   r   s     r   Úskip_previouszSpotifyClient.skip_previous­   s!   € Ø�|Š|˜FÐ$9À;ÐPYÐBZˆ|Ñ[Ô[Ð[r   Úintc               ó8   — |                       dd||dœ¬¦  «        S )Nri   z/me/player/seek)ry   rg   r~   rd   )r'   ry   rg   s      r   ÚseekzSpotifyClient.seek°   s/   € Ø�|Š|˜EÐ#4Ø&Ø"ð>
ð >
ˆ|ñ ô ð 	r   Ústatec               ó8   — |                       dd||dœ¬¦  «        S )Nri   z/me/player/repeat©r‰   rg   r~   rd   ©r'   r‰   rg   s      r   Ú
set_repeatzSpotifyClient.set_repeat¶   s$   € Ø�|Š|˜EÐ#6ÈÐ]fÐ?gÐ?gˆ|ÑhÔhÐhr   c          	     ó�   — |                       ddt          t          |¦  «        ¦  «                             ¦   «         |dœ¬¦  «        S )Nri   z/me/player/shuffler‹   r~   )rS   r   r3   ÚlowerrŒ   s      r   Úset_shufflezSpotifyClient.set_shuffle¹   s?   € Ø�|Š|˜EÐ#7Í#ÍdÐSXÉkÌkÑJZÔJZ×J`ÒJ`ÑJbÔJbÐqzÐ@{Ð@{ˆ|Ñ|Ô|Ð|r   Úvolume_percentc               ó8   — |                       dd||dœ¬¦  «        S )Nri   z/me/player/volume)r‘   rg   r~   rd   )r'   r‘   rg   s      r   Ú
set_volumezSpotifyClient.set_volume¼   s1   € Ø�|Š|˜EÐ#6Ø,Ø"ð@
ð @
ˆ|ñ ô ð 	r   c                ó.   — |                       dd¦  «        S )Nrc   ú/me/player/queuerd   r0   s    r   Ú	get_queuezSpotifyClient.get_queueÂ   s   € Ø�|Š|˜EÐ#5Ñ6Ô6Ð6r   Úuric               ó8   — |                       dd||dœ¬¦  «        S )Nr‚   r•   )r—   rg   r~   rd   )r'   r—   rg   s      r   Úadd_to_queuezSpotifyClient.add_to_queueÅ   s$   € Ø�|Š|˜FÐ$6ÀsÐYbÐ?cÐ?cˆ|ÑdÔdÐdr   é
   r   )Úlimitrx   rn   Úinclude_externalÚqueryÚsearch_typesú	list[str]r›   rœ   c               óf   — |                       dd|d                     |¦  «        ||||dœ¬¦  «        S )Nrc   z/searchÚ,)ÚqÚtyper›   rx   rn   rœ   r~   ©rS   Újoin)r'   r�   rž   r›   rx   rn   rœ   s          r   ÚsearchzSpotifyClient.searchÈ   sH   € ð �|Š|˜E 9ØØ—H’H˜\Ñ*Ô*ØØØØ 0ð6
ð 6
ˆ|ñ ô ð 	r   é   ©r›   rx   c               ó8   — |                       dd||dœ¬¦  «        S )Nrc   ú/me/playlistsr¨   r~   rd   )r'   r›   rx   s      r   Úget_my_playlistszSpotifyClient.get_my_playlistsÛ   s#   € Ø�|Š|˜E ?ÀUÐV\Ð;]Ð;]ˆ|Ñ^Ô^Ð^r   Úplaylist_idc               ó<   — |                       dd|› �d|i¬¦  «        S )Nrc   ú/playlists/rn   r~   rd   )r'   r¬   rn   s      r   Úget_playlistzSpotifyClient.get_playlistÞ   s)   € Ø�|Š|˜EÐ#>°Ð#>Ð#>ÈÐRXÐGYˆ|ÑZÔZÐZr   )ÚpublicÚcollaborativeÚdescriptionÚnamer°   r±   r²   c          	     ó<   — |                       dd||||dœ¬¦  «        S )Nr‚   rª   ©r³   r°   r±   r²   rl   rd   )r'   r³   r°   r±   r²   s        r   Úcreate_playlistzSpotifyClient.create_playlistá   s8   € ð �|Š|˜F OØØØ*Ø&ð	@
ð @
ˆ|ñ ô ð 	r   )Úpositionr·   c               ó@   — |                       dd|› d�||dœ¬¦  «        S )Nr‚   r®   ú/items)rw   r·   rl   rd   )r'   r¬   rw   r·   s       r   Úadd_playlist_itemsz SpotifyClient.add_playlist_itemsð   s>   € ð �|Š|˜FÐ$E°+Ð$EÐ$EÐ$EØØ ðR
ð R
ˆ|ñ ô ð 	r   )Úsnapshot_idr»   c               óT   — |                       dd|› d�d„ |D ¦   «         |dœ¬¦  «        S )NÚDELETEr®   r¹   c                ó   — g | ]}d |i‘ŒS )r—   r   )Ú.0r—   s     r   ú
<listcomp>z7SpotifyClient.remove_playlist_items.<locals>.<listcomp>  s   € Ð3Ð3Ð3 s�u˜c�lÐ3Ð3Ð3r   )Úitemsr»   rl   rd   )r'   r¬   rw   r»   s       r   Úremove_playlist_itemsz#SpotifyClient.remove_playlist_itemsü   sL   € ð �|Š|˜HÐ&G°KÐ&GÐ&GÐ&GØ3Ð3¨dÐ3Ñ3Ô3Ø&ðT
ð T
ˆ|ñ ô ð 	r   rµ   úOptional[bool]c          	     óB   — |                       dd|› �||||dœ¬¦  «        S )Nri   r®   rµ   rl   rd   )r'   r¬   r³   r°   r±   r²   s         r   Úupdate_playlist_detailsz%SpotifyClient.update_playlist_details  sA   € ð �|Š|˜EÐ#>°Ð#>Ð#>ØØØ*Ø&ð	K
ð K
ˆ|ñ ô ð 	r   Úalbum_idc               ó<   — |                       dd|› �d|i¬¦  «        S )Nrc   ú/albums/rn   r~   rd   )r'   rÆ   rn   s      r   Ú	get_albumzSpotifyClient.get_album  s(   € Ø�|Š|˜EÐ#8¨hÐ#8Ð#8À(ÈFÐASˆ|ÑTÔTÐTr   ©r›   rx   rn   c               óB   — |                       dd|› d�|||dœ¬¦  «        S )Nrc   rÈ   z/tracksrÊ   r~   rd   )r'   rÆ   r›   rx   rn   s        r   Úget_album_trackszSpotifyClient.get_album_tracks  s?   € Ø�|Š|˜EÐ#?¨hÐ#?Ð#?Ð#?ØØØðI
ð I
ˆ|ñ ô ð 	r   c               ó:   — |                       dd|||dœ¬¦  «        S )Nrc   z
/me/tracksrÊ   r~   rd   ©r'   r›   rx   rn   s       r   Úget_saved_trackszSpotifyClient.get_saved_tracks"  ó&   € Ø�|Š|˜E <À%ÐSYÐekÐ8lÐ8lˆ|ÑmÔmÐmr   c               ó\   — |                       dddd                     |¦  «        i¬¦  «        S )Nri   ú/me/libraryrw   r¡   r~   r¤   ©r'   rw   s     r   Úsave_library_itemsz SpotifyClient.save_library_items%  s)   € Ø�|Š|˜E =¸&À#Ç(Â(È4Á.Ä.Ð9Qˆ|ÑRÔRÐRr   c               ó\   — |                       dddd                     |¦  «        i¬¦  «        S )Nrc   z/me/library/containsrw   r¡   r~   r¤   rÓ   s     r   Úlibrary_containszSpotifyClient.library_contains(  s+   € Ø�|Š|˜EÐ#9À6È3Ï8Ê8ÐTXÉ>Ì>ÐBZˆ|Ñ[Ô[Ð[r   c               ó:   — |                       dd|||dœ¬¦  «        S )Nrc   z
/me/albumsrÊ   r~   rd   rÎ   s       r   Úget_saved_albumszSpotifyClient.get_saved_albums+  rÐ   r   Ú	track_idsc               ót   — d„ |D ¦   «         }|                       dddd                     |¦  «        i¬¦  «        S )Nc                ó   — g | ]}d |› �‘ŒS )zspotify:track:r   )r¿   Útrack_ids     r   rÀ   z5SpotifyClient.remove_saved_tracks.<locals>.<listcomp>/  ó!   € ÐFÐFÐF°Ð+ Ð+Ð+ÐFÐFÐFr   r½   rÒ   rw   r¡   r~   r¤   )r'   rÙ   rw   s      r   Úremove_saved_tracksz!SpotifyClient.remove_saved_tracks.  ó<   € ØFÐF¸IÐFÑFÔFˆØ�|Š|˜H m¸VÀSÇXÂXÈdÁ^Ä^Ð<Tˆ|ÑUÔUÐUr   Ú	album_idsc               ót   — d„ |D ¦   «         }|                       dddd                     |¦  «        i¬¦  «        S )Nc                ó   — g | ]}d |› �‘ŒS )zspotify:album:r   )r¿   rÆ   s     r   rÀ   z5SpotifyClient.remove_saved_albums.<locals>.<listcomp>3  rÝ   r   r½   rÒ   rw   r¡   r~   r¤   )r'   rà   rw   s      r   Úremove_saved_albumsz!SpotifyClient.remove_saved_albums2  rß   r   ©r›   ÚafterÚbeforerå   ræ   c               ó:   — |                       dd|||dœ¬¦  «        S )Nrc   z/me/player/recently-playedrä   r~   rd   )r'   r›   rå   ræ   s       r   Úget_recently_playedz!SpotifyClient.get_recently_played6  s6   € ð �|Š|˜EÐ#?ØØØðI
ð I
ˆ|ñ ô ð 	r   )r    r!   )r2   r3   r-   r3   r    r4   )r    r   )r    r=   )rG   r   r&   r   rC   rH   rD   rH   rE   r3   rF   rH   r    r   )rX   rY   rG   r   r&   r   r    r!   )r    r   )rg   r   rf   r3   r    r   )rn   r   r    r   )rg   r   rv   r   rw   rz   rx   rH   ry   r   r    r   )rg   r   r    r   )ry   r†   rg   r   r    r   )r‰   r   rg   r   r    r   )r‰   r3   rg   r   r    r   )r‘   r†   rg   r   r    r   )r—   r   rg   r   r    r   )r�   r   rž   rŸ   r›   r†   rx   r†   rn   r   rœ   r   r    r   )r›   r†   rx   r†   r    r   )r¬   r   rn   r   r    r   )
r³   r   r°   r3   r±   r3   r²   r   r    r   )r¬   r   rw   rŸ   r·   r   r    r   )r¬   r   rw   rŸ   r»   r   r    r   )r¬   r   r³   r   r°   rÃ   r±   rÃ   r²   r   r    r   )rÆ   r   rn   r   r    r   )
rÆ   r   r›   r†   rx   r†   rn   r   r    r   )r›   r†   rx   r†   rn   r   r    r   )rw   rŸ   r    r   )rÙ   rŸ   r    r   )rà   rŸ   r    r   )r›   r†   rå   r   ræ   r   r    r   )(r   r   r   r%   r.   Úpropertyr8   rB   rS   rU   re   rm   rs   ru   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+   r+   )   s.  € € € € € ðHð Hð Hð Hð 9>Ð[_ð >ð >ð >ð >ð >ð >ð ðDð Dð Dñ „XðDð
ð 
ð 
ð 
ð ,0Ø.2Ø#'Ø37ð"8ð "8ð "8ð "8ð "8ð "8ðHð ð ð ð9ð 9ð 9ð 9ð AFð ð ð ð ð ð ð =Að 

ð 

ð 

ð 

ð 

ð 

ð @Dð 

ð 

ð 

ð 

ð 

ð 

ð $(Ø%)Ø$(Ø+/Ø%)ð
ð 
ð 
ð 
ð 
ð 
ð* <@ð Xð Xð Xð Xð Xð Xð 7;ð Xð Xð Xð Xð Xð Xð ;?ð \ð \ð \ð \ð \ð \ð DHð ð ð ð ð ð ð DHð ið ið ið ið ið ið FJð }ð }ð }ð }ð }ð }ð MQð ð ð ð ð ð ð7ð 7ð 7ð 7ð DHð eð eð eð eð eð eð ØØ $Ø*.ðð ð ð ð ð ð& 02Àð _ð _ð _ð _ð _ð _ð IMð [ð [ð [ð [ð [ð [ð Ø#Ø%)ðð ð ð ð ð ð( #'ð
ð 
ð 
ð 
ð 
ð 
ð" &*ð
ð 
ð 
ð 
ð 
ð 
ð  #Ø!%Ø(,Ø%)ðð ð ð ð ð ð  CGð Uð Uð Uð Uð Uð Uð ?AÐPQÐkoð ð ð ð ð ð ð 02ÀÐ\`ð nð nð nð nð nð nðSð Sð Sð Sð\ð \ð \ð \ð 02ÀÐ\`ð nð nð nð nð nð nðVð Vð Vð VðVð Vð Vð Vð Ø#Ø $ðð ð ð ð ð ð ð r   r+   rX   rY   r[   r   r    c               óp  — |}	 |                       ¦   «         }t          |t          ¦  «        rf|                     d¦  «        }t          |t          ¦  «        r%t	          |                     d¦  «        p|¦  «        }nt          |t          ¦  «        r|}n# t
          $ r Y nw xY w|                     ¦   «         S )Nra   r   )rK   Ú
isinstanceÚdictr;   r   Ú	Exceptionr^   )rX   r[   r\   ÚpayloadÚ	error_objs        r   r`   r`   D  s´   € Ø€Fð	Ø—-’-‘/”/ˆÝ�g�tÑ$Ô$ð 	#ØŸš GÑ,Ô,ˆIÝ˜)¥TÑ*Ô*ð #Ý˜YŸ]š]¨9Ñ5Ô5Ð?¸Ñ@Ô@��Ý˜I¥sÑ+Ô+ð #Ø"�øøÝð ð ð Øˆðøøøà�<Š<‰>Œ>Ðs   „BB Â
B!Â B!r   r†   r\   rG   r&   r]   r   c                óè   — |                      ¦   «         }|                     d¦  «        }| dk    rdS | dk    r|r	 dS d|v sd|v rdS d	S | d
k    r|rdS dS | dk    rd}|r	|d|› d�z  }|S |r|S d| › d�S )Nrj   rM   zJSpotify authentication failed or expired. Run `hermes auth spotify` again.i“  z‰Spotify rejected this playback request. Playback control usually requires a Spotify Premium account and an active Spotify Connect device.ÚscopeÚ
permissionz�Spotify rejected the request because the current auth scope is insufficient. Re-run `hermes auth spotify` to refresh permissions.zRSpotify rejected the request. The account may not have permission for this action.i”  zTSpotify could not find an active playback device or player session for this request.zSpotify resource not found.i­  zSpotify rate limit exceeded.z Retry after z	 seconds.z'Spotify API request failed with status ú.)r�   Ú
startswith)r   r\   rG   r&   r]   Únormalized_detailÚis_playback_pathr   s           r   r_   r_   S  só   € ð Ÿš™œÐØ—’ |Ñ4Ô4Ðà�cÒÐØ[Ð[à�cÒÐØð 	ð8ðð ð Ð'Ð'Ð'¨<Ð;LÐ+LÐ+Lð Wð  WØcÐcà�cÒÐØð 	jØiÐiØ,Ð,à�cÒÐØ0ˆØð 	>ØÐ= {Ð=Ð=Ð=Ñ=ˆGØˆàð ØˆØC°[ÐCÐCÐCÐCr   rî   rH   r4   c                óF   — | si S d„ |                       ¦   «         D ¦   «         S )Nc                ó   — i | ]
\  }}|®||“ŒS r#   r   )r¿   ÚkeyÚvalues      r   ú
<dictcomp>z_strip_none.<locals>.<dictcomp>~  s#   € ÐNÐNÐN™:˜3 ¸EÐ<MˆC�Ð<MÐ<MÐ<Mr   )rÁ   )rî   s    r   rT   rT   {  s+   € Øð Øˆ	ØNÐN¨¯ª©¬ÐNÑNÔNÐNr   rú   Úexpected_typec                ó  — | pd                      ¦   «         }|st          d¦  «        ‚|                     d¦  «        rV|                     d¦  «        }t	          |¦  «        dk    r.|d         }|r||k    rt          d|› d|› d	�¦  «        ‚|d
         S d|v rvt          |¦  «        }d„ |j                             d¦  «        D ¦   «         }t	          |¦  «        d
k    r0|d         |d         }}|r||k    rt          d|› d|› d	�¦  «        ‚|S |S )Nr9   zSpotify id/uri/url is required.úspotify:ú:é   é   úExpected a Spotify ú, got ró   é   zopen.spotify.comc                ó   — g | ]}|¯|‘ŒS r   r   )r¿   Úparts     r   rÀ   z(normalize_spotify_id.<locals>.<listcomp>Ž  s   € ÐFÐFÐF˜tÀÐF�dÐFÐFÐFr   r:   r   )r^   r   rô   ÚsplitÚlenr   r&   )rú   rü   ÚcleanedÚpartsÚ	item_typeÚparsedÚ
path_partsÚitem_ids           r   Únormalize_spotify_idr  �  sG  € Øˆ{˜×!Ò!Ñ#Ô#€GØð >ÝÐ<Ñ=Ô=Ð=Ø×Ò˜*Ñ%Ô%ð Ø—’˜cÑ"Ô"ˆÝˆu‰:Œ:˜Š?ˆ?Ø˜aœˆIØð \ ¨mÒ!;Ð!;Ý"Ð#Z¸Ð#ZÐ#ZÈiÐ#ZÐ#ZÐ#ZÑ[Ô[Ð[Ø˜”8ˆOØ˜WÐ$Ð$Ý˜'Ñ"Ô"ˆØFÐF v¤{×'8Ò'8¸Ñ'=Ô'=ÐFÑFÔFˆ
Ýˆz‰?Œ?˜aÒÐØ!+¨A¤°
¸1´�wˆIØð \ ¨mÒ!;Ð!;Ý"Ð#Z¸Ð#ZÐ#ZÈiÐ#ZÐ#ZÐ#ZÑ[Ô[Ð[ØˆNØ€Nr   c                óZ  — | pd                      ¦   «         }|st          d¦  «        ‚|                     d¦  «        rT|rP|                     d¦  «        }t	          |¦  «        dk    r(|d         |k    rt          d|› d|d         › d	�¦  «        ‚|S t          ||¦  «        }|rd|› d|› �S |S )
Nr9   zSpotify URI/url/id is required.rþ   rÿ   r   r  r  r  ró   )r^   r   rô   r  r  r  )rú   rü   r	  r
  r  s        r   Únormalize_spotify_urir  —  sÙ   € Øˆ{˜×!Ò!Ñ#Ô#€GØð >ÝÐ<Ñ=Ô=Ð=Ø×Ò˜*Ñ%Ô%ð Øð 	[Ø—M’M #Ñ&Ô&ˆEÝ�5‰zŒz˜QŠˆ 5¨¤8¨}Ò#<Ð#<Ý"Ð#Y¸Ð#YÐ#YÈeÐTUÌhÐ#YÐ#YÐ#YÑZÔZÐZØˆÝ" 7¨MÑ:Ô:€GØð 4Ø3˜-Ð3Ð3¨'Ð3Ð3Ð3Ø€Nr   ÚvaluesúIterable[str]rŸ   c                ó¢   — g }| D ]8}t          t          |¦  «        |¦  «        }||vr|                     |¦  «         Œ9|st          d¦  «        ‚|S )Nz&At least one Spotify item is required.)r  r   Úappendr   )r  rü   rw   rú   r—   s        r   Únormalize_spotify_urisr  §  sd   € Ø€DØð ð ˆÝ#¥C¨¡J¤J°Ñ>Ô>ˆØ�dˆ?ˆ?Ø�KŠK˜ÑÔÐøØð EÝÐCÑDÔDÐDØ€Kr   Údatar   c                ó.   — t          j        | d¬¦  «        S )NF)Úensure_ascii)rK   Údumps)r  s    r   Úcompact_jsonr  ²  s   € ÝŒ:�d¨Ð/Ñ/Ô/Ð/r   )rX   rY   r[   r   r    r   )r   r†   r\   r   rG   r   r&   r   r]   r   r    r   )rî   rH   r    r4   r#   )rú   r   rü   r   r    r   )r  r  rü   r   r    rŸ   )r  r   r    r   )r   Ú
__future__r   rK   Útypingr   r   r   r   Úurllib.parser   rR   Úhermes_cli.authr	   r
   ÚRuntimeErrorr   r   r   r+   r`   r_   rT   r  r  r  r  r   r   r   ú<module>r!     sò  ðØ >Ð >à "Ð "Ð "Ð "Ð "Ð "à €€€Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø !Ð !Ð !Ð !Ð !Ð !à €€€ðð ð ð ð ð ð ð ð#ð #ð #ð #ð #�<ñ #ô #ð #ðIð Ið Ið Ið I˜|ñ Iô Ið Iðð ð ð ð �lñ ô ð ð Xð Xð Xð Xð Xñ Xô Xð Xðvð ð ð ð%Dð %Dð %Dð %DðPOð Oð Oð Oðð ð ð ð ð,ð ð ð ð ð ð ð ð ð ð0ð 0ð 0ð 0ð 0ð 0r   