
    im                        % S r SSKrSSKJrJr  SSKJr  SSK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SK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r"Sr#Sr$Sr%Sr&Sr'Sr(Sr)S r*S!r+S"r,Sr-Sr.Sr/S#r0S$r1Sr2Sr3S$r4S%r5S&r6S'r7S(r8S)r9S*r:S+r;S,r<S-r=S.r>S/r?S0r@S1rAS2rBS3rCS4rDS5rES6rF0 S7S8_S9S:_S;S<_S=S>_S?S@_SASB_SCSD_SESF_SGSH_SISJ_SKSL_SMSN_SOSP_SQSR_SSST_SUSV_SWSX_SYSZS[S\S]S^S_S`SaSb.	ErG\H\IS-  \J4   \KSc'   \" SdSe9 " Sf Sg5      5       rL\R                  " \N5      rO " Sh Si5      rP " Sj Sk\R                  5      rR " Sl Sm\5      rS " Sn So\S5      rT " Sp Sq\S5      rUg)rzT
Provides a controller for controlling the default media players
on the Chromecast.
    N)datetimetimezone)	dataclass)Any   )APP_MEDIA_RECEIVER)MESSAGE_TYPE)ControllerNotRegistered)CastMessage)WaitResponse   )CallbackTypeQuickPlayControllerUNKNOWNBUFFEREDLIVEPLAYING	BUFFERINGPAUSEDIDLEEDIT_TRACKS_INFO
GET_STATUSLOADLOAD_FAILEDQUEUE_INSERTMEDIA_STATUSPAUSEPLAY
QUEUE_NEXT
QUEUE_PREVQUEUE_UPDATESEEKSET_PLAYBACK_RATESTOP         i0  @         i   i   i   i   i   i    i @  i   i   i   i          d   MEDIA_UNKNOWNe   MEDIA_ABORTEDf   MEDIA_DECODEg   MEDIA_NETWORKh   MEDIA_SRC_NOT_SUPPORTEDn   SOURCE_BUFFER_FAILURE   MEDIAKEYS_NETWORK   MEDIAKEYS_UNSUPPORTED   MEDIAKEYS_WEBCRYPTOi-  SEGMENT_NETWORKi7  HLS_NETWORK_MASTER_PLAYLISTi8  HLS_NETWORK_PLAYLISTi9  HLS_NETWORK_NO_KEY_RESPONSEi:  HLS_NETWORK_KEY_LOADi;  HLS_NETWORK_INVALID_SEGMENTi<  HLS_SEGMENT_PARSINGiA  DASH_NETWORKDASH_NO_INITSMOOTH_NETWORKSMOOTH_NO_MEDIA_DATAHLS_MANIFEST_MASTERHLS_MANIFEST_PLAYLISTDASH_MANIFEST_NO_PERIODSDASH_MANIFEST_NO_MIMETYPEDASH_INVALID_SEGMENT_INFOSMOOTH_MANIFEST)	iB  iK  iL  i  i  i  i  i  i  MEDIA_PLAYER_ERROR_CODEST)frozenc                   J    \ rS rSr% Sr\S-  \S'   \S-  \S'   \S-  \S'   Srg)
MediaImager7   zMedia image metadata container.Nurlheightwidth )	__name__
__module____qualname____firstlineno____doc__str__annotations__int__static_attributes__rW       U/home/sebas/venvs/catt/lib/python3.13/site-packages/pychromecast/controllers/media.pyrS   rS   n   s"    )	tO$J:ra   rS   c                   <   \ rS rSrSrS'S jr\S\S-  4S j5       r\S\	S-  4S j5       r
\S\4S j5       r\S\4S	 j5       r\S\4S
 j5       r\S\4S j5       r\S\4S j5       r\S\4S j5       r\S\4S j5       r\S\4S j5       r\S\4S j5       r\S\4S j5       r\S\S-  4S j5       r\S\S-  4S j5       r\S\	S-  4S j5       r\S\	S-  4S j5       r\S\S-  4S j5       r\S\S-  4S j5       r\S\S-  4S j5       r\S\	S-  4S j5       r\S\\    4S j5       r!\S\4S j5       r"\S\4S j5       r#\S\4S j5       r$\S\4S j5       r%\S\4S j5       r&\S\4S  j5       r'\S\4S! j5       r(\S\4S" j5       r)S#\*SS4S$ jr+S\4S% jr,S&r-g)(MediaStatusz   zClass to hold the media status.returnNc                    SU l         S U l        S U l        S U l        [        U l        S U l        S U l        SU l        [        U l
        SU l        SU l        SU l        0 U l        0 U l        0 U l        / U l        S U l        g )Ng        g      ?r   F)current_time
content_idcontent_typedurationSTREAM_TYPE_UNKNOWNstream_typeidle_reasonmedia_session_idplayback_rateMEDIA_PLAYER_STATE_UNKNOWNplayer_statesupported_media_commandsvolume_levelvolume_mutedmedia_custom_datamedia_metadatasubtitle_trackscurrent_subtitle_trackslast_updatedselfs    rb   __init__MediaStatus.__init__}   s    &*(,&*.'+,0 6()%!')$&%'-/$-1ra   c                 (   U R                   bz  U R                  bm  U R                  [        :X  aY  U R                   U R                  [
        R                  " [        R                  5      U R                  -
  R                  5       -  -   $ U R                   $ )z8Returns calculated current seek time of media in seconds)
rh   rz   rr   MEDIA_PLAYER_STATE_PLAYINGrp   r   nowr   utctotal_secondsr{   s    rb   adjusted_current_time!MediaStatus.adjusted_current_time   s     )!!-!!%?? !!$$<<-0A0AAPPRSS    ra   c                 8    U R                   R                  S5      $ )zType of meta data.metadataTyperw   getr{   s    rb   metadata_typeMediaStatus.metadata_type   s     ""&&~66ra   c                 4    U R                   [        [        4;   $ )z!Return True if player is PLAYING.)rr   r   MEDIA_PLAYER_STATE_BUFFERINGr{   s    rb   player_is_playingMediaStatus.player_is_playing   s"       &(%
 
 	
ra   c                 (    U R                   [        :H  $ )z Return True if player is PAUSED.)rr   MEDIA_PLAYER_STATE_PAUSEDr{   s    rb   player_is_pausedMediaStatus.player_is_paused   s       $===ra   c                 (    U R                   [        :H  $ )zReturn True if player is IDLE.)rr   MEDIA_PLAYER_STATE_IDLEr{   s    rb   player_is_idleMediaStatus.player_is_idle   s       $;;;ra   c                 (    U R                   [        :H  $ )z5Return True if media status represents generic media.)r   METADATA_TYPE_GENERICr{   s    rb   media_is_genericMediaStatus.media_is_generic   s     !!%:::ra   c                 (    U R                   [        :H  $ )z1Return True if media status represents a tv show.)r   METADATA_TYPE_TVSHOWr{   s    rb   media_is_tvshowMediaStatus.media_is_tvshow   s     !!%999ra   c                 (    U R                   [        :H  $ )z/Return True if media status represents a movie.)r   METADATA_TYPE_MOVIEr{   s    rb   media_is_movieMediaStatus.media_is_movie        !!%888ra   c                 (    U R                   [        :H  $ )z4Return True if media status represents a musictrack.)r   METADATA_TYPE_MUSICTRACKr{   s    rb   media_is_musictrackMediaStatus.media_is_musictrack   s     !!%===ra   c                 (    U R                   [        :H  $ )z/Return True if media status represents a photo.)r   METADATA_TYPE_PHOTOr{   s    rb   media_is_photoMediaStatus.media_is_photo   r   ra   c                 (    U R                   [        :H  $ )z'Return True if stream type is BUFFERED.)rm   STREAM_TYPE_BUFFEREDr{   s    rb   stream_type_is_buffered#MediaStatus.stream_type_is_buffered   s     #777ra   c                 (    U R                   [        :H  $ )z#Return True if stream type is LIVE.)rm   STREAM_TYPE_LIVEr{   s    rb   stream_type_is_liveMediaStatus.stream_type_is_live   s     #333ra   c                 8    U R                   R                  S5      $ )zReturn title of media.titler   r{   s    rb   r   MediaStatus.title        ""&&w//ra   c                 8    U R                   R                  S5      $ )z!Return series title if available.seriesTitler   r{   s    rb   series_titleMediaStatus.series_title        ""&&}55ra   c                 8    U R                   R                  S5      $ )zReturn season if available.seasonr   r{   s    rb   r   MediaStatus.season        ""&&x00ra   c                 8    U R                   R                  S5      $ )zReturn episode if available.episoder   r{   s    rb   r   MediaStatus.episode   s     ""&&y11ra   c                 8    U R                   R                  S5      $ )zReturn artist if available.artistr   r{   s    rb   r   MediaStatus.artist   r   ra   c                 8    U R                   R                  S5      $ )zReturn album name if available.	albumNamer   r{   s    rb   
album_nameMediaStatus.album_name   s     ""&&{33ra   c                 8    U R                   R                  S5      $ )z!Return album artist if available.albumArtistr   r{   s    rb   album_artistMediaStatus.album_artist   r   ra   c                 8    U R                   R                  S5      $ )z!Return track number if available.trackr   r{   s    rb   r   MediaStatus.track   r   ra   c           
          U R                   R                  S/ 5       Vs/ s H=  n[        UR                  S5      UR                  S5      UR                  S5      5      PM?     sn$ s  snf )z3Return a list of MediaImage objects for this media.imagesrT   rU   rV   )rw   r   rS   )r|   items     rb   r   MediaStatus.images  s_    
 ++//"=
= txx(:DHHW<MN=
 	
 
s   AA&c                 :    [        U R                  [        -  5      $ )zTrue if PAUSE is supported.)boolrs   CMD_SUPPORT_PAUSEr{   s    rb   supports_pauseMediaStatus.supports_pause  s     D114EEFFra   c                 :    [        U R                  [        -  5      $ )zTrue if SEEK is supported.)r   rs   CMD_SUPPORT_SEEKr{   s    rb   supports_seekMediaStatus.supports_seek  s     D114DDEEra   c                 :    [        U R                  [        -  5      $ )z#True if STREAM_VOLUME is supported.)r   rs   CMD_SUPPORT_STREAM_VOLUMEr{   s    rb   supports_stream_volume"MediaStatus.supports_stream_volume       D114MMNNra   c                 :    [        U R                  [        -  5      $ )z!True if STREAM_MUTE is supported.)r   rs   CMD_SUPPORT_STREAM_MUTEr{   s    rb   supports_stream_mute MediaStatus.supports_stream_mute  s     D114KKLLra   c                 :    [        U R                  [        -  5      $ )z"True if SKIP_FORWARD is supported.)r   rs   CMD_SUPPORT_SKIP_FORWARDr{   s    rb   supports_skip_forward!MediaStatus.supports_skip_forward  s     D114LLMMra   c                 :    [        U R                  [        -  5      $ )z#True if SKIP_BACKWARD is supported.)r   rs   CMD_SUPPORT_SKIP_BACKWARDr{   s    rb   supports_skip_backward"MediaStatus.supports_skip_backward$  r   ra   c                 :    [        U R                  [        -  5      $ )z True if QUEUE_NEXT is supported.)r   rs   CMD_SUPPORT_QUEUE_NEXTr{   s    rb   supports_queue_nextMediaStatus.supports_queue_next)       D114JJKKra   c                 :    [        U R                  [        -  5      $ )z True if QUEUE_PREV is supported.)r   rs   CMD_SUPPORT_QUEUE_PREVr{   s    rb   supports_queue_prevMediaStatus.supports_queue_prev.  r   ra   datac                 N   UR                  S/ 5      (       d  gUS   S   nUR                  S5      =(       d    0 nU(       d#  SU;   a  US   R                  S5      =(       d    0 nUR                  S0 5      nUR                  SU R                  5      U l        UR                  SU R                  5      U l        UR                  S	U R                  5      U l        UR                  S
U R                  5      U l        UR                  SU R
                  5      U l        UR                  SS5      U l        UR                  SU R                  5      U l        UR                  SU R                  5      U l        UR                  SU R                  5      U l	        UR                  SU R                  5      U l
        UR                  SU R                  5      U l        UR                  SU R                  5      U l        UR                  SU R                  5      U l        UR                  SU R                  5      U l        UR                  SU R                  5      U l        UR                  SU R                   5      U l        ["        R$                  " [&        R(                  5      U l        g)z2New data will only contain the changed attributes.statusNr   mediaextendedStatusvolumecurrentTime	contentIdcontentTyperk   
streamType
idleReasonmediaSessionIdplaybackRateplayerStatesupportedMediaCommandslevelmuted
customDatametadatatracksactiveTrackIds)r   rh   ri   rj   rk   rm   rn   ro   rp   rr   rs   rt   ru   rv   rw   rx   ry   r   r   r   r   rz   )r|   r   status_data
media_datavolume_datas        rb   updateMediaStatus.update3  s   xx"%%8nQ' __W-3
.+=$%56::7CIrJ!ooh3'OOM4;L;LM$..dooF&NN=$:K:KL"z4==A%>>,8H8HI&??<> +0@$BWBW X(__^T=O=OP'OOM4;L;LM(3$d&C&C)
% (OOGT5F5FG'OOGT5F5FG!+d>T>T!U(nnZ9L9LM)~~h8L8LM'2d::(
$ %LL6ra   c                    0 SU R                   _SU R                  _SU R                  _SU R                  _SU R                  _SU R
                  _SU R                  _SU R                  _S	U R                  _S
U R                  _SU R                  _SU R                  _SU R                  _SU R                  _SU R                  _SU R                  _SU R                   _nUR#                  U R$                  5        SU S3$ )Nr   r   r   r   r   r   r   r   r   rx   r   r   r   r   r   r   r   z<MediaStatus >)r   r   r   r   r   r   r   r   r   rx   r   r   r   r   r   r   r   r  __dict__)r|   infos     rb   __repr__MediaStatus.__repr__U  sJ   
T//
TZZ
 D--
 dkk	

 t||
 dkk
 $//
 D--
 TZZ
 t33
 dkk
 d11
 T//
 %d&A&A
 #D$=$=
  $T%?%?!
" %d&A&A#
& 	DMM"tfA&&ra   )ri   rj   ry   rh   rk   rn   rz   rv   rw   ro   rp   rr   rm   rx   rs   rt   ru   rf   N).rX   rY   rZ   r[   r\   r}   propertyfloatr   r_   r   r   r   r   r   r   r   r   r   r   r   r   r]   r   r   r   r   r   r   r   r   listrS   r   r   r   r   r   r   r   r   r   dictr  r  r`   rW   ra   rb   rd   rd   z   s~   )2& !ut| ! !  7sTz 7 7 
4 
 
 >$ > > < < < ;$ ; ; : : : 9 9 9 >T > > 9 9 9 8 8 8 4T 4 4 0sTz 0 0 6cDj 6 6 1d
 1 1 2t 2 2 1d
 1 1 4C$J 4 4 6cDj 6 6 0sTz 0 0 
Z( 
 
 G G G Ft F F O O O Md M M Nt N N O O O LT L L LT L L 74  7D  7D'# 'ra   rd   c                   |    \ rS rSrSr\R                  S\SS4S j5       r\R                  S\	S\	SS4S	 j5       r
S
rg)MediaStatusListenerim  z+Listener for receiving media status events.r   rf   Nc                     g)zUpdated media status.NrW   )r|   r   s     rb   new_media_status$MediaStatusListener.new_media_statusp      ra   queue_item_id
error_codec                     g)z_Called when load media failed.

queue_item_id is the id of the queue item which failed to load
NrW   )r|   r%  r&  s      rb   load_media_failed%MediaStatusListener.load_media_failedt  r$  ra   rW   )rX   rY   rZ   r[   r\   abcabstractmethodrd   r"  r_   r(  r`   rW   ra   rb   r   r   m  sZ    5${ $t $ $ 	s    ra   r   c            !       b  ^  \ rS rSrSrS$S\S\SS4U 4S jjjrSSSS\SSS	S
SSSSS.S\S\S\S-  S\S-  S\	S-  S\S\S\
S-  S\S-  S\S\S\S\S\
S-  S\S-  SS4 S jjrS\S\S\S-  S\S-  S\	S-  S\S\S\
S-  S\S-  S\S\S\S\S\
S-  S\S-  SS4 S jrS\S \	S!\SS4S" jrS#rU =r$ )%BaseMediaPlayeri|  zLMixin class for apps which can play media using the default media namespace.Tsupporting_app_idapp_must_matchrf   Nc                 $   > [         TU ]  SUUS9  g )Nz urn:x-cast:com.google.cast.mediar.  r/  )superr}   )r|   r.  r/  	__class__s      rb   r}   BaseMediaPlayer.__init__  s    ./) 	 	
ra   zen-USztext/vttr   F)r   thumbrh   autoplayrm   r  	subtitlessubtitles_langsubtitles_mimesubtitle_idenqueue
media_infocallback_functionrT   rj   r   r5  rh   r6  rm   r  r7  r8  r9  r:  r;  r<  r=  c                >    U R                  UUUUUUUUU	U
UUUUUS9  g)a  
Plays media on the Chromecast. Start default media receiver if not
already started.

Parameters:
url: str - url of the media.
content_type: str - mime type. Example: 'video/mp4'.
title: str - title of the media.
thumb: str - thumbnail image url.
current_time: float - Seconds since beginning of content. If the content is
    live content, and position is not specifed, the stream will start at the
    live position
autoplay: bool - whether the media will automatically play.
stream_type: str - describes the type of media artifact as one of the
    following: "NONE", "BUFFERED", "LIVE".
subtitles: str - url of subtitle file to be shown on chromecast.
subtitles_lang: str - language for subtitles.
subtitles_mime: str - mimetype of subtitles.
subtitle_id: int - id of subtitle to be loaded.
enqueue: bool - if True, enqueue the media instead of play it.
media_info: dict - additional MediaInformation attributes not explicitly listed.
metadata: dict - media metadata object, one of the following:
    GenericMediaMetadata, MovieMediaMetadata, TvShowMediaMetadata,
    MusicTrackMediaMetadata, PhotoMediaMetadata.

Docs:
https://developers.google.com/cast/docs/reference/messages#MediaData
https://developers.google.com/cast/docs/reference/web_receiver/cast.framework.messages.MediaInformation
r=  N)_send_start_play_media)r|   rT   rj   r   r5  rh   r6  rm   r  r7  r8  r9  r:  r;  r<  r=  s                   rb   
play_mediaBaseMediaPlayer.play_media  sE    b 	##/ 	$ 	
ra   c           
         U=(       d    0 nUUUU=(       d    0 S.UEnU(       a  UUS   S'   U(       a2  UUS   S'   SUS   ;  a  / US   S'   US   S   R                  SU05        US   (       a  SUS   ;  a  [        US   S'   U	(       a  UU	U
SS	UU
 S
U S3S./nUUS'   SSSS.US'   U(       aT  U R                  c  [        eU R                  R                  R
                  nSUR                  SUSSSS./[        [        0nOSU[        [        0nUb  UUS'   UUS'   0 US'   U	(       a  U/US'   U R                  USUS9  g )N)r  r  r  r  r  r   r5  r   rT   r   	SUBTITLESTEXTz - z	 Subtitle)trackIdtrackContentIdlanguagesubtypetypetrackContentTypenamer  z	#FFFFFF00OUTLINEz	#000000FF)backgroundColoredgeType	edgeColortextTrackStyler  itemsTr   )r   r6  	startTimepreloadTimer   r   r6  r  r  )inc_session_idr=  )appendr   _socket_clientr
   media_controllerr   ro   r	   TYPE_QUEUE_INSERT	TYPE_LOADsend_message)r|   rT   rj   r   r5  rh   r6  rm   r  r7  r8  r9  r:  r;  r<  r=  r   sub_msgr   msgs                       rb   r@  &BaseMediaPlayer._send_start_play_media  s   $  %2
%' B	

 
 ).E*g&).E*g&uZ00.0j!(+*h'..u~> uZ7H!H0EE*n-  +&/ .*"(6-.c+iH
G &E(O#.%('E"# ""*--((99@@F &"9"9!&$(%&'(	 /#C iC #!-C"JL%0MC !#dFWXra   media_idtimeoutkwargsc                    UR                  SS5      n[        USU 35      nU R                  " X40 UDSUR                  0D6  UR	                  5         g)z
Quick Play
media_typez	video/mp4zquick play r=  N)popr   rA  callbackwait_response)r|   r_  r`  ra  rc  response_handlers         rb   
quick_playBaseMediaPlayer.quick_play&  s[     ZZk:
';xj1IJ	
$*	
>N>W>W	
 	&&(ra   rW   )T)rX   rY   rZ   r[   r\   r]   r   r}   r   r  r  r_   r   rA  r@  r   rh  r`   __classcell__r3  s   @rb   r-  r-  |  s)   V
# 
t 
t 
 
 ! %)+ $ $%("&15#A
A
 A

 TzA
 TzA
 dlA
 A
 A
 +A
 :A
 A
 A
 A
 A
  4K!A
" ($.#A
$ 
%A
F[Y[Y [Y Tz	[Y
 Tz[Y dl[Y [Y [Y +[Y :[Y [Y [Y [Y [Y 4K[Y  ($.![Y" 
#[Yz	)c 	)E 	)S 	)T 	) 	)ra   r-  c                     ^  \ rS rSrSrS*U 4S j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4S jjrS\	S\S-  SS4S jrS+S\SS4S jjrS+S\SS4S jjrS+S\SS4S jjrS+S\SS4S jjrS+S\SS4S jjrS+S\S\SS4S jjrS+S\S\SS4S jjrS+S\SS4S jjrS+S\SS4S jjrS+S\S\SS4S jjrS+S\SS4S  jjr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$ jr!S%\S&\SS4S' jr"S*U 4S( jjr#S)r$U =r%$ )-MediaControlleri2  z3Controller to interact with Google media namespace.rf   Nc                    > [         TU ]  [        SS9  SU l        [	        5       U l        [        R                  " 5       U l        / U l	        g )NFr1  r   )
r2  r}   r   ro   rd   r   	threadingEventsession_active_event_status_listenersr|   r3  s    rb   r}   MediaController.__init__5  sE    0  	 	

 !"!m$-OO$5!<>ra   c                 $    U R                  5         g)z;Called when media channel is connected. Will update status.N)update_statusr{   s    rb   channel_connected!MediaController.channel_connected@  s    ra   c                 B    [        5       U l        U R                  5         g)z?Called when a media channel is disconnected. Will erase status.N)rd   r   _fire_status_changedr{   s    rb   channel_disconnected$MediaController.channel_disconnectedD  s    !m!!#ra   _messager   c                     U[            [        :X  a  U R                  U5        gU[            [        :X  a  U R	                  U5        gg)z(Called when a media message is received.TF)r	   TYPE_MEDIA_STATUS_process_media_statusTYPE_LOAD_FAILED_process_load_failed)r|   r}  r   s      rb   receive_messageMediaController.receive_messageI  sC    !22&&t,!11%%d+ra   listenerc                 :    U R                   R                  U5        g)zdRegister a listener for new media statuses. A new status will
call listener.new_media_status(status)N)rr  rV  r|   r  s     rb   register_status_listener(MediaController.register_status_listenerU  s     	%%h/ra   r?  r=  c                8    U R                  [        [        0US9  g)z"Send message to update the status.r?  N)r[  r	   TYPE_GET_STATUS)r|   r=  s     rb   rv  MediaController.update_statusZ  s     ?+?P 	 	
ra   commandc                    U R                   b  U R                   R                  c4  U R                  R                  SU[           5        U(       a	  U" SS5        gU R                   R                  US'   U R                  XSS9  g)z2Send a command to the Chromecast on media channel.Nz.%s command requested but no session is active.Fr  T)r=  rU  )r   ro   loggerwarningr	   r[  )r|   r  r=  s      rb   _send_commandMediaController._send_command`  sx     ;;$++">">"FKK@',BW !!%.$(KK$@$@ ! 	 	
ra   r`  c                     [        US5      nU R                  [        [        0UR                  5        UR                  5         g)zSend the PLAY command.playN)r   r  r	   	TYPE_PLAYre  rf  r|   r`  rg  s      rb   r  MediaController.playr  7    '8L)46F6O6OP&&(ra   c                     [        US5      nU R                  [        [        0UR                  5        UR                  5         g)zSend the PAUSE command.pauseN)r   r  r	   
TYPE_PAUSEre  rf  r  s      rb   r  MediaController.pausex  s7    '9L*57G7P7PQ&&(ra   c                     [        US5      nU R                  [        [        0UR                  5        UR                  5         g)zSend the STOP command.stopN)r   r  r	   	TYPE_STOPre  rf  r  s      rb   r  MediaController.stop~  r  ra   c                 (    U R                  SU5        g)z,Starts playing the media from the beginning.r   N)seekr|   r`  s     rb   rewindMediaController.rewind  s    		!Wra   c                     U R                   R                  (       a  U R                   R                  S:  a  gU R                  [        U R                   R                  5      S-
  U5        g)z;Skips rest of the media. Values less then -5 behaved flaky.   N)r   rk   r  r_   r  s     rb   skipMediaController.skip  sE    {{##t{{';';a'?		#dkk**+a/9ra   positionc                     [        USU 35      nU R                  [        [        SUSS0UR                  5        UR                  5         g)z&Seek the media to a specific location.zseek r   resumeStatePLAYBACK_STARTN)r   r  r	   	TYPE_SEEKre  rf  )r|   r  r`  rg  s       rb   r  MediaController.seek  sR    '5
1CDix/
 %%	
 	&&(ra   rp   c                     [        US5      nU R                  [        [        SU0UR                  5        UR                  5         g)z?Set the playback rate. 1.0 is regular time, 0.5 is slow motion.zset playback rater  N)r   r  r	   TYPE_SET_PLAYBACK_RATEre  rf  )r|   rp   r`  rg  s       rb   set_playback_rate!MediaController.set_playback_rate  sG    '1DE4 %%	
 	&&(ra   c                     [        US5      nU R                  [        [        SS0UR                  5        UR                  5         g)zSend the QUEUE_NEXT command.z
queue nextjumpr   Nr   r  r	   TYPE_QUEUE_UPDATEre  rf  r  s      rb   
queue_nextMediaController.queue_next  sA    '>,fa8:J:S:S	
 	&&(ra   c                     [        US5      nU R                  [        [        SS0UR                  5        UR                  5         g)zSend the QUEUE_PREV command.z
queue prevr  Nr  r  s      rb   
queue_prevMediaController.queue_prev  sA    '>,fb9;K;T;T	
 	&&(ra   track_idc                     [        US5      nU R                  [        [        SU/0UR                  5        UR                  5         g)zEnable specific text track.zenable subtitler  Nr   r  r	   TYPE_EDIT_TRACKS_INFOre  rf  )r|   r  r`  rg  s       rb   enable_subtitleMediaController.enable_subtitle  sE    '1BC02BXJO%%	
 	&&(ra   c                     [        US5      nU R                  [        [        S/ 0UR                  5        UR                  5         g)zDisable subtitle.zdisable subtitler  Nr  r  s      rb   disable_subtitle MediaController.disable_subtitle  sC    '1CD02BBG%%	
 	&&(ra   c                 6    U R                   R                  US9  g)a  
Blocks thread until the media controller session is active on the
chromecast. The media controller only accepts playback control
commands when a media session is active.

If a session is already active then the method returns immediately.

:param timeout: a floating point number specifying a timeout for the
                operation in seconds (or fractions thereof). Or None
                to block forever.
)r`  N)rq  waitr  s     rb   block_until_active"MediaController.block_until_active  s     	!!&&w&7ra   c                 >   U R                   R                  U5        U R                  R                  SU R                   5        U R                   R                  c  U R
                  R                  5         OU R
                  R                  5         U R                  5         g)zProcesses a STATUS message.zMedia:Updated status %sN)	r   r  r  debugro   rq  clearsetrz  )r|   r   s     rb   r  %MediaController._process_media_status  so    4 3T[[A ;;''/%%++-%%))+!!#ra   c                    UR                  S5      nUR                  S5      nU R                  R                  SU[        R                  US5      U5        Ub  Uc  U R                  R                  S5        gU R	                  X#5        g)z Processes a LOAD_FAILED message.itemIddetailedErrorCodez7Media:Load failed with code %s(%s) for queue item id %szunknown codeNzMedia:Not firing load failed)r   r  r  rP   _fire_load_failed)r|   r   r%  r&  s       rb   r  $MediaController._process_load_failed  s{    $(HHX$6!%*=!>
E$((^D		
  J$6KK<=}9ra   c                     U R                    H  n UR                  U R                  5        M!     g! [         a    [        R                  S5         MF  f = f)$Tells listeners of a changed status.z3Exception thrown when calling media status callbackN)rr  r"  r   	Exception_LOGGER	exceptionr  s     rb   rz  $MediaController._fire_status_changed  sL    ..HY))$++6 /  Y!!"WXYs   1AAr%  r&  c                     U R                    H  n UR                  X5        M     g! [         a    [        R	                  S5         M<  f = f)r  z2Exception thrown when calling load failed callbackN)rr  r(  r  r  r  )r|   r%  r&  r  s       rb   r  !MediaController._fire_load_failed  sH    ..HX**=E /  X!!"VWXs   'A
	A
c                 0   > [         TU ]  5         / U l        g)z$Called when controller is destroyed.N)r2  	tear_downrr  rs  s    rb   r  MediaController.tear_down  s    !#ra   )rr  ro   rq  r   r  )g      $@)N)&rX   rY   rZ   r[   r\   r}   rw  r{  r   r  r   r  r   r  r   rv  r  r  r  r  r  r  r  r  r  r  r  r_   r  r  r  r  r  rz  r  r  r`   rj  rk  s   @rb   rm  rm  2  s   =	?$

 
4 
D 
01D 0 0
 IM 
,2E 
QU 


0<t0C
	
$)E )T ))U )d ))E )T )e t :E :T :)U )U )d )
)u 
)u 
)PT 
))% )4 ))% )4 )) )e )t )) ) )8%$, 8$ 8$$ $4 $: :$ :$YXs X X X$ $ra   rm  c                   0   ^  \ rS rSrSrSU 4S jjrSrU =r$ )DefaultMediaReceiverControlleri  zBController to force media to play with the default media receiver.c                 (   > [         TU ]  [        S9  g )N)r.  )r2  r}   r   rs  s    rb   r}   'DefaultMediaReceiverController.__init__  s    +=>ra   rW   r  )rX   rY   rZ   r[   r\   r}   r`   rj  rk  s   @rb   r  r    s    L? ?ra   r  )Vr\   r*  r   r   dataclassesr   loggingro  typingr   configr   constr	   errorr
   generated.cast_channel_pb2r   rg  r    r   r   rl   r   r   r   r   r   r   rq   r  r  rZ  r  rY  r  r  r  TYPE_QUEUE_NEXTTYPE_QUEUE_PREVr  r  r  r  r   r   r   r   r   r   r   r   r   CMD_SUPPORT_ALL_BASIC_MEDIAr   r   CMD_SUPPORT_QUEUE_SHUFFLECMD_SUPPORT_QUEUE_REPEAT_ALLCMD_SUPPORT_QUEUE_REPEAT_ONECMD_SUPPORT_QUEUE_REPEATCMD_SUPPORT_SKIP_ADCMD_SUPPORT_EDIT_TRACKSCMD_SUPPORT_PLAYBACK_RATECMD_SUPPORT_LIKECMD_SUPPORT_DISLIKECMD_SUPPORT_FOLLOWCMD_SUPPORT_UNFOLLOWCMD_SUPPORT_STREAM_TRANSFERr   r   rP   r  r_   r]   r^   rS   	getLoggerrX   r  rd   ABCr   r-  rm  r  rW   ra   rb   <module>r     s  
  ' !    '   + , / !  & * $   & * 	  " " 
	" 	, 	          #    # #          $    333 3 	3
 	"3 	 3 	3 	 3 	3 	3 	&3 	3 	&3 	3 	&3  	!3" #3$ 
				 	#	$	$	53 $sTz3/ < $   

H
%p' p'f#'' s)) s)lY$o Y$x?_ ?ra   