From 20ffd1e69f3680a6f67e829929767acb1d412c81 Mon Sep 17 00:00:00 2001 From: Sadrul Habib Chowdhury Date: Thu, 8 Nov 2007 17:59:37 -0500 Subject: [PATCH] A new status widget. --- example/xmms/xmms_status.py | 148 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 148 insertions(+) create mode 100755 example/xmms/xmms_status.py diff --git a/example/xmms/xmms_status.py b/example/xmms/xmms_status.py new file mode 100755 index 0000000..6b34e1e --- /dev/null +++ b/example/xmms/xmms_status.py @@ -0,0 +1,148 @@ +#!/usr/bin/env python + +""" +xmms-status : A status widget for XMMS2. + +Copyright (C) 2007 Sadrul Habib Chowdhury + +This application is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +This application 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 +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this application; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 +USA +""" + +import xmmsclient +import xmmsclient.glib as xg +import xmmsclient.collections as xc +import gobject +import gnt +import os +import sys + +import common + +__version__ = "0.0.1alpha" +__author__ = "Sadrul Habib Chowdhury " +__copyright__ = "Copyright 2007, Sadrul Habib Chowdhury" +__license__ = "GPL" + +reload(sys) +sys.setdefaultencoding("utf-8") + +class XStatus(gnt.Box): + """A generic widget displaying the playback status of XMMS2.""" + def __init__(self, xmms): + gnt.Box.__init__(self, False, False) + self.set_property('vertical', True) + self.set_pad(0) + self.xmms = xmms + self.current = None + self.playtime = "" + + self.tv = gnt.TextView() + self.tv.set_flag(gnt.TEXT_VIEW_NO_SCROLL) + self.tv.set_flag(gnt.TEXT_VIEW_TOP_ALIGN) + + self.tv.append_text_with_flags("Title: ", gnt.TEXT_FLAG_BOLD) + self.tv.append_text_with_tag("...", gnt.TEXT_FLAG_NORMAL, "title") + self.tv.append_text_with_flags("\nArtist: ", gnt.TEXT_FLAG_BOLD) + self.tv.append_text_with_tag("...", gnt.TEXT_FLAG_NORMAL, "artist") + self.tv.append_text_with_flags("\nDuration: ", gnt.TEXT_FLAG_BOLD) + self.tv.append_text_with_tag(".../...", gnt.TEXT_FLAG_NORMAL, "playtime") + self.tv.set_size(-1, 3) + + self.status = gnt.Label(" " * 15) + self.status.set_property("text-flag", gnt.TEXT_FLAG_BOLD); + gnt.unset_flag(self.status, gnt.WIDGET_GROW_X) + + self.progress = gnt.Slider(False, 1, 0) + gnt.unset_flag(self.progress, gnt.WIDGET_CAN_TAKE_FOCUS) + + self.add_widget(self.tv) + self.add_widget(common.pack_widget(False, [self.status, self.progress])) + + # Update playback status + self.xmms.broadcast_playback_status(self.update_status) + self.xmms.playback_status(self.update_status) + + # Update playback time + self.xmms.signal_playback_playtime(self.update_playtime) + self.xmms.playback_playtime(self.update_playtime) + + # Update song information + self.xmms.broadcast_playback_current_id(self.update_song_info) + self.xmms.playback_current_id(self.update_song_info) + + def medialib_entry_changed(result): + song = result.value() + if song == self.current['id']: + self.update_song_info() + self.xmms.broadcast_medialib_entry_changed(medialib_entry_changed) + + def update_status(self, result): + val = result.value() + status = "..." + if val == xmmsclient.PLAYBACK_STATUS_STOP: + status = "Stopped" + elif val == xmmsclient.PLAYBACK_STATUS_PLAY: + status = "Playing" + elif val == xmmsclient.PLAYBACK_STATUS_PAUSE: + status = "Paused" + self.status.set_text(status) + + def update_playtime(self, result): + val = result.value() / 1000 + self.tv.tag_change("playtime", "%02d:%02d/%s" % (val / 60, val % 60, self.playtime), True) + self.tv.draw() + self.progress.set_value(val) + result.restart() + + def update_song(self): + self.tv.tag_change("title", self.current['title'], True) + self.tv.tag_change("artist", self.current['artist'], True) + + def update_song_info(self, result = None): + if result: + val = result.value() + else: + val = self.current['id'] + def received_song_info(result): + self.current = result.value() + playtime = int(self.current.get('duration', 0) / 1000) + self.progress.set_range(0, playtime) + self.playtime = "%02d:%02d" % (playtime / 60, playtime % 60) + self.update_song() + self.xmms.medialib_get_info(val, received_song_info) + + def show(self): + win = gnt.Window() + win.set_pad(0) + win.set_title("XMMS2 Status") + win.add_widget(self) + win.show() + +def setup_xmms(): + xmms = xmmsclient.XMMS("pygnt-search") + try: + xmms.connect(os.getenv("XMMS_PATH")) + conn = xg.GLibConnector(xmms) + xs = XStatus(xmms) + xs.show() + except IOError, detail: + common.show_error("Connection failed: " + str(detail)) + +if __name__ == '__main__': + setup_xmms() + gnt.gnt_main() + gnt.gnt_quit() + -- 2.11.4.GIT