
    i                         S r SSKrSSKrSSKJrJr  SSKJr  SSKJ	r	  SSK
r
SSKJr  SS	KJr  SS
KJr  SSKJr  SSKJr  SrSrSrSr\R2                  " \5      r " S S\5      r " S S\5      rg)z\
Controller to interface with the YouTube-app.
Use the media controller to play, pause etc.
    N)Anycast)YouTubeSession)HEADERS   )QuickPlayController   )MESSAGE_TYPE)RequestTimeout)CastMessage)APP_YOUTUBEz!urn:x-cast:com.google.youtube.mdxgetMdxSessionStatusmdxSessionStatusscreenIdc                   j   ^  \ rS rSrSrS\S\SS4U 4S jjr    SS\S	\S
\S\S\S\4S jjr	Sr
U =r$ )TimeoutYouTubeSession   zA youtube session with timeout.	screen_idtimeoutreturnNc                 0   > [         TU ]  U5        X l        g)zInitialize.N)super__init___TimeoutYouTubeSession__timeout)selfr   r   	__class__s      W/home/sebas/venvs/catt/lib/python3.13/site-packages/pychromecast/controllers/youtube.pyr   TimeoutYouTubeSession.__init__    s    #     urldataparamsheaderssession_requestc                 F   U(       a  0 [         EUEnO[         n[        R                  " XX#U R                  S9nUR                  S;   a  U(       a  U R                  5         UR                  5         U(       a  U =R                  S-  sl        U =R                  S-  sl        U$ )a  
Calls requests.post with custom headers,
 increments RID(request id) on every post.
will raise if response is not 200
:param url:(str) request url
:param data: (dict) the POST body
:param params:(dict) POST url params
:param headers:(dict) Additional headers for the request
:param session_request:(bool) True to increment session
 request counter(req_count)
:return: POST response
)r#   r!   r"   r   )i  i  r   )	r   requestspostr   status_code_bindraise_for_status
_req_count_rid)r   r    r!   r"   r#   r$   responses          r   _do_postTimeoutYouTubeSession._do_post%   s~    ( ,,G,GG==tDNN
 :-/JJL!!#OOq O		Q	r   )	__timeout)NNNF)__name__
__module____qualname____firstlineno____doc__strfloatr   r   r.   __static_attributes____classcell__r   s   @r   r   r      sr    )!# ! !$ ! $%% % 	%
 % % 
% %r   r   c                   *  ^  \ rS rSr% Sr\\S'   Sr\S-  \S'   SS\	SS4U 4S jjjr
SS	 jrS S
\S\S-  SS4S jjrS
\SS4S jrS
\SS4S jrS
\SS4S jrSS jrSS jrS\S\S\4S jrS\SS4S jrSSS.S\S\	S\S-  S\S\SS4S jjrSrU =r$ )!YouTubeControllerM   z$Controller to interact with Youtube._sessionN
_screen_idr   r   c                    > [         TU ]  [        [        5        [        R
                  " 5       U l        Xl        S U l        g N)	r   r   YOUTUBE_NAMESPACEr   	threadingEventstatus_update_event_timeoutr>   )r   r   r   s     r   r   YouTubeController.__init__S   s.    *K8#,??#4 r   c                     U R                   (       a  U R                  (       dB  U R                  5         [        [	        [
        U R                   5      U R                  S9U l        gg)z-
Starts a session it is not yet initialized.
)r   r   N)r?   r>   update_screen_idr   r   r6   rF   r   s    r   start_session_if_none'YouTubeController.start_session_if_noneY   sB     DMM!!#1sDOO4dmmDM %2r   video_idplaylist_idc                 Z    U R                  5         U R                  R                  X5        g)z
Play video(video_id) now. This ignores the current play queue order.
:param video_id: YouTube video id(http://youtube.com/watch?v=video_id)
:param playlist_id: youtube.com/watch?v=video_id&list=playlist_id
N)rK   r>   
play_video)r   rM   rN   s      r   rP   YouTubeController.play_videoc   s"     	""$  7r   c                 Z    U R                  5         U R                  R                  U5        g)zz
Add video(video_id) to the end of the play queue.
:param video_id: YouTube video id(http://youtube.com/watch?v=video_id)
N)rK   r>   add_to_queuer   rM   s     r   rS   YouTubeController.add_to_queuel   "    
 	""$""8,r   c                 Z    U R                  5         U R                  R                  U5        g)z
Play video(video_id) after the currently playing video.
:param video_id: YouTube video id(http://youtube.com/watch?v=video_id)
N)rK   r>   	play_nextrT   s     r   rX   YouTubeController.play_nextt   s"    
 	""$)r   c                 Z    U R                  5         U R                  R                  U5        g)zn
Remove video(videoId) from the queue.
:param video_id: YouTube video id(http://youtube.com/watch?v=video_id)
N)rK   r>   remove_videorT   s     r   r[   YouTubeController.remove_video|   rV   r   c                 X    U R                  5         U R                  R                  5         g)z
Clear the entire video queue
N)rK   r>   clear_playlistrJ   s    r   r^    YouTubeController.clear_playlist   s      	""$$$&r   c                    U R                   R                  5         U R                  [        [        05        U R                   R                  S5      nU(       d  [        R                  S5        U R                   R                  5         g)z
Sends a getMdxSessionStatus to get the screenId and waits for response.
This function is blocking
If connected we should always get a response
(send message will launch app if it is not running).

   zFailed to update screen_idN)rE   clearsend_messager
   TYPE_GET_SCREEN_IDwait_LOGGERwarningr   statuss     r   rI   "YouTubeController.update_screen_id   sb     	  &&(<);<=))..r2OO89  &&(r   _messager!   c                 h    U[            [        :X  a!  U R                  UR                  S5      5        gg)z"Called when a message is received.r!   TF)r
   TYPE_STATUS_process_statusget)r   rk   r!   s      r   receive_message!YouTubeController.receive_message   s,    ,  &!12r   ri   c                 l    UR                  [        5      U l        U R                  R	                  5         g)zProcess latest status update.N)ro   ATTR_SCREEN_IDr?   rE   setrh   s     r   rn   !YouTubeController._process_status   s$     **^4  $$&r   F)rN   enqueuemedia_idrv   kwargsc                    X l          U(       a  U R                  " U40 UD6  gU R                  " U4SU0UD6  g! [        R                   a  n[        SU 3U5      UeSnAff = f)z
Quick PlayrN   zyoutube quick play N)rF   rS   rP   r&   Timeoutr   )r   rw   r   rN   rv   rx   excs          r   
quick_playYouTubeController.quick_play   sk      	U!!(5f5LkLVL 	U #6xj!A7KQTT	Us   9 9 A"AA")r?   r>   rF   rE   )ra   )r   NrA   )r1   r2   r3   r4   r5   r   __annotations__r?   r6   r7   r   rK   rP   rS   rX   r[   r^   rI   r   dictboolrp   rn   r   r|   r8   r9   r:   s   @r   r<   r<   M   s   .!Jd
! t  83 8S4Z 84 8-S -T -*# *$ *-S -T -') 4 D 'd 't ' #'U U 	U
 4ZU U U 
U Ur   r<   )r5   loggingrC   typingr   r   casttuber   casttube.YouTubeSessionr   r&    r   constr
   errorr   generated.cast_channel_pb2r   configr   rB   rd   rm   rs   	getLoggerr1   rf   r   r<    r   r   <module>r      su   
    # +  !   " !7 *  


H
%-N -`lU+ lUr   