
    :j                         d Z ddlZddlZddlmZmZ ddlmZ ddlm	Z	 ddl
Z
ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ dZdZdZdZ ej        e          Z G d de          Z G d de          ZdS )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                   Z     e Zd ZdZdededdf fdZ	 	 	 	 dded	ed
edededefdZ xZ	S )TimeoutYouTubeSessionzA youtube session with timeout.	screen_idtimeoutreturnNc                 X    t                                          |           || _        dS )zInitialize.N)super__init___TimeoutYouTubeSession__timeout)selfr   r   	__class__s      V/home/user/adhan/venv/lib/python3.11/site-packages/pychromecast/controllers/youtube.pyr   zTimeoutYouTubeSession.__init__    s&    ###     Furldataparamsheaderssession_requestc                    |ri t           |}nt           }t          j        ||||| j                  }|j        dv r|r|                                  |                                 |r| xj        dz  c_        | xj        dz  c_        |S )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_postzTimeoutYouTubeSession._do_post%   s    (  	,,G,GGG=tFDN
 
 
 :--/-JJLLL!!### 	!OOq OO		Q		r   )NNNF)
__name__
__module____qualname____doc__strfloatr   r   r,   __classcell__r   s   @r   r   r      s        ))!# ! !$ ! ! ! ! ! ! $% %% % 	%
 % % 
% % % % % % % %r   r   c                       e Zd ZU dZeed<   dZedz  ed<   ddeddf fdZ	dd	Z
dd
ededz  ddfdZd
eddfdZd
eddfdZd
eddfdZddZddZdededefdZdeddfdZddddedededz  dededdfdZ xZS ) YouTubeControllerz$Controller to interact with Youtube._sessionN
_screen_id
   r   r   c                     t                                          t          t                     t	          j                    | _        || _        d | _        d S N)	r   r   YOUTUBE_NAMESPACEr   	threadingEventstatus_update_event_timeoutr7   )r   r   r   s     r   r   zYouTubeController.__init__S   s@    *K888#,?#4#4 r   c                     | j         r| j        sI|                                  t          t	          t
          | j                   | j                  | _        dS dS )z=
        Starts a session it is not yet initialized.
        )r   r   N)r8   r7   update_screen_idr   r   r1   r@   r   s    r   start_session_if_nonez'YouTubeController.start_session_if_noneY   s`      	DM 	!!###1sDO44dm  DMMM	 	r   video_idplaylist_idc                 d    |                                   | j                            ||           dS )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)rD   r7   
play_video)r   rE   rF   s      r   rH   zYouTubeController.play_videoc   s4     	""$$$  ;77777r   c                 b    |                                   | j                            |           dS )z
        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)rD   r7   add_to_queuer   rE   s     r   rJ   zYouTubeController.add_to_queuel   2    
 	""$$$""8,,,,,r   c                 b    |                                   | j                            |           dS )z
        Play video(video_id) after the currently playing video.
        :param video_id: YouTube video id(http://youtube.com/watch?v=video_id)
        N)rD   r7   	play_nextrK   s     r   rN   zYouTubeController.play_nextt   s2    
 	""$$$)))))r   c                 b    |                                   | j                            |           dS )z
        Remove video(videoId) from the queue.
        :param video_id: YouTube video id(http://youtube.com/watch?v=video_id)
        N)rD   r7   remove_videorK   s     r   rP   zYouTubeController.remove_video|   rL   r   c                 `    |                                   | j                                         dS )z.
        Clear the entire video queue
        N)rD   r7   clear_playlistrC   s    r   rR   z YouTubeController.clear_playlist   s0     	""$$$$$&&&&&r   c                    | j                                          |                     t          t          i           | j                             d          }|st                              d           | j                                          dS )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).
        r9   zFailed to update screen_idN)r?   clearsend_messager
   TYPE_GET_SCREEN_IDwait_LOGGERwarningr   statuss     r   rB   z"YouTubeController.update_screen_id   s     	 &&(((<);<===)..r22 	:OO8999 &&(((((r   _messager   c                     |t                    t          k    r*|                     |                    d                     dS dS )z"Called when a message is received.r   TF)r
   TYPE_STATUS_process_statusget)r   r\   r   s      r   receive_messagez!YouTubeController.receive_message   s<    ,,  &!1!12224ur   r[   c                 v    |                     t                    | _        | j                                         dS )zProcess latest status update.N)r`   ATTR_SCREEN_IDr8   r?   setrZ   s     r   r_   z!YouTubeController._process_status   s0     **^44 $$&&&&&r   F)rF   enqueuemedia_idre   kwargsc                    || _         	 |r | j        |fi | dS  | j        |fd|i| dS # t          j        $ r}t          d| |          |d}~ww xY w)z
Quick PlayrF   zyoutube quick play N)r@   rJ   rH   r$   Timeoutr   )r   rf   r   rF   re   rg   excs          r   
quick_playzYouTubeController.quick_play   s      	U M!!(55f55555LLkLVLLLLL 	U 	U 	U !Ax!A!A7KKQTT	Us   - - AAA)r9   )r   Nr;   )r-   r.   r/   r0   r   __annotations__r8   r1   r2   r   rD   rH   rJ   rN   rP   rR   rB   r   dictboolra   r_   r   rk   r3   r4   s   @r   r6   r6   M   s        ..!Jd
!!!  t         8 83 8S4Z 84 8 8 8 8-S -T - - - -*# *$ * * * *-S -T - - - -' ' ' ') ) ) ) 4 D    'd 't ' ' ' ' #'U U U U 	U
 4ZU U U 
U U U U U U U Ur   r6   )r0   loggingr=   typingr   r   casttuber   casttube.YouTubeSessionr   r$    r   constr
   errorr   generated.cast_channel_pb2r   configr   r<   rV   r^   rc   	getLoggerr-   rX   r   r6    r   r   <module>rz      so   
              # # # # # # + + + + + +  ! ! ! ! ! !             " " " " " "      !          7 *  
'
H
%
%- - - - -N - - -`lU lU lU lU lU+ lU lU lU lU lUr   