
    i,                     Z   S r SSKrSSKJr  SSKJr  SSKJrJrJ	r	J
r
JrJrJr  SSKJr  SSKJrJr  S	S
KJrJr  SrSrSrSrSrSrSrSrSrSrSr \" SS9 " S S5      5       r!\" SS9 " S S5      5       r" " S S\RF                  5      r$ " S S\RF                  5      r% " S  S!\5      r&g)"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                       \ rS rSr% Sr\S-  \S'   \S-  \S'   \\S'   \\S'   \S-  \S'   \S-  \S	'   \	\   \S
'   \S-  \S'   \S-  \S'   \\S'   \S-  \S'   \\S'   Sr
g)
CastStatus*   z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____firstlineno____doc__bool__annotations__floatstrlist__static_attributes__r-       X/home/sebas/venvs/catt/lib/python3.13/site-packages/pychromecast/controllers/receiver.pyr   r   *   sm     D[ $J*S	d
*Djr9   r   c                   J    \ rS rSr% Sr\S-  \S'   \S-  \S'   \S-  \S'   Srg)LaunchFailure<   zLaunch failure container.Nr   r%   
request_idr-   )	r.   r/   r0   r1   r2   r6   r4   intr8   r-   r9   r:   r<   r<   <   s#    #$J$Jd
r9   r<   c                   H    \ rS rSrSr\R                  S\SS4S j5       rSr	g)CastStatusListenerE   z*Listener for receiving cast status events.statusreturnNc                     g)zUpdated cast status.Nr-   selfrC   s     r:   new_cast_status"CastStatusListener.new_cast_statusH       r9   r-   )
r.   r/   r0   r1   r2   abcabstractmethodr   rH   r8   r-   r9   r:   rA   rA   E   s+    4#j #T # #r9   rA   c                   H    \ rS rSrSr\R                  S\SS4S j5       rSr	g)LaunchErrorListenerM   z+Listener for receiving launch error events.rC   rD   Nc                     g)zLaunch error.Nr-   rF   s     r:   new_launch_error$LaunchErrorListener.new_launch_errorP   rJ   r9   r-   )
r.   r/   r0   r1   r2   rK   rL   r<   rQ   r8   r-   r9   r:   rN   rN   M   s+    5}   r9   rN   c                     ^  \ rS rSrSr\4S\SS4U 4S jjjrS'S jr\	S\S-  4S j5       r
S	\S
\S\4S jrS\SS4S jrS\SS4S jrSS.S\S-  SS4S jjrSSS.S\S\S\S-  SS4S jjrSS.S\S\S\S-  S\SS4
S jjrSS.S\S-  SS4S jjr\4S\S\S\4S jjr\4S\S\SS4S  jjr\S
\S\S\4S! j5       rS
\SS4S" jr\S
\S\ 4S# j5       r!S
\SS4S$ jr"S'U 4S% jjr#S&r$U =r%$ )(ReceiverControllerU   zd
Controller to interact with the Chromecast platform.

:param cast_type: Type of Chromecast device.
	cast_typerD   Nc                 n   > [         TU ]  [        SS9  S U l        S U l        Xl        / U l        / U l        g )NT)target_platform)super__init__NS_RECEIVERrC   launch_failurerV   _status_listeners_launch_error_listeners)rG   rV   	__class__s     r:   rZ   ReceiverController.__init__\   s9    d;)-48";=BD$r9   c                 H    U R                   R                  S5        SU l        g)z,Called when disconnected. Will erase status.zReceiver:channel_disconnectedN)loggerinforC   rG   s    r:   disconnectedReceiverController.disconnectedf   s    89r9   c                 T    U R                   (       a  U R                   R                  $ S$ )z.Convenience method to retrieve current app id.N)rC   r%   rd   s    r:   r%   ReceiverController.app_idk   s     &*[[t{{!!:d:r9   _messagedatac                     U[            [        :X  a  U R                  U5        gU[            [        :X  a  U R	                  U5        gg)zg
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)rG   ri   rj   s      r:   receive_message"ReceiverController.receive_messagep   sE     !55$$T*!22&&t,r9   listenerc                 :    U R                   R                  U5        g)zRegister a status listener for when a new Chromecast status
has been received. Listeners will be called with
listener.new_cast_status(status)N)r]   appendrG   rr   s     r:   register_status_listener+ReceiverController.register_status_listener   s     	%%h/r9   c                 :    U R                   R                  U5        g)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)r^   rt   ru   s     r:   register_launch_error_listener1ReceiverController.register_launch_error_listener   s     	$$++H5r9   callback_functionr|   c                n    U R                   R                  S5        U R                  [        [        0US9  g)z7Sends a message to the Chromecast to update the status.zReceiver:Updating statusr{   N)rb   debugsend_messager	   TYPE_GET_STATUSrG   r|   s     r:   update_status ReceiverController.update_status   s5     	45?+?P 	 	
r9   F)force_launchr|   r%   r   c          	          U(       d;  U R                   c.  U R                  [        [        U R                  X5      U5      S9  gU R	                  XU5        g)zmLaunches an app on the Chromecast.

Will only launch if it is not currently running unless
force_launch=True.Nr{   )rC   r   r   r   _send_launch_message)rG   r%   r   r|   s       r:   
launch_appReceiverController.launch_app   sQ      3"2D55vL%#   %%f<MNr9   Tretry_on_cancelled_errorr   c                X  ^ ^^^^ T(       d  T R                   T:w  aa  T R                  R                  ST5        S T l        S[        S[
        S -  SS 4UUUUU 4S jjnT R                  [        [        [        T0US9  g T R                  R                  ST5        T(       a
  T" SS 5        g g )	NzReceiver:Launching app %smsg_sentresponserD   c                   > U (       a  U(       a  UR                  [        5      [        :X  ad  UR                  [        5      [        :X  aG  TR
                  (       d6  T(       a/  TR                  R                  ST5        TR                  TTTSS9  g T(       d  g U (       a  U(       d
  T" SU5        g U[           [        :X  a
  T" SU5        g T" SU5        g )Nz/Receiver:Launching app %s failed, retrying onceFr   T)
getr	   rn   ERROR_REASONLAUNCH_CANCELLEDr^   rb   rc   r   rl   )r   r   r%   r|   r   r   rG   s     r:   handle_launch_responseGReceiverController._send_launch_message.<locals>.handle_launch_response   s      \26GG \26FF 880KK$$I6 --$)16	 .  (x%eX6L)-AA%dH5!%2r9   r{   z&Not launching app %s - already runningT)
r%   rb   rc   r\   r3   dictr   r	   TYPE_LAUNCHAPP_ID)rG   r%   r   r|   r   r   s   ````` r:   r   'ReceiverController._send_launch_message   s     4;;&0KK8&A"&D3 3 3QU 3 3B {FF;"8  
 KKEvN !$- !r9   c                |    U R                   R                  SU R                  5        U R                  [        S0SUS9$ )z0Stops the current running app on the Chromecast.z"Receiver:Stopping current app '%s'STOPT)inc_session_idr|   )rb   rc   r%   r   r	   r   s     r:   stop_appReceiverController.stop_app   sC     	=t{{K  6"/ ! 
 	
r9   volumetimeoutc                     [        [        SU5      S5      nU R                  R                  SU5        [	        US5      nU R                  [        SSSU00UR                  S9  UR                  5         U$ )	zMAllows 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   levelr{   )	minmaxrb   rc   r   r   r	   callbackwait_response)rG   r   r   response_handlers       r:   
set_volumeReceiverController.set_volume   sx    
 SF^Q':FC'><GV3DE.77 	 	
 	&&(r9   mutedc                     [        US5      nU R                  [        SSSU00UR                  S9  UR	                  5         g)zAllows to mute volume.zmute volumer   r   r   r{   N)r   r   r	   r   r   )rG   r   r   r   s       r:   set_volume_muted#ReceiverController.set_volume_muted  sJ    '?<GU3CD.77 	 	
 	&&(r9   c                    U R                  S0 5      nUR                  S0 5      n US   S   nU[        [        4;   n[        UR                  S5      UR                  SU(       a  SOS5      UR                  S	S
5      UR                  SS5      UR                  [        5      UR                  S5      UR                  S/ 5       Vs/ s H  ofS   PM	     snUR                  [        5      UR                  S5      UR                  SS5      UR                  S5      UR                  S[        5      5      nU$ ! [        [        4 a    0 n GNf = fs  snf )z
Parses a STATUS message and returns a CastStatus object.

:type data: dict
:param cast_type: Type of Chromecast.
:rtype: CastStatus
rC   r   applicationsr   isActiveInput	isStandByNTr   g      ?r   FdisplayNamer'   nametransportId
statusText iconUrlcontrolType)	r   KeyError
IndexErrorr   r   r   r   r   VOLUME_CONTROL_TYPE_ATTENUATION)rj   rV   status_datavolume_dataapp_datais_audioitemrC   s           r:   _parse_status ReceiverController._parse_status  s.    !HHXr2'OOHb9	(8;H / BBOOO,OOKtDOOGS)OOGU+LL LL'&.ll<&DE&Dd&\&DELL$LL'LLr*LL#OOM+JK
 ' *% 	H	 Fs   D7 E7EEc                 H   U R                  XR                  5      nX l        U R                  R	                  SU R                  5        U R
                   H  n UR                  U R                  5        M!     g! [         a    U R                  R                  S5         ML  f = f)z;Processes a received STATUS message and notifies listeners.zReceived status: %sz2Exception thrown when calling cast status listenerN)	r   rV   rC   rb   r~   r]   rH   	Exception	exception)rG   rj   rC   rr   s       r:   rm   &ReceiverController._process_get_status0  s    ##D..9/=..H((5 /  %%Hs   A88%B! B!c                     [        U R                  [        S5      U R                  [        5      U R                  [        5      5      $ )zk
Parses a LAUNCH_ERROR message and returns a LaunchFailure object.

:type data: dict
:rtype: LaunchFailure
N)r<   r   r   r   r
   )rj   s    r:   _parse_launch_error&ReceiverController._parse_launch_error?  s5     HH\4($((6*:DHHZ<P
 	
r9   c                    U R                  U5      nX l        U R                  R                  SU5        U R                   H  n UR                  U5        M     g! [         a    U R                  R                  S5         MB  f = f)zC
Processes a received LAUNCH_ERROR message and notifies listeners.
zLaunch status: %sz3Exception thrown when calling launch error listenerN)r   r\   rb   r~   r^   rQ   r   r   )rG   rj   r\   rr   s       r:   ro   (ReceiverController._process_launch_errorK  sx     11$7,-~>44H)).9 5  %%Is   A%BBc                 L   > [         TU ]  5         SU l        SU l        / U l        g)z$Called when controller is destroyed.N)rY   	tear_downrC   r\   r]   )rG   r_   s    r:   r   ReceiverController.tear_down\  s%    "!#r9   )r^   r]   rV   r\   rC   )rD   N)&r.   r/   r0   r1   r2   r   r6   rZ   re   propertyr%   r   r   r3   rp   rA   rv   rN   ry   r   r   r   r   r   r   r5   r   r   staticmethodr   r   rm   r<   r   ro   r   r8   __classcell__)r_   s   @r:   rT   rT   U   s    )= E# E E E
 ;d
 ; ; 4 D $01C 0 067J 6t 6 26	
 ($.	
 
		
 #15OO 	O
 ($.O 
O: *.5.5. 5. ($.	5. #'5. 
5.t 26
 ($.
 
	
 :I   U  >M )d )U )QU ) !D !S !Z ! !F   	
$ 	
= 	
 	
$ 4 "$ $r9   rT   )'r2   rK   dataclassesr   	functoolsr   constr   r   r   r	   r
   r   r   generated.cast_channel_pb2r   r   r   r   r   r   r   r   r   r[   r   rl   r   rn   r   r   VOLUME_CONTROL_TYPE_FIXEDVOLUME_CONTROL_TYPE_MASTERr   r<   ABCrA   rN   rT   r-   r9   r:   <module>r      s   
  !    > *	3( "  "/ # %  $  " $  # ##'' N$ N$r9   