diff options
author | Éric Araujo <merwok@netwok.org> | 2010-02-08 17:08:40 +0300 |
---|---|---|
committer | Éric Araujo <merwok@netwok.org> | 2010-02-08 17:08:40 +0300 |
commit | fedd7dc8e22950f0dbe297443860662368c249d1 (patch) | |
tree | a6426601d50b3020348fd6574107c9fd6f9dfb0e /src/music_track_listener.py | |
parent | 1a69ea93f1316e9f98d50ac8a212498b42d3cf60 (diff) |
convert tabs to spaces in source code thanks to reindent.py
holy diff batman!
Diffstat (limited to 'src/music_track_listener.py')
-rw-r--r-- | src/music_track_listener.py | 536 |
1 files changed, 267 insertions, 269 deletions
diff --git a/src/music_track_listener.py b/src/music_track_listener.py index 07105a947..9de01dd02 100644 --- a/src/music_track_listener.py +++ b/src/music_track_listener.py @@ -25,282 +25,280 @@ import gobject if __name__ == '__main__': - # install _() func before importing dbus_support - from common import i18n + # install _() func before importing dbus_support + from common import i18n from common import dbus_support if dbus_support.supported: - import dbus - import dbus.glib + import dbus + import dbus.glib class MusicTrackInfo(object): - __slots__ = ['title', 'album', 'artist', 'duration', 'track_number', - 'paused'] + __slots__ = ['title', 'album', 'artist', 'duration', 'track_number', + 'paused'] class MusicTrackListener(gobject.GObject): - __gsignals__ = { - 'music-track-changed': (gobject.SIGNAL_RUN_LAST, None, (object,)), - } - - _instance = None - @classmethod - def get(cls): - if cls._instance is None: - cls._instance = cls() - return cls._instance - - def __init__(self): - super(MusicTrackListener, self).__init__() - self._last_playing_music = None - - bus = dbus.SessionBus() - - ## MPRIS - bus.add_signal_receiver(self._mpris_music_track_change_cb, 'TrackChange', - 'org.freedesktop.MediaPlayer') - bus.add_signal_receiver(self._mpris_playing_changed_cb, 'StatusChange', - 'org.freedesktop.MediaPlayer') - bus.add_signal_receiver(self._player_name_owner_changed, - 'NameOwnerChanged', 'org.freedesktop.DBus', - arg0='org.freedesktop.MediaPlayer') - - ## Muine - bus.add_signal_receiver(self._muine_music_track_change_cb, 'SongChanged', - 'org.gnome.Muine.Player') - bus.add_signal_receiver(self._player_name_owner_changed, - 'NameOwnerChanged', 'org.freedesktop.DBus', arg0='org.gnome.Muine') - bus.add_signal_receiver(self._player_playing_changed_cb, 'StateChanged', - 'org.gnome.Muine.Player') - - ## Rhythmbox - bus.add_signal_receiver(self._player_name_owner_changed, - 'NameOwnerChanged', 'org.freedesktop.DBus', arg0='org.gnome.Rhythmbox') - bus.add_signal_receiver(self._rhythmbox_playing_changed_cb, - 'playingChanged', 'org.gnome.Rhythmbox.Player') - bus.add_signal_receiver(self._player_playing_song_property_changed_cb, - 'playingSongPropertyChanged', 'org.gnome.Rhythmbox.Player') - - ## Banshee - bus.add_signal_receiver(self._banshee_state_changed_cb, - 'StateChanged', 'org.bansheeproject.Banshee.PlayerEngine') - bus.add_signal_receiver(self._player_name_owner_changed, - 'NameOwnerChanged', 'org.freedesktop.DBus', - arg0='org.bansheeproject.Banshee') - - ## Quod Libet - bus.add_signal_receiver(self._quodlibet_state_change_cb, - 'SongStarted', 'net.sacredchao.QuodLibet') - bus.add_signal_receiver(self._quodlibet_state_change_cb, - 'Paused', 'net.sacredchao.QuodLibet') - bus.add_signal_receiver(self._quodlibet_state_change_cb, - 'Unpaused', 'net.sacredchao.QuodLibet') - bus.add_signal_receiver(self._player_name_owner_changed, - 'NameOwnerChanged', 'org.freedesktop.DBus', - arg0='net.sacredchao.QuodLibet') - - def _player_name_owner_changed(self, name, old, new): - if not new: - self.emit('music-track-changed', None) - - def _player_playing_changed_cb(self, playing): - if playing: - self.emit('music-track-changed', self._last_playing_music) - else: - self.emit('music-track-changed', None) - - def _player_playing_song_property_changed_cb(self, a, b, c, d): - if b == 'rb:stream-song-title': - self.emit('music-track-changed', self._last_playing_music) - - def _mpris_properties_extract(self, song): - info = MusicTrackInfo() - info.title = song.get('title', '') - info.album = song.get('album', '') - info.artist = song.get('artist', '') - info.duration = int(song.get('length', 0)) - return info - - def _mpris_playing_changed_cb(self, playing): - if type(playing) is dbus.Struct: - if playing[0]: - self.emit('music-track-changed', None) - else: - self.emit('music-track-changed', self._last_playing_music) - else: # Workaround for e.g. Audacious - if playing: - self.emit('music-track-changed', None) - else: - self.emit('music-track-changed', self._last_playing_music) - - def _mpris_music_track_change_cb(self, arg): - self._last_playing_music = self._mpris_properties_extract(arg) - self.emit('music-track-changed', self._last_playing_music) - - def _muine_properties_extract(self, song_string): - d = dict((x.strip() for x in s1.split(':', 1)) for s1 in \ - song_string.split('\n')) - info = MusicTrackInfo() - info.title = d['title'] - info.album = d['album'] - info.artist = d['artist'] - info.duration = int(d['duration']) - info.track_number = int(d['track_number']) - return info - - def _muine_music_track_change_cb(self, arg): - info = self._muine_properties_extract(arg) - self.emit('music-track-changed', info) - - def _rhythmbox_playing_changed_cb(self, playing): - if playing: - info = self.get_playing_track() - self.emit('music-track-changed', info) - else: - self.emit('music-track-changed', None) - - def _rhythmbox_properties_extract(self, props): - info = MusicTrackInfo() - info.title = props.get('title', None) - info.album = props.get('album', None) - info.artist = props.get('artist', None) - info.duration = int(props.get('duration', 0)) - info.track_number = int(props.get('track-number', 0)) - return info - - def _banshee_state_changed_cb(self, state): - if state == 'playing': - bus = dbus.SessionBus() - banshee = bus.get_object('org.bansheeproject.Banshee', - '/org/bansheeproject/Banshee/PlayerEngine') - currentTrack = banshee.GetCurrentTrack() - self._last_playing_music = self._banshee_properties_extract( - currentTrack) - self.emit('music-track-changed', self._last_playing_music) - elif state == 'paused': - self.emit('music-track-changed', None) - - def _banshee_properties_extract(self, props): - info = MusicTrackInfo() - info.title = props.get('name', None) - info.album = props.get('album', None) - info.artist = props.get('artist', None) - info.duration = int(props.get('length', 0)) - return info - - def _quodlibet_state_change_cb(self, state=None): - info = self.get_playing_track() - if info: - self.emit('music-track-changed', info) - else: - self.emit('music-track-changed', None) - - def _quodlibet_properties_extract(self, props): - info = MusicTrackInfo() - info.title = props.get('title', None) - info.album = props.get('album', None) - info.artist = props.get('artist', None) - info.duration = int(props.get('~#length', 0)) - return info - - def get_playing_track(self): - '''Return a MusicTrackInfo for the currently playing - song, or None if no song is playing''' - - bus = dbus.SessionBus() - - ## Check Muine playing track - test = False - if hasattr(bus, 'name_has_owner'): - if bus.name_has_owner('org.gnome.Muine'): - test = True - elif dbus.dbus_bindings.bus_name_has_owner(bus.get_connection(), - 'org.gnome.Muine'): - test = True - if test: - obj = bus.get_object('org.gnome.Muine', '/org/gnome/Muine/Player') - player = dbus.Interface(obj, 'org.gnome.Muine.Player') - if player.GetPlaying(): - song_string = player.GetCurrentSong() - song = self._muine_properties_extract(song_string) - self._last_playing_music = song - return song - - ## Check Rhythmbox playing song - test = False - if hasattr(bus, 'name_has_owner'): - if bus.name_has_owner('org.gnome.Rhythmbox'): - test = True - elif dbus.dbus_bindings.bus_name_has_owner(bus.get_connection(), - 'org.gnome.Rhythmbox'): - test = True - if test: - rbshellobj = bus.get_object('org.gnome.Rhythmbox', - '/org/gnome/Rhythmbox/Shell') - player = dbus.Interface( - bus.get_object('org.gnome.Rhythmbox', - '/org/gnome/Rhythmbox/Player'), 'org.gnome.Rhythmbox.Player') - rbshell = dbus.Interface(rbshellobj, 'org.gnome.Rhythmbox.Shell') - try: - uri = player.getPlayingUri() - except dbus.DBusException: - uri = None - if not uri: - return None - props = rbshell.getSongProperties(uri) - info = self._rhythmbox_properties_extract(props) - self._last_playing_music = info - return info - - ## Check Banshee playing track - test = False - if hasattr(bus, 'name_has_owner'): - if bus.name_has_owner('org.bansheeproject.Banshee'): - test = True - elif dbus.dbus_bindings.bus_name_has_owner(bus.get_connection(), - 'org.bansheeproject.Banshee'): - test = True - if test: - banshee = bus.get_object('org.bansheeproject.Banshee', - '/org/bansheeproject/Banshee/PlayerEngine') - currentTrack = banshee.GetCurrentTrack() - if currentTrack: - song = self._banshee_properties_extract(currentTrack) - self._last_playing_music = song - return song - - ## Check Quod Libet playing track - test = False - if hasattr(bus, 'name_has_owner'): - if bus.name_has_owner('net.sacredchao.QuodLibet'): - test = True - elif dbus.dbus_bindings.bus_name_has_owner(bus.get_connection(), - 'net.sacredchao.QuodLibet'): - test = True - if test: - quodlibet = bus.get_object('net.sacredchao.QuodLibet', - '/net/sacredchao/QuodLibet') - if quodlibet.IsPlaying(): - currentTrack = quodlibet.CurrentSong() - song = self._quodlibet_properties_extract(currentTrack) - self._last_playing_music = song - return song - - return None + __gsignals__ = { + 'music-track-changed': (gobject.SIGNAL_RUN_LAST, None, (object,)), + } + + _instance = None + @classmethod + def get(cls): + if cls._instance is None: + cls._instance = cls() + return cls._instance + + def __init__(self): + super(MusicTrackListener, self).__init__() + self._last_playing_music = None + + bus = dbus.SessionBus() + + ## MPRIS + bus.add_signal_receiver(self._mpris_music_track_change_cb, 'TrackChange', + 'org.freedesktop.MediaPlayer') + bus.add_signal_receiver(self._mpris_playing_changed_cb, 'StatusChange', + 'org.freedesktop.MediaPlayer') + bus.add_signal_receiver(self._player_name_owner_changed, + 'NameOwnerChanged', 'org.freedesktop.DBus', + arg0='org.freedesktop.MediaPlayer') + + ## Muine + bus.add_signal_receiver(self._muine_music_track_change_cb, 'SongChanged', + 'org.gnome.Muine.Player') + bus.add_signal_receiver(self._player_name_owner_changed, + 'NameOwnerChanged', 'org.freedesktop.DBus', arg0='org.gnome.Muine') + bus.add_signal_receiver(self._player_playing_changed_cb, 'StateChanged', + 'org.gnome.Muine.Player') + + ## Rhythmbox + bus.add_signal_receiver(self._player_name_owner_changed, + 'NameOwnerChanged', 'org.freedesktop.DBus', arg0='org.gnome.Rhythmbox') + bus.add_signal_receiver(self._rhythmbox_playing_changed_cb, + 'playingChanged', 'org.gnome.Rhythmbox.Player') + bus.add_signal_receiver(self._player_playing_song_property_changed_cb, + 'playingSongPropertyChanged', 'org.gnome.Rhythmbox.Player') + + ## Banshee + bus.add_signal_receiver(self._banshee_state_changed_cb, + 'StateChanged', 'org.bansheeproject.Banshee.PlayerEngine') + bus.add_signal_receiver(self._player_name_owner_changed, + 'NameOwnerChanged', 'org.freedesktop.DBus', + arg0='org.bansheeproject.Banshee') + + ## Quod Libet + bus.add_signal_receiver(self._quodlibet_state_change_cb, + 'SongStarted', 'net.sacredchao.QuodLibet') + bus.add_signal_receiver(self._quodlibet_state_change_cb, + 'Paused', 'net.sacredchao.QuodLibet') + bus.add_signal_receiver(self._quodlibet_state_change_cb, + 'Unpaused', 'net.sacredchao.QuodLibet') + bus.add_signal_receiver(self._player_name_owner_changed, + 'NameOwnerChanged', 'org.freedesktop.DBus', + arg0='net.sacredchao.QuodLibet') + + def _player_name_owner_changed(self, name, old, new): + if not new: + self.emit('music-track-changed', None) + + def _player_playing_changed_cb(self, playing): + if playing: + self.emit('music-track-changed', self._last_playing_music) + else: + self.emit('music-track-changed', None) + + def _player_playing_song_property_changed_cb(self, a, b, c, d): + if b == 'rb:stream-song-title': + self.emit('music-track-changed', self._last_playing_music) + + def _mpris_properties_extract(self, song): + info = MusicTrackInfo() + info.title = song.get('title', '') + info.album = song.get('album', '') + info.artist = song.get('artist', '') + info.duration = int(song.get('length', 0)) + return info + + def _mpris_playing_changed_cb(self, playing): + if type(playing) is dbus.Struct: + if playing[0]: + self.emit('music-track-changed', None) + else: + self.emit('music-track-changed', self._last_playing_music) + else: # Workaround for e.g. Audacious + if playing: + self.emit('music-track-changed', None) + else: + self.emit('music-track-changed', self._last_playing_music) + + def _mpris_music_track_change_cb(self, arg): + self._last_playing_music = self._mpris_properties_extract(arg) + self.emit('music-track-changed', self._last_playing_music) + + def _muine_properties_extract(self, song_string): + d = dict((x.strip() for x in s1.split(':', 1)) for s1 in \ + song_string.split('\n')) + info = MusicTrackInfo() + info.title = d['title'] + info.album = d['album'] + info.artist = d['artist'] + info.duration = int(d['duration']) + info.track_number = int(d['track_number']) + return info + + def _muine_music_track_change_cb(self, arg): + info = self._muine_properties_extract(arg) + self.emit('music-track-changed', info) + + def _rhythmbox_playing_changed_cb(self, playing): + if playing: + info = self.get_playing_track() + self.emit('music-track-changed', info) + else: + self.emit('music-track-changed', None) + + def _rhythmbox_properties_extract(self, props): + info = MusicTrackInfo() + info.title = props.get('title', None) + info.album = props.get('album', None) + info.artist = props.get('artist', None) + info.duration = int(props.get('duration', 0)) + info.track_number = int(props.get('track-number', 0)) + return info + + def _banshee_state_changed_cb(self, state): + if state == 'playing': + bus = dbus.SessionBus() + banshee = bus.get_object('org.bansheeproject.Banshee', + '/org/bansheeproject/Banshee/PlayerEngine') + currentTrack = banshee.GetCurrentTrack() + self._last_playing_music = self._banshee_properties_extract( + currentTrack) + self.emit('music-track-changed', self._last_playing_music) + elif state == 'paused': + self.emit('music-track-changed', None) + + def _banshee_properties_extract(self, props): + info = MusicTrackInfo() + info.title = props.get('name', None) + info.album = props.get('album', None) + info.artist = props.get('artist', None) + info.duration = int(props.get('length', 0)) + return info + + def _quodlibet_state_change_cb(self, state=None): + info = self.get_playing_track() + if info: + self.emit('music-track-changed', info) + else: + self.emit('music-track-changed', None) + + def _quodlibet_properties_extract(self, props): + info = MusicTrackInfo() + info.title = props.get('title', None) + info.album = props.get('album', None) + info.artist = props.get('artist', None) + info.duration = int(props.get('~#length', 0)) + return info + + def get_playing_track(self): + '''Return a MusicTrackInfo for the currently playing + song, or None if no song is playing''' + + bus = dbus.SessionBus() + + ## Check Muine playing track + test = False + if hasattr(bus, 'name_has_owner'): + if bus.name_has_owner('org.gnome.Muine'): + test = True + elif dbus.dbus_bindings.bus_name_has_owner(bus.get_connection(), + 'org.gnome.Muine'): + test = True + if test: + obj = bus.get_object('org.gnome.Muine', '/org/gnome/Muine/Player') + player = dbus.Interface(obj, 'org.gnome.Muine.Player') + if player.GetPlaying(): + song_string = player.GetCurrentSong() + song = self._muine_properties_extract(song_string) + self._last_playing_music = song + return song + + ## Check Rhythmbox playing song + test = False + if hasattr(bus, 'name_has_owner'): + if bus.name_has_owner('org.gnome.Rhythmbox'): + test = True + elif dbus.dbus_bindings.bus_name_has_owner(bus.get_connection(), + 'org.gnome.Rhythmbox'): + test = True + if test: + rbshellobj = bus.get_object('org.gnome.Rhythmbox', + '/org/gnome/Rhythmbox/Shell') + player = dbus.Interface( + bus.get_object('org.gnome.Rhythmbox', + '/org/gnome/Rhythmbox/Player'), 'org.gnome.Rhythmbox.Player') + rbshell = dbus.Interface(rbshellobj, 'org.gnome.Rhythmbox.Shell') + try: + uri = player.getPlayingUri() + except dbus.DBusException: + uri = None + if not uri: + return None + props = rbshell.getSongProperties(uri) + info = self._rhythmbox_properties_extract(props) + self._last_playing_music = info + return info + + ## Check Banshee playing track + test = False + if hasattr(bus, 'name_has_owner'): + if bus.name_has_owner('org.bansheeproject.Banshee'): + test = True + elif dbus.dbus_bindings.bus_name_has_owner(bus.get_connection(), + 'org.bansheeproject.Banshee'): + test = True + if test: + banshee = bus.get_object('org.bansheeproject.Banshee', + '/org/bansheeproject/Banshee/PlayerEngine') + currentTrack = banshee.GetCurrentTrack() + if currentTrack: + song = self._banshee_properties_extract(currentTrack) + self._last_playing_music = song + return song + + ## Check Quod Libet playing track + test = False + if hasattr(bus, 'name_has_owner'): + if bus.name_has_owner('net.sacredchao.QuodLibet'): + test = True + elif dbus.dbus_bindings.bus_name_has_owner(bus.get_connection(), + 'net.sacredchao.QuodLibet'): + test = True + if test: + quodlibet = bus.get_object('net.sacredchao.QuodLibet', + '/net/sacredchao/QuodLibet') + if quodlibet.IsPlaying(): + currentTrack = quodlibet.CurrentSong() + song = self._quodlibet_properties_extract(currentTrack) + self._last_playing_music = song + return song + + return None # here we test :) if __name__ == '__main__': - def music_track_change_cb(listener, music_track_info): - if music_track_info is None: - print 'Stop!' - else: - print music_track_info.title - listener = MusicTrackListener.get() - listener.connect('music-track-changed', music_track_change_cb) - track = listener.get_playing_track() - if track is None: - print 'Now not playing anything' - else: - print 'Now playing: "%s" by %s' % (track.title, track.artist) - gobject.MainLoop().run() - -# vim: se ts=3: + def music_track_change_cb(listener, music_track_info): + if music_track_info is None: + print 'Stop!' + else: + print music_track_info.title + listener = MusicTrackListener.get() + listener.connect('music-track-changed', music_track_change_cb) + track = listener.get_playing_track() + if track is None: + print 'Now not playing anything' + else: + print 'Now playing: "%s" by %s' % (track.title, track.artist) + gobject.MainLoop().run() |