diff --git a/now_listen/__init__.py b/now_listen/__init__.py
new file mode 100644
index 0000000..c4c33d6
--- /dev/null
+++ b/now_listen/__init__.py
@@ -0,0 +1 @@
+from now_listen import NowListenPlugin
diff --git a/now_listen/config_dialog.ui b/now_listen/config_dialog.ui
new file mode 100644
index 0000000..3090eba
--- /dev/null
+++ b/now_listen/config_dialog.ui
@@ -0,0 +1,80 @@
+
+
+
+
+
+
diff --git a/now_listen/manifest.ini b/now_listen/manifest.ini
new file mode 100644
index 0000000..38a8b6f
--- /dev/null
+++ b/now_listen/manifest.ini
@@ -0,0 +1,7 @@
+[info]
+name: Now Listen
+short_name: now-listen
+version: 0.1
+description: Copy tune info to conversation input box, at cursor position
+authors = Denis Fomin
+homepage = http://trac-plugins.gajim.org/wiki
diff --git a/now_listen/now_listen.py b/now_listen/now_listen.py
new file mode 100644
index 0000000..fa1c530
--- /dev/null
+++ b/now_listen/now_listen.py
@@ -0,0 +1,148 @@
+# -*- coding: utf-8 -*-
+
+import gtk
+import gobject
+
+from common import gajim
+from plugins import GajimPlugin
+from plugins.helpers import log_calls
+from plugins.gui import GajimPluginConfigDialog
+from plugins.plugin import GajimPluginException
+from common import dbus_support
+
+if dbus_support.supported:
+ from music_track_listener import MusicTrackListener
+
+class NowListenPlugin(GajimPlugin):
+
+ @log_calls('NowListenPlugin')
+ def init(self):
+ self.config_dialog = NowListenPluginConfigDialog(self)
+ self.gui_extension_points = {'chat_control_base':
+ (self.connect_with_chat_control, self.disconnect_from_chat_control)}
+
+ self.config_default_values = {
+ 'format_string': ('Now listen:"%title" by %artist from %album', '')}
+
+ self.controls = []
+ self.first_run = True
+ self.music_track_changed_signal = None
+
+ @log_calls('NowListenPlugin')
+ def connect_with_chat_control(self, chat_control):
+ #if not dbus_support.supported:
+ #return
+ if self.first_run:
+ # ALT + N
+ gtk.binding_entry_add_signal(chat_control.msg_textview,
+ gtk.keysyms.n, gtk.gdk.MOD1_MASK, 'mykeypress',
+ int, gtk.keysyms.n, gtk.gdk.ModifierType, gtk.gdk.MOD1_MASK)
+ self.first_run = False
+ self.chat_control = chat_control
+ control = Base(self, self.chat_control)
+ self.controls.append(control)
+
+ @log_calls('NowListenPlugin')
+ def disconnect_from_chat_control(self, chat_control):
+ for control in self.controls:
+ control.disconnect_from_chat_control()
+ self.controls = []
+
+ @log_calls('NowListenPlugin')
+ def activate(self):
+ if not dbus_support.supported:
+ raise GajimPluginException("python-dbus is missing!")
+ listener = MusicTrackListener.get()
+ if not self.music_track_changed_signal:
+ self.music_track_changed_signal = listener.connect(
+ 'music-track-changed', self.music_track_changed)
+ track = listener.get_playing_track()
+ self.music_track_changed(listener, track)
+
+ @log_calls('NowListenPlugin')
+ def deactivate(self):
+ if hasattr(self, 'chat_control'):
+ gtk.binding_entry_remove(self.chat_control.msg_textview,
+ gtk.keysyms.n, gtk.gdk.MOD1_MASK)
+ self.first_run = True
+ if dbus_support.supported:
+ listener = MusicTrackListener.get()
+ if self.music_track_changed_signal:
+ listener.disconnect(self.music_track_changed_signal)
+ self.music_track_changed_signal = None
+
+ def music_track_changed(self, unused_listener, music_track_info,
+ account=None):
+ is_paused = hasattr(music_track_info, 'paused') and \
+ music_track_info.paused == 0
+ if not music_track_info or is_paused:
+ self.artist = self.title = self.source = ''
+ else:
+ self.artist = music_track_info.artist
+ self.title = music_track_info.title
+ self.source = music_track_info.album
+
+
+class Base(object):
+ def __init__(self, plugin, chat_control):
+ self.plugin = plugin
+ self.chat_control = chat_control
+
+ self.id_ = chat_control.msg_textview.connect('mykeypress',
+ self.on_insert)
+ self.chat_control.handlers[self.id_] = self.chat_control.msg_textview
+
+ def disconnect_from_chat_control(self):
+ if self.chat_control.handlers[self.id_].handler_is_connected(self.id_):
+ self.chat_control.handlers[self.id_].disconnect(self.id_)
+ del self.chat_control.handlers[self.id_]
+
+ def on_insert(self, widget, event_keyval, event_keymod):
+ """
+ Insert text to conversation input box, at cursor position
+ """
+ # construct event instance from binding
+ event = gtk.gdk.Event(gtk.gdk.KEY_PRESS) # it's always a key-press here
+ event.keyval = event_keyval
+ event.state = event_keymod
+ event.time = 0 # assign current time
+
+ if event.keyval != gtk.keysyms.n:
+ return
+ if event.state != gtk.gdk.MOD1_MASK: # ALT+N
+ return
+
+ if self.plugin.artist == self.plugin.title == self.plugin.source == '':
+ tune_string = 'paused or stopped'
+ else:
+ tune_string = self.plugin.config['format_string'].replace(
+ '%artist', self.plugin.artist).replace(
+ '%title', self.plugin.title).replace('%album',self.plugin.source)
+
+ text = tune_string.rstrip() + ' '
+ message_buffer = self.chat_control.msg_textview.get_buffer()
+ message_buffer.insert_at_cursor(text)
+ self.chat_control.msg_textview.grab_focus()
+
+
+class NowListenPluginConfigDialog(GajimPluginConfigDialog):
+ def init(self):
+ self.GTK_BUILDER_FILE_PATH = self.plugin.local_file_path(
+ 'config_dialog.ui')
+ self.xml = gtk.Builder()
+ #self.xml.set_translation_domain(i18n.APP)
+ self.xml.add_objects_from_file(self.GTK_BUILDER_FILE_PATH,
+ ['now_listen_config_vbox'])
+
+ self.config_vbox = self.xml.get_object('now_listen_config_vbox')
+ self.child.pack_start(self.config_vbox)
+
+ self.format_sting = self.xml.get_object('format_sting')
+ self.xml.connect_signals(self)
+ self.connect('hide', self.on_hide)
+
+ def on_run(self):
+ self.format_sting.set_text(self.plugin.config['format_string'])
+
+ def on_hide(self, widget):
+ self.plugin.config['format_string'] = self.format_sting.get_text()