From owner-freebsd-ports-bugs@FreeBSD.ORG Fri Feb 19 07:50:01 2010 Return-Path: Delivered-To: freebsd-ports-bugs@hub.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id E531E1065679 for ; Fri, 19 Feb 2010 07:50:01 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2001:4f8:fff6::28]) by mx1.freebsd.org (Postfix) with ESMTP id C01098FC17 for ; Fri, 19 Feb 2010 07:50:01 +0000 (UTC) Received: from freefall.freebsd.org (localhost [127.0.0.1]) by freefall.freebsd.org (8.14.3/8.14.3) with ESMTP id o1J7o16p042642 for ; Fri, 19 Feb 2010 07:50:01 GMT (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.14.3/8.14.3/Submit) id o1J7o14d042641; Fri, 19 Feb 2010 07:50:01 GMT (envelope-from gnats) Resent-Date: Fri, 19 Feb 2010 07:50:01 GMT Resent-Message-Id: <201002190750.o1J7o14d042641@freefall.freebsd.org> Resent-From: FreeBSD-gnats-submit@FreeBSD.org (GNATS Filer) Resent-To: freebsd-ports-bugs@FreeBSD.org Resent-Reply-To: FreeBSD-gnats-submit@FreeBSD.org, "J.D. Morris" Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id C5F44106566C for ; Fri, 19 Feb 2010 07:48:28 +0000 (UTC) (envelope-from nobody@FreeBSD.org) Received: from www.freebsd.org (www.freebsd.org [IPv6:2001:4f8:fff6::21]) by mx1.freebsd.org (Postfix) with ESMTP id B2DA78FC15 for ; Fri, 19 Feb 2010 07:48:28 +0000 (UTC) Received: from www.freebsd.org (localhost [127.0.0.1]) by www.freebsd.org (8.14.3/8.14.3) with ESMTP id o1J7mScE074081 for ; Fri, 19 Feb 2010 07:48:28 GMT (envelope-from nobody@www.freebsd.org) Received: (from nobody@localhost) by www.freebsd.org (8.14.3/8.14.3/Submit) id o1J7mScu074080; Fri, 19 Feb 2010 07:48:28 GMT (envelope-from nobody) Message-Id: <201002190748.o1J7mScu074080@www.freebsd.org> Date: Fri, 19 Feb 2010 07:48:28 GMT From: "J.D. Morris" To: freebsd-gnats-submit@FreeBSD.org X-Send-Pr-Version: www-3.1 Cc: Subject: ports/144094: [patch] multimedia/quodlibet: update to 2.2 X-BeenThere: freebsd-ports-bugs@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Ports bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 19 Feb 2010 07:50:02 -0000 >Number: 144094 >Category: ports >Synopsis: [patch] multimedia/quodlibet: update to 2.2 >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-ports-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: update >Submitter-Id: current-users >Arrival-Date: Fri Feb 19 07:50:01 UTC 2010 >Closed-Date: >Last-Modified: >Originator: J.D. Morris >Release: 8.0-STABLE i386 >Organization: >Environment: FreeBSD ulysses.hermessystems.com 8.0-STABLE FreeBSD 8.0-STABLE #4: Mon Feb 15 21:06:56 EST 2010 root@ulysses.hermessystems.com:/usr/obj/usr/src/sys/ULYSSES i386 >Description: - Update to 2.2 - Updated Makefile to use PYDISTUTILS instead of GMAKE - Updated MASTER_SITES - Extended pkg-descr and updated WWW - Added pkg-message with instructions for installing additional plugins - Removed existing patches (no longer needed) and qlscrobbler.py plugin - Added patch to insure man pages are installed to proper location (not share/man) - Added patch to prevent syntax error (non-critical) during install Removed files: - files/patch-Makefile - files/patch-po-Makefile - files/qlscrobbler.py Added files: - pkg-message - files/patch-gdist__man.py - files/patch-quodlibet__qltk__config.py >How-To-Repeat: >Fix: Patch attached with submission follows: diff -ruN --exclude=CVS quodlibet.orig/Makefile quodlibet/Makefile --- quodlibet.orig/Makefile 2010-02-18 18:34:34.000000000 -0500 +++ quodlibet/Makefile 2010-02-18 03:52:48.000000000 -0500 @@ -6,11 +6,11 @@ # PORTNAME= quodlibet -PORTVERSION= 1.0 -PORTREVISION= 5 +PORTVERSION= 2.2 CATEGORIES= multimedia audio python gnome -MASTER_SITES= http://www.sacredchao.net/~piman/software/ \ - http://www.tortall.net/mirrors/piman-software/ +MASTER_SITES= ${MASTER_SITE_GOOGLE_CODE} \ + http://www.sacredchao.net/~piman/software/ \ + http://www.tortall.net/mirrors/piman-software/ MAINTAINER= johnson.peter@gmail.com COMMENT= A GTK+-based audio player written in Python @@ -21,7 +21,7 @@ USE_PYTHON= 2.4+ USE_GNOME= pygtk2 USE_GETTEXT= yes -USE_GMAKE= yes +USE_PYDISTUTILS= yes USE_DISPLAY= yes USE_GSTREAMER= gconf good python @@ -105,22 +105,9 @@ PLIST_SUB+= EXTENSIONS="@comment " .endif -do-configure: - @${PYTHON_CMD} ${WRKSRC}/check.py - -do-build: - @cd ${WRKSRC}/po && ${GMAKE} po -.if defined(WITH_EXTENSIONS) - @cd ${WRKSRC} && ${GMAKE} extensions -.endif - -pre-install: - @${MKDIR} ${PREFIX}/lib/${PORTNAME} - @${MKDIR} ${PREFIX}/share/applications - post-install: - @${MKDIR} ${DATADIR}/plugins - @${MKDIR} ${DATADIR}/plugins/events - @${INSTALL_DATA} ${FILESDIR}/qlscrobbler.py ${DATADIR}/plugins/events + @${ECHO_CMD} + @${CAT} ${PKGMESSAGE} + @${ECHO_CMD} .include diff -ruN --exclude=CVS quodlibet.orig/distinfo quodlibet/distinfo --- quodlibet.orig/distinfo 2010-02-18 18:34:34.000000000 -0500 +++ quodlibet/distinfo 2010-02-18 04:30:16.000000000 -0500 @@ -1,3 +1,3 @@ -MD5 (quodlibet-1.0.tar.gz) = 5c925b754bd8505a7a66f2ffcc5b5fe4 -SHA256 (quodlibet-1.0.tar.gz) = bba92a91ac462b0277ad788a655b56af8bf02496a5878692dc88ffc4fdaddba4 -SIZE (quodlibet-1.0.tar.gz) = 617369 +MD5 (quodlibet-2.2.tar.gz) = ff8bb5f9e680797dfb60d437368298f9 +SHA256 (quodlibet-2.2.tar.gz) = 1aac91369b26fa897c0d9eaa6a43aadcd5ffe8751a298a6c7beabe7591c0e713 +SIZE (quodlibet-2.2.tar.gz) = 910381 diff -ruN --exclude=CVS quodlibet.orig/files/patch-Makefile quodlibet/files/patch-Makefile --- quodlibet.orig/files/patch-Makefile 2010-02-18 18:34:34.000000000 -0500 +++ quodlibet/files/patch-Makefile 1969-12-31 19:00:00.000000000 -0500 @@ -1,36 +0,0 @@ ---- Makefile.orig Sun Apr 15 19:45:47 2007 -+++ Makefile Mon Jun 4 21:41:02 2007 -@@ -13,7 +13,6 @@ - @./check.py $(DESTDIR)$(PREFIX)/$(TO) - - make-install-dirs: -- mkdir -p $(DESTDIR)$(PREFIX)/share/man/man1 - mkdir -p $(DESTDIR)$(PREFIX)/bin - mkdir -p $(DESTDIR)$(PREFIX)/$(TO) - -@@ -21,9 +20,9 @@ - install -m 644 $(MODULES) missing-cover.svg audio-*.png media-*.png device-*.png $(DESTDIR)$(PREFIX)/$(TO) - cd po && make install-po DESTDIR=$(DESTDIR) - -- for E in $(EXTENSIONS); do \ -+ -for E in $(EXTENSIONS); do \ - if test -e $$E; then \ -- install -m 755 -D $$E $(DESTDIR)$(PREFIX)/$(TODEP)/$$E; \ -+ install -m 755 $$E $(DESTDIR)$(PREFIX)/$(TODEP)/$$E; \ - fi; \ - done - -@@ -37,10 +36,10 @@ - - app-install-%: make-install-dirs %.desktop - install -m 755 $*.py $(DESTDIR)$(PREFIX)/$(TO) -- install -m 644 $*.1 $(DESTDIR)$(PREFIX)/share/man/man1/$*.1 -- install -D -m 644 $*.png $(DESTDIR)$(PREFIX)/share/pixmaps/$*.png -+ install -m 644 $*.1 $(DESTDIR)$(PREFIX)/man/man1/$*.1 -+ install -m 644 $*.png $(DESTDIR)$(PREFIX)/share/pixmaps/$*.png - install -m 644 $*.svg $*.png $(DESTDIR)$(PREFIX)/$(TO) -- -install -D -m 644 $*.desktop $(DESTDIR)$(PREFIX)/share/applications/$*.desktop -+ -install -m 644 $*.desktop $(DESTDIR)$(PREFIX)/share/applications/$*.desktop - ln -sf ../$(TO)/$*.py $(DESTDIR)$(PREFIX)/bin/$* - - clean: diff -ruN --exclude=CVS quodlibet.orig/files/patch-gdist__man.py quodlibet/files/patch-gdist__man.py --- quodlibet.orig/files/patch-gdist__man.py 1969-12-31 19:00:00.000000000 -0500 +++ quodlibet/files/patch-gdist__man.py 2010-02-18 02:58:29.000000000 -0500 @@ -0,0 +1,11 @@ +--- gdist/man.py.orig 2010-02-18 02:56:24.000000000 -0500 ++++ gdist/man.py 2010-02-18 02:56:58.000000000 -0500 +@@ -36,7 +36,7 @@ + raise SystemExit("%r has no section" % man_page) + + def run(self): +- basepath = os.path.join(self.prefix, 'share', 'man') ++ basepath = os.path.join(self.prefix, 'man') + if self.root != None: + basepath = change_root(self.root, basepath) + self.mkpath(basepath) diff -ruN --exclude=CVS quodlibet.orig/files/patch-po-Makefile quodlibet/files/patch-po-Makefile --- quodlibet.orig/files/patch-po-Makefile 2010-02-18 18:34:34.000000000 -0500 +++ quodlibet/files/patch-po-Makefile 1969-12-31 19:00:00.000000000 -0500 @@ -1,12 +0,0 @@ ---- po/Makefile.orig Sun Nov 12 04:24:42 2006 -+++ po/Makefile Mon Jun 4 23:11:13 2007 -@@ -12,9 +12,6 @@ - quodlibet.pot: POTFILES.in ../*.py ../formats/*.py ../browsers/*.py ../qltk/*.py ../plugins/*.py tag-names.py ../util/*.py ../library/*.py ../devices/*.py - intltool-update --pot --gettext-package=$(NAME) - --%.po: quodlibet.pot -- intltool-update --dist --gettext-package=$(NAME) $* -- - %.mo: %.po - msgfmt -o $@ $< - diff -ruN --exclude=CVS quodlibet.orig/files/patch-quodlibet__qltk__config.py quodlibet/files/patch-quodlibet__qltk__config.py --- quodlibet.orig/files/patch-quodlibet__qltk__config.py 1969-12-31 19:00:00.000000000 -0500 +++ quodlibet/files/patch-quodlibet__qltk__config.py 2010-02-18 03:03:52.000000000 -0500 @@ -0,0 +1,10 @@ +--- quodlibet/qltk/config.py.orig 2010-02-18 03:01:37.000000000 -0500 ++++ quodlibet/qltk/config.py 2010-02-18 03:01:59.000000000 -0500 +@@ -54,7 +54,3 @@ + + def __toggled(self, section, option): + config.set(section, option, str(bool(self.get_active())).lower()) +- +- +- +-class ConfigCheckButton(gtk.CheckButton) diff -ruN --exclude=CVS quodlibet.orig/files/qlscrobbler.py quodlibet/files/qlscrobbler.py --- quodlibet.orig/files/qlscrobbler.py 2010-02-18 18:34:34.000000000 -0500 +++ quodlibet/files/qlscrobbler.py 1969-12-31 19:00:00.000000000 -0500 @@ -1,533 +0,0 @@ -# QLScrobbler: an Audioscrobbler client plugin for Quod Libet. -# version 0.8 -# (C) 2005 by Joshua Kwan , -# Joe Wreschnig -# Licensed under GPLv2. See Quod Libet's COPYING for more information. - -import random -import md5, urllib, urllib2, time, threading, os -import player, config, const, widgets, parse -import gobject, gtk -from qltk.msg import Message, WarningMessage -from qltk.entry import ValidatingEntry -from util import to - -from plugins.events import EventPlugin - -class QLScrobbler(EventPlugin): - # session invariants - PLUGIN_NAME = "QLScrobbler" - PLUGIN_DESC = "Audioscrobbler client for Quod Libet" - PLUGIN_ICON = gtk.STOCK_CONNECT - PLUGIN_VERSION = "0.8.1" - CLIENT = "qlb" - PROTOCOL_VERSION = "1.1" - try: DUMP = os.path.join(const.USERDIR, "scrobbler_cache") - except AttributeError: - DUMP = os.path.join(const.DIR, "scrobbler_cache") - - # things that could change - - username = "" - password = "" - pwhash = "" - exclude = "" - - timeout_id = -1 - submission_tid = -1 - - challenge = "" - submit_url = "" - - # state management - waiting = False - challenge_sent = False - broken = False - need_config = False - need_update = False - already_submitted = False - locked = False - flushing = False - __enabled = False - offline = False - - # we need to store this because not all events get the song - song = None - - queue = [] - - def __init__(self): - # Read dumped queue and delete it - try: - dump = open(self.DUMP, 'r') - self.read_dump(dump) - except: pass - - # Read configuration - self.read_config() - - # Set up exit hook to dump queue - gtk.quit_add(0, self.dump_queue) - - def read_dump(self, dump): - print "Loading dumped queue." - - current = {} - - for line in dump.readlines(): - key = "" - value = "" - - line = line.rstrip("\n") - try: (key, value) = line.split(" = ", 1) - except: - if line == "-": - for key in ["album", "mbid"]: - if key not in current: - current[key] = "" - - for reqkey in ["artist", "title", "length", "stamp"]: - # discard if somehow invalid - if reqkey not in current: - current = {} - - if current != {}: - self.queue.append(current) - current = {} - continue - - if key == "length": current[key] = int(value) - else: current[key] = value - - dump.close() - - os.remove(self.DUMP) - -# print "Queue contents:" -# for item in self.queue: -# print "\t%s - %s" % (item['artist'], item['title']) - - # Try to flush it immediately - if len(self.queue) > 0: - self.flushing = True - self.submit_song() - else: print "Queue was empty!" - - def dump_queue(self): - if len(self.queue) == 0: return 0 - - print "Dumping offline queue, will submit next time." - - dump = open(self.DUMP, 'w') - - for item in self.queue: - for key in item: - dump.write("%s = %s\n" % (key, item[key])) - dump.write("-\n") - - dump.close() - - return 0 - - def plugin_on_removed(self, songs): - try: - if self.song in songs: - self.already_submitted = True - except: - # Older version compatibility. - if self.song is songs: - self.already_submitted = True - - def plugin_on_song_ended(self, song, stopped): - if song is None: return - - if self.timeout_id > 0: - gobject.source_remove(self.timeout_id) - self.timeout_id = -1 - - def plugin_on_song_started(self, song): - if song is None: return - - self.already_submitted = False - if self.timeout_id > 0: - gobject.source_remove(self.timeout_id) - - self.timeout_id = -1 - - # Protocol stipulation: - # * don't submit when length < 00:30 - # NOTE: >30:00 stipulation has been REMOVED as of Protocol1.1 - # * don't submit if artist and title are not available - if song["~#length"] < 30: return - elif 'title' not in song: return - elif "artist" not in song: - if ("composer" not in song) and ("performer" not in song): return - - # Check to see if this song is not something we'd like to submit - # e.g. "Hit Me Baby One More Time" - if self.exclude != "" and parse.Query(self.exclude).search(song): - print to("Not submitting: %s - %s" % (song["artist"], song["title"])) - return - - self.song = song - if player.playlist.paused == False: - self.prepare() - - def plugin_on_paused(self): - if self.timeout_id > 0: - gobject.source_remove(self.timeout_id) - # special value that will tell on_unpaused to check song length - self.timeout_id = -2 - - def plugin_on_unpaused(self): - if self.already_submitted == False and self.timeout_id == -1: self.prepare() - - def plugin_on_seek(self, song, msec): - if self.timeout_id > 0: - gobject.source_remove(self.timeout_id) - self.timeout_id = -1 - - if msec == 0: #I think this is okay! - self.prepare() - else: - self.already_submitted = True # cancel - - def prepare(self): - if self.song is None: return - - # Protocol stipulations: - # * submit 240 seconds in or at 50%, whichever comes first - delay = int(min(self.song["~#length"] / 2, 240)) - - if self.timeout_id == -2: # change delta based on current progress - # assumption is that self.already_submitted == 0, therefore - # delay - progress > 0 - progress = int(player.playlist.get_position() / 1000) - delay -= progress - - self.timeout_id = gobject.timeout_add(delay * 1000, self.submit_song) - - def read_config(self): - username = "" - password = "" - try: - username = config.get("plugins", "scrobbler_username") - password = config.get("plugins", "scrobbler_password") - except: - if (self.need_config == False and - getattr(self, 'PMEnFlag', False)): - self.quick_dialog("Please visit the Preferences window to set QLScrobbler up. Until then, songs will not be submitted.", gtk.MESSAGE_INFO) - self.need_config = True - return - - try: self.offline = (config.get("plugins", "scrobbler_offline") == "true") - except: pass - try: self.exclude = config.get("plugins", "scrobbler_exclude") - except: pass - - self.username = username - - hasher = md5.new() - hasher.update(password); - self.password = hasher.hexdigest() - self.need_config = False - - def __destroy_cb(self, dialog, response_id): - dialog.destroy() - - def quick_dialog_helper(self, type, str): - dialog = Message(gtk.MESSAGE_INFO, widgets.main, "QLScrobbler", str) - dialog.connect('response', self.__destroy_cb) - dialog.show() - - def quick_dialog(self, str, type): - gobject.idle_add(self.quick_dialog_helper, type, str) - - def clear_waiting(self): - self.waiting = False - - def send_handshake(self): - # construct url - url = "http://post.audioscrobbler.com/?hs=true&p=%s&c=%s&v=%s&u=%s" % ( self.PROTOCOL_VERSION, self.CLIENT, self.PLUGIN_VERSION, self.username ) - - print "Sending handshake to Audioscrobbler." - - resp = None - - try: - resp = urllib2.urlopen(url); - except: - print "Server not responding, handshake failed." - return # challenge_sent is NOT set to 1 - - # check response - lines = resp.read().rstrip().split("\n") - status = lines.pop(0) - - print "Handshake status: %s" % status - - if status == "UPTODATE" or status.startswith("UPDATE"): - if status.startswith("UPDATE"): - self.quick_dialog("A new plugin is available at %s! Please download it, or your Audioscrobbler stats may not be updated, and this message will be displayed every session." % status.split()[1], gtk.MESSAGE_INFO) - self.need_update = True - - # Scan for submit URL and challenge. - self.challenge = lines.pop(0) - - print "Challenge: %s" % self.challenge - - # determine password - hasher = md5.new() - hasher.update(self.password) - hasher.update(self.challenge) - self.pwhash = hasher.hexdigest() - - self.submit_url = lines.pop(0) - - self.challenge_sent = True - elif status == "BADUSER": - self.quick_dialog("Authentication failed: invalid username %s or bad password." % self.username, gtk.MESSAGE_ERROR) - - self.broken = True - - # Honor INTERVAL if available - try: interval = int(lines.pop(0).split()[1]) - except: interval = 0 - - if interval > 1: - self.waiting = True - gobject.timeout_add(interval * 1000, self.clear_waiting) - print "Server says to wait for %d seconds." % interval - - def submit_song(self): - bg = threading.Thread(None, self.submit_song_helper) - bg.setDaemon(True) - bg.start() - - def enabled(self): - self.__enabled = True - - def disabled(self): - self.__enabled = False - - def submit_song_helper(self): - if self.__enabled: - print "Plugin re-enabled - accepting new songs." - if self.submission_tid != -1: - gobject.source_remove(self.submission_tid); - self.submission_tid = -1 - else: - print "Plugin disabled - not accepting any new songs." - if len(self.queue) > 0: - self.submission_tid = gobject.timeout_add(120 * 1000, self.submit_song_helper) - print "Attempts will continue to submit the last %d songs." % len(self.queue) - - if self.already_submitted == True or self.broken == True: return - - # Scope. - store = {} - - if self.flushing == False: - stamp = time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime()) - - store = { - "title": self.song.comma("title"), - "length": str(self.song["~#length"]), - "album": self.song.comma("album"), - "mbid": "", # will be correctly set if available - "stamp": stamp - } - - if "artist" in self.song: - store["artist"] = self.song.comma("artist") - elif "composer" in self.song: - store["artist"] = self.song.comma("composer") - elif "performer" in self.song: - performer = self.song.comma('performer') - if performer[-1] == ")" and "(" in performer: - store["artist"] = performer[:performer.rindex("(")].strip() - else: - store["artist"] = performer - if "musicbrainz_trackid" in self.song: - store["mbid"] = self.song["musicbrainz_trackid"] - - self.queue.append(store) - else: self.flushing = False - - # Just note to stdout if either of these are true.. - # locked means another instance if s_s_h is dealing with sending. - if self.offline or self.locked: - print to("Queuing: %s - %s" % (store["artist"], store["title"])) - return - - self.locked = True - - while self.waiting == True: time.sleep(1) - - # Read config, handshake, and send challenge if not already done - if self.challenge_sent == False: - self.read_config() - if self.broken == False and self.need_config == False: - self.send_handshake() - - # INTERVAL may have been set during handshake. - while self.waiting == True: time.sleep(1) - - if self.challenge_sent == False: - self.locked = False - return - - data = { - 'u': self.username, - 's': self.pwhash - } - - # Flush the cache - for i in range(min(len(self.queue), 10)): - print to("Sending song: %s - %s" % (self.queue[i]['artist'], self.queue[i]['title'])) - data["a[%d]" % i] = self.queue[i]['artist'].encode('utf-8') - data["t[%d]" % i] = self.queue[i]['title'].encode('utf-8') - data["l[%d]" % i] = str(self.queue[i]['length']) - data["b[%d]" % i] = self.queue[i]['album'].encode('utf-8') - data["m[%d]" % i] = self.queue[i]['mbid'] - data["i[%d]" % i] = self.queue[i]['stamp'] - - (host, file) = self.submit_url[7:].split("/") - - resp = None - - try: - data_str = urllib.urlencode(data) - resp = urllib2.urlopen("http://" + host + "/" + file, data_str) - except: - print "Audioscrobbler server not responding, will try later." - self.locked = False - return # preserve the queue, yadda yadda - - resp_save = resp.read() - lines = resp_save.rstrip().split("\n") - - try: (status, interval) = lines - except: - try: status = lines[0] - except: - print "Truncated server response, will try later..." - self.locked = False - return - interval = None - - print "Submission status: %s" % status - - if status == "BADAUTH": - print "Attempting to re-authenticate." - self.challenge_sent = False - self.send_handshake() - if self.challenge_sent == False: - self.quick_dialog("Your Audioscrobbler login data is incorrect, so you must re-enter it before any songs will be submitted.\n\nThis message will not be shown again.", gtk.MESSAGE_ERROR) - self.broken = True - elif status == "OK": - self.queue = self.queue[10:] - elif status.startswith("FAILED"): - if status.startswith("FAILED Plugin bug"): - print "Plugin bug!? Ridiculous! Dumping queue contents." - for item in self.queue: - for key in item: - print to("%s = %s" % (key, item[key])) - # possibly handle other specific cases here for debugging later - else: - print "Unknown response from server: %s" % status - print "Dumping full response:" - print resp_save - - if interval != None: interval_secs = int(interval.split()[1]) - else: interval_secs = 0 - - if interval_secs > 1: - self.waiting = True - gobject.timeout_add(interval_secs * 1000, self.clear_waiting) - print "Server says to wait for %d seconds." % interval_secs - - if not self.__enabled and len(self.queue) == 0 and self.submission_tid != -1: - print "All songs submitted, disabling retries." - gobject.source_remove(self.submission_tid) - self.submission_tid = -1 - - self.already_submitted = True - self.locked = False - - def PluginPreferences(self, parent): - def toggled(widget): - if widget.get_active(): - config.set("plugins", "scrobbler_offline", "true") - self.offline = True - else: - config.set("plugins", "scrobbler_offline", "false") - self.offline = False - - def changed(entry, key): - # having a function for each entry is unnecessary.. - config.set("plugins", "scrobbler_" + key, entry.get_text()) - - def destroyed(*args): - # if changed, let's say that things just got better and we should - # try everything again - newu = None - newp = None - try: - newu = config.get("plugins", "scrobbler_username") - newp = config.get("plugins", "scrobbler_password") - except: - return - - try: self.exclude = config.get("plugins", "scrobbler_exclude") - except: pass - - if self.username != newu or self.password != newp: - self.broken = False - - table = gtk.Table(6, 3) - table.set_col_spacings(3) - lt = gtk.Label(_("Please enter your Audioscrobbler\nusername and password.")) - lu = gtk.Label(_("Username:")) - lp = gtk.Label(_("Password:")) - lv = gtk.Label(_("Exclude filter:")) - lvd = gtk.Label(_("Songs matching this filter will\nnot be sent to Audioscrobbler.\n")) - off = gtk.CheckButton(_("Offline mode (don't submit anything)")) - ve = ValidatingEntry(parse.Query.is_valid_color) - for l in [lt, lu, lp, lv, lvd]: - l.set_line_wrap(True) - l.set_alignment(0.0, 0.5) - table.attach(lt, 0, 2, 0, 1, xoptions=gtk.FILL | gtk.SHRINK) - table.attach(lu, 0, 1, 1, 2, xoptions=gtk.FILL | gtk.SHRINK) - table.attach(lp, 0, 1, 2, 3, xoptions=gtk.FILL | gtk.SHRINK) - table.attach(lv, 0, 1, 3, 4, xoptions=gtk.FILL | gtk.SHRINK) - - userent = gtk.Entry() - pwent = gtk.Entry() - pwent.set_visibility(False) - pwent.set_invisible_char('*') - table.set_border_width(6) - - table.attach(ve, 1, 2, 3, 4, xoptions=gtk.FILL | gtk.SHRINK) - table.attach(lvd, 0, 2, 4, 5, xoptions=gtk.FILL | gtk.SHRINK) - table.attach(off, 0, 2, 5, 7, xoptions=gtk.FILL | gtk.SHRINK) - - try: userent.set_text(config.get("plugins", "scrobbler_username")) - except: pass - try: pwent.set_text(config.get("plugins", "scrobbler_password")) - except: pass - try: - if config.get("plugins", "scrobbler_offline") == "true": - off.set_active(True) - except: pass - try: ve.set_text(config.get("plugins", "scrobbler_exclude")) - except: pass - - table.attach(userent, 1, 2, 1, 2, xoptions=gtk.FILL | gtk.SHRINK) - table.attach(pwent, 1, 2, 2, 3, xoptions=gtk.FILL | gtk.SHRINK) - pwent.connect('changed', changed, 'password') - userent.connect('changed', changed, 'username') - ve.connect('changed', changed, 'exclude') - table.connect('destroy', destroyed) - off.connect('toggled', toggled) - return table diff -ruN --exclude=CVS quodlibet.orig/pkg-descr quodlibet/pkg-descr --- quodlibet.orig/pkg-descr 2010-02-18 18:34:34.000000000 -0500 +++ quodlibet/pkg-descr 2010-02-18 13:29:21.000000000 -0500 @@ -1,3 +1,9 @@ -Quod Libet is a GTK+-based audio player written in Python. +Quod Libet is a GTK+-based audio player written in Python, using the +Mutagen tagging library. It's designed around the idea that you know +how to organize your music better than we do. It lets you make playlists +based on regular expressions (don't worry, regular searches work too). +It lets you display and edit any tags you want in the file. And it +lets you do this for all the file formats it supports -- Ogg Vorbis, +FLAC, MP3, Musepack, and MOD. -WWW: http://www.sacredchao.net/quodlibet/ +WWW: http://code.google.com/p/quodlibet/ diff -ruN --exclude=CVS quodlibet.orig/pkg-message quodlibet/pkg-message --- quodlibet.orig/pkg-message 1969-12-31 19:00:00.000000000 -0500 +++ quodlibet/pkg-message 2010-02-18 03:51:44.000000000 -0500 @@ -0,0 +1,13 @@ +For additional Quod Libet plugins: + +1. Fetch plugins archive. + + fetch http://quodlibet.googlecode.com/files/quodlibet-plugins-2.2.tar.gz + +2. Extract archive. + + tar xvfz quodlibet-plugins-2.2.tar.gz + +3. Copy extracted files to Quod Libet plugins directory. + + cp -R quodlibet-plugins-2.2/* ~/.quodlibet/plugins/ diff -ruN --exclude=CVS quodlibet.orig/pkg-plist quodlibet/pkg-plist --- quodlibet.orig/pkg-plist 2010-02-18 18:34:34.000000000 -0500 +++ quodlibet/pkg-plist 2010-02-18 13:21:36.000000000 -0500 @@ -1,153 +1,390 @@ bin/exfalso bin/quodlibet -%%EXTENSIONS%%lib/quodlibet/_mmkeys.so -%%EXTENSIONS%%lib/quodlibet/_trayicon.so share/applications/exfalso.desktop share/applications/quodlibet.desktop -share/locale/bg/LC_MESSAGES/quodlibet.mo -share/locale/de/LC_MESSAGES/quodlibet.mo -share/locale/en_CA/LC_MESSAGES/quodlibet.mo -share/locale/en_GB/LC_MESSAGES/quodlibet.mo -share/locale/es/LC_MESSAGES/quodlibet.mo -share/locale/fi/LC_MESSAGES/quodlibet.mo -share/locale/fr/LC_MESSAGES/quodlibet.mo -share/locale/gl/LC_MESSAGES/quodlibet.mo -share/locale/he/LC_MESSAGES/quodlibet.mo share/locale/hu/LC_MESSAGES/quodlibet.mo -share/locale/it/LC_MESSAGES/quodlibet.mo +share/locale/gl_ES/LC_MESSAGES/quodlibet.mo +share/locale/ru/LC_MESSAGES/quodlibet.mo share/locale/ja/LC_MESSAGES/quodlibet.mo -share/locale/ko/LC_MESSAGES/quodlibet.mo -share/locale/lt/LC_MESSAGES/quodlibet.mo -share/locale/nb/LC_MESSAGES/quodlibet.mo +share/locale/he/LC_MESSAGES/quodlibet.mo +share/locale/es/LC_MESSAGES/quodlibet.mo +share/locale/sk/LC_MESSAGES/quodlibet.mo +share/locale/de/LC_MESSAGES/quodlibet.mo share/locale/nl/LC_MESSAGES/quodlibet.mo +share/locale/sv/LC_MESSAGES/quodlibet.mo +share/locale/ko/LC_MESSAGES/quodlibet.mo +share/locale/ro/LC_MESSAGES/quodlibet.mo +share/locale/uk/LC_MESSAGES/quodlibet.mo share/locale/pl/LC_MESSAGES/quodlibet.mo share/locale/pt/LC_MESSAGES/quodlibet.mo -share/locale/ro/LC_MESSAGES/quodlibet.mo -share/locale/ru/LC_MESSAGES/quodlibet.mo -share/locale/sk/LC_MESSAGES/quodlibet.mo -share/locale/sv/LC_MESSAGES/quodlibet.mo +share/locale/en_CA/LC_MESSAGES/quodlibet.mo +share/locale/nb/LC_MESSAGES/quodlibet.mo +share/locale/tr/LC_MESSAGES/quodlibet.mo share/locale/zh_CN/LC_MESSAGES/quodlibet.mo +share/locale/fr/LC_MESSAGES/quodlibet.mo +share/locale/gl/LC_MESSAGES/quodlibet.mo +share/locale/it/LC_MESSAGES/quodlibet.mo +share/locale/en_GB/LC_MESSAGES/quodlibet.mo +share/locale/bg/LC_MESSAGES/quodlibet.mo +share/locale/lt/LC_MESSAGES/quodlibet.mo share/locale/zh_TW/LC_MESSAGES/quodlibet.mo -share/pixmaps/exfalso.png -share/pixmaps/quodlibet.png -%%DATADIR%%/audio-volume-high.png -%%DATADIR%%/audio-volume-low.png -%%DATADIR%%/audio-volume-medium.png -%%DATADIR%%/audio-volume-muted.png -%%DATADIR%%/browsers/__init__.py -%%DATADIR%%/browsers/_base.py -%%DATADIR%%/browsers/albums.py -%%DATADIR%%/browsers/audiofeeds.py -%%DATADIR%%/browsers/filesystem.py -%%DATADIR%%/browsers/iradio.py -%%DATADIR%%/browsers/media.py -%%DATADIR%%/browsers/paned.py -%%DATADIR%%/browsers/playlists.py -%%DATADIR%%/browsers/search.py -%%DATADIR%%/config.py -%%DATADIR%%/const.py -%%DATADIR%%/exfalso.png -%%DATADIR%%/exfalso.py -%%DATADIR%%/exfalso.svg -%%DATADIR%%/device-generic.png -%%DATADIR%%/device-ipod.png -%%DATADIR%%/devices/__init__.py -%%DATADIR%%/devices/_base.py -%%DATADIR%%/devices/ipod.py -%%DATADIR%%/devices/storage.py -%%DATADIR%%/formats/__init__.py -%%DATADIR%%/formats/_apev2.py -%%DATADIR%%/formats/_audio.py -%%DATADIR%%/formats/_id3.py -%%DATADIR%%/formats/mod.py -%%DATADIR%%/formats/mp3.py -%%DATADIR%%/formats/mp4.py -%%DATADIR%%/formats/mpc.py -%%DATADIR%%/formats/remote.py -%%DATADIR%%/formats/spc.py -%%DATADIR%%/formats/trueaudio.py -%%DATADIR%%/formats/wav.py -%%DATADIR%%/formats/wavpack.py -%%DATADIR%%/formats/wma.py -%%DATADIR%%/formats/xiph.py -%%DATADIR%%/library/__init__.py -%%DATADIR%%/library/_library.py -%%DATADIR%%/library/songs.py -%%DATADIR%%/media-eject.png -%%DATADIR%%/missing-cover.svg -%%DATADIR%%/parse/__init__.py -%%DATADIR%%/parse/_match.py -%%DATADIR%%/parse/_pattern.py -%%DATADIR%%/parse/_query.py -%%DATADIR%%/player.py -%%DATADIR%%/plugins/__init__.py -%%DATADIR%%/plugins/editing.py -%%DATADIR%%/plugins/events.py -%%DATADIR%%/plugins/events/qlscrobbler.py -%%DATADIR%%/plugins/songsmenu.py -%%DATADIR%%/qltk/__init__.py -%%DATADIR%%/qltk/_editpane.py -%%DATADIR%%/qltk/about.py -%%DATADIR%%/qltk/bookmarks.py -%%DATADIR%%/qltk/browser.py -%%DATADIR%%/qltk/cbes.py -%%DATADIR%%/qltk/ccb.py -%%DATADIR%%/qltk/chooser.py -%%DATADIR%%/qltk/completion.py -%%DATADIR%%/qltk/controls.py -%%DATADIR%%/qltk/cover.py -%%DATADIR%%/qltk/dbus_.py -%%DATADIR%%/qltk/delete.py -%%DATADIR%%/qltk/downloader.py -%%DATADIR%%/qltk/edittags.py -%%DATADIR%%/qltk/entry.py -%%DATADIR%%/qltk/exfalso.py -%%DATADIR%%/qltk/filesel.py -%%DATADIR%%/qltk/getstring.py -%%DATADIR%%/qltk/info.py -%%DATADIR%%/qltk/information.py -%%DATADIR%%/qltk/lyrics.py -%%DATADIR%%/qltk/mmkeys.py -%%DATADIR%%/qltk/msg.py -%%DATADIR%%/qltk/playorder.py -%%DATADIR%%/qltk/pluginwin.py -%%DATADIR%%/qltk/prefs.py -%%DATADIR%%/qltk/properties.py -%%DATADIR%%/qltk/queue.py -%%DATADIR%%/qltk/quodlibet.py -%%DATADIR%%/qltk/remote.py -%%DATADIR%%/qltk/renamefiles.py -%%DATADIR%%/qltk/session.py -%%DATADIR%%/qltk/sliderbutton.py -%%DATADIR%%/qltk/songlist.py -%%DATADIR%%/qltk/songsmenu.py -%%DATADIR%%/qltk/tagscombobox.py -%%DATADIR%%/qltk/tagsfrompath.py -%%DATADIR%%/qltk/textedit.py -%%DATADIR%%/qltk/tracker.py -%%DATADIR%%/qltk/tracknumbers.py -%%DATADIR%%/qltk/views.py -%%DATADIR%%/qltk/wlw.py -%%DATADIR%%/qltk/x.py -%%DATADIR%%/quodlibet.png -%%DATADIR%%/quodlibet.py -%%DATADIR%%/quodlibet.svg -%%DATADIR%%/stock.py -%%DATADIR%%/util/__init__.py -%%DATADIR%%/util/copool.py -%%DATADIR%%/util/i18n.py -%%DATADIR%%/util/massagers.py -%%DATADIR%%/util/uri.py -%%DATADIR%%/widgets.py -@dirrmtry share/applications -@dirrm lib/quodlibet -@dirrm %%DATADIR%%/util -@dirrm %%DATADIR%%/qltk -@dirrm %%DATADIR%%/plugins/events -@dirrm %%DATADIR%%/plugins -@dirrm %%DATADIR%%/parse -@dirrm %%DATADIR%%/library -@dirrm %%DATADIR%%/formats -@dirrm %%DATADIR%%/devices -@dirrm %%DATADIR%%/browsers -@dirrm %%DATADIR%% +share/locale/fi/LC_MESSAGES/quodlibet.mo +%%PYTHON_SITELIBDIR%%/quodlibet/widgets.py +%%PYTHON_SITELIBDIR%%/quodlibet/config.py +%%PYTHON_SITELIBDIR%%/quodlibet/__init__.py +%%PYTHON_SITELIBDIR%%/quodlibet/stock.py +%%PYTHON_SITELIBDIR%%/quodlibet/const.py +%%PYTHON_SITELIBDIR%%/quodlibet/browsers/albums.py +%%PYTHON_SITELIBDIR%%/quodlibet/browsers/playlists.py +%%PYTHON_SITELIBDIR%%/quodlibet/browsers/media.py +%%PYTHON_SITELIBDIR%%/quodlibet/browsers/audiofeeds.py +%%PYTHON_SITELIBDIR%%/quodlibet/browsers/_base.py +%%PYTHON_SITELIBDIR%%/quodlibet/browsers/iradio.py +%%PYTHON_SITELIBDIR%%/quodlibet/browsers/search.py +%%PYTHON_SITELIBDIR%%/quodlibet/browsers/filesystem.py +%%PYTHON_SITELIBDIR%%/quodlibet/browsers/paned.py +%%PYTHON_SITELIBDIR%%/quodlibet/browsers/__init__.py +%%PYTHON_SITELIBDIR%%/quodlibet/devices/_base.py +%%PYTHON_SITELIBDIR%%/quodlibet/devices/ipod.py +%%PYTHON_SITELIBDIR%%/quodlibet/devices/storage.py +%%PYTHON_SITELIBDIR%%/quodlibet/devices/__init__.py +%%PYTHON_SITELIBDIR%%/quodlibet/formats/wav.py +%%PYTHON_SITELIBDIR%%/quodlibet/formats/spc.py +%%PYTHON_SITELIBDIR%%/quodlibet/formats/wavpack.py +%%PYTHON_SITELIBDIR%%/quodlibet/formats/_audio.py +%%PYTHON_SITELIBDIR%%/quodlibet/formats/xiph.py +%%PYTHON_SITELIBDIR%%/quodlibet/formats/mod.py +%%PYTHON_SITELIBDIR%%/quodlibet/formats/mp3.py +%%PYTHON_SITELIBDIR%%/quodlibet/formats/wma.py +%%PYTHON_SITELIBDIR%%/quodlibet/formats/_id3.py +%%PYTHON_SITELIBDIR%%/quodlibet/formats/mp4.py +%%PYTHON_SITELIBDIR%%/quodlibet/formats/mpc.py +%%PYTHON_SITELIBDIR%%/quodlibet/formats/__init__.py +%%PYTHON_SITELIBDIR%%/quodlibet/formats/_apev2.py +%%PYTHON_SITELIBDIR%%/quodlibet/formats/trueaudio.py +%%PYTHON_SITELIBDIR%%/quodlibet/formats/remote.py +%%PYTHON_SITELIBDIR%%/quodlibet/library/_library.py +%%PYTHON_SITELIBDIR%%/quodlibet/library/songs.py +%%PYTHON_SITELIBDIR%%/quodlibet/library/__init__.py +%%PYTHON_SITELIBDIR%%/quodlibet/parse/_match.py +%%PYTHON_SITELIBDIR%%/quodlibet/parse/_query.py +%%PYTHON_SITELIBDIR%%/quodlibet/parse/_pattern.py +%%PYTHON_SITELIBDIR%%/quodlibet/parse/__init__.py +%%PYTHON_SITELIBDIR%%/quodlibet/parse/_scanner.py +%%PYTHON_SITELIBDIR%%/quodlibet/plugins/songsmenu.py +%%PYTHON_SITELIBDIR%%/quodlibet/plugins/playorder.py +%%PYTHON_SITELIBDIR%%/quodlibet/plugins/editing.py +%%PYTHON_SITELIBDIR%%/quodlibet/plugins/events.py +%%PYTHON_SITELIBDIR%%/quodlibet/plugins/__init__.py +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/songlist.py +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/songsmenu.py +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/lyrics.py +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/logging.py +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/quodlibetwindow.py +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/filesel.py +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/playorder.py +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/tagscombobox.py +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/downloader.py +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/browser.py +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/info.py +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/msg.py +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/renamefiles.py +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/getstring.py +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/about.py +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/session.py +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/tracker.py +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/pluginwin.py +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/information.py +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/entry.py +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/ccb.py +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/completion.py +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/cbes.py +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/tracknumbers.py +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/controls.py +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/queue.py +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/delete.py +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/chooser.py +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/prefs.py +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/_editpane.py +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/mmkeys_.py +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/dbus_.py +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/config.py +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/wlw.py +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/bookmarks.py +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/views.py +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/cover.py +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/tagsfrompath.py +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/textedit.py +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/exfalsowindow.py +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/edittags.py +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/sliderbutton.py +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/__init__.py +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/x.py +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/properties.py +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/remote.py +%%PYTHON_SITELIBDIR%%/quodlibet/util/logging.py +%%PYTHON_SITELIBDIR%%/quodlibet/util/copool.py +%%PYTHON_SITELIBDIR%%/quodlibet/util/titlecase.py +%%PYTHON_SITELIBDIR%%/quodlibet/util/tags.py +%%PYTHON_SITELIBDIR%%/quodlibet/util/massagers.py +%%PYTHON_SITELIBDIR%%/quodlibet/util/thumbnails.py +%%PYTHON_SITELIBDIR%%/quodlibet/util/i18n.py +%%PYTHON_SITELIBDIR%%/quodlibet/util/uri.py +%%PYTHON_SITELIBDIR%%/quodlibet/util/__init__.py +%%PYTHON_SITELIBDIR%%/quodlibet/player/_xine.py +%%PYTHON_SITELIBDIR%%/quodlibet/player/nullbe.py +%%PYTHON_SITELIBDIR%%/quodlibet/player/_base.py +%%PYTHON_SITELIBDIR%%/quodlibet/player/xinebe.py +%%PYTHON_SITELIBDIR%%/quodlibet/player/gstbe.py +%%PYTHON_SITELIBDIR%%/quodlibet/player/__init__.py +%%PYTHON_SITELIBDIR%%/quodlibet/debug/enc.py +%%PYTHON_SITELIBDIR%%/quodlibet/debug/debugwindow.py +%%PYTHON_SITELIBDIR%%/quodlibet/debug/__init__.py +%%PYTHON_SITELIBDIR%%/quodlibet/images/quodlibet.png +%%PYTHON_SITELIBDIR%%/quodlibet/images/audio-volume-muted.png +%%PYTHON_SITELIBDIR%%/quodlibet/images/device-generic.png +%%PYTHON_SITELIBDIR%%/quodlibet/images/audio-volume-low.png +%%PYTHON_SITELIBDIR%%/quodlibet/images/audio-volume-high.png +%%PYTHON_SITELIBDIR%%/quodlibet/images/audio-volume-medium.png +%%PYTHON_SITELIBDIR%%/quodlibet/images/media-eject.png +%%PYTHON_SITELIBDIR%%/quodlibet/images/exfalso.png +%%PYTHON_SITELIBDIR%%/quodlibet/images/device-ipod.png +%%PYTHON_SITELIBDIR%%/quodlibet/images/missing-cover.svg +%%PYTHON_SITELIBDIR%%/quodlibet/images/exfalso.svg +%%PYTHON_SITELIBDIR%%/quodlibet/images/quodlibet.svg +%%PYTHON_SITELIBDIR%%/quodlibet/_mmkeys.so +%%PYTHON_SITELIBDIR%%/quodlibet/_trayicon.so +%%PYTHON_SITELIBDIR%%/quodlibet/widgets.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/config.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/__init__.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/stock.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/const.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/browsers/albums.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/browsers/playlists.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/browsers/media.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/browsers/audiofeeds.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/browsers/_base.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/browsers/iradio.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/browsers/search.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/browsers/filesystem.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/browsers/paned.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/browsers/__init__.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/devices/_base.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/devices/ipod.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/devices/storage.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/devices/__init__.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/formats/wav.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/formats/spc.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/formats/wavpack.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/formats/_audio.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/formats/xiph.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/formats/mod.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/formats/mp3.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/formats/wma.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/formats/_id3.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/formats/mp4.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/formats/mpc.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/formats/__init__.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/formats/_apev2.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/formats/trueaudio.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/formats/remote.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/library/_library.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/library/songs.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/library/__init__.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/parse/_match.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/parse/_query.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/parse/_pattern.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/parse/__init__.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/parse/_scanner.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/plugins/songsmenu.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/plugins/playorder.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/plugins/editing.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/plugins/events.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/plugins/__init__.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/songlist.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/songsmenu.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/lyrics.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/logging.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/quodlibetwindow.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/filesel.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/playorder.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/tagscombobox.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/downloader.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/browser.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/info.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/msg.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/renamefiles.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/getstring.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/about.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/session.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/tracker.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/pluginwin.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/information.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/entry.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/ccb.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/completion.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/cbes.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/tracknumbers.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/controls.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/queue.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/delete.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/chooser.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/prefs.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/_editpane.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/mmkeys_.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/dbus_.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/config.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/wlw.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/bookmarks.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/views.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/cover.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/tagsfrompath.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/textedit.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/exfalsowindow.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/edittags.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/sliderbutton.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/__init__.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/x.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/properties.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/remote.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/util/logging.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/util/copool.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/util/titlecase.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/util/tags.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/util/massagers.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/util/thumbnails.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/util/i18n.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/util/uri.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/util/__init__.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/player/_xine.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/player/nullbe.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/player/_base.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/player/xinebe.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/player/gstbe.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/player/__init__.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/debug/enc.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/debug/debugwindow.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/debug/__init__.pyc +%%PYTHON_SITELIBDIR%%/quodlibet/widgets.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/config.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/__init__.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/stock.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/const.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/browsers/albums.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/browsers/playlists.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/browsers/media.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/browsers/audiofeeds.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/browsers/_base.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/browsers/iradio.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/browsers/search.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/browsers/filesystem.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/browsers/paned.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/browsers/__init__.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/devices/_base.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/devices/ipod.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/devices/storage.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/devices/__init__.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/formats/wav.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/formats/spc.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/formats/wavpack.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/formats/_audio.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/formats/xiph.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/formats/mod.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/formats/mp3.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/formats/wma.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/formats/_id3.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/formats/mp4.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/formats/mpc.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/formats/__init__.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/formats/_apev2.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/formats/trueaudio.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/formats/remote.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/library/_library.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/library/songs.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/library/__init__.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/parse/_match.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/parse/_query.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/parse/_pattern.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/parse/__init__.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/parse/_scanner.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/plugins/songsmenu.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/plugins/playorder.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/plugins/editing.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/plugins/events.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/plugins/__init__.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/songlist.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/songsmenu.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/lyrics.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/logging.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/quodlibetwindow.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/filesel.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/playorder.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/tagscombobox.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/downloader.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/browser.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/info.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/msg.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/renamefiles.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/getstring.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/about.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/session.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/tracker.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/pluginwin.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/information.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/entry.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/ccb.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/completion.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/cbes.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/tracknumbers.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/controls.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/queue.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/delete.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/chooser.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/prefs.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/_editpane.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/mmkeys_.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/dbus_.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/config.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/wlw.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/bookmarks.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/views.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/cover.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/tagsfrompath.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/textedit.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/exfalsowindow.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/edittags.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/sliderbutton.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/__init__.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/x.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/properties.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/qltk/remote.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/util/logging.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/util/copool.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/util/titlecase.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/util/tags.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/util/massagers.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/util/thumbnails.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/util/i18n.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/util/uri.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/util/__init__.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/player/_xine.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/player/nullbe.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/player/_base.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/player/xinebe.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/player/gstbe.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/player/__init__.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/debug/enc.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/debug/debugwindow.pyo +%%PYTHON_SITELIBDIR%%/quodlibet/debug/__init__.pyo +@dirrm %%PYTHON_SITELIBDIR%%/quodlibet/browsers +@dirrm %%PYTHON_SITELIBDIR%%/quodlibet/devices +@dirrm %%PYTHON_SITELIBDIR%%/quodlibet/formats +@dirrm %%PYTHON_SITELIBDIR%%/quodlibet/library +@dirrm %%PYTHON_SITELIBDIR%%/quodlibet/parse +@dirrm %%PYTHON_SITELIBDIR%%/quodlibet/plugins +@dirrm %%PYTHON_SITELIBDIR%%/quodlibet/qltk +@dirrm %%PYTHON_SITELIBDIR%%/quodlibet/util +@dirrm %%PYTHON_SITELIBDIR%%/quodlibet/player +@dirrm %%PYTHON_SITELIBDIR%%/quodlibet/debug +@dirrm %%PYTHON_SITELIBDIR%%/quodlibet/images +@dirrm %%PYTHON_SITELIBDIR%%/quodlibet >Release-Note: >Audit-Trail: >Unformatted: