
    :j,                        d Z ddlZddl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 ddlmZmZ d	d
lmZmZ dZdZdZdZdZdZdZdZdZdZdZ  ed           G d d                      Z! ed           G d d                      Z" G d dej#                  Z$ G d dej#                  Z% G d  d!e          Z&dS )"zT
Provides a controller for controlling the default media players
on the Chromecast.
    N)	dataclass)partial   )CAST_TYPE_AUDIOCAST_TYPE_CHROMECASTCAST_TYPE_GROUPMESSAGE_TYPE
REQUEST_IDREQUEST_TIMEOUT
SESSION_ID)CastMessage)WaitResponsechain_on_success   )BaseControllerCallbackTypeappIdreasonz#urn:x-cast:com.google.cast.receiver
GET_STATUSRECEIVER_STATUSLAUNCHLAUNCH_ERROR	CANCELLEDattenuationfixedmasterT)frozenc                       e Zd ZU dZedz  ed<   edz  ed<   eed<   eed<   edz  ed<   edz  ed<   ee         ed	<   edz  ed
<   edz  ed<   eed<   edz  ed<   eed<   dS )
CastStatuszCast status container.Nis_active_inputis_stand_byvolume_levelvolume_mutedapp_iddisplay_name
namespaces
session_idtransport_idstatus_texticon_urlvolume_control_type)	__name__
__module____qualname____doc__bool__annotations__floatstrlist     W/home/user/adhan/venv/lib/python3.11/site-packages/pychromecast/controllers/receiver.pyr   r   *   s           D[   $J*S	d
*Djr6   r   c                   D    e Zd ZU dZedz  ed<   edz  ed<   edz  ed<   dS )LaunchFailurezLaunch failure container.Nr   r$   
request_id)r,   r-   r.   r/   r3   r1   intr5   r6   r7   r9   r9   <   sH         ##$J$Jd
r6   r9   c                   <    e Zd ZdZej        deddfd            ZdS )CastStatusListenerz*Listener for receiving cast status events.statusreturnNc                     dS )zUpdated cast status.Nr5   selfr>   s     r7   new_cast_statusz"CastStatusListener.new_cast_statusH         r6   )r,   r-   r.   r/   abcabstractmethodr   rC   r5   r6   r7   r=   r=   E   sJ        44#j #T # # # # # #r6   r=   c                   <    e Zd ZdZej        deddfd            ZdS )LaunchErrorListenerz+Listener for receiving launch error events.r>   r?   Nc                     dS )zLaunch error.Nr5   rA   s     r7   new_launch_errorz$LaunchErrorListener.new_launch_errorP   rD   r6   )r,   r-   r.   r/   rE   rF   r9   rJ   r5   r6   r7   rH   rH   M   sJ        55}       r6   rH   c                       e Zd ZdZefdeddf fdZd%dZededz  fd            Z	de
d	edefd
ZdeddfdZdeddfdZdddedz  ddfdZddddedededz  ddfdZdddedededz  deddf
dZdddedz  ddfdZefdededefdZefdededdfdZed	ededefd             Zd	eddfd!Zed	edefd"            Z d	eddfd#Z!d% fd$Z" xZ#S )&ReceiverControllerzp
    Controller to interact with the Chromecast platform.

    :param cast_type: Type of Chromecast device.
    	cast_typer?   Nc                     t                                          t          d           d | _        d | _        || _        g | _        g | _        d S )NT)target_platform)super__init__NS_RECEIVERr>   launch_failurerM   _status_listeners_launch_error_listeners)rB   rM   	__class__s     r7   rQ   zReceiverController.__init__\   sL    d;;;)-48";=BD$$$r6   c                 H    | j                             d           d| _        dS )z,Called when disconnected. Will erase status.zReceiver:channel_disconnectedN)loggerinfor>   rB   s    r7   disconnectedzReceiverController.disconnectedf   s$    8999r6   c                 ,    | j         r| j         j        ndS )z.Convenience method to retrieve current app id.N)r>   r$   rZ   s    r7   r$   zReceiverController.app_idk   s     &*[:t{!!d:r6   _messagedatac                     |t                    t          k    r|                     |           dS |t                    t          k    r|                     |           dS dS )z
        Called when a receiver message is received.

        data is message.payload_utf8 interpreted as a JSON dict.
        TF)r	   TYPE_RECEIVER_STATUS_process_get_statusTYPE_LAUNCH_ERROR_process_launch_error)rB   r]   r^   s      r7   receive_messagez"ReceiverController.receive_messagep   s]     !555$$T***4!222&&t,,,4ur6   listenerc                 :    | j                             |           dS )zRegister a status listener for when a new Chromecast status
        has been received. Listeners will be called with
        listener.new_cast_status(status)N)rT   appendrB   re   s     r7   register_status_listenerz+ReceiverController.register_status_listener   s!     	%%h/////r6   c                 :    | j                             |           dS )zRegister a listener for when a new launch error message
        has been received. Listeners will be called with
        listener.new_launch_error(launch_failure)N)rU   rg   rh   s     r7   register_launch_error_listenerz1ReceiverController.register_launch_error_listener   s!     	$++H55555r6   callback_functionrm   c                    | j                             d           |                     t          t          i|           dS )z7Sends a message to the Chromecast to update the status.zReceiver:Updating statusrl   N)rX   debugsend_messager	   TYPE_GET_STATUSrB   rm   s     r7   update_statusz ReceiverController.update_status   sM     	4555?+?P 	 	
 	
 	
 	
 	
r6   F)force_launchrm   r$   rt   c          	          |sA| j         :|                     t          t          | j        ||          |                     dS |                     |||           dS )z}Launches an app on the Chromecast.

        Will only launch if it is not currently running unless
        force_launch=True.Nrl   )r>   rs   r   r   _send_launch_message)rB   r$   rt   rm   s       r7   
launch_appzReceiverController.launch_app   s~      		O 3"2D5v|LL%# #       %%fl<MNNNNNr6   Tretry_on_cancelled_errorry   c                V    s j         k    rk j                            d           d  _        dt          dt
          d z  dd f fd}                     t          t          t          i|           d S  j                            d           r dd            d S d S )	NzReceiver:Launching app %smsg_sentresponser?   c                    | r|r|                     t                    t          k    rb|                     t                    t          k    r?j        s8r6j                            d                               d           d S sd S | r|s d|           d S |t                   t          k    r d|           d S  d|           d S )Nz/Receiver:Launching app %s failed, retrying onceFrx   T)
getr	   rb   ERROR_REASONLAUNCH_CANCELLEDrU   rX   rY   rv   r`   )r{   r|   r$   rm   rt   ry   rB   s     r7   handle_launch_responsezGReceiverController._send_launch_message.<locals>.handle_launch_response   s#     !\226GGG \226FFF 8 G0 G K$$I6   --$)16	 .    F( F x %%eX666FL)-AAA%%dH555F!!%22222r6   rl   z&Not launching app %s - already runningT)
r$   rX   rY   rS   r0   dictrp   r	   TYPE_LAUNCHAPP_ID)rB   r$   rt   rm   ry   r   s   ````` r7   rv   z'ReceiverController._send_launch_message   s	     -	.4;&00K8&AAA"&D3 3 3QU 3 3 3 3 3 3 3 3 3 3B {FF;"8      
 KEvNNN  .!!$-----. .r6   c                    | j                             d| j                   |                     t          did|          S )z0Stops the current running app on the Chromecast.z"Receiver:Stopping current app '%s'STOPT)inc_session_idrm   )rX   rY   r$   rp   r	   rr   s     r7   stop_appzReceiverController.stop_app   sJ     	=t{KKK  6"/ ! 
 
 	
r6   volumetimeoutc                    t          t          d|          d          }| j                            d|           t	          |d          }|                     t          ddd|ii|j                   |                                 |S )	z]Allows to set volume. Should be value between 0..1.
        Returns the new volume.

        r   r   zReceiver:setting volume to %.2fz
set volume
SET_VOLUMEr   levelrl   )	minmaxrX   rY   r   rp   r	   callbackwait_response)rB   r   r   response_handlers       r7   
set_volumezReceiverController.set_volume   s    
 SF^^Q'':FCCC'>><GV3DE.7 	 	
 	
 	
 	&&(((r6   mutedc                     t          |d          }|                     t          ddd|ii|j                   |                                 dS )zAllows to mute volume.zmute volumer   r   r   rl   N)r   rp   r	   r   r   )rB   r   r   r   s       r7   set_volume_mutedz#ReceiverController.set_volume_muted  s`    '??<GU3CD.7 	 	
 	
 	
 	&&(((((r6   c                    |                      di           }|                     di           }	 |d         d         }n# t          t          f$ r i }Y nw xY w|t          t          fv }t          |                     d          |                     d|rdnd          |                     d	d
          |                     dd          |                     t                    |                     d          d |                     dg           D             |                     t                    |                     d          |                     dd          |                     d          |                     dt                              }|S )z
        Parses a STATUS message and returns a CastStatus object.

        :type data: dict
        :param cast_type: Type of Chromecast.
        :rtype: CastStatus
        r>   r   applicationsr   isActiveInput	isStandByNTr   g      ?r   FdisplayNamec                     g | ]
}|d          S )namer5   ).0items     r7   
<listcomp>z4ReceiverController._parse_status.<locals>.<listcomp>'  s    EEEdT&\EEEr6   r&   transportId
statusText iconUrlcontrolType)	r~   KeyError
IndexErrorr   r   r   r   r   VOLUME_CONTROL_TYPE_ATTENUATION)r^   rM   status_datavolume_dataapp_datais_audior>   s          r7   _parse_statusz ReceiverController._parse_status  sh    !HHXr22'OOHb99	(8;HH*% 	 	 	HHH	 / BBOOO,,OOK)CtDDOOGS))OOGU++LL  LL''EEhll<&D&DEEELL$$LL''LLr**LL##OOM+JKK
 
 s   = AAc                 (   |                      || j                  }|| _        | j                            d| j                   | j        D ]G}	 |                    | j                   # t          $ r | j                            d           Y Dw xY wdS )z;Processes a received STATUS message and notifies listeners.zReceived status: %sz2Exception thrown when calling cast status listenerN)	r   rM   r>   rX   ro   rT   rC   	Exception	exception)rB   r^   r>   re   s       r7   ra   z&ReceiverController._process_get_status0  s    ##D$.99/===. 	 	H((5555   %%H    	 	s   A(($BBc                     t          |                     t          d          |                     t                    |                     t                              S )z
        Parses a LAUNCH_ERROR message and returns a LaunchFailure object.

        :type data: dict
        :rtype: LaunchFailure
        N)r9   r~   r   r   r
   )r^   s    r7   _parse_launch_errorz&ReceiverController._parse_launch_error?  sC     HH\4(($((6*:*:DHHZ<P<P
 
 	
r6   c                    |                      |          }|| _        | j                            d|           | j        D ]B}	 |                    |           # t          $ r | j                            d           Y ?w xY wdS )zS
        Processes a received LAUNCH_ERROR message and notifies listeners.
        zLaunch status: %sz3Exception thrown when calling launch error listenerN)r   rS   rX   ro   rU   rJ   r   r   )rB   r^   rS   re   s       r7   rc   z(ReceiverController._process_launch_errorK  s     11$77,-~>>>4 	 	H)).9999   %%I    	 	s   A$A?>A?c                 r    t                                                       d| _        d| _        g | _        dS )z$Called when controller is destroyed.N)rP   	tear_downr>   rS   rT   )rB   rV   s    r7   r   zReceiverController.tear_down\  s6    "!#r6   )r?   N)$r,   r-   r.   r/   r   r3   rQ   r[   propertyr$   r   r   r0   rd   r=   ri   rH   rk   r   rs   rw   rv   r   r   r2   r   r   staticmethodr   r   ra   r9   r   rc   r   __classcell__)rV   s   @r7   rL   rL   U   sq         )= E E# E E E E E E E   
 ;d
 ; ; ; X; 4 D    $01C 0 0 0 0 067J 6t 6 6 6 6 26	
 	
 	
 ($.	
 
		
 	
 	
 	
 #15O O OO 	O
 ($.O 
O O O O: *.5. 5. 5.5. 5. ($.	5. #'5. 
5. 5. 5. 5.t 26
 
 
 ($.
 
	
 
 
 
 :I    U     >M ) )d )U )QU ) ) ) ) !D !S !Z ! ! ! \!F      	
$ 	
= 	
 	
 	
 \	
$ 4    "$ $ $ $ $ $ $ $ $ $r6   rL   )'r/   rE   dataclassesr   	functoolsr   constr   r   r   r	   r
   r   r   generated.cast_channel_pb2r   r   r   r   r   r   r   r   r   rR   rq   r`   r   rb   r   r   VOLUME_CONTROL_TYPE_FIXEDVOLUME_CONTROL_TYPE_MASTERr   r9   ABCr=   rH   rL   r5   r6   r7   <module>r      s?   
 


 ! ! ! ! ! !                             > = = = = = = = * * * * * * * *	3( "  "/ # %  $       " $       # # # # # # # #    #'   N$ N$ N$ N$ N$ N$ N$ N$ N$ N$r6   