From 4deee7cb0bbf8d22ca98d8c15cf7d79dfa70776b Mon Sep 17 00:00:00 2001 From: mathieui Date: Mon, 11 Mar 2013 02:09:04 +0100 Subject: Implement user-tune publishing in the mpd plugin (#1840) --- doc/en/plugins/mpd_client.txt | 3 +++ plugins/mpd_client.py | 56 ++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 56 insertions(+), 3 deletions(-) diff --git a/doc/en/plugins/mpd_client.txt b/doc/en/plugins/mpd_client.txt index 54c6fb2d..5031fb6c 100644 --- a/doc/en/plugins/mpd_client.txt +++ b/doc/en/plugins/mpd_client.txt @@ -38,6 +38,9 @@ port = 6600 password = password if necessary --------------------------------------------------------------------- +To enable link:http://xmpp.org/extensions/xep-0118.html[User tune] +publishing, you also have to set the _broadcast_ option to _true_. + Usage ----- diff --git a/plugins/mpd_client.py b/plugins/mpd_client.py index c215e971..a7064e09 100644 --- a/plugins/mpd_client.py +++ b/plugins/mpd_client.py @@ -5,6 +5,48 @@ from common import shell_split from os.path import basename as base import tabs import mpd +import threading +from select import select +from time import sleep + +class UpdateThread(threading.Thread): + """ + Background thread that awaits mpd changes + """ + + def __init__(self, plugin, xmpp): + threading.Thread.__init__(self) + self.plugin = plugin + self.xmpp = xmpp + self.alive = False + self.c = mpd.MPDClient() + + def run(self, *args, **kwargs): + self.alive = True + while self.alive: + try: + self.c.connect(host=self.plugin.config.get('host', 'localhost'), port=self.plugin.config.get('port', '6600')) + password = self.plugin.config.get('password', '') + if password: + self.c.password(password) + self.c.send_idle() + select([self.c], [], []) + self.c.fetch_idle() + status = self.c.status() + if status['state'] == 'play' and self.alive: + song = self.c.currentsong() + self.xmpp.plugin['xep_0118'].publish_tune(artist=song.get('artist'), + length=song.get('time'), title=song.get('title'), + track=song.get('track'), block=False) + self.c.disconnect() + except: + pass + finally: + try: + self.c.disconnect() + except: + pass + sleep(8) class Plugin(BasePlugin): def init(self): @@ -14,6 +56,15 @@ class Plugin(BasePlugin): help='Sends a message showing the current song of an MPD instance. If full is provided, the message is more verbose.', short='Send the MPD status', completion=self.completion_mpd) + if self.config.get('broadcast', 'true').lower() != 'false': + self.core.xmpp.register_plugin('xep_0118') + self.thread = UpdateThread(plugin=self, xmpp=self.core.xmpp) + self.thread.start() + + def cleanup(self): + self.thread.alive = False + self.thread.c.disconnect() + self.core.xmpp.plugin['xep_0118'].stop(block=False) def command_mpd(self, args): args = shell_split(args) @@ -27,13 +78,12 @@ class Plugin(BasePlugin): album = current.get('album', 'Unknown album') title = current.get('title', base(current.get('file', 'Unknown title'))) - s = '%s - %s (%s)' % (artist, title, album) if 'full' in args: if 'elapsed' in current and 'time' in current: current_time = float(c.status()['elapsed']) - pourcentage = int(current_time / float(current['time']) * 10) - s += ' \x192}[\x191}' + '-'*(pourcentage-1) + '\x193}+' + '\x191}' + '-' * (10-pourcentage-1) + '\x192}]\x19o' + percents = int(current_time / float(current['time']) * 10) + s += ' \x192}[\x191}' + '-'*(percents-1) + '\x193}+' + '\x191}' + '-' * (10-percents-1) + '\x192}]\x19o' if not self.api.send_message('%s' % (s,)): self.api.information('Cannot send result (%s)' % s, 'Error') -- cgit v1.2.3