Changeset 9962

Show
Ignore:
Timestamp:
07/19/08 21:55:13 (5 months ago)
Author:
steve-e
Message:

Add use_tune support for banshee 1.0. (No more polling, yeah!)

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/src/music_track_listener.py

    r9643 r9962  
    3333        __slots__ = ['title', 'album', 'artist', 'duration', 'track_number', 
    3434                'paused'] 
    35  
    3635 
    3736class MusicTrackListener(gobject.GObject): 
     
    5857                bus.add_signal_receiver(self._mpris_playing_changed_cb, 'StatusChange', 
    5958                        'org.freedesktop.MediaPlayer') 
    60                          
     59                bus.add_signal_receiver(self._player_name_owner_changed, 
     60                        'NameOwnerChanged', 'org.freedesktop.DBus', arg0='org.freedesktop.MediaPlayer') 
    6161 
    6262                ## Muine 
     
    7777 
    7878                ## Banshee 
    79                 # Banshee sucks because it only supports polling. 
    80                 # Thus, we only register this is we are very sure that it's 
    81                 # installed. 
    82                 if os.name == 'posix' and os.system('which banshee >/dev/null 2>&1') == 0: 
    83                         banshee_bus = dbus.SessionBus() 
    84                         dubus = banshee_bus.get_object('org.freedesktop.DBus', 
    85                                 '/org/freedesktop/dbus') 
    86                         self.dubus_methods = dbus.Interface(dubus, 'org.freedesktop.DBus') 
    87                         self.current_banshee_title = '' 
    88                         self.banshee_paused_before = False 
    89                         self.banshee_is_here = False 
    90                         gobject.timeout_add_seconds(10, self._check_if_banshee_bus) 
    91                         if self.dubus_methods.NameHasOwner('org.gnome.Banshee'): 
    92                                 self._get_banshee_bus() 
    93                                 self.banshee_is_here = True 
    94                         # Otherwise, it opens Banshee! 
    95                         self.banshee_props ={} 
    96                         gobject.timeout_add_seconds(1, self._banshee_check_track_status) 
    97  
    98         def _check_if_banshee_bus(self): 
    99                 if self.dubus_methods.NameHasOwner('org.gnome.Banshee'): 
    100                         self._get_banshee_bus() 
    101                         self.banshee_is_here = True 
    102                 else: 
    103                         self.banshee_is_here = False 
    104                 return True 
    105  
    106         def _get_banshee_bus(self): 
    107                 bus = dbus.SessionBus() 
    108                 banshee = bus.get_object('org.gnome.Banshee', '/org/gnome/Banshee/Player') 
    109                 self.banshee_methods = dbus.Interface(banshee, 'org.gnome.Banshee.Core') 
    110  
    111         def do_music_track_changed(self, info): 
    112                 if info is not None: 
    113                         self._last_playing_music = info 
     79                bus.add_signal_receiver(self._banshee_state_changed_cb, 
     80                        'StateChanged', 'org.bansheeproject.Banshee.PlayerEngine') 
     81                bus.add_signal_receiver(self._player_name_owner_changed, 
     82                        'NameOwnerChanged', 'org.freedesktop.DBus', arg0='org.bansheeproject.Banshee') 
    11483 
    11584        def _player_name_owner_changed(self, name, old, new): 
     
    193162                return info 
    194163 
    195         def _banshee_check_track_status(self): 
    196                 if self.dubus_methods.NameHasOwner('org.gnome.Banshee') and \ 
    197                 not hasattr(self, 'banshee_methods'): 
    198                         self._get_banshee_bus() 
    199  
    200                 if self.dubus_methods.NameHasOwner('org.gnome.Banshee') and self.banshee_is_here: 
    201                         try: 
    202                                 self.banshee_props['title'] = self.banshee_methods.GetPlayingTitle() 
    203                                 self.banshee_props['album'] = self.banshee_methods.GetPlayingAlbum() 
    204                                 self.banshee_props['artist'] = self.banshee_methods.\ 
    205                                         GetPlayingArtist() 
    206                                 self.banshee_props['duration'] = \ 
    207                                 self.banshee_methods.GetPlayingDuration() 
    208                                 self.banshee_props['paused'] = self.banshee_methods.\ 
    209                                         GetPlayingStatus() 
    210                                 info = self._banshee_properties_extract(self.banshee_props) 
    211                         except dbus.DBusException, err: 
    212                                 info = None 
    213  
    214                                 for key in self.banshee_props.keys(): 
    215                                         self.banshee_props[key] = '' 
    216                                 self.banshee_is_here = False 
    217  
    218                         if self.current_banshee_title != self.banshee_props['title']: 
    219                                 self.emit('music-track-changed', info) 
    220                                 self.banshee_paused_before = False 
    221                         if self.banshee_props['paused'] == 0 and self.banshee_paused_before ==\ 
    222                         False: 
    223                                 self.emit('music-track-changed', info) 
    224                                 self.banshee_paused_before = True 
    225                         else:  
    226                                 if self.banshee_paused_before and self.banshee_props['paused'] == 1: 
    227                                         self.emit('music-track-changed', info) 
    228                                         self.banshee_paused_before = False 
    229                         self.current_banshee_title = self.banshee_props['title'] 
    230                 return 1 
    231  
    232         def _banshee_music_track_change_cb(self, arg): 
    233                 info = self._banshee_properties_extract(arg) 
    234                 self.emit('music-track-changed', info) 
     164        def _banshee_state_changed_cb(self, state): 
     165                if state == 'playing': 
     166                        bus = dbus.SessionBus() 
     167                        banshee = bus.get_object("org.bansheeproject.Banshee", "/org/bansheeproject/Banshee/PlayerEngine") 
     168                        currentTrack = banshee.GetCurrentTrack() 
     169                        self._last_playing_music = self._banshee_properties_extract(currentTrack)  
     170                        self.emit('music-track-changed', self._last_playing_music) 
     171                elif state == 'paused': 
     172                        self.emit('music-track-changed', None) 
    235173 
    236174        def _banshee_properties_extract(self, props): 
    237175                info = MusicTrackInfo() 
    238                 info.title = props['title'] 
     176                info.title = props['name'] 
    239177                info.album = props['album'] 
    240178                info.artist = props['artist'] 
    241                 info.duration = int(props['duration']) 
    242                 info.paused = props['paused'] 
     179                info.duration = int(props['length']) 
    243180                return info 
    244181