
    Eg&                         d dl mZmZmZmZ d dlmZ d dlmZ d dl	m
Z
  G d de      Z G d de      Z G d	 d
ej                        Zy)    )GioGLibCScreensaverGObject)IntEnum)
BaseClient)trackersc                       e Zd ZdZdZdZdZy)PlaybackStatusr            N)__name__
__module____qualname__UnknownPlayingPausedStopped     ?/usr/share/cinnamon-screensaver/dbusdepot/mediaPlayerWatcher.pyr   r   	   s    GGFGr   r   c                       e Zd ZdZej
                  j                  deffej
                  j                  ddfdZ fdZ	d Z
d Zd Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd ZddZddZ xZS )MprisClienta  
    Represents a media player with an mpris dbus interface.

    There can be as many of these as there are players active in the session,
    but we only control the first active one in our list.

    These are instantiated by our MediaPlayerWatcher.
    Nr   )status-changedmetadata-changedc                     t         t        |   t        j                  j
                  t        j                  ||       d | _        d | _	        d| _
        d| _        d| _        d| _        y N )superr   __init__r   BusTypeSESSIONr   MediaPlayerProxyidentitymetadata
album_name
track_nameartist_namealbumart_url)selfnamepath	__class__s      r   r!   zMprisClient.__init__   s[    k4)#++*=*=*6*G*G*.*.	0
 r   c                 j   t        j                         j                  | j                  d| j                         t        j                         j                  | j                  d| j
                         | j                          | j                  j                         j                  d      d   | _	        y )Nznotify::playback-statusznotify::metadata.r   )
r	   con_tracker_getconnectproxyon_playback_status_changedon_metadata_changedensure_metadataget_name
rpartitionr%   r+   s    r   on_client_setup_completez$MprisClient.on_client_setup_complete)   s      "**4::+D+/+J+J	L 	  "**4::+=+/+C+C	E 	
 

++-88=a@r   c                     | j                   S N)r%   r9   s    r   get_identityzMprisClient.get_identity9   s    }}r   c                     t         j                  }| j                         r5| j                  j	                  d      }	 t        t        d|z               }|S |S # t        t        t        f$ r Y |S w xY w)Nzplayback-statuszPlaybackStatus.)	r   r   ensure_proxy_aliver3   get_propertyeval
ValueError	TypeErrorSyntaxError)r+   statusstr_props      r   get_playback_statuszMprisClient.get_playback_status<   ss    ''""$zz../@AH'->-I(JK v 	;7 s   A A0/A0c                     | j                         r8| j                  j                  d      xs | j                  j                  d      S y)Nzcan-playz	can-pauseFr?   r3   r@   r9   s    r   get_can_play_pausezMprisClient.get_can_play_pauseI   s;    ""$::**:6^$**:Q:QR]:^^r   c                 Z    | j                         r| j                  j                  d      S y)Nzcan-controlFrI   r9   s    r   get_can_controlzMprisClient.get_can_controlO   &    ""$::**=99r   c                 Z    | j                         r| j                  j                          y y r<   )r?   r3   call_play_pauser9   s    r   
play_pausezMprisClient.play_pauseU   s#    ""$JJ&&( %r   c                 Z    | j                         r| j                  j                  d      S y)Nzcan-go-nextFrI   r9   s    r   get_can_go_nextzMprisClient.get_can_go_nextY   rM   r   c                 Z    | j                         r| j                  j                          y y r<   )r?   r3   	call_nextr9   s    r   go_nextzMprisClient.go_next_   s#    ""$JJ  " %r   c                 Z    | j                         r| j                  j                  d      S y)Nzcan-go-previousFrI   r9   s    r   get_can_go_previouszMprisClient.get_can_go_previousc   s'    ""$::**+<==r   c                 Z    | j                         r| j                  j                          y y r<   )r?   r3   call_previousr9   s    r   go_previouszMprisClient.go_previousi   s#    ""$JJ$$& %r   c                 X    | j                         r| j                  j                         S yr   )r?   r3   r7   r9   s    r   r7   zMprisClient.get_namem   s$    ""$::&&((r   c                 :    | j                          | j                  S r<   )r6   r(   r9   s    r   get_track_namezMprisClient.get_track_names       r   c                 :    | j                          | j                  S r<   )r6   r)   r9   s    r   get_artist_namezMprisClient.get_artist_namex   s    r   c                 :    | j                          | j                  S r<   )r6   r'   r9   s    r   get_album_namezMprisClient.get_album_name}   r^   r   c                 :    | j                          | j                  S r<   )r6   r*   r9   s    r   get_albumart_urlzMprisClient.get_albumart_url   s       r   c                      y r<   r   )r+   argss     r   
on_failurezMprisClient.on_failure   s    r   c                 r    t        |      t        k(  rdj                  |      S t        |      t        k(  r|S y)Nz, r   )typelistjoinstr)r+   items     r   return_best_stringzMprisClient.return_best_string   s0    :99T?"$Z3Kr   c                    | j                   s| j                  j                  d      | _         | j                   r	 | j                  | j                   d         | _        	 | j                  | j                   d         | _        	 | j                  | j                   d         | _        	 | j                  | j                   d         | _        y y y # t
        $ r
 d| _        Y w xY w# t
        $ r
 d| _        Y sw xY w# t
        $ r6 	 | j                  | j                   d         | _        n#  d| _        Y nxY wY w xY w# t
        $ r
 d| _        Y y w xY w)Nr&   zxesam:titler   zxesam:albumzxesam:albumArtistzxesam:artistzmpris:artUrl)	r&   r3   r@   rn   r(   KeyErrorr'   r)   r*   r9   s    r   r6   zMprisClient.ensure_metadata   s;   }} JJ33J?DM}})&*&=&=dmmM>Z&[DO)&*&=&=dmmM>Z&[DO.'+'>'>t}}M`?a'bD$+(,(?(?n@](^D%#  
   )&(DO)   )&(DO)   ..+/+B+B4==Q_C`+a(.+-(	.   +(*D%+s_   #C #C" #C8 &#D: CC"C54C58	D7#D&%D7&	D1/D76D7:EEc                 D    | j                  d| j                                y )Nr   )emitrG   r+   r3   pspecdatas       r   r4   z&MprisClient.on_playback_status_changed   s    		"D$<$<$>?r   c                 T    d | _         | j                          | j                  d       y )Nr   )r&   r6   rr   rs   s       r   r5   zMprisClient.on_metadata_changed   s"    		$%r   r<   )r   r   r   __doc__r   SignalFlagsRUN_LASTint__gsignals__r!   r:   r=   rG   rJ   rL   rP   rR   rU   rW   rZ   r7   r]   r`   rb   rd   rg   rn   r6   r4   r5   __classcell__r.   s   @r   r   r      s     #..77vF$00994DLA )#'
 

!
+0@&r   r   c                   T     e Zd ZdZdZ fdZddZd ZddZd Z	d Z
d	 Zd
 Z xZS )MediaPlayerWatchera  
    Media player interfaces are different from our other interfaces.
    There is no common owned name, players export their own unique interface,
    within the org.mpris.MediaPlayer2.* namespace.  This allows multiple
    players to exist on the bus at one time.  It requires us to list all
    interfaces and filter out all but the ones in that namespace.  We then
    create separate Player clients for each one.
    z/org/mpris/MediaPlayer2c           	         t         t        |           g | _        	 t        j
                  j                  t        j                  j                  t        j                  j                  ddddd      | _        t        j                         j                  | j                  d| j                         | j!                          y# t"        j$                  $ r d| _        t'        d       Y yw xY w)zG
        Connect to the bus and retrieve a list of interfaces.
        Nzorg.freedesktop.DBusz/org/freedesktop/DBuszg-signalzMCannot acquire session org.freedesktop.DBus client to watch for media players)r    r   r!   player_clientsr   	DBusProxynew_for_bus_syncr"   r#   DBusProxyFlagsNONE
dbus_proxyr	   r1   r2   on_dbus_proxy_signalfind_initial_playersr   Errorprint)r+   r.   s    r   r!   zMediaPlayerWatcher.__init__   s     	 $02 	c!mm<<S[[=P=P=@=O=O=T=T=A=S=T=S=ACDO $$&..t/9/3/H/HJ %%'zz 	c"DOab	cs   B#C   %C('C(c                 r    |dk(  r2|d   dk7  r| j                  |d          y| j                  |d          yy)z
        NameOwnerChanged is called both when a name appears on the bus, as
        well as when it disappears.  The filled parameters tell us whether we've
        gained or lost the player.
        NameOwnerChangedr   r   r   N)on_name_acquiredon_name_lost)r+   r3   sendersignal
parametersru   s         r   r   z'MediaPlayerWatcher.on_dbus_proxy_signal   sB     ''!}"%%jm4!!*Q-0	 (r   c                     | j                   j                  dd t        j                  j                  dd | j
                         y )N	ListNames)r   callr   DBusCallFlagsr   on_names_listedr9   s    r   r   z'MediaPlayerWatcher.find_initial_players   s7    [! ..33!!11	3r   c                 \    |j                  |      d   }|D ]  }| j                  |        y )Nr   )call_finishr   )r+   busresultru   namesr,   s         r   r   z"MediaPlayerWatcher.on_names_listed   s2    '* 	(D!!$'	(r   c                     |j                  d      r0| j                  j                  t        || j                               yy)zG
        Create an mpris client for any discovered interfaces.
        zorg.mpris.MediaPlayer2.N)
startswithr   appendr   
MPRIS_PATH)r+   r,   s     r   r   z#MediaPlayerWatcher.on_name_acquired   s5     ??45&&{4'IJ 6r   c                     d}| j                   D ]  }|j                         |k(  s|} n |r| j                   j                  |       yy)z@
        Remove any clients that disappear off the bus.
        N)r   r7   remove)r+   r,   rm   clients       r   r   zMediaPlayerWatcher.on_name_lost   sS     )) 	F D(	
 &&t, r   c                     d}| j                   D ]N  }|j                         t        j                  k(  r|c S |+|j	                         s<|j                         sM|}P |S )a  
        Find the first player in our list that is playing, then for one
        that *can* be played.  Players that are simply loaded but don't 
        have any playlist queued up should not pass these tests - we have
        only limited control from the lockscreen.
        N)r   rG   r   r   rJ   rL   )r+   
first_idler   s      r   get_best_playerz"MediaPlayerWatcher.get_best_player  sc     
)) 	$F))+~/E/EE!f&?&?&AfF\F\F^#
	$ r   c                     g }| j                   D ]Q  }|j                         }|j                  d      }|j                  |t	        |      dz
     j                                S |S )a4  
        Return a list of all player simple names - this is used by our
        notification code to ignore notifications sent from media players,
        which are usually unimportant, but not marked as transient (which
        would normally cause them to be ignored in the CsNotificationWatcher.)
        r0   r   )r   r7   splitr   lenlower)r+   retr   fullnamer   s        r   get_all_player_namesz'MediaPlayerWatcher.get_all_player_names  sa     )) 	6F(HNN3'EJJuSZ!^,2245	6
 
r   r<   )r   r   r   rw   r   r!   r   r   r   r   r   r   r   r|   r}   s   @r   r   r      s9     +Jc4
13(K-&r   r   N)gi.repositoryr   r   r   r   enumr   dbusdepot.baseClientr   utilr	   r   r   Objectr   r   r   r   <module>r      sC    ; :  + W a&* a&Ft tr   