diff --git a/src/common/config.py b/src/common/config.py index 882bf8917..8c3dff8eb 100644 --- a/src/common/config.py +++ b/src/common/config.py @@ -125,6 +125,7 @@ class Config: 'before_nickname': [ opt_str, '' ], 'after_nickname': [ opt_str, ':' ], 'send_os_info': [ opt_bool, True ], + 'set_status_msg_from_current_music_track': [ opt_bool, False ], 'notify_on_new_gmail_email': [ opt_bool, True ], 'notify_on_new_gmail_email_extra': [ opt_bool, False ], 'usegpg': [ opt_bool, False, '', True ], diff --git a/src/config.py b/src/config.py index 1a66f034d..df884d9aa 100644 --- a/src/config.py +++ b/src/config.py @@ -1,7 +1,7 @@ ## config.py ## ## Copyright (C) 2003-2006 Yann Le Boulanger -## Copyright (C) 2005-2006 Nikos Kouremenos +## Copyright (C) 2005-2006 Nikos Kouremenos ## Copyright (C) 2005 Dimitur Kirov ## Copyright (C) 2003-2005 Vincent Hanquez ## @@ -181,7 +181,7 @@ class PreferencesWindow: theme = config_theme.replace('_', ' ') model.append([theme]) if gajim.config.get('roster_theme') == config_theme: - theme_combobox.set_active(i) + theme_combobox.set_active(i) i += 1 self.on_theme_combobox_changed(theme_combobox) @@ -458,12 +458,18 @@ class PreferencesWindow: # send os info st = gajim.config.get('send_os_info') self.xml.get_widget('send_os_info_checkbutton').set_active(st) + + # set status msg from currently playing music track + st = gajim.config.get('set_status_msg_from_current_music_track') + self.xml.get_widget( + 'set_status_msg_from_current_music_track_checkbutton').set_active(st) # Notify user of new gmail e-mail messages, # only show checkbox if user has a gtalk account frame_gmail = self.xml.get_widget('frame_gmail') notify_gmail_checkbutton = self.xml.get_widget('notify_gmail_checkbutton') - notify_gmail_extra_checkbutton = self.xml.get_widget('notify_gmail_extra_checkbutton') + notify_gmail_extra_checkbutton = self.xml.get_widget( + 'notify_gmail_extra_checkbutton') frame_gmail.set_no_show_all(True) for account in gajim.config.get_per('accounts'): @@ -1082,6 +1088,13 @@ class PreferencesWindow: gajim.interface.instances['advanced_config'] = \ dialogs.AdvancedConfigurationWindow() + def set_status_msg_from_current_music_track_checkbutton_toggled(self, + widget): + self.on_checkbutton_toggled(widget, + 'set_status_msg_from_current_music_track') + gajim.interface.roster.enable_syncing_status_msg_from_current_music_track( + widget.get_active()) + #---------- AccountModificationWindow class -------------# class AccountModificationWindow: '''Class for account informations''' @@ -2383,7 +2396,7 @@ class ManageBookmarksWindow: if gajim.connections[account].connected <= 1: continue iter = self.treestore.append(None, [None, account,None, - None, None, None, None]) + None, None, None, None]) for bookmark in gajim.connections[account].bookmarks: if bookmark['name'] == '': diff --git a/src/music_track_listener.py b/src/music_track_listener.py new file mode 100644 index 000000000..51446ddff --- /dev/null +++ b/src/music_track_listener.py @@ -0,0 +1,71 @@ +# -*- coding: utf-8 -*- +## musictracklistener.py +## +## Copyright (C) 2006 Gustavo Carneiro +## Copyright (C) 2006 Nikos Kouremenos +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published +## by the Free Software Foundation; version 2 only. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +import gobject +import dbus +import dbus.glib + +class MusicTrackInfo(object): + __slots__ = ['title', 'album', 'artist', 'duration', 'track_number'] + + +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__() + bus = dbus.SessionBus() + bus.add_signal_receiver(self._muine_music_track_change_cb, 'SongChanged', + 'org.gnome.Muine.Player') + bus.add_signal_receiver(self._rhythmbox_music_track_change_cb, + 'playingUriChanged', 'org.gnome.Rhythmbox.Player') + + def _muine_music_track_change_cb(self, arg): + d = dict((x.strip() for x in s1.split(':', 1)) for s1 in arg.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']) + self.emit('music-track-changed', info) + + def _rhythmbox_music_track_change_cb(self, uri): + bus = dbus.SessionBus() + rbshellobj = bus.get_object('org.gnome.Rhythmbox', '/org/gnome/Rhythmbox/Shell') + rbshell = rbshell = dbus.Interface(rbshellobj, 'org.gnome.Rhythmbox.Shell') + props = rbshell.getSongProperties(uri) + info = MusicTrackInfo() + info.title = props['title'] + info.album = props['album'] + info.artist = props['artist'] + info.duration = int(props['duration']) + info.track_number = int(props['track-number']) + self.emit('music-track-changed', info) + +# here we test :) +if __name__ == '__main__': + def music_track_change_cb(listener, music_track_info): + print music_track_info.title + MusicTrackListener.get().connect('music-track-changed', music_track_change_cb) + gobject.MainLoop().run() diff --git a/src/roster_window.py b/src/roster_window.py index 537e0f234..214aa380a 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- ## roster_window.py ## ## Copyright (C) 2003-2006 Yann Le Boulanger @@ -38,6 +39,7 @@ from message_window import MessageWindowMgr from chat_control import ChatControl from groupchat_control import GroupchatControl from groupchat_control import PrivateChatControl +from music_track_listener import MusicTrackListener #(icon, name, type, jid, account, editable, second pixbuf) ( @@ -2382,6 +2384,36 @@ _('If "%s" accepts this request you will know his or her status.') % jid) self.send_status(acct, status, message) self.update_status_combobox() + ## enable setting status msg from currently playing music track + def enable_syncing_status_msg_from_current_music_track(self, enabled): + '''if enabled is True, we listen to events from music players about + currently played music track, and we update our + status message accordinly''' + if enabled: + if self._music_track_changed_signal is None: + listener = MusicTrackListener.get() + self._music_track_changed_signal = listener.connect( + 'music-track-changed', self._music_track_changed) + else: + if self._music_track_changed_signal is not None: + listener = MusicTrackListener.get() + listener.disconnect(self._music_track_changed_signal) + self._music_track_changed_signal = None + self._music_track_changed(None, None) + + def _music_track_changed(self, unused_listener, music_track_info): + accounts = gajim.connections.keys() + if music_track_info is None: + status_message = '' + else: + status_message = _('♪ "%(title)s" by %(artist)s ♪') % \ + {'title': music_track_info.title, + 'artist': music_track_info.artist } + for acct in accounts: + current_show = gajim.SHOW_LIST[gajim.connections[acct].connected] + self.send_status(acct, current_show, status_message) + + def update_status_combobox(self): # table to change index in connection.connected to index in combobox table = {'offline':9, 'connecting':9, 'online':0, 'chat':1, 'away':2, @@ -3686,6 +3718,7 @@ _('If "%s" accepts this request you will know his or her status.') % jid) def __init__(self): self.xml = gtkgui_helpers.get_glade('roster_window.glade') self.window = self.xml.get_widget('roster_window') + self._music_track_changed_signal = None gajim.interface.msg_win_mgr = MessageWindowMgr() self.advanced_menus = [] # We keep them to destroy them if gajim.config.get('roster_window_skip_taskbar'): @@ -3862,6 +3895,10 @@ _('If "%s" accepts this request you will know his or her status.') % jid) self.tooltip = tooltips.RosterTooltip() self.draw_roster() + ## Music Track notifications + self.enable_syncing_status_msg_from_current_music_track(gajim.config.get( + 'set_status_msg_from_current_music_track')) + if gajim.config.get('show_roster_on_startup'): self.window.show_all() else: