§
    ‰eîi”L  ã                  óÊ  — d Z ddlmZ ddlmZ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ÚDictÚ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© ó    ú7/home/div/.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_limitr3   '   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_listrH   ;   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.)ÚsuccessrJ   Ú
is_playingr"   rP   Ú	get_statez-No active Spotify playback session was found.)rQ   rJ   Úhas_active_devicer"   rP   )r#   Údictr   )rI   rJ   s     r   Ú_describe_empty_playbackrV   C   sÈ   € Ý�g�tÑ$Ô$ð ¨G¯KªK¸Ñ,@Ô,@ð ØˆtØÐ(Ò(Ð(àØØØ"Ÿ;š; }°cÑ:Ô:Ø—{’{ 9Ñ-Ô-Ð]Ð1]ð
ð 
ð 	
ð �ÒÐàØØ!&Ø"Ÿ;š; }°cÑ:Ô:Ø—{’{ 9Ñ-Ô-Ð`Ð1`ð
ð 
ð 	
ð ˆ4r   ÚargsrU   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)8NrJ   rS   Úmarket)rY   )rJ   rN   ÚplayÚoffsetc                ó   — i | ]
\  }}|®||“ŒS r   r   )rD   Ú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)rf   rb   r`   r[   rg   T©rQ   rJ   ÚresultÚpause)rf   ÚnextÚpreviousÚseekz)position_ms is required for action='seek')rg   rf   Ú
set_repeatÚstateÚ >   r;   ra   Úcontextz)state must be one of: track, context, off)ro   rf   Úset_shuffleÚ
set_volumeÚvolume_percentz2volume_percent is required for action='set_volume'r   éd   )rt   rf   Úrecently_playedÚafterÚbeforez'Provide only one of 'after' or 'before'Úlimitr'   ©r*   )ry   rw   rx   z!Unknown spotify_playback action: )!r    r   r=   r>   r   Úget_playback_staterV   r   rN   r#   rU   Úitemsr   rH   Ú
startswithr   Ústart_playbackÚpause_playbackÚ	skip_nextÚskip_previousr   rm   r.   rn   rr   r@   rs   r0   r1   Úget_recently_playedr3   r   r&   )rW   ÚkwrJ   ÚclientrI   Úempty_resultr[   Úpayload_offsetr`   rb   Úraw_contextÚcontext_typeri   ro   rw   rx   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)NrJ   rG   Útransferrf   rp   z+device_id is required for action='transfer'rZ   )rf   rZ   Trh   z Unknown spotify_devices action: )r    r   r=   r>   r   r   Úget_devicesr   Útransfer_playbackr@   r   r&   )rW   rƒ   rJ   r„   rf   ri   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)NrJ   r   ÚaddÚurirp   rf   )r‘   rf   T)rQ   rJ   r‘   ri   zUnknown spotify_queue action: )r    r   r=   r>   r   r   Ú	get_queuer   Úadd_to_queuer   r   r&   )rW   rƒ   rJ   r„   r‘   ri   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Úqueryrp   zquery is requiredÚtypesr$   ra   c                ób   — g | ],}|                      ¦   «         d v ¯|                      ¦   «         ‘Œ-S )>   Úshowrc   ra   re   Úepisoderd   Ú	audiobook)r>   )rD   r2   s     r   rF   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, audiobookry   é
   rz   r   r[   rY   Úinclude_external)r–   Úsearch_typesry   r[   rY   r�   )r   r    r   r=   r   rH   r   Úsearchr3   r0   r.   r   r&   )rW   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) NrJ   rG   ry   r'   rz   r   r[   )ry   r[   r   Úplaylist_idrp   rd   rY   )r£   rY   Ú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_playlistsr3   r0   r.   r   Úget_playlistr   Úcreate_playlistr@   r   rH   Úadd_playlist_itemsÚremove_playlist_itemsÚupdate_playlist_detailsr   r&   )rW   rƒ   rJ   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)NrJ   r   Úalbum_idÚidrp   rc   rY   )r¶   rY   Útracksry   r'   rz   r   r[   )r¶   ry   r[   rY   zUnknown spotify_albums action: )r    r   r=   r>   r   r   r   Ú	get_albumÚget_album_tracksr3   r0   r.   r   r   r&   )rW   rƒ   rJ   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).Úkindrp   >   Úalbumsr¸   z#kind must be one of: tracks, albumsrJ   rG   r¸   ra   rc   ry   r'   rz   r   r[   rY   )ry   r[   rY   Úsaver`   r|   )r`   Úremovec                ó0   •— g | ]}t          |‰¦  «        ‘ŒS r   )r   )rD   rE   Ú	item_types     €r   rF   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   r3   r0   r.   r   Úget_saved_tracksÚget_saved_albumsr   rH   Úsave_library_itemsÚremove_saved_tracksÚremove_saved_albumsr   r&   )rW   rƒ   r½   rJ   r„   ry   r[   rY   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)rS   rN   rZ   rj   rk   rl   rm   rn   rr   rs   rv   )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))rJ   rf   rY   rb   r`   r[   rg   ro   rt   ry   rw   rx   )r$   Ú
propertiesÚrequired)r¥   r¨   Ú
parametersÚspotify_deviceszHList Spotify Connect devices or transfer playback to a different device.rG   r‹   )rJ   rf   rZ   Úspotify_queuez6Inspect the user's Spotify queue or add an item to it.r   r�   )rJ   r‘   rf   Úspotify_searchzVSearch the Spotify catalog for tracks, albums, artists, playlists, shows, or episodes.)r–   r—   r$   ry   r[   rY   r�   r–   Úspotify_playlistsz<List, inspect, create, update, and modify Spotify playlists.)rG   r   r¤   r©   r«   r­   )rJ   r£   rY   ry   r[   r¥   r¨   r¦   r§   r`   rª   r¬   Úspotify_albumsz-Fetch Spotify album metadata or album tracks.r¸   )rJ   r¶   r·   rY   ry   r[   Ú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¨   )rG   r¿   rÀ   )r½   rJ   ry   r[   rY   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   rA   )rI   r   rJ   r    r   rK   )rW   rU   r   r    )*Ú__doc__Ú
__future__r   Útypingr   r   r   Úhermes_cli.authr   Úplugins.spotify.clientr   r	   r
   r   r   r   r   Útools.registryr   r   r   r   r&   r3   r@   rH   rV   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ë      sT  ðØ 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   