
    i2                       S r SSKJ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JrJrJr  SS	KJrJr  S
SKJr  S
SKJr  S
SKJrJrJrJrJr  \(       a  S
SK
Jr  \R<                  " \5      r Sr!Sr"Sr#Sr$Sr%Sr&Sr'Sr(Sr) " S S\5      r* " S S\5      r+ " S S\RX                  5      r- " S S\RX                  5      r. " S  S!\\\\-5      r/ " S" S#5      r0 " S$ S%\5      r1g)&z,
Controller to monitor audio group members.
    )annotationsN)TYPE_CHECKING	TypedDict)UUID   )BaseController)MediaControllerMediaStatusListenerMediaStatus)
CastStatusCastStatusListener   )MESSAGE_TYPE)CastMessage)CONNECTION_STATUS_CONNECTEDCONNECTION_STATUS_DISCONNECTEDCONNECTION_STATUS_LOSTConnectionStatusConnectionStatusListener)
Chromecastz$urn:x-cast:com.google.cast.multizoneCASTING_GROUPSDEVICE_ADDEDDEVICE_UPDATEDDEVICE_REMOVEDGET_CASTING_GROUPS
GET_STATUSMULTIZONE_STATUSPLAYBACK_SESSION_UPDATEDc                  .    \ rS rSr% SrS\S'   S\S'   Srg)		GroupInfo+   z/Chromecast connection and listener for a group.r   
chromecastListenerlistener N__name__
__module____qualname____firstlineno____doc____annotations____static_attributes__r%       Y/home/sebas/venvs/catt/lib/python3.13/site-packages/pychromecast/controllers/multizone.pyr    r    +   s    9r.   r    c                  .    \ rS rSr% SrS\S'   S\S'   Srg)	GroupMemberInfo2   z+Group memberships and listener for a group.zset[str]group_membershipszlist[MultiZoneManagerListener]	listenersr%   Nr&   r%   r.   r/   r1   r1   2   s    5--r.   r1   c                      \ rS rSrSr\R                  SS j5       r\R                  SS j5       r\R                  S	S j5       r	Sr
g)
MultiZoneControllerListener9   z*Listener for receiving audio group events.c                    gz:The cast has been added to group identified by group_uuid.Nr%   self
group_uuids     r/   multizone_member_added2MultiZoneControllerListener.multizone_member_added<       r.   c                    gz>The cast has been removed from group identified by group_uuid.Nr%   r:   s     r/   multizone_member_removed4MultiZoneControllerListener.multizone_member_removed@   r?   r.   c                    g)z"Multizone status has been updated.Nr%   r;   s    r/   multizone_status_received5MultiZoneControllerListener.multizone_status_receivedD   r?   r.   r%   Nr<   strreturnNonerJ   rK   )r'   r(   r)   r*   r+   abcabstractmethodr=   rB   rF   r-   r%   r.   r/   r6   r6   9   sU    4I I 	M M 	1 1r.   r6   c                      \ rS rSrSr\R                  S	S j5       r\R                  S	S j5       r\R                        S
S j5       r	\R                        SS j5       r
Srg)MultiZoneManagerListenerI   z<Listener for receiving audio group events for a cast device.c                    gr9   r%   r:   s     r/   added_to_multizone+MultiZoneManagerListener.added_to_multizoneL   r?   r.   c                    grA   r%   r:   s     r/   removed_from_multizone/MultiZoneManagerListener.removed_from_multizoneP   r?   r.   c                    g)zXThe group identified by group_uuid, of which the cast is a member, has new media status.Nr%   )r;   r<   media_statuss      r/   multizone_new_media_status3MultiZoneManagerListener.multizone_new_media_statusT   r?   r.   c                    g)zRThe group identified by group_uuid, of which the cast is a member, has new status.Nr%   )r;   r<   cast_statuss      r/   multizone_new_cast_status2MultiZoneManagerListener.multizone_new_cast_statusZ   r?   r.   r%   NrH   )r<   rI   rY   r   rJ   rK   )r<   rI   r]   r   rJ   rK   )r'   r(   r)   r*   r+   rM   rN   rS   rV   rZ   r^   r-   r%   r.   r/   rP   rP   I   s    FI I 	M M 	gg-8g	g g
 	aa,6a	a ar.   rP   c                  t    \ rS rSrSr      SS jrSS jrSS jrSS jrSS jr	SS jr
SS	 jrSS
 jrSrg)r#   a   zCallback handler.c                ^   X l         UR                  U 5        UR                  R                  U 5        UR                  U 5        [	        UR
                  5      U l        U R                  R                  U 5        [        UR
                  5      U l	        UR                  U R                  5        g)zInitialize the listener.N)_castsregister_status_listenermedia_controllerregister_connection_listenerMultizoneControlleruuid_mzregister_listenerrI   _group_uuidregister_handler)r;   
group_castcastss      r/   __init__Listener.__init__i   s~     ++D1##<<TB//5&z7""4(z/##DHH-r.   c                    U R                   nU R                  R                  nU H=  nXB;  a  M
  [        X$   S   5       H  nUR	                  U R
                  U5        M!     M?     g)z%Handle reception of a new CastStatus.r4   N)rc   ri   memberslistr^   rk   r;   statusrn   group_membersmember_uuidr$   s         r/   new_cast_statusListener.new_cast_statusv   s[    (((K' !3K!@A2243C3CVL B )r.   c                    U R                   nU R                  R                  nU H=  nXB;  a  M
  [        X$   S   5       H  nUR	                  U R
                  U5        M!     M?     g)z&Handle reception of a new MediaStatus.r4   N)rc   ri   rr   rs   rZ   rk   rt   s         r/   new_media_statusListener.new_media_status   s[    (((K' !3K!@A33D4D4DfM B )r.   c                    g)zCalled when load media failed.Nr%   )r;   queue_item_id
error_codes      r/   load_media_failedListener.load_media_failed   r?   r.   c                    UR                   [        :X  a  U R                  R                  5         UR                   [        [
        4;   a  U R                  R                  5         gg)z+Handle reception of a new ConnectionStatus.N)ru   r   ri   update_membersr   r   reset_members)r;   ru   s     r/   new_connection_statusListener.new_connection_status   sM    ==77HH##%==*"
 
 HH""$	
r.   c                    U R                   nX;  a  / [        5       S.X!'   X!   S   R                  U R                  5        [	        X!   S   5       H  nUR                  U R                  5        M      g)z Handle added audio group member.r4   r3   r3   r4   N)rc   setaddrk   rs   rS   r;   r<   rn   r$   s       r/   r=   Listener.multizone_member_added   sh    ".0su ME-.2243C3CDU.{;<H''(8(89 =r.   c                    U R                   nX;  a  / [        5       S.X!'   X!   S   R                  U R                  5        [	        X!   S   5       H  nUR                  U R                  5        M      g)z"Handle removed audio group member.r   r3   r4   N)rc   r   discardrk   rs   rV   r   s       r/   rB   !Listener.multizone_member_removed   sh    ".0su ME-.66t7G7GHU.{;<H++D,<,<= =r.   c                    g)z'Handle reception of audio group status.Nr%   rE   s    r/   rF   "Listener.multizone_status_received   r?   r.   )rc   rk   ri   N)rm   r   rn   zdict[str, GroupMemberInfo]rJ   rK   )ru   r   rJ   rK   )ru   r   rJ   rK   )r~   intr   r   rJ   rK   )ru   r   rJ   rK   rH   rL   )r'   r(   r)   r*   r+   ro   rx   r{   r   r   r=   rB   rF   r-   r%   r.   r/   r#   r#   a   sI     .$.-G.	.MN-%:>6r.   r#   c                  v    \ rS rSrSrSS jrSS jrSS jr      SS jr      SS jr	SS jr
SS	 jrS
rg)MultizoneManager   zManage audio groups.c                     0 U l         0 U l        g )Nrc   _groupsrE   s    r/   ro   MultizoneManager.__init__   s     35-/r.   c                t    U[        XR                  5      S.U R                  [        UR                  5      '   g)zStart managing a group)r"   r$   N)r#   rc   r   rI   rh   )r;   rm   s     r/   add_multizoneMultizoneManager.add_multizone   s,     % [[9.
S)*r.   c                    [        U5      nU R                  R                  US5      nUb  US   R                  R	                  5         U R
                  R                  5        H  nUS   R                  U5        M     g)zStop managing a groupNr$   r3   )rI   r   popri   r   rc   valuesr   )r;   r<   group_uuid_strgroupmembers        r/   remove_multizone!MultizoneManager.remove_multizone   si    Z  6*!!//1kk((*F&'//? +r.   c                    [        U5      nX0R                  ;  a  / [        5       S.U R                  U'   U R                  U   S   R                  U5        g)a  Register a listener for audio group changes of cast uuid.
On update will call:
listener.added_to_multizone(group_uuid)
    The cast has been added to group uuid
listener.removed_from_multizone(group_uuid)
    The cast has been removed from group uuid
listener.multizone_new_media_status(group_uuid, media_status)
    The group uuid, of which the cast is a member, has new status
listener.multizone_new_cast_status(group_uuid, cast_status)
    The group uuid, of which the cast is a member, has new status
r   r4   N)rI   rc   r   append)r;   rw   r$   member_uuid_strs       r/   rj   "MultizoneManager.register_listener   sK     k*++-9;RURW+XDKK(O$[188Br.   c                X    U R                   [        U5         S   R                  U5        g)z9Deregister listener for audio group changes of cast uuid.r4   N)rc   rI   remove)r;   rw   r$   s      r/   deregister_listener$MultizoneManager.deregister_listener   s%     	C$%k299(Cr.   c                J    [        U R                  [        U5         S   5      $ )zCReturn a list of audio groups in which cast member_uuid is a memberr3   )rs   rc   rI   )r;   rw   s     r/   get_multizone_memberships*MultizoneManager.get_multizone_memberships   s!    DKKK 012EFGGr.   c                L    U R                   [        U5         S   R                  $ )zGet mediacontroller of a groupr"   )r   rI   re   r:   s     r/   get_multizone_mediacontroller.MultizoneManager.get_multizone_mediacontroller   s     ||C
O,\:KKKr.   r   NrL   )rm   r   rJ   rK   )r<   r   rJ   rK   )rw   r   r$   rP   rJ   rK   )rw   r   rJ   	list[str])r<   r   rJ   r	   )r'   r(   r)   r*   r+   ro   r   r   rj   r   r   r   r-   r%   r.   r/   r   r      sc    0
@CC+CC	C&DD+CD	DHLr.   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 jr\	SS j5       r
SS jrSS	 jrSS
 jr      SS jrSU 4S jjrSrU =r$ )rg      z*Controller to monitor audio group members.c                f   > 0 U l         / U l        [        U5      U l        [        TU ]  [        SS9  g )NT)target_platform)_members_status_listenersrI   _uuidsuperro   MULTIZONE_NAMESPACE)r;   rh   	__class__s     r/   ro   MultizoneController.__init__   s0    (*DFY
,dCr.   c                    XR                   ;  ai  X R                   U'   [        R                  SU R                  UUU R                   5        [	        U R
                  5       H  nUR                  U5        M     g g )Nz%(%s) Added member %s(%s), members: %s)r   _LOGGERdebugr   rs   r   r=   r;   rh   namer$   s       r/   _add_memberMultizoneController._add_member   se    }}$"&MM$MM7

 !!7!78//5 9 %r.   c                    U R                   R                  US5      n[        R                  SU R                  UUU R                   5        [        U R                  5       H  nUR                  U5        M     g )Nz	<Unknown>z'(%s) Removed member %s(%s), members: %s)r   r   r   r   r   rs   r   rB   r   s       r/   _remove_member"MultizoneController._remove_member   s`    }}  {35JJMM	
 T334H--d3 5r.   c                :    U R                   R                  U5        g)zRegister a listener for audio group changes. On update will call:
listener.multizone_member_added(uuid)
listener.multizone_member_removed(uuid)
listener.multizone_status_received()
N)r   r   )r;   r$   s     r/   rj   %MultizoneController.register_listener  s     	%%h/r.   c                H    [        U R                  R                  5       5      $ )z%Return a list of audio group members.)rs   r   keysrE   s    r/   rr   MultizoneController.members  s     DMM&&())r.   c                ^    [        U R                  5       H  nU R                  U5        M     g)zReset audio group members.N)rs   r   r   )r;   rh   s     r/   r   !MultizoneController.reset_members  s#    'D% (r.   c                :    U R                  [        [        05        g)zUpdate audio group members.N)send_messager   TYPE_GET_STATUSrE   s    r/   r   "MultizoneController.update_members  s    <9:r.   c                :    U R                  [        [        05        g)z Send GET_CASTING_GROUPS message.N)r   r   TYPE_GET_CASTING_GROUPSrE   s    r/   get_casting_groups&MultizoneController.get_casting_groups!  s    <)@ABr.   c                   U[            [        :X  a"  US   S   nUS   S   nU R                  X45        gU[            [        :X  a  US   nU R	                  U5        gU[            [
        :X  a"  US   S   nUS   S   nU R                  X45        gU[            [        :X  Ga2  US   S   nU Vs0 s H  ofS   US   _M     nn[        [        U R                  R                  5       5      [        UR                  5       5      -
  5      n[        [        UR                  5       5      [        U R                  R                  5       5      -
  5      n[        R                  SU R                  UU5        U H  nU R	                  U5        M     U H  nU R                  X5U   5        M     [        U R                  5       H  n	U	R                  5         M     gU[            [         :X  a  gU[            ["        :X  a  ggs  snf )	z,Called when a multizone message is received.devicedeviceIdr   Tru   devicesz*(%s) Added members %s, Removed members: %sF)r   TYPE_DEVICE_ADDEDr   TYPE_DEVICE_REMOVEDr   TYPE_DEVICE_UPDATEDTYPE_MULTIZONE_STATUSrs   r   r   r   r   r   r   r   rF   TYPE_SESSION_UPDATEDTYPE_CASTING_GROUPS)
r;   _messagedatarh   r   rr   r   removed_membersadded_membersr$   s
             r/   receive_message#MultizoneController.receive_message%  s    !22>*-D>&)DT(!44
#D%!44>*-D>&)DT(!668nY/GHOPfj)6&>9GP"3t}}'9'9';#<s7<<>?R#RSO W\\^!4s4==;M;M;O7P!PQMMM<

	 (##D) (%  t}5 & !!7!78224 9 !55!449 Qs   -G8c                0   > [         TU ]  5         / U l        g)z$Called when controller is destroyed.N)r   	tear_downr   )r;   r   s    r/   r   MultizoneController.tear_downZ  s    !#r.   )r   r   r   )rh   r   rJ   rK   )rh   rI   r   rI   rJ   rK   )rh   rI   rJ   rK   )r$   r6   rJ   rK   )rJ   r   rL   )r   r   r   dictrJ   bool)r'   r(   r)   r*   r+   ro   r   r   rj   propertyrr   r   r   r   r   r   r-   __classcell__)r   s   @r/   rg   rg      sg    4D6
40 * *&
;C3#3+/3	3j$ $r.   rg   )2r+   
__future__r   rM   loggingtypingr   r   rh   r    r   mediar	   r
   r   receiverr   r   constr   generated.cast_channel_pb2r   socket_clientr   r   r   r   r   r   	getLoggerr'   r   r   r   r   r   r   r   r   r   r   r    r1   ABCr6   rP   r#   r   rg   r%   r.   r/   <module>r      s    # 
  +   D D 4   5  


H
%< & " & & . * 1 	 .i .1#'' 1 asww a0I6	I6X9L 9Lxu$. u$r.   