§
    øžyjŽL  ã                  óÆ  — d Z ddlmZ ddlmZmZ ddlmZ ddlm	Z	m
Z
mZmZmZmZmZ ddlmZmZ d_d	„Zd`d„Zdad„Zddddœdbd„Zdcddd„Zded„Zdfd"„Zdgd%„Zdgd&„Zdgd'„Zdgd(„Zdgd)„Zdgd*„Zdgd+„Z d,d-iZ!d.d/d0d-g d1¢d2œe!e!e!d3e!d4œd,d0id,d5id6d,d-id,d7igd8œd,d5id5d9d:œd5d;d:œd5d<d:œd=œd gd>œd?œZ"d@dAd0d-dBdCgd2œe!d,d7idDœd gd>œd?œZ#dEdFd0d-dGdHgd2œe!e!dIœd gd>œd?œZ$dJdKd0e!d3e!d4œe!d,d5id,d5ie!e!dLœdMgd>œd?œZ%dNdOd0d-g dP¢d2œe!e!d,d5id,d5ie!e!d,d7id,d7id3e!d4œd,d5ie!dQœd gd>œd?œZ&dRdSd0d-dGdTgd2œe!e!e!d,d5id,d5idUœd gd>œd?œZ'dVdWd0d-dTdXgdYdZœd-g d[¢d2œd,d5id,d5ie!d3e!d4œd3e!d4œd3e!d4œd\œd]d gd>œd?œZ(d^S )hzANative Spotify tools for Hermes (registered via plugins/spotify).é    )Úannotations)ÚAnyÚList)Úget_auth_status)ÚSpotifyAPIErrorÚSpotifyAuthRequiredErrorÚSpotifyClientÚSpotifyErrorÚnormalize_spotify_idÚnormalize_spotify_uriÚnormalize_spotify_uris)Ú
tool_errorÚtool_resultÚreturnÚboolc                 ó„   — 	 t          t          d¦  «                             d¦  «        ¦  «        S # t          $ r Y dS w xY w)NÚspotifyÚ	logged_inF)r   r   ÚgetÚ	Exception© ó    ú;/home/ragecks/.hermes/hermes-agent/plugins/spotify/tools.pyÚ_check_spotify_availabler      sM   € ðÝ•O IÑ.Ô.×2Ò2°;Ñ?Ô?Ñ@Ô@Ð@øÝð ð ð Øˆuˆuðøøøs   ‚.1 ±
?¾?r	   c                 ó   — t          ¦   «         S ©N)r	   r   r   r   Ú_spotify_clientr      s   € Ý‰?Œ?Ðr   Úexcr   Ústrc                ó0  — t          | t          t          f¦  «        rt          t	          | ¦  «        ¦  «        S t          | t
          ¦  «        r#t          t	          | ¦  «        | j        ¬¦  «        S t          dt          | ¦  «        j        › d| › �¦  «        S )N)Ústatus_codezSpotify tool failed: z: )	Ú
isinstancer
   r   r   r   r   r!   ÚtypeÚ__name__)r   s    r   Ú_spotify_tool_errorr%      s„   € Ý�#�Õ&>Ð?Ñ@Ô@ð $Ý�#˜c™(œ(Ñ#Ô#Ð#Ý�#•Ñ'Ô'ð AÝ�#˜c™(œ(°´Ð@Ñ@Ô@Ð@ÝÐI­d°3©i¬iÔ.@ÐIÐIÀCÐIÐIÑJÔJÐJr   é   é   é2   )ÚdefaultÚminimumÚmaximumÚrawr   r)   Úintr*   r+   c               ó„   — 	 t          | ¦  «        }n# t          $ r |}Y nw xY wt          |t          ||¦  «        ¦  «        S r   )r-   r   ÚmaxÚmin)r,   r)   r*   r+   Úvalues        r   Ú_coerce_limitr2   '   sR   € ðÝ�C‘”ˆˆøÝð ð ð Øˆˆˆðøøøåˆw�˜G UÑ+Ô+Ñ,Ô,Ð,s   ‚ ’! !Fc                óÂ   — t          | t          ¦  «        r| S t          | t          ¦  «        r2|                      ¦   «                              ¦   «         }|dv rdS |dv rdS |S )N>   Ú1ÚonÚyesÚtrueT>   Ú0ÚnoÚoffÚfalseF)r"   r   r   ÚstripÚlower)r,   r)   Úcleaneds      r   Ú_coerce_boolr?   /   sk   € Ý�#•tÑÔð Øˆ
Ý�#•sÑÔð Ø—)’)‘+”+×#Ò#Ñ%Ô%ˆØÐ0Ð0Ð0Ø�4ØÐ1Ð1Ð1Ø�5Ø€Nr   ú	List[str]c                óÖ   — | €g S t          | t          ¦  «        rd„ | D ¦   «         S t          | ¦  «                             ¦   «         r"t          | ¦  «                             ¦   «         gng S )Nc                ó’   — g | ]D}t          |¦  «                             ¦   «         ¯#t          |¦  «                             ¦   «         ‘ŒES r   )r   r<   )Ú.0Úitems     r   ú
<listcomp>z_as_list.<locals>.<listcomp>?   s=   € ÐGÐGÐG dµS¸±Y´Y·_²_Ñ5FÔ5FÐG•�D‘	”	—’Ñ!Ô!ÐGÐGÐGr   )r"   Úlistr   r<   )r,   s    r   Ú_as_listrG   ;   sf   € Ø
€{Øˆ	Ý�#•tÑÔð HØGÐG¨cÐGÑGÔGÐGÝ!$ S¡¤§¢Ñ!1Ô!1Ð9�C�‰HŒH�NŠNÑÔÐÐ°rÐ9r   ÚpayloadÚactionúdict | Nonec               ó:  — t          | t          ¦  «        r|                      d¦  «        sd S |dk    r1d|d|                      dd¦  «        |                      d¦  «        pdd	œS |d
k    r1d|d|                      dd¦  «        |                      d¦  «        pddœS d S )NÚemptyÚget_currently_playingTFr!   éÌ   Úmessagez*Spotify is not currently playing anything.)ÚsuccessrI   Ú
is_playingr!   rO   Ú	get_statez-No active Spotify playback session was found.)rP   rI   Úhas_active_devicer!   rO   )r"   Údictr   )rH   rI   s     r   Ú_describe_empty_playbackrU   C   sÈ   € Ý�g�tÑ$Ô$ð ¨G¯KªK¸Ñ,@Ô,@ð ØˆtØÐ(Ò(Ð(àØØØ"Ÿ;š; }°cÑ:Ô:Ø—{’{ 9Ñ-Ô-Ð]Ð1]ð
ð 
ð 	
ð �ÒÐàØØ!&Ø"Ÿ;š; }°cÑ:Ô:Ø—{’{ 9Ñ-Ô-Ð`Ð1`ð
ð 
ð 	
ð ˆ4r   ÚargsrT   c                ó~  — t          |                      d¦  «        pd¦  «                             ¦   «                              ¦   «         }t	          ¦   «         }	 |dk    rK|                     |                      d¦  «        ¬¦  «        }t          ||¬¦  «        }t          |p|¦  «        S |dk    rK|                     |                      d¦  «        ¬¦  «        }t          ||¬¦  «        }t          |p|¦  «        S |dk    �rƒ|                      d¦  «        }t          |t          ¦  «        rd	„ |                     ¦   «         D ¦   «         }nd }|                      d
¦  «        r0t          t          |                      d
¦  «        ¦  «        d¦  «        nd }d }	|                      d¦  «        r‡t          |                      d¦  «        ¦  «        }
d }|
                     d¦  «        sd|
v rd}n7|
                     d¦  «        sd|
v rd}n|
                     d¦  «        sd|
v rd}t          |
|¦  «        }	|                     |                      d¦  «        |	|||                      d¦  «        ¬¦  «        }t          d||dœ¦  «        S |dk    r<|                     |                      d¦  «        ¬¦  «        }t          d||dœ¦  «        S |dk    r<|                     |                      d¦  «        ¬¦  «        }t          d||dœ¦  «        S |dk    r<|                     |                      d¦  «        ¬¦  «        }t          d||dœ¦  «        S |dk    rt|                      d¦  «        €t)          d ¦  «        S |                     t-          | d         ¦  «        |                      d¦  «        ¬!¦  «        }t          d||dœ¦  «        S |d"k    r˜t          |                      d#¦  «        pd$¦  «                             ¦   «                              ¦   «         }|d%vrt)          d&¦  «        S |                     ||                      d¦  «        ¬'¦  «        }t          d||dœ¦  «        S |d(k    r]|                     t3          |                      d#¦  «        ¦  «        |                      d¦  «        ¬'¦  «        }t          d||dœ¦  «        S |d)k    r�|                      d*¦  «        €t)          d+¦  «        S |                     t7          d,t9          d-t-          | d*         ¦  «        ¦  «        ¦  «        |                      d¦  «        ¬.¦  «        }t          d||dœ¦  «        S |d/k    r¦|                      d0¦  «        }|                      d1¦  «        }|r|rt)          d2¦  «        S t          |                     t=          |                      d3¦  «        d4¬5¦  «        |�t-          |¦  «        nd |�t-          |¦  «        nd ¬6¦  «        ¦  «        S t)          d7|› �¦  «        S # t>          $ r}tA          |¦  «        cY d }~S d }~ww xY w)8NrI   rR   Úmarket)rX   )rI   rM   ÚplayÚoffsetc                ó   — i | ]
\  }}|®||“ŒS r   r   )rC   ÚkÚvs      r   ú
<dictcomp>z,_handle_spotify_playback.<locals>.<dictcomp>h   s   € Ð!SÐ!SÐ!S©4¨1¨aÀQÀ] ! QÀ]À]À]r   ÚurisÚtrackÚcontext_urizspotify:album:z/album/Úalbumzspotify:playlist:z
/playlist/Úplaylistzspotify:artist:z/artist/ÚartistÚ	device_idÚposition_ms)re   ra   r_   rZ   rf   T©rP   rI   ÚresultÚpause)re   ÚnextÚpreviousÚseekz)position_ms is required for action='seek')rf   re   Ú
set_repeatÚstateÚ >   r:   r`   Úcontextz)state must be one of: track, context, off)rn   re   Úset_shuffleÚ
set_volumeÚvolume_percentz2volume_percent is required for action='set_volume'r   éd   )rs   re   Úrecently_playedÚafterÚbeforez'Provide only one of 'after' or 'before'Úlimitr&   ©r)   )rx   rv   rw   z!Unknown spotify_playback action: )!r   r   r<   r=   r   Úget_playback_staterU   r   rM   r"   rT   Úitemsr   rG   Ú
startswithr   Ústart_playbackÚpause_playbackÚ	skip_nextÚskip_previousr   rl   r-   rm   rq   r?   rr   r/   r0   Úget_recently_playedr2   r   r%   )rV   ÚkwrI   ÚclientrH   Úempty_resultrZ   Úpayload_offsetr_   ra   Úraw_contextÚcontext_typerh   rn   rv   rw   r   s                    r   Ú_handle_spotify_playbackrˆ   Y   s  € Ý�—’˜(Ñ#Ô#Ð2 {Ñ3Ô3×9Ò9Ñ;Ô;×AÒAÑCÔC€FÝÑÔ€FðK(Ø�[Ò Ð Ø×/Ò/°t·x²xÀÑ7IÔ7IÐ/ÑJÔJˆGÝ3°GÀFÐKÑKÔKˆLÝ˜|Ð6¨wÑ7Ô7Ð7ØÐ,Ò,Ð,Ø×2Ò2¸$¿(º(À8Ñ:LÔ:LÐ2ÑMÔMˆGÝ3°GÀFÐKÑKÔKˆLÝ˜|Ð6¨wÑ7Ô7Ð7Ø�VÒÑØ—X’X˜hÑ'Ô'ˆFÝ˜&¥$Ñ'Ô'ð &Ø!SÐ!S°6·<²<±>´>Ð!SÑ!SÔ!S��à!%�ØRV×RZÒRZÐ[aÑRbÔRbÐlÕ)­(°4·8²8¸FÑ3CÔ3CÑ*DÔ*DÀgÑNÔNÐNÐhlˆDØˆKØ�xŠx˜Ñ&Ô&ð 	OÝ! $§(¢(¨=Ñ"9Ô"9Ñ:Ô:�Ø#�Ø×)Ò)Ð*:Ñ;Ô;ð ,¸yÈKÐ?WÐ?WØ#*�L�LØ ×+Ò+Ð,?Ñ@Ô@ð ,ÀLÐT_ÐD_ÐD_Ø#-�L�LØ ×+Ò+Ð,=Ñ>Ô>ð ,À*ÐP[ÐB[ÐB[Ø#+�LÝ3°KÀÑNÔN�Ø×*Ò*ØŸ(š( ;Ñ/Ô/Ø'ØØ%Ø ŸHšH ]Ñ3Ô3ð +ñ ô ˆFõ ¨4¸6ÈVÐTÐTÑUÔUÐUØ�WÒÐØ×*Ò*°T·X²X¸kÑ5JÔ5JÐ*ÑKÔKˆFÝ¨4¸6ÈVÐTÐTÑUÔUÐUØ�VÒÐØ×%Ò%°·²¸Ñ0EÔ0EÐ%ÑFÔFˆFÝ¨4¸6ÈVÐTÐTÑUÔUÐUØ�ZÒÐØ×)Ò)°D·H²H¸[Ñ4IÔ4IÐ)ÑJÔJˆFÝ¨4¸6ÈVÐTÐTÑUÔUÐUØ�VÒÐØ�xŠx˜Ñ&Ô&Ð.Ý!Ð"MÑNÔNÐNØ—[’[­S°°mÔ1DÑ-EÔ-EÐQU×QYÒQYÐZeÑQfÔQf�[ÑgÔgˆFÝ¨4¸6ÈVÐTÐTÑUÔUÐUØ�\Ò!Ð!Ý˜Ÿš Ñ)Ô)Ð/¨RÑ0Ô0×6Ò6Ñ8Ô8×>Ò>Ñ@Ô@ˆEØÐ7Ð7Ð7Ý!Ð"MÑNÔNÐNØ×&Ò&¨U¸d¿hºhÀ{Ñ>SÔ>SÐ&ÑTÔTˆFÝ¨4¸6ÈVÐTÐTÑUÔUÐUØ�]Ò"Ð"Ø×'Ò'­l¸4¿8º8ÀGÑ;LÔ;LÑ.MÔ.MÐY]×YaÒYaÐbmÑYnÔYnÐ'ÑoÔoˆFÝ¨4¸6ÈVÐTÐTÑUÔUÐUØ�\Ò!Ð!Ø�xŠxÐ(Ñ)Ô)Ð1Ý!Ð"VÑWÔWÐWØ×&Ò&µc¸!½SÀÅcÈ$ÐO_ÔJ`ÑFaÔFaÑ=bÔ=bÑ6cÔ6cÐos×owÒowð  yDñ  pEô  pEÐ&ñ  Fô  FˆFÝ¨4¸6ÈVÐTÐTÑUÔUÐUØÐ&Ò&Ð&Ø—H’H˜WÑ%Ô%ˆEØ—X’X˜hÑ'Ô'ˆFØð M˜ð MÝ!Ð"KÑLÔLÐLÝ˜v×9Ò9Ý# D§H¢H¨WÑ$5Ô$5¸rÐBÑBÔBØ$)Ð$5•c˜%‘j”j�j¸4Ø&,Ð&8•s˜6‘{”{�{¸dð  :ñ  ô  ñ ô ð õ
 ÐF¸fÐFÐFÑGÔGÐGøÝð (ð (ð (Ý" 3Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'øøøøð(øøøs„   ÁAX Â)AX Ã:F	X ÊAX ËAX ÌAX Í
)X Í4AX ÏA X Ð%<X Ñ"A"X Ó)X Ó/A+X ÕAX ÖA(X ØX Ø
X<Ø#X7Ø1X<Ø7X<c                óœ  — t          |                      d¦  «        pd¦  «                             ¦   «                              ¦   «         }t	          ¦   «         }	 |dk    r!t          |                     ¦   «         ¦  «        S |dk    r‘t          |                      d¦  «        pd¦  «                             ¦   «         }|st          d¦  «        S |                     |t          |                      d¦  «        ¦  «        ¬¦  «        }t          d	||d
œ¦  «        S t          d|› �¦  «        S # t          $ r}t          |¦  «        cY d }~S d }~ww xY w)NrI   rF   Útransferre   ro   z+device_id is required for action='transfer'rY   )re   rY   Trg   z Unknown spotify_devices action: )r   r   r<   r=   r   r   Úget_devicesr   Útransfer_playbackr?   r   r%   )rV   r‚   rI   rƒ   re   rh   r   s          r   Ú_handle_spotify_devicesr�   ª   sU  € Ý�—’˜(Ñ#Ô#Ð- vÑ.Ô.×4Ò4Ñ6Ô6×<Ò<Ñ>Ô>€FÝÑÔ€Fð(Ø�VÒÐÝ˜v×1Ò1Ñ3Ô3Ñ4Ô4Ð4Ø�ZÒÐÝ˜DŸHšH [Ñ1Ô1Ð7°RÑ8Ô8×>Ò>Ñ@Ô@ˆIØð QÝ!Ð"OÑPÔPÐPØ×-Ò-¸	ÍÐUY×U]ÒU]Ð^dÑUeÔUeÑHfÔHfÐ-ÑgÔgˆFÝ¨4¸6ÈVÐTÐTÑUÔUÐUÝÐE¸VÐEÐEÑFÔFÐFøÝð (ð (ð (Ý" 3Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'øøøøð(øøøs2   Á&D( Á?AD( ÃA	D( ÄD( Ä(
EÄ2EÅ EÅEc                óZ  — t          |                      d¦  «        pd¦  «                             ¦   «                              ¦   «         }t	          ¦   «         }	 |dk    r!t          |                     ¦   «         ¦  «        S |dk    rpt          t          |                      d¦  «        pd¦  «        d ¦  «        }|                     ||                      d¦  «        ¬¦  «        }t          d|||d	œ¦  «        S t          d
|› �¦  «        S # t          $ r}t          |¦  «        cY d }~S d }~ww xY w)NrI   r   ÚaddÚuriro   re   )r�   re   T)rP   rI   r�   rh   zUnknown spotify_queue action: )r   r   r<   r=   r   r   Ú	get_queuer   Úadd_to_queuer   r   r%   )rV   r‚   rI   rƒ   r�   rh   r   s          r   Ú_handle_spotify_queuer“   »   s,  € Ý�—’˜(Ñ#Ô#Ð, uÑ-Ô-×3Ò3Ñ5Ô5×;Ò;Ñ=Ô=€FÝÑÔ€Fð	(Ø�UŠ?ˆ?Ý˜v×/Ò/Ñ1Ô1Ñ2Ô2Ð2Ø�UŠ?ˆ?Ý'­¨D¯HªH°U©O¬OÐ,A¸rÑ(BÔ(BÀDÑIÔIˆCØ×(Ò(¨S¸D¿HºHÀ[Ñ<QÔ<QÐ(ÑRÔRˆFÝ¨4¸6È#ÐY_Ð`Ð`ÑaÔaÐaÝÐC¸6ÐCÐCÑDÔDÐDøÝð (ð (ð (Ý" 3Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'øøøøð(øøøs+   Á&D Á?A5D Ã5D Ä
D*ÄD%ÄD*Ä%D*c                óè  — t          ¦   «         }t          |                      d¦  «        pd¦  «                             ¦   «         }|st	          d¦  «        S t          |                      d¦  «        p|                      d¦  «        pdg¦  «        }d„ |D ¦   «         }|st	          d¦  «        S 	 t          |                     ||t          |                      d	¦  «        d
¬¦  «        t          dt          |                      d¦  «        pd¦  «        ¦  «        |                      d¦  «        |                      d¦  «        ¬¦  «        ¦  «        S # t          $ r}t          |¦  «        cY d }~S d }~ww xY w)NÚqueryro   zquery is requiredÚtypesr#   r`   c                ób   — g | ],}|                      ¦   «         d v ¯|                      ¦   «         ‘Œ-S )>   Úshowrb   r`   rd   Úepisoderc   Ú	audiobook)r=   )rC   r1   s     r   rE   z*_handle_spotify_search.<locals>.<listcomp>Ð   sO   € ð  Wð  Wð  W e¸E¿KºK¹M¼Mð  NVð  =Vð  =V�E—K’K‘M”Mð  =Vð  =Vð  =Vr   z[types must contain one or more of: album, artist, playlist, track, show, episode, audiobookrx   é
   ry   r   rZ   rX   Úinclude_external)r•   Úsearch_typesrx   rZ   rX   rœ   )r   r   r   r<   r   rG   r   Úsearchr2   r/   r-   r   r%   )rV   r‚   rƒ   r•   Ú	raw_typesr�   r   s          r   Ú_handle_spotify_searchr    Ê   sŠ  € ÝÑÔ€FÝ�—’˜Ñ!Ô!Ð' RÑ(Ô(×.Ò.Ñ0Ô0€EØð /ÝÐ-Ñ.Ô.Ð.Ý˜Ÿš 'Ñ*Ô*ÐK¨d¯hªh°vÑ.>Ô.>ÐKÀ7À)ÑLÔL€Ið Wð  W¨yð  Wñ  Wô  W€LØð yÝÐwÑxÔxÐxð
(Ý˜6Ÿ=š=ØØ%Ý §¢¨Ñ 1Ô 1¸2Ð>Ñ>Ô>Ý�q�#˜dŸhšh xÑ0Ô0Ð5°AÑ6Ô6Ñ7Ô7Ø—8’8˜HÑ%Ô%Ø!ŸXšXÐ&8Ñ9Ô9ð )ñ 
ô 
ñ ô ð 	øõ ð (ð (ð (Ý" 3Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'øøøøð(øøøs   Â.BE Å
E1ÅE,Å&E1Å,E1c                óT  — t          |                      d¦  «        pd¦  «                             ¦   «                              ¦   «         }t	          ¦   «         }	 |dk    rvt          |                     t          |                      d¦  «        d¬¦  «        t          dt          |                      d¦  «        pd¦  «        ¦  «        ¬¦  «        ¦  «        S |d	k    rit          t          |                      d
¦  «        pd¦  «        d¦  «        }t          |                     ||                      d¦  «        ¬¦  «        ¦  «        S |dk    rÀt          |                      d¦  «        pd¦  «                             ¦   «         }|st          d¦  «        S t          |                     |t          |                      d¦  «        ¦  «        t          |                      d¦  «        ¦  «        |                      d¦  «        ¬¦  «        ¦  «        S |dk    r™t          t          |                      d
¦  «        pd¦  «        d¦  «        }t          t!          |                      d¦  «        ¦  «        ¦  «        }t          |                     |||                      d¦  «        ¬¦  «        ¦  «        S |dk    r™t          t          |                      d
¦  «        pd¦  «        d¦  «        }t          t!          |                      d¦  «        ¦  «        ¦  «        }t          |                     |||                      d¦  «        ¬¦  «        ¦  «        S |dk    r¥t          t          |                      d
¦  «        pd¦  «        d¦  «        }t          |                     ||                      d¦  «        |                      d¦  «        |                      d¦  «        |                      d¦  «        ¬¦  «        ¦  «        S t          d|› �¦  «        S # t(          $ r}t+          |¦  «        cY d }~S d }~ww xY w) NrI   rF   rx   r&   ry   r   rZ   )rx   rZ   r   Úplaylist_idro   rc   rX   )r¢   rX   ÚcreateÚnamez$name is required for action='create'ÚpublicÚcollaborativeÚdescription)r¤   r¥   r¦   r§   Ú	add_itemsr_   Úposition)r¢   r_   r©   Úremove_itemsÚsnapshot_id)r¢   r_   r«   Úupdate_details)r¢   r¤   r¥   r¦   r§   z"Unknown spotify_playlists action: )r   r   r<   r=   r   r   Úget_my_playlistsr2   r/   r-   r   Úget_playlistr   Úcreate_playlistr?   r   rG   Úadd_playlist_itemsÚremove_playlist_itemsÚupdate_playlist_detailsr   r%   )rV   r‚   rI   rƒ   r¢   r¤   r_   r   s           r   Ú_handle_spotify_playlistsr³   à   s÷  € Ý�—’˜(Ñ#Ô#Ð- vÑ.Ô.×4Ò4Ñ6Ô6×<Ò<Ñ>Ô>€FÝÑÔ€Fð.(Ø�VÒÐÝ˜v×6Ò6Ý# D§H¢H¨WÑ$5Ô$5¸rÐBÑBÔBÝ˜1�c $§(¢(¨8Ñ"4Ô"4Ð"9¸Ñ:Ô:Ñ;Ô;ð  7ñ  ô  ñ ô ð ð �UŠ?ˆ?Ý.­s°4·8²8¸MÑ3JÔ3JÐ3PÈbÑ/QÔ/QÐS]Ñ^Ô^ˆKÝ˜v×2Ò2¸{ÐSW×S[ÒS[Ð\dÑSeÔSeÐ2ÑfÔfÑgÔgÐgØ�XÒÐÝ�t—x’x Ñ'Ô'Ð-¨2Ñ.Ô.×4Ò4Ñ6Ô6ˆDØð JÝ!Ð"HÑIÔIÐIÝ˜v×5Ò5ØÝ# D§H¢H¨XÑ$6Ô$6Ñ7Ô7Ý*¨4¯8ª8°OÑ+DÔ+DÑEÔEØ ŸHšH ]Ñ3Ô3ð	  6ñ  ô  ñ ô ð ð �[Ò Ð Ý.­s°4·8²8¸MÑ3JÔ3JÐ3PÈbÑ/QÔ/QÐS]Ñ^Ô^ˆKÝ)­(°4·8²8¸FÑ3CÔ3CÑ*DÔ*DÑEÔEˆDÝ˜v×8Ò8Ø'ØØŸš *Ñ-Ô-ð  9ñ  ô  ñ ô ð ð
 �^Ò#Ð#Ý.­s°4·8²8¸MÑ3JÔ3JÐ3PÈbÑ/QÔ/QÐS]Ñ^Ô^ˆKÝ)­(°4·8²8¸FÑ3CÔ3CÑ*DÔ*DÑEÔEˆDÝ˜v×;Ò;Ø'ØØ ŸHšH ]Ñ3Ô3ð  <ñ  ô  ñ ô ð ð
 Ð%Ò%Ð%Ý.­s°4·8²8¸MÑ3JÔ3JÐ3PÈbÑ/QÔ/QÐS]Ñ^Ô^ˆKÝ˜v×=Ò=Ø'Ø—X’X˜fÑ%Ô%Ø—x’x Ñ)Ô)Ø"Ÿhšh Ñ7Ô7Ø ŸHšH ]Ñ3Ô3ð  >ñ  ô  ñ ô ð õ ÐG¸vÐGÐGÑHÔHÐHøÝð (ð (ð (Ý" 3Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'øøøøð(øøøsO   ÁA;P ÃA.P ÅAP ÆA8P È	BP Ê(BP ÍB*P Ï2P Ð
P'ÐP"ÐP'Ð"P'c                óJ  — t          |                      d¦  «        pd¦  «                             ¦   «                              ¦   «         }t	          ¦   «         }	 t          t          |                      d¦  «        p|                      d¦  «        pd¦  «        d¦  «        }|dk    r7t          |                     ||                      d¦  «        ¬¦  «        ¦  «        S |d	k    r‹t          |                     |t          |                      d
¦  «        d¬¦  «        t          dt          |                      d¦  «        pd¦  «        ¦  «        |                      d¦  «        ¬¦  «        ¦  «        S t          d|› �¦  «        S # t          $ r}t          |¦  «        cY d }~S d }~ww xY w)NrI   r   Úalbum_idÚidro   rb   rX   )rµ   rX   Útracksrx   r&   ry   r   rZ   )rµ   rx   rZ   rX   zUnknown spotify_albums action: )r   r   r<   r=   r   r   r   Ú	get_albumÚget_album_tracksr2   r/   r-   r   r   r%   )rV   r‚   rI   rƒ   rµ   r   s         r   Ú_handle_spotify_albumsrº     s•  € Ý�—’˜(Ñ#Ô#Ð, uÑ-Ô-×3Ò3Ñ5Ô5×;Ò;Ñ=Ô=€FÝÑÔ€Fð(Ý'­¨D¯HªH°ZÑ,@Ô,@Ð,XÀDÇHÂHÈTÁNÄNÐ,XÐVXÑ(YÔ(YÐ[bÑcÔcˆØ�UŠ?ˆ?Ý˜v×/Ò/¸È$Ï(Ê(ÐS[ÑJ\ÔJ\Ð/Ñ]Ô]Ñ^Ô^Ð^Ø�XÒÐÝ˜v×6Ò6Ø!Ý# D§H¢H¨WÑ$5Ô$5¸rÐBÑBÔBÝ˜1�c $§(¢(¨8Ñ"4Ô"4Ð"9¸Ñ:Ô:Ñ;Ô;Ø—x’x Ñ)Ô)ð	  7ñ  ô  ñ ô ð õ ÐD¸FÐDÐDÑEÔEÐEøÝð (ð (ð (Ý" 3Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'øøøøð(øøøs,   ÁBE? ÃBE? Å-E? Å?
F"Æ	FÆF"ÆF"c                ó–  ‡— t          |                      d¦  «        pd¦  «                             ¦   «                              ¦   «         }|dvrt	          d¦  «        S t          |                      d¦  «        pd¦  «                             ¦   «                              ¦   «         }|dk    rdnd	Št          ¦   «         }	 |dk    r»t          |                      d
¦  «        d¬¦  «        }t          dt          |                      d¦  «        pd¦  «        ¦  «        }|                      d¦  «        }|dk    r%t          | 
                    |||¬¦  «        ¦  «        S t          |                     |||¬¦  «        ¦  «        S |dk    rht          t          |                      d¦  «        p|                      d¦  «        ¦  «        ‰¦  «        }t          |                     |¬¦  «        ¦  «        S |dk    r ˆfd„t          |                      d¦  «        p|                      d¦  «        ¦  «        D ¦   «         }	|	st	          d¦  «        S |dk    r#t          |                     |	¬¦  «        ¦  «        S t          |                     |	¬¦  «        ¦  «        S t	          d|› �¦  «        S # t"          $ r}
t%          |
¦  «        cY d}
~
S d}
~
ww xY w)zEUnified handler for saved tracks + saved albums (formerly two tools).Úkindro   >   Úalbumsr·   z#kind must be one of: tracks, albumsrI   rF   r·   r`   rb   rx   r&   ry   r   rZ   rX   )rx   rZ   rX   Úsaver_   r{   )r_   Úremovec                ó0   •— g | ]}t          |‰¦  «        ‘ŒS r   )r   )rC   rD   Ú	item_types     €r   rE   z+_handle_spotify_library.<locals>.<listcomp>;  s$   ø€ ÐtÐtÐt¸TÕ'¨¨iÑ8Ô8ÐtÐtÐtr   Úidsz)ids/items is required for action='remove')Ú	track_ids)Ú	album_idsz Unknown spotify_library action: N)r   r   r<   r=   r   r   r2   r/   r-   r   Úget_saved_tracksÚget_saved_albumsr   rG   Úsave_library_itemsÚremove_saved_tracksÚremove_saved_albumsr   r%   )rV   r‚   r¼   rI   rƒ   rx   rZ   rX   r_   rÂ   r   rÁ   s              @r   Ú_handle_spotify_libraryrÊ   '  sÂ  ø€ åˆt�xŠx˜ÑÔÐ% 2Ñ&Ô&×,Ò,Ñ.Ô.×4Ò4Ñ6Ô6€DØÐ'Ð'Ð'ÝÐ?Ñ@Ô@Ð@Ý�—’˜(Ñ#Ô#Ð- vÑ.Ô.×4Ò4Ñ6Ô6×<Ò<Ñ>Ô>€FØ 8Ò+Ð+��°€IÝÑÔ€Fð(Ø�VÒÐÝ! $§(¢(¨7Ñ"3Ô"3¸RÐ@Ñ@Ô@ˆEÝ˜�C §¢¨Ñ 2Ô 2Ð 7°aÑ8Ô8Ñ9Ô9ˆFØ—X’X˜hÑ'Ô'ˆFØ�xÒÐÝ" 6×#:Ò#:ÀÈvÐ^dÐ#:Ñ#eÔ#eÑfÔfÐfÝ˜v×6Ò6¸UÈ6ÐZ`Ð6ÑaÔaÑbÔbÐbØ�VÒÐÝ)­(°4·8²8¸FÑ3CÔ3CÐ3XÀtÇxÂxÐPWÑGXÔGXÑ*YÔ*YÐ[dÑeÔeˆDÝ˜v×8Ò8¸dÐ8ÑCÔCÑDÔDÐDØ�XÒÐØtÐtÐtÐtÅXÈdÏhÊhÐW\ÉoÌoÐNrÐae×aiÒaiÐjqÑarÔarÑEsÔEsÐtÑtÔtˆCØð OÝ!Ð"MÑNÔNÐNØ�xÒÐÝ" 6×#=Ò#=ÈÐ#=Ñ#LÔ#LÑMÔMÐMÝ˜v×9Ò9ÀCÐ9ÑHÔHÑIÔIÐIÝÐE¸VÐEÐEÑFÔFÐFøÝð (ð (ð (Ý" 3Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'øøøøð(øøøsE   Â>BJ% Å$J% Å?A-J% Ç-AJ% É(J% É0"J% ÊJ% Ê%
KÊ/KÊ=KËKr#   ÚstringÚspotify_playbackz]Control Spotify playback, inspect the active playback state, or fetch recently played tracks.Úobject)rR   rM   rY   ri   rj   rk   rl   rm   rq   rr   ru   )r#   ÚenumÚarray)r#   r{   ÚintegerzRFor set_repeat use track/context/off. For set_shuffle use boolean-like true/false.Úboolean)r§   ÚoneOfz.For recently_played: number of tracks (max 50))r#   r§   z:For recently_played: Unix ms cursor (after this timestamp)z;For recently_played: Unix ms cursor (before this timestamp))rI   re   rX   ra   r_   rZ   rf   rn   rs   rx   rv   rw   )r#   Ú
propertiesÚrequired)r¤   r§   Ú
parametersÚspotify_deviceszHList Spotify Connect devices or transfer playback to a different device.rF   rŠ   )rI   re   rY   Úspotify_queuez6Inspect the user's Spotify queue or add an item to it.r   r�   )rI   r�   re   Úspotify_searchzVSearch the Spotify catalog for tracks, albums, artists, playlists, shows, or episodes.)r•   r–   r#   rx   rZ   rX   rœ   r•   Úspotify_playlistsz<List, inspect, create, update, and modify Spotify playlists.)rF   r   r£   r¨   rª   r¬   )rI   r¢   rX   rx   rZ   r¤   r§   r¥   r¦   r_   r©   r«   Úspotify_albumsz-Fetch Spotify album metadata or album tracks.r·   )rI   rµ   r¶   rX   rx   rZ   Úspotify_libraryz\List, save, or remove the user's saved Spotify tracks or albums. Use `kind` to select which.r½   zWhich library to operate on)r#   rÎ   r§   )rF   r¾   r¿   )r¼   rI   rx   rZ   rX   r_   rÂ   r{   r¼   N)r   r   )r   r	   )r   r   r   r   )
r,   r   r)   r-   r*   r-   r+   r-   r   r-   )F)r,   r   r)   r   r   r   )r,   r   r   r@   )rH   r   rI   r   r   rJ   )rV   rT   r   r   ))Ú__doc__Ú
__future__r   Útypingr   r   Úhermes_cli.authr   Úplugins.spotify.clientr   r   r	   r
   r   r   r   Útools.registryr   r   r   r   r%   r2   r?   rG   rU   rˆ   r�   r“   r    r³   rº   rÊ   ÚCOMMON_STRINGÚSPOTIFY_PLAYBACK_SCHEMAÚSPOTIFY_DEVICES_SCHEMAÚSPOTIFY_QUEUE_SCHEMAÚSPOTIFY_SEARCH_SCHEMAÚSPOTIFY_PLAYLISTS_SCHEMAÚSPOTIFY_ALBUMS_SCHEMAÚSPOTIFY_LIBRARY_SCHEMAr   r   r   ú<module>rê      sN  ðØ GÐ Gà "Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ð Ð Ð Ð à +Ð +Ð +Ð +Ð +Ð +ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð 3Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2ðð ð ð ðð ð ð ðKð Kð Kð Kð /1ÀÐSUð -ð -ð -ð -ð -ð -ð	ð 	ð 	ð 	ð 	ð:ð :ð :ð :ðð ð ð ð,N(ð N(ð N(ð N(ðb(ð (ð (ð (ð"(ð (ð (ð (ð(ð (ð (ð (ð,1(ð 1(ð 1(ð 1(ðh(ð (ð (ð (ð&(ð (ð (ð (ð> ˜Ð"€ð Øràà'ð  2Cð  2Cð  2Cð  Dð  DØ&Ø#Ø(Ø$¨}Ð=Ð=Ø˜xÐ(Ø" IÐ.Ø%yð  GMð  OWð  FXð  [að  clð  Zmð  Enð  oð  oØ% yÐ1Ø'Ð8hÐiÐiØ'Ð8tÐuÐuØ(Ð9vÐwÐwð
ð 
ð �Jð!ð ðð Ð ð0 Ø]àà'°&¸*Ð1EÐFÐFØ&Ø˜YÐ'ð
ð 
ð
 �Jðð ðð Ð ð ØKàà'°%¸°Ð@Ð@Ø Ø&ð
ð 
ð
 �Jðð ðð Ð ð Økàà"Ø%°Ð>Ð>Ø!Ø˜iÐ(Ø˜yÐ)Ø#Ø -ð
ð 
ð �Iðð ðð Ð ð&  ØQàà'Ð1yÐ1yÐ1yÐzÐzØ(Ø#Ø˜iÐ(Ø˜yÐ)Ø!Ø(Ø˜yÐ)Ø$ iÐ0Ø$¨}Ð=Ð=Ø Ð+Ø(ð
ð 
ð �Jð!ð ðð Ð ð0 ØBàà'°%¸Ð1BÐCÐCØ%ØØ#Ø˜iÐ(Ø˜yÐ)ð
ð 
ð �Jðð ðð Ð ð$ Øqàà%°¸(Ð/CÐTqÐrÐrØ'Ð1KÐ1KÐ1KÐLÐLØ˜iÐ(Ø˜yÐ)Ø#Ø$¨}Ð=Ð=Ø#¨mÐ<Ð<Ø%°Ð>Ð>ð	
ð 	
ð ˜XÐ&ðð ðð Ð Ð Ð r   