ports/144094: [patch] multimedia/quodlibet: update to 2.2

J.D. Morris jdm720 at gmail.com
Fri Feb 19 07:50:02 UTC 2010


>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 at 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 at 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 <bsd.port.post.mk>
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 <joshk at triplehelix.org>,
-#             Joe Wreschnig <piman at sacredchao.net>
-# 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
- at dirrmtry share/applications
- at dirrm lib/quodlibet
- at dirrm %%DATADIR%%/util
- at dirrm %%DATADIR%%/qltk
- at dirrm %%DATADIR%%/plugins/events
- at dirrm %%DATADIR%%/plugins
- at dirrm %%DATADIR%%/parse
- at dirrm %%DATADIR%%/library
- at dirrm %%DATADIR%%/formats
- at dirrm %%DATADIR%%/devices
- at dirrm %%DATADIR%%/browsers
- at 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
+ at dirrm %%PYTHON_SITELIBDIR%%/quodlibet/browsers
+ at dirrm %%PYTHON_SITELIBDIR%%/quodlibet/devices
+ at dirrm %%PYTHON_SITELIBDIR%%/quodlibet/formats
+ at dirrm %%PYTHON_SITELIBDIR%%/quodlibet/library
+ at dirrm %%PYTHON_SITELIBDIR%%/quodlibet/parse
+ at dirrm %%PYTHON_SITELIBDIR%%/quodlibet/plugins
+ at dirrm %%PYTHON_SITELIBDIR%%/quodlibet/qltk
+ at dirrm %%PYTHON_SITELIBDIR%%/quodlibet/util
+ at dirrm %%PYTHON_SITELIBDIR%%/quodlibet/player
+ at dirrm %%PYTHON_SITELIBDIR%%/quodlibet/debug
+ at dirrm %%PYTHON_SITELIBDIR%%/quodlibet/images
+ at dirrm %%PYTHON_SITELIBDIR%%/quodlibet


>Release-Note:
>Audit-Trail:
>Unformatted:



More information about the freebsd-ports-bugs mailing list