| 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') |
| 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) |