View | Details | Raw Unified | Return to bug 144094
Collapse All | Expand All

(-)quodlibet/Makefile (-21 / +8 lines)
Lines 6-16 Link Here
6
#
6
#
7
7
8
PORTNAME=	quodlibet
8
PORTNAME=	quodlibet
9
PORTVERSION=	1.0
9
PORTVERSION=	2.2
10
PORTREVISION=	5
11
CATEGORIES=	multimedia audio python gnome
10
CATEGORIES=	multimedia audio python gnome
12
MASTER_SITES=	http://www.sacredchao.net/~piman/software/ \
11
MASTER_SITES=	${MASTER_SITE_GOOGLE_CODE} \
13
		http://www.tortall.net/mirrors/piman-software/
12
				http://www.sacredchao.net/~piman/software/ \
13
				http://www.tortall.net/mirrors/piman-software/
14
14
15
MAINTAINER=	johnson.peter@gmail.com
15
MAINTAINER=	johnson.peter@gmail.com
16
COMMENT=	A GTK+-based audio player written in Python
16
COMMENT=	A GTK+-based audio player written in Python
Lines 21-27 Link Here
21
USE_PYTHON=	2.4+
21
USE_PYTHON=	2.4+
22
USE_GNOME=	pygtk2
22
USE_GNOME=	pygtk2
23
USE_GETTEXT=	yes
23
USE_GETTEXT=	yes
24
USE_GMAKE=	yes
24
USE_PYDISTUTILS=	yes
25
USE_DISPLAY=	yes
25
USE_DISPLAY=	yes
26
USE_GSTREAMER=	gconf good python
26
USE_GSTREAMER=	gconf good python
27
27
Lines 105-126 Link Here
105
PLIST_SUB+=	EXTENSIONS="@comment "
105
PLIST_SUB+=	EXTENSIONS="@comment "
106
.endif
106
.endif
107
107
108
do-configure:
109
	@${PYTHON_CMD} ${WRKSRC}/check.py
110
111
do-build:
112
	@cd ${WRKSRC}/po && ${GMAKE} po
113
.if defined(WITH_EXTENSIONS)
114
	@cd ${WRKSRC} && ${GMAKE} extensions
115
.endif
116
117
pre-install:
118
	@${MKDIR} ${PREFIX}/lib/${PORTNAME}
119
	@${MKDIR} ${PREFIX}/share/applications
120
121
post-install:
108
post-install:
122
	@${MKDIR} ${DATADIR}/plugins
109
	@${ECHO_CMD}
123
	@${MKDIR} ${DATADIR}/plugins/events
110
	@${CAT} ${PKGMESSAGE}
124
	@${INSTALL_DATA} ${FILESDIR}/qlscrobbler.py ${DATADIR}/plugins/events
111
	@${ECHO_CMD}
125
112
126
.include <bsd.port.post.mk>
113
.include <bsd.port.post.mk>
(-)quodlibet/distinfo (-3 / +3 lines)
Lines 1-3 Link Here
1
MD5 (quodlibet-1.0.tar.gz) = 5c925b754bd8505a7a66f2ffcc5b5fe4
1
MD5 (quodlibet-2.2.tar.gz) = ff8bb5f9e680797dfb60d437368298f9
2
SHA256 (quodlibet-1.0.tar.gz) = bba92a91ac462b0277ad788a655b56af8bf02496a5878692dc88ffc4fdaddba4
2
SHA256 (quodlibet-2.2.tar.gz) = 1aac91369b26fa897c0d9eaa6a43aadcd5ffe8751a298a6c7beabe7591c0e713
3
SIZE (quodlibet-1.0.tar.gz) = 617369
3
SIZE (quodlibet-2.2.tar.gz) = 910381
(-)quodlibet/files/patch-Makefile (-36 lines)
Lines 1-36 Link Here
1
--- Makefile.orig	Sun Apr 15 19:45:47 2007
2
+++ Makefile	Mon Jun  4 21:41:02 2007
3
@@ -13,7 +13,6 @@
4
 	@./check.py $(DESTDIR)$(PREFIX)/$(TO)
5
 
6
 make-install-dirs:
7
-	mkdir -p $(DESTDIR)$(PREFIX)/share/man/man1
8
 	mkdir -p $(DESTDIR)$(PREFIX)/bin
9
 	mkdir -p $(DESTDIR)$(PREFIX)/$(TO)
10
 
11
@@ -21,9 +20,9 @@
12
 	install -m 644 $(MODULES) missing-cover.svg audio-*.png media-*.png device-*.png $(DESTDIR)$(PREFIX)/$(TO)
13
 	cd po && make install-po DESTDIR=$(DESTDIR)
14
 
15
-	for E in $(EXTENSIONS); do \
16
+	-for E in $(EXTENSIONS); do \
17
 		if test -e $$E; then \
18
-			install -m 755 -D $$E $(DESTDIR)$(PREFIX)/$(TODEP)/$$E; \
19
+			install -m 755 $$E $(DESTDIR)$(PREFIX)/$(TODEP)/$$E; \
20
 		fi; \
21
 	done
22
 
23
@@ -37,10 +36,10 @@
24
 
25
 app-install-%: make-install-dirs %.desktop
26
 	install -m 755 $*.py $(DESTDIR)$(PREFIX)/$(TO)
27
-	install -m 644 $*.1 $(DESTDIR)$(PREFIX)/share/man/man1/$*.1
28
-	install -D -m 644 $*.png $(DESTDIR)$(PREFIX)/share/pixmaps/$*.png
29
+	install -m 644 $*.1 $(DESTDIR)$(PREFIX)/man/man1/$*.1
30
+	install -m 644 $*.png $(DESTDIR)$(PREFIX)/share/pixmaps/$*.png
31
 	install -m 644 $*.svg $*.png $(DESTDIR)$(PREFIX)/$(TO)
32
-	-install -D -m 644 $*.desktop $(DESTDIR)$(PREFIX)/share/applications/$*.desktop
33
+	-install -m 644 $*.desktop $(DESTDIR)$(PREFIX)/share/applications/$*.desktop
34
 	ln -sf ../$(TO)/$*.py $(DESTDIR)$(PREFIX)/bin/$*
35
 
36
 clean:
(-)quodlibet/files/patch-gdist__man.py (+11 lines)
Line 0 Link Here
1
--- gdist/man.py.orig	2010-02-18 02:56:24.000000000 -0500
2
+++ gdist/man.py	2010-02-18 02:56:58.000000000 -0500
3
@@ -36,7 +36,7 @@
4
                 raise SystemExit("%r has no section" % man_page)
5
 
6
     def run(self):
7
-        basepath = os.path.join(self.prefix, 'share', 'man')
8
+        basepath = os.path.join(self.prefix, 'man')
9
         if self.root != None:
10
           basepath = change_root(self.root, basepath)
11
         self.mkpath(basepath)
(-)quodlibet/files/patch-po-Makefile (-12 lines)
Lines 1-12 Link Here
1
--- po/Makefile.orig	Sun Nov 12 04:24:42 2006
2
+++ po/Makefile	Mon Jun  4 23:11:13 2007
3
@@ -12,9 +12,6 @@
4
 quodlibet.pot: POTFILES.in ../*.py ../formats/*.py ../browsers/*.py ../qltk/*.py ../plugins/*.py tag-names.py ../util/*.py ../library/*.py ../devices/*.py
5
 	intltool-update --pot --gettext-package=$(NAME)
6
 
7
-%.po: quodlibet.pot
8
-	intltool-update --dist --gettext-package=$(NAME) $*
9
-
10
 %.mo: %.po
11
 	msgfmt -o $@ $<
12
 
(-)quodlibet/files/patch-quodlibet__qltk__config.py (+10 lines)
Line 0 Link Here
1
--- quodlibet/qltk/config.py.orig	2010-02-18 03:01:37.000000000 -0500
2
+++ quodlibet/qltk/config.py	2010-02-18 03:01:59.000000000 -0500
3
@@ -54,7 +54,3 @@
4
 
5
     def __toggled(self, section, option):
6
         config.set(section, option, str(bool(self.get_active())).lower())
7
-
8
-    
9
-
10
-class ConfigCheckButton(gtk.CheckButton)
(-)quodlibet/files/qlscrobbler.py (-533 lines)
Lines 1-533 Link Here
1
# QLScrobbler: an Audioscrobbler client plugin for Quod Libet.
2
# version 0.8
3
# (C) 2005 by Joshua Kwan <joshk@triplehelix.org>,
4
#             Joe Wreschnig <piman@sacredchao.net>
5
# Licensed under GPLv2. See Quod Libet's COPYING for more information.
6
7
import random
8
import md5, urllib, urllib2, time, threading, os
9
import player, config, const, widgets, parse
10
import gobject, gtk
11
from qltk.msg import Message, WarningMessage
12
from qltk.entry import ValidatingEntry
13
from util import to
14
15
from plugins.events import EventPlugin
16
17
class QLScrobbler(EventPlugin):
18
	# session invariants
19
	PLUGIN_NAME = "QLScrobbler"
20
	PLUGIN_DESC = "Audioscrobbler client for Quod Libet"
21
	PLUGIN_ICON = gtk.STOCK_CONNECT
22
	PLUGIN_VERSION = "0.8.1"
23
	CLIENT = "qlb"
24
	PROTOCOL_VERSION = "1.1"
25
	try: DUMP = os.path.join(const.USERDIR, "scrobbler_cache")
26
	except AttributeError:
27
		DUMP = os.path.join(const.DIR, "scrobbler_cache")
28
29
	# things that could change
30
	
31
	username = ""
32
	password = ""
33
	pwhash = ""
34
	exclude = ""
35
	
36
	timeout_id = -1
37
	submission_tid = -1
38
39
	challenge = ""
40
	submit_url = ""
41
	
42
	# state management
43
	waiting = False
44
	challenge_sent = False
45
	broken = False
46
	need_config = False
47
	need_update = False
48
	already_submitted = False
49
	locked = False
50
	flushing = False
51
	__enabled = False
52
	offline = False
53
54
	# we need to store this because not all events get the song
55
	song = None
56
57
	queue = []
58
59
	def __init__(self):
60
		# Read dumped queue and delete it
61
		try:
62
			dump = open(self.DUMP, 'r')
63
			self.read_dump(dump)
64
		except: pass
65
66
		# Read configuration
67
		self.read_config()
68
		
69
		# Set up exit hook to dump queue
70
		gtk.quit_add(0, self.dump_queue)
71
72
	def read_dump(self, dump):
73
		print "Loading dumped queue."
74
	
75
		current = {}
76
77
		for line in dump.readlines():
78
			key = ""
79
			value = ""
80
			
81
			line = line.rstrip("\n")
82
			try: (key, value) = line.split(" = ", 1)
83
			except:
84
				if line == "-":
85
					for key in ["album", "mbid"]:
86
						if key not in current:
87
							current[key] = ""
88
					
89
					for reqkey in ["artist", "title", "length", "stamp"]:
90
						# discard if somehow invalid
91
						if reqkey not in current:
92
							current = {}
93
94
					if current != {}:
95
						self.queue.append(current)
96
						current = {}
97
				continue
98
				
99
			if key == "length": current[key] = int(value)
100
			else: current[key] = value
101
102
		dump.close()
103
104
		os.remove(self.DUMP)
105
106
#		print "Queue contents:"
107
#		for item in self.queue:
108
#			print "\t%s - %s" % (item['artist'], item['title'])
109
110
		# Try to flush it immediately
111
		if len(self.queue) > 0:
112
			self.flushing = True
113
			self.submit_song()
114
		else: print "Queue was empty!"
115
116
	def dump_queue(self):
117
		if len(self.queue) == 0: return 0
118
		
119
		print "Dumping offline queue, will submit next time."
120
121
		dump = open(self.DUMP, 'w')
122
		
123
		for item in self.queue:
124
			for key in item:
125
				dump.write("%s = %s\n" % (key, item[key]))
126
			dump.write("-\n")
127
128
		dump.close()
129
130
		return 0
131
		
132
	def plugin_on_removed(self, songs):
133
		try:
134
			if self.song in songs:
135
				self.already_submitted = True
136
		except:
137
			# Older version compatibility.
138
			if self.song is songs:
139
				self.already_submitted = True
140
141
	def plugin_on_song_ended(self, song, stopped):
142
		if song is None: return
143
144
		if self.timeout_id > 0:
145
			gobject.source_remove(self.timeout_id)
146
			self.timeout_id = -1
147
	
148
	def plugin_on_song_started(self, song):
149
		if song is None: return
150
		
151
		self.already_submitted = False
152
		if self.timeout_id > 0:
153
			gobject.source_remove(self.timeout_id)
154
		
155
		self.timeout_id = -1
156
157
		# Protocol stipulation:
158
		#	* don't submit when length < 00:30
159
		#     NOTE: >30:00 stipulation has been REMOVED as of Protocol1.1
160
		#	* don't submit if artist and title are not available
161
		if song["~#length"] < 30: return
162
		elif 'title' not in song: return
163
		elif "artist" not in song:
164
			if ("composer" not in song) and ("performer" not in song): return
165
		
166
		# Check to see if this song is not something we'd like to submit
167
		#    e.g. "Hit Me Baby One More Time"
168
		if self.exclude != "" and parse.Query(self.exclude).search(song):
169
			print to("Not submitting: %s - %s" % (song["artist"], song["title"]))
170
			return
171
172
		self.song = song
173
		if player.playlist.paused == False:
174
			self.prepare()
175
176
	def plugin_on_paused(self):
177
		if self.timeout_id > 0:
178
			gobject.source_remove(self.timeout_id)
179
			# special value that will tell on_unpaused to check song length
180
			self.timeout_id = -2
181
182
	def plugin_on_unpaused(self):
183
		if self.already_submitted == False and self.timeout_id == -1: self.prepare()
184
		
185
	def plugin_on_seek(self, song, msec):
186
		if self.timeout_id > 0:
187
			gobject.source_remove(self.timeout_id)
188
			self.timeout_id = -1
189
			
190
		if msec == 0: #I think this is okay!
191
			self.prepare()
192
		else:
193
			self.already_submitted = True # cancel
194
		
195
	def prepare(self):
196
		if self.song is None: return
197
198
		# Protocol stipulations:
199
		#	* submit 240 seconds in or at 50%, whichever comes first
200
		delay = int(min(self.song["~#length"] / 2, 240))
201
202
		if self.timeout_id == -2: # change delta based on current progress
203
			# assumption is that self.already_submitted == 0, therefore
204
			# delay - progress > 0
205
			progress = int(player.playlist.get_position() / 1000)
206
			delay -= progress
207
208
		self.timeout_id = gobject.timeout_add(delay * 1000, self.submit_song)
209
	
210
	def read_config(self):
211
		username = ""
212
		password = ""
213
		try:
214
			username = config.get("plugins", "scrobbler_username")
215
			password = config.get("plugins", "scrobbler_password")
216
		except:
217
			if (self.need_config == False and
218
			    getattr(self, 'PMEnFlag', False)):
219
				self.quick_dialog("Please visit the Preferences window to set QLScrobbler up. Until then, songs will not be submitted.", gtk.MESSAGE_INFO)
220
				self.need_config = True
221
				return
222
223
		try: self.offline = (config.get("plugins", "scrobbler_offline") == "true")
224
		except: pass
225
		try: self.exclude = config.get("plugins", "scrobbler_exclude")
226
		except: pass
227
		
228
		self.username = username
229
		
230
		hasher = md5.new()
231
		hasher.update(password);
232
		self.password = hasher.hexdigest()
233
		self.need_config = False
234
235
	def __destroy_cb(self, dialog, response_id):
236
		dialog.destroy()
237
	
238
	def quick_dialog_helper(self, type, str):
239
		dialog = Message(gtk.MESSAGE_INFO, widgets.main, "QLScrobbler", str)
240
		dialog.connect('response', self.__destroy_cb)
241
		dialog.show()
242
243
	def quick_dialog(self, str, type):
244
		gobject.idle_add(self.quick_dialog_helper, type, str)
245
	
246
	def clear_waiting(self):
247
		self.waiting = False
248
249
	def send_handshake(self):
250
		# construct url
251
		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 )
252
		
253
		print "Sending handshake to Audioscrobbler."
254
255
		resp = None
256
257
		try:
258
			resp = urllib2.urlopen(url);
259
		except:
260
			print "Server not responding, handshake failed."
261
			return # challenge_sent is NOT set to 1
262
			
263
		# check response
264
		lines = resp.read().rstrip().split("\n")
265
		status = lines.pop(0)
266
267
		print "Handshake status: %s" % status
268
			
269
		if status == "UPTODATE" or status.startswith("UPDATE"):
270
			if status.startswith("UPDATE"):
271
				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)
272
				self.need_update = True
273
274
			# Scan for submit URL and challenge.
275
			self.challenge = lines.pop(0)
276
277
			print "Challenge: %s" % self.challenge
278
279
			# determine password
280
			hasher = md5.new()
281
			hasher.update(self.password)
282
			hasher.update(self.challenge)
283
			self.pwhash = hasher.hexdigest()
284
285
			self.submit_url = lines.pop(0)
286
			
287
			self.challenge_sent = True
288
		elif status == "BADUSER":
289
			self.quick_dialog("Authentication failed: invalid username %s or bad password." % self.username, gtk.MESSAGE_ERROR)
290
				
291
			self.broken = True
292
293
		# Honor INTERVAL if available
294
		try: interval = int(lines.pop(0).split()[1])
295
		except: interval = 0
296
297
		if interval > 1:
298
			self.waiting = True
299
			gobject.timeout_add(interval * 1000, self.clear_waiting)
300
			print "Server says to wait for %d seconds." % interval
301
	
302
	def submit_song(self):
303
		bg = threading.Thread(None, self.submit_song_helper)
304
		bg.setDaemon(True)
305
		bg.start()
306
307
	def enabled(self):
308
		self.__enabled = True
309
310
	def disabled(self):
311
		self.__enabled = False
312
313
	def submit_song_helper(self):
314
		if self.__enabled:
315
			print "Plugin re-enabled - accepting new songs."
316
			if self.submission_tid != -1:
317
				gobject.source_remove(self.submission_tid);
318
				self.submission_tid = -1
319
		else:
320
			print "Plugin disabled - not accepting any new songs."
321
			if len(self.queue) > 0:
322
				self.submission_tid = gobject.timeout_add(120 * 1000, self.submit_song_helper)
323
				print "Attempts will continue to submit the last %d songs." % len(self.queue)
324
325
		if self.already_submitted == True or self.broken == True: return
326
327
		# Scope.
328
		store = {}
329
		
330
		if self.flushing == False:
331
			stamp = time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime())
332
	
333
			store = {
334
				"title": self.song.comma("title"),
335
				"length": str(self.song["~#length"]),
336
				"album": self.song.comma("album"),
337
				"mbid": "", # will be correctly set if available
338
				"stamp": stamp
339
			}
340
341
			if "artist" in self.song:
342
				store["artist"] = self.song.comma("artist")
343
			elif "composer" in self.song:
344
				store["artist"] = self.song.comma("composer")
345
			elif "performer" in self.song:
346
				performer = self.song.comma('performer')
347
				if performer[-1] == ")" and "(" in performer:
348
					store["artist"] = performer[:performer.rindex("(")].strip()
349
				else:
350
					store["artist"] = performer
351
			if "musicbrainz_trackid" in self.song:
352
				store["mbid"] = self.song["musicbrainz_trackid"]
353
354
			self.queue.append(store)
355
		else: self.flushing = False
356
357
		# Just note to stdout if either of these are true..
358
		# locked means another instance if s_s_h is dealing with sending.
359
		if self.offline or self.locked:
360
			print to("Queuing: %s - %s" % (store["artist"], store["title"]))
361
			return
362
363
		self.locked = True
364
365
		while self.waiting == True: time.sleep(1)
366
367
		# Read config, handshake, and send challenge if not already done
368
		if self.challenge_sent == False:
369
			self.read_config()
370
			if self.broken == False and self.need_config == False:
371
				self.send_handshake()
372
		
373
		# INTERVAL may have been set during handshake.
374
		while self.waiting == True: time.sleep(1)
375
			
376
		if self.challenge_sent == False:
377
			self.locked = False
378
			return
379
		
380
		data = {
381
			'u': self.username,
382
			's': self.pwhash
383
		}
384
		
385
		# Flush the cache
386
		for i in range(min(len(self.queue), 10)):
387
			print to("Sending song: %s - %s" % (self.queue[i]['artist'], self.queue[i]['title']))
388
			data["a[%d]" % i] = self.queue[i]['artist'].encode('utf-8')
389
			data["t[%d]" % i] = self.queue[i]['title'].encode('utf-8')
390
			data["l[%d]" % i] = str(self.queue[i]['length'])
391
			data["b[%d]" % i] = self.queue[i]['album'].encode('utf-8')
392
			data["m[%d]" % i] = self.queue[i]['mbid']
393
			data["i[%d]" % i] = self.queue[i]['stamp']
394
		
395
		(host, file) = self.submit_url[7:].split("/") 
396
397
		resp = None
398
		
399
		try:
400
			data_str = urllib.urlencode(data)
401
			resp = urllib2.urlopen("http://" + host + "/" + file, data_str)
402
		except:
403
			print "Audioscrobbler server not responding, will try later."
404
			self.locked = False
405
			return # preserve the queue, yadda yadda
406
407
		resp_save = resp.read()
408
		lines = resp_save.rstrip().split("\n")
409
		
410
		try: (status, interval) = lines
411
		except:
412
			try: status = lines[0]
413
			except:
414
				print "Truncated server response, will try later..."
415
				self.locked = False
416
				return
417
			interval = None
418
		
419
		print "Submission status: %s" % status
420
421
		if status == "BADAUTH":
422
			print "Attempting to re-authenticate."
423
			self.challenge_sent = False
424
			self.send_handshake()
425
			if self.challenge_sent == False:
426
				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)
427
				self.broken = True
428
		elif status == "OK":
429
			self.queue = self.queue[10:]
430
		elif status.startswith("FAILED"):
431
			if status.startswith("FAILED Plugin bug"):
432
				print "Plugin bug!? Ridiculous! Dumping queue contents."
433
				for item in self.queue:
434
					for key in item:
435
						print to("%s = %s" % (key, item[key]))
436
			# possibly handle other specific cases here for debugging later
437
		else:
438
			print "Unknown response from server: %s" % status
439
			print "Dumping full response:"
440
			print resp_save
441
442
		if interval != None: interval_secs = int(interval.split()[1])
443
		else: interval_secs = 0
444
445
		if interval_secs > 1:
446
			self.waiting = True
447
			gobject.timeout_add(interval_secs * 1000, self.clear_waiting)
448
			print "Server says to wait for %d seconds." % interval_secs
449
450
		if not self.__enabled and len(self.queue) == 0 and self.submission_tid != -1:
451
			print "All songs submitted, disabling retries."
452
			gobject.source_remove(self.submission_tid)
453
			self.submission_tid = -1
454
455
		self.already_submitted = True
456
		self.locked = False
457
458
	def PluginPreferences(self, parent):
459
		def toggled(widget):
460
			if widget.get_active():
461
				config.set("plugins", "scrobbler_offline", "true")
462
				self.offline = True
463
			else:
464
				config.set("plugins", "scrobbler_offline", "false")
465
				self.offline = False
466
467
		def changed(entry, key):
468
			# having a function for each entry is unnecessary..
469
			config.set("plugins", "scrobbler_" + key, entry.get_text())
470
471
		def destroyed(*args):
472
			# if changed, let's say that things just got better and we should
473
			# try everything again
474
			newu = None
475
			newp = None
476
			try:
477
				newu = config.get("plugins", "scrobbler_username")
478
				newp = config.get("plugins", "scrobbler_password")
479
			except:
480
				return
481
482
			try: self.exclude = config.get("plugins", "scrobbler_exclude")
483
			except: pass
484
485
			if self.username != newu or self.password != newp:
486
				self.broken = False
487
488
		table = gtk.Table(6, 3)
489
		table.set_col_spacings(3)
490
		lt = gtk.Label(_("Please enter your Audioscrobbler\nusername and password."))
491
		lu = gtk.Label(_("Username:"))
492
		lp = gtk.Label(_("Password:"))
493
		lv = gtk.Label(_("Exclude filter:"))
494
		lvd = gtk.Label(_("Songs matching this filter will\nnot be sent to Audioscrobbler.\n"))
495
		off = gtk.CheckButton(_("Offline mode (don't submit anything)"))
496
		ve = ValidatingEntry(parse.Query.is_valid_color)
497
		for l in [lt, lu, lp, lv, lvd]:
498
			l.set_line_wrap(True)
499
			l.set_alignment(0.0, 0.5)
500
		table.attach(lt, 0, 2, 0, 1, xoptions=gtk.FILL | gtk.SHRINK)
501
		table.attach(lu, 0, 1, 1, 2, xoptions=gtk.FILL | gtk.SHRINK)
502
		table.attach(lp, 0, 1, 2, 3, xoptions=gtk.FILL | gtk.SHRINK)
503
		table.attach(lv, 0, 1, 3, 4, xoptions=gtk.FILL | gtk.SHRINK)
504
			
505
		userent = gtk.Entry()
506
		pwent = gtk.Entry()
507
		pwent.set_visibility(False)
508
		pwent.set_invisible_char('*')
509
		table.set_border_width(6)
510
		
511
		table.attach(ve, 1, 2, 3, 4, xoptions=gtk.FILL | gtk.SHRINK)
512
		table.attach(lvd, 0, 2, 4, 5, xoptions=gtk.FILL | gtk.SHRINK)
513
		table.attach(off, 0, 2, 5, 7, xoptions=gtk.FILL | gtk.SHRINK)
514
515
		try: userent.set_text(config.get("plugins", "scrobbler_username"))
516
		except: pass
517
		try: pwent.set_text(config.get("plugins", "scrobbler_password"))
518
		except: pass
519
		try:
520
			if config.get("plugins", "scrobbler_offline") == "true":
521
				off.set_active(True)
522
		except: pass
523
		try: ve.set_text(config.get("plugins", "scrobbler_exclude"))
524
		except: pass
525
526
		table.attach(userent, 1, 2, 1, 2, xoptions=gtk.FILL | gtk.SHRINK)
527
		table.attach(pwent, 1, 2, 2, 3, xoptions=gtk.FILL | gtk.SHRINK)
528
		pwent.connect('changed', changed, 'password')
529
		userent.connect('changed', changed, 'username')
530
		ve.connect('changed', changed, 'exclude')
531
		table.connect('destroy', destroyed)
532
		off.connect('toggled', toggled)
533
		return table
(-)quodlibet/pkg-descr (-2 / +8 lines)
Lines 1-3 Link Here
1
Quod Libet is a GTK+-based audio player written in Python.
1
Quod Libet is a GTK+-based audio player written in Python, using the
2
Mutagen tagging library. It's designed around the idea that you know
3
how to organize your music better than we do. It lets you make playlists
4
based on regular expressions (don't worry, regular searches work too).
5
It lets you display and edit any tags you want in the file. And it 
6
lets you do this for all the file formats it supports -- Ogg Vorbis,
7
FLAC, MP3, Musepack, and MOD.
2
8
3
WWW: http://www.sacredchao.net/quodlibet/
9
WWW: http://code.google.com/p/quodlibet/
(-)quodlibet/pkg-message (+13 lines)
Line 0 Link Here
1
For additional Quod Libet plugins:
2
3
1. Fetch plugins archive.
4
5
	fetch http://quodlibet.googlecode.com/files/quodlibet-plugins-2.2.tar.gz
6
7
2. Extract archive.
8
9
	tar xvfz quodlibet-plugins-2.2.tar.gz
10
11
3. Copy extracted files to Quod Libet plugins directory.
12
13
	cp -R quodlibet-plugins-2.2/* ~/.quodlibet/plugins/
(-)quodlibet/pkg-plist (-142 / +379 lines)
Lines 1-153 Link Here
1
bin/exfalso
1
bin/exfalso
2
bin/quodlibet
2
bin/quodlibet
3
%%EXTENSIONS%%lib/quodlibet/_mmkeys.so
4
%%EXTENSIONS%%lib/quodlibet/_trayicon.so
5
share/applications/exfalso.desktop
3
share/applications/exfalso.desktop
6
share/applications/quodlibet.desktop
4
share/applications/quodlibet.desktop
7
share/locale/bg/LC_MESSAGES/quodlibet.mo
8
share/locale/de/LC_MESSAGES/quodlibet.mo
9
share/locale/en_CA/LC_MESSAGES/quodlibet.mo
10
share/locale/en_GB/LC_MESSAGES/quodlibet.mo
11
share/locale/es/LC_MESSAGES/quodlibet.mo
12
share/locale/fi/LC_MESSAGES/quodlibet.mo
13
share/locale/fr/LC_MESSAGES/quodlibet.mo
14
share/locale/gl/LC_MESSAGES/quodlibet.mo
15
share/locale/he/LC_MESSAGES/quodlibet.mo
16
share/locale/hu/LC_MESSAGES/quodlibet.mo
5
share/locale/hu/LC_MESSAGES/quodlibet.mo
17
share/locale/it/LC_MESSAGES/quodlibet.mo
6
share/locale/gl_ES/LC_MESSAGES/quodlibet.mo
7
share/locale/ru/LC_MESSAGES/quodlibet.mo
18
share/locale/ja/LC_MESSAGES/quodlibet.mo
8
share/locale/ja/LC_MESSAGES/quodlibet.mo
19
share/locale/ko/LC_MESSAGES/quodlibet.mo
9
share/locale/he/LC_MESSAGES/quodlibet.mo
20
share/locale/lt/LC_MESSAGES/quodlibet.mo
10
share/locale/es/LC_MESSAGES/quodlibet.mo
21
share/locale/nb/LC_MESSAGES/quodlibet.mo
11
share/locale/sk/LC_MESSAGES/quodlibet.mo
12
share/locale/de/LC_MESSAGES/quodlibet.mo
22
share/locale/nl/LC_MESSAGES/quodlibet.mo
13
share/locale/nl/LC_MESSAGES/quodlibet.mo
14
share/locale/sv/LC_MESSAGES/quodlibet.mo
15
share/locale/ko/LC_MESSAGES/quodlibet.mo
16
share/locale/ro/LC_MESSAGES/quodlibet.mo
17
share/locale/uk/LC_MESSAGES/quodlibet.mo
23
share/locale/pl/LC_MESSAGES/quodlibet.mo
18
share/locale/pl/LC_MESSAGES/quodlibet.mo
24
share/locale/pt/LC_MESSAGES/quodlibet.mo
19
share/locale/pt/LC_MESSAGES/quodlibet.mo
25
share/locale/ro/LC_MESSAGES/quodlibet.mo
20
share/locale/en_CA/LC_MESSAGES/quodlibet.mo
26
share/locale/ru/LC_MESSAGES/quodlibet.mo
21
share/locale/nb/LC_MESSAGES/quodlibet.mo
27
share/locale/sk/LC_MESSAGES/quodlibet.mo
22
share/locale/tr/LC_MESSAGES/quodlibet.mo
28
share/locale/sv/LC_MESSAGES/quodlibet.mo
29
share/locale/zh_CN/LC_MESSAGES/quodlibet.mo
23
share/locale/zh_CN/LC_MESSAGES/quodlibet.mo
24
share/locale/fr/LC_MESSAGES/quodlibet.mo
25
share/locale/gl/LC_MESSAGES/quodlibet.mo
26
share/locale/it/LC_MESSAGES/quodlibet.mo
27
share/locale/en_GB/LC_MESSAGES/quodlibet.mo
28
share/locale/bg/LC_MESSAGES/quodlibet.mo
29
share/locale/lt/LC_MESSAGES/quodlibet.mo
30
share/locale/zh_TW/LC_MESSAGES/quodlibet.mo
30
share/locale/zh_TW/LC_MESSAGES/quodlibet.mo
31
share/pixmaps/exfalso.png
31
share/locale/fi/LC_MESSAGES/quodlibet.mo
32
share/pixmaps/quodlibet.png
32
%%PYTHON_SITELIBDIR%%/quodlibet/widgets.py
33
%%DATADIR%%/audio-volume-high.png
33
%%PYTHON_SITELIBDIR%%/quodlibet/config.py
34
%%DATADIR%%/audio-volume-low.png
34
%%PYTHON_SITELIBDIR%%/quodlibet/__init__.py
35
%%DATADIR%%/audio-volume-medium.png
35
%%PYTHON_SITELIBDIR%%/quodlibet/stock.py
36
%%DATADIR%%/audio-volume-muted.png
36
%%PYTHON_SITELIBDIR%%/quodlibet/const.py
37
%%DATADIR%%/browsers/__init__.py
37
%%PYTHON_SITELIBDIR%%/quodlibet/browsers/albums.py
38
%%DATADIR%%/browsers/_base.py
38
%%PYTHON_SITELIBDIR%%/quodlibet/browsers/playlists.py
39
%%DATADIR%%/browsers/albums.py
39
%%PYTHON_SITELIBDIR%%/quodlibet/browsers/media.py
40
%%DATADIR%%/browsers/audiofeeds.py
40
%%PYTHON_SITELIBDIR%%/quodlibet/browsers/audiofeeds.py
41
%%DATADIR%%/browsers/filesystem.py
41
%%PYTHON_SITELIBDIR%%/quodlibet/browsers/_base.py
42
%%DATADIR%%/browsers/iradio.py
42
%%PYTHON_SITELIBDIR%%/quodlibet/browsers/iradio.py
43
%%DATADIR%%/browsers/media.py
43
%%PYTHON_SITELIBDIR%%/quodlibet/browsers/search.py
44
%%DATADIR%%/browsers/paned.py
44
%%PYTHON_SITELIBDIR%%/quodlibet/browsers/filesystem.py
45
%%DATADIR%%/browsers/playlists.py
45
%%PYTHON_SITELIBDIR%%/quodlibet/browsers/paned.py
46
%%DATADIR%%/browsers/search.py
46
%%PYTHON_SITELIBDIR%%/quodlibet/browsers/__init__.py
47
%%DATADIR%%/config.py
47
%%PYTHON_SITELIBDIR%%/quodlibet/devices/_base.py
48
%%DATADIR%%/const.py
48
%%PYTHON_SITELIBDIR%%/quodlibet/devices/ipod.py
49
%%DATADIR%%/exfalso.png
49
%%PYTHON_SITELIBDIR%%/quodlibet/devices/storage.py
50
%%DATADIR%%/exfalso.py
50
%%PYTHON_SITELIBDIR%%/quodlibet/devices/__init__.py
51
%%DATADIR%%/exfalso.svg
51
%%PYTHON_SITELIBDIR%%/quodlibet/formats/wav.py
52
%%DATADIR%%/device-generic.png
52
%%PYTHON_SITELIBDIR%%/quodlibet/formats/spc.py
53
%%DATADIR%%/device-ipod.png
53
%%PYTHON_SITELIBDIR%%/quodlibet/formats/wavpack.py
54
%%DATADIR%%/devices/__init__.py
54
%%PYTHON_SITELIBDIR%%/quodlibet/formats/_audio.py
55
%%DATADIR%%/devices/_base.py
55
%%PYTHON_SITELIBDIR%%/quodlibet/formats/xiph.py
56
%%DATADIR%%/devices/ipod.py
56
%%PYTHON_SITELIBDIR%%/quodlibet/formats/mod.py
57
%%DATADIR%%/devices/storage.py
57
%%PYTHON_SITELIBDIR%%/quodlibet/formats/mp3.py
58
%%DATADIR%%/formats/__init__.py
58
%%PYTHON_SITELIBDIR%%/quodlibet/formats/wma.py
59
%%DATADIR%%/formats/_apev2.py
59
%%PYTHON_SITELIBDIR%%/quodlibet/formats/_id3.py
60
%%DATADIR%%/formats/_audio.py
60
%%PYTHON_SITELIBDIR%%/quodlibet/formats/mp4.py
61
%%DATADIR%%/formats/_id3.py
61
%%PYTHON_SITELIBDIR%%/quodlibet/formats/mpc.py
62
%%DATADIR%%/formats/mod.py
62
%%PYTHON_SITELIBDIR%%/quodlibet/formats/__init__.py
63
%%DATADIR%%/formats/mp3.py
63
%%PYTHON_SITELIBDIR%%/quodlibet/formats/_apev2.py
64
%%DATADIR%%/formats/mp4.py
64
%%PYTHON_SITELIBDIR%%/quodlibet/formats/trueaudio.py
65
%%DATADIR%%/formats/mpc.py
65
%%PYTHON_SITELIBDIR%%/quodlibet/formats/remote.py
66
%%DATADIR%%/formats/remote.py
66
%%PYTHON_SITELIBDIR%%/quodlibet/library/_library.py
67
%%DATADIR%%/formats/spc.py
67
%%PYTHON_SITELIBDIR%%/quodlibet/library/songs.py
68
%%DATADIR%%/formats/trueaudio.py
68
%%PYTHON_SITELIBDIR%%/quodlibet/library/__init__.py
69
%%DATADIR%%/formats/wav.py
69
%%PYTHON_SITELIBDIR%%/quodlibet/parse/_match.py
70
%%DATADIR%%/formats/wavpack.py
70
%%PYTHON_SITELIBDIR%%/quodlibet/parse/_query.py
71
%%DATADIR%%/formats/wma.py
71
%%PYTHON_SITELIBDIR%%/quodlibet/parse/_pattern.py
72
%%DATADIR%%/formats/xiph.py
72
%%PYTHON_SITELIBDIR%%/quodlibet/parse/__init__.py
73
%%DATADIR%%/library/__init__.py
73
%%PYTHON_SITELIBDIR%%/quodlibet/parse/_scanner.py
74
%%DATADIR%%/library/_library.py
74
%%PYTHON_SITELIBDIR%%/quodlibet/plugins/songsmenu.py
75
%%DATADIR%%/library/songs.py
75
%%PYTHON_SITELIBDIR%%/quodlibet/plugins/playorder.py
76
%%DATADIR%%/media-eject.png
76
%%PYTHON_SITELIBDIR%%/quodlibet/plugins/editing.py
77
%%DATADIR%%/missing-cover.svg
77
%%PYTHON_SITELIBDIR%%/quodlibet/plugins/events.py
78
%%DATADIR%%/parse/__init__.py
78
%%PYTHON_SITELIBDIR%%/quodlibet/plugins/__init__.py
79
%%DATADIR%%/parse/_match.py
79
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/songlist.py
80
%%DATADIR%%/parse/_pattern.py
80
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/songsmenu.py
81
%%DATADIR%%/parse/_query.py
81
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/lyrics.py
82
%%DATADIR%%/player.py
82
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/logging.py
83
%%DATADIR%%/plugins/__init__.py
83
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/quodlibetwindow.py
84
%%DATADIR%%/plugins/editing.py
84
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/filesel.py
85
%%DATADIR%%/plugins/events.py
85
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/playorder.py
86
%%DATADIR%%/plugins/events/qlscrobbler.py
86
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/tagscombobox.py
87
%%DATADIR%%/plugins/songsmenu.py
87
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/downloader.py
88
%%DATADIR%%/qltk/__init__.py
88
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/browser.py
89
%%DATADIR%%/qltk/_editpane.py
89
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/info.py
90
%%DATADIR%%/qltk/about.py
90
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/msg.py
91
%%DATADIR%%/qltk/bookmarks.py
91
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/renamefiles.py
92
%%DATADIR%%/qltk/browser.py
92
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/getstring.py
93
%%DATADIR%%/qltk/cbes.py
93
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/about.py
94
%%DATADIR%%/qltk/ccb.py
94
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/session.py
95
%%DATADIR%%/qltk/chooser.py
95
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/tracker.py
96
%%DATADIR%%/qltk/completion.py
96
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/pluginwin.py
97
%%DATADIR%%/qltk/controls.py
97
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/information.py
98
%%DATADIR%%/qltk/cover.py
98
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/entry.py
99
%%DATADIR%%/qltk/dbus_.py
99
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/ccb.py
100
%%DATADIR%%/qltk/delete.py
100
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/completion.py
101
%%DATADIR%%/qltk/downloader.py
101
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/cbes.py
102
%%DATADIR%%/qltk/edittags.py
102
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/tracknumbers.py
103
%%DATADIR%%/qltk/entry.py
103
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/controls.py
104
%%DATADIR%%/qltk/exfalso.py
104
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/queue.py
105
%%DATADIR%%/qltk/filesel.py
105
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/delete.py
106
%%DATADIR%%/qltk/getstring.py
106
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/chooser.py
107
%%DATADIR%%/qltk/info.py
107
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/prefs.py
108
%%DATADIR%%/qltk/information.py
108
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/_editpane.py
109
%%DATADIR%%/qltk/lyrics.py
109
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/mmkeys_.py
110
%%DATADIR%%/qltk/mmkeys.py
110
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/dbus_.py
111
%%DATADIR%%/qltk/msg.py
111
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/config.py
112
%%DATADIR%%/qltk/playorder.py
112
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/wlw.py
113
%%DATADIR%%/qltk/pluginwin.py
113
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/bookmarks.py
114
%%DATADIR%%/qltk/prefs.py
114
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/views.py
115
%%DATADIR%%/qltk/properties.py
115
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/cover.py
116
%%DATADIR%%/qltk/queue.py
116
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/tagsfrompath.py
117
%%DATADIR%%/qltk/quodlibet.py
117
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/textedit.py
118
%%DATADIR%%/qltk/remote.py
118
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/exfalsowindow.py
119
%%DATADIR%%/qltk/renamefiles.py
119
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/edittags.py
120
%%DATADIR%%/qltk/session.py
120
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/sliderbutton.py
121
%%DATADIR%%/qltk/sliderbutton.py
121
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/__init__.py
122
%%DATADIR%%/qltk/songlist.py
122
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/x.py
123
%%DATADIR%%/qltk/songsmenu.py
123
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/properties.py
124
%%DATADIR%%/qltk/tagscombobox.py
124
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/remote.py
125
%%DATADIR%%/qltk/tagsfrompath.py
125
%%PYTHON_SITELIBDIR%%/quodlibet/util/logging.py
126
%%DATADIR%%/qltk/textedit.py
126
%%PYTHON_SITELIBDIR%%/quodlibet/util/copool.py
127
%%DATADIR%%/qltk/tracker.py
127
%%PYTHON_SITELIBDIR%%/quodlibet/util/titlecase.py
128
%%DATADIR%%/qltk/tracknumbers.py
128
%%PYTHON_SITELIBDIR%%/quodlibet/util/tags.py
129
%%DATADIR%%/qltk/views.py
129
%%PYTHON_SITELIBDIR%%/quodlibet/util/massagers.py
130
%%DATADIR%%/qltk/wlw.py
130
%%PYTHON_SITELIBDIR%%/quodlibet/util/thumbnails.py
131
%%DATADIR%%/qltk/x.py
131
%%PYTHON_SITELIBDIR%%/quodlibet/util/i18n.py
132
%%DATADIR%%/quodlibet.png
132
%%PYTHON_SITELIBDIR%%/quodlibet/util/uri.py
133
%%DATADIR%%/quodlibet.py
133
%%PYTHON_SITELIBDIR%%/quodlibet/util/__init__.py
134
%%DATADIR%%/quodlibet.svg
134
%%PYTHON_SITELIBDIR%%/quodlibet/player/_xine.py
135
%%DATADIR%%/stock.py
135
%%PYTHON_SITELIBDIR%%/quodlibet/player/nullbe.py
136
%%DATADIR%%/util/__init__.py
136
%%PYTHON_SITELIBDIR%%/quodlibet/player/_base.py
137
%%DATADIR%%/util/copool.py
137
%%PYTHON_SITELIBDIR%%/quodlibet/player/xinebe.py
138
%%DATADIR%%/util/i18n.py
138
%%PYTHON_SITELIBDIR%%/quodlibet/player/gstbe.py
139
%%DATADIR%%/util/massagers.py
139
%%PYTHON_SITELIBDIR%%/quodlibet/player/__init__.py
140
%%DATADIR%%/util/uri.py
140
%%PYTHON_SITELIBDIR%%/quodlibet/debug/enc.py
141
%%DATADIR%%/widgets.py
141
%%PYTHON_SITELIBDIR%%/quodlibet/debug/debugwindow.py
142
@dirrmtry share/applications
142
%%PYTHON_SITELIBDIR%%/quodlibet/debug/__init__.py
143
@dirrm lib/quodlibet
143
%%PYTHON_SITELIBDIR%%/quodlibet/images/quodlibet.png
144
@dirrm %%DATADIR%%/util
144
%%PYTHON_SITELIBDIR%%/quodlibet/images/audio-volume-muted.png
145
@dirrm %%DATADIR%%/qltk
145
%%PYTHON_SITELIBDIR%%/quodlibet/images/device-generic.png
146
@dirrm %%DATADIR%%/plugins/events
146
%%PYTHON_SITELIBDIR%%/quodlibet/images/audio-volume-low.png
147
@dirrm %%DATADIR%%/plugins
147
%%PYTHON_SITELIBDIR%%/quodlibet/images/audio-volume-high.png
148
@dirrm %%DATADIR%%/parse
148
%%PYTHON_SITELIBDIR%%/quodlibet/images/audio-volume-medium.png
149
@dirrm %%DATADIR%%/library
149
%%PYTHON_SITELIBDIR%%/quodlibet/images/media-eject.png
150
@dirrm %%DATADIR%%/formats
150
%%PYTHON_SITELIBDIR%%/quodlibet/images/exfalso.png
151
@dirrm %%DATADIR%%/devices
151
%%PYTHON_SITELIBDIR%%/quodlibet/images/device-ipod.png
152
@dirrm %%DATADIR%%/browsers
152
%%PYTHON_SITELIBDIR%%/quodlibet/images/missing-cover.svg
153
@dirrm %%DATADIR%%
153
%%PYTHON_SITELIBDIR%%/quodlibet/images/exfalso.svg
154
%%PYTHON_SITELIBDIR%%/quodlibet/images/quodlibet.svg
155
%%PYTHON_SITELIBDIR%%/quodlibet/_mmkeys.so
156
%%PYTHON_SITELIBDIR%%/quodlibet/_trayicon.so
157
%%PYTHON_SITELIBDIR%%/quodlibet/widgets.pyc
158
%%PYTHON_SITELIBDIR%%/quodlibet/config.pyc
159
%%PYTHON_SITELIBDIR%%/quodlibet/__init__.pyc
160
%%PYTHON_SITELIBDIR%%/quodlibet/stock.pyc
161
%%PYTHON_SITELIBDIR%%/quodlibet/const.pyc
162
%%PYTHON_SITELIBDIR%%/quodlibet/browsers/albums.pyc
163
%%PYTHON_SITELIBDIR%%/quodlibet/browsers/playlists.pyc
164
%%PYTHON_SITELIBDIR%%/quodlibet/browsers/media.pyc
165
%%PYTHON_SITELIBDIR%%/quodlibet/browsers/audiofeeds.pyc
166
%%PYTHON_SITELIBDIR%%/quodlibet/browsers/_base.pyc
167
%%PYTHON_SITELIBDIR%%/quodlibet/browsers/iradio.pyc
168
%%PYTHON_SITELIBDIR%%/quodlibet/browsers/search.pyc
169
%%PYTHON_SITELIBDIR%%/quodlibet/browsers/filesystem.pyc
170
%%PYTHON_SITELIBDIR%%/quodlibet/browsers/paned.pyc
171
%%PYTHON_SITELIBDIR%%/quodlibet/browsers/__init__.pyc
172
%%PYTHON_SITELIBDIR%%/quodlibet/devices/_base.pyc
173
%%PYTHON_SITELIBDIR%%/quodlibet/devices/ipod.pyc
174
%%PYTHON_SITELIBDIR%%/quodlibet/devices/storage.pyc
175
%%PYTHON_SITELIBDIR%%/quodlibet/devices/__init__.pyc
176
%%PYTHON_SITELIBDIR%%/quodlibet/formats/wav.pyc
177
%%PYTHON_SITELIBDIR%%/quodlibet/formats/spc.pyc
178
%%PYTHON_SITELIBDIR%%/quodlibet/formats/wavpack.pyc
179
%%PYTHON_SITELIBDIR%%/quodlibet/formats/_audio.pyc
180
%%PYTHON_SITELIBDIR%%/quodlibet/formats/xiph.pyc
181
%%PYTHON_SITELIBDIR%%/quodlibet/formats/mod.pyc
182
%%PYTHON_SITELIBDIR%%/quodlibet/formats/mp3.pyc
183
%%PYTHON_SITELIBDIR%%/quodlibet/formats/wma.pyc
184
%%PYTHON_SITELIBDIR%%/quodlibet/formats/_id3.pyc
185
%%PYTHON_SITELIBDIR%%/quodlibet/formats/mp4.pyc
186
%%PYTHON_SITELIBDIR%%/quodlibet/formats/mpc.pyc
187
%%PYTHON_SITELIBDIR%%/quodlibet/formats/__init__.pyc
188
%%PYTHON_SITELIBDIR%%/quodlibet/formats/_apev2.pyc
189
%%PYTHON_SITELIBDIR%%/quodlibet/formats/trueaudio.pyc
190
%%PYTHON_SITELIBDIR%%/quodlibet/formats/remote.pyc
191
%%PYTHON_SITELIBDIR%%/quodlibet/library/_library.pyc
192
%%PYTHON_SITELIBDIR%%/quodlibet/library/songs.pyc
193
%%PYTHON_SITELIBDIR%%/quodlibet/library/__init__.pyc
194
%%PYTHON_SITELIBDIR%%/quodlibet/parse/_match.pyc
195
%%PYTHON_SITELIBDIR%%/quodlibet/parse/_query.pyc
196
%%PYTHON_SITELIBDIR%%/quodlibet/parse/_pattern.pyc
197
%%PYTHON_SITELIBDIR%%/quodlibet/parse/__init__.pyc
198
%%PYTHON_SITELIBDIR%%/quodlibet/parse/_scanner.pyc
199
%%PYTHON_SITELIBDIR%%/quodlibet/plugins/songsmenu.pyc
200
%%PYTHON_SITELIBDIR%%/quodlibet/plugins/playorder.pyc
201
%%PYTHON_SITELIBDIR%%/quodlibet/plugins/editing.pyc
202
%%PYTHON_SITELIBDIR%%/quodlibet/plugins/events.pyc
203
%%PYTHON_SITELIBDIR%%/quodlibet/plugins/__init__.pyc
204
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/songlist.pyc
205
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/songsmenu.pyc
206
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/lyrics.pyc
207
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/logging.pyc
208
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/quodlibetwindow.pyc
209
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/filesel.pyc
210
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/playorder.pyc
211
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/tagscombobox.pyc
212
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/downloader.pyc
213
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/browser.pyc
214
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/info.pyc
215
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/msg.pyc
216
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/renamefiles.pyc
217
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/getstring.pyc
218
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/about.pyc
219
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/session.pyc
220
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/tracker.pyc
221
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/pluginwin.pyc
222
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/information.pyc
223
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/entry.pyc
224
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/ccb.pyc
225
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/completion.pyc
226
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/cbes.pyc
227
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/tracknumbers.pyc
228
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/controls.pyc
229
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/queue.pyc
230
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/delete.pyc
231
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/chooser.pyc
232
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/prefs.pyc
233
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/_editpane.pyc
234
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/mmkeys_.pyc
235
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/dbus_.pyc
236
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/config.pyc
237
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/wlw.pyc
238
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/bookmarks.pyc
239
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/views.pyc
240
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/cover.pyc
241
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/tagsfrompath.pyc
242
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/textedit.pyc
243
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/exfalsowindow.pyc
244
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/edittags.pyc
245
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/sliderbutton.pyc
246
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/__init__.pyc
247
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/x.pyc
248
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/properties.pyc
249
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/remote.pyc
250
%%PYTHON_SITELIBDIR%%/quodlibet/util/logging.pyc
251
%%PYTHON_SITELIBDIR%%/quodlibet/util/copool.pyc
252
%%PYTHON_SITELIBDIR%%/quodlibet/util/titlecase.pyc
253
%%PYTHON_SITELIBDIR%%/quodlibet/util/tags.pyc
254
%%PYTHON_SITELIBDIR%%/quodlibet/util/massagers.pyc
255
%%PYTHON_SITELIBDIR%%/quodlibet/util/thumbnails.pyc
256
%%PYTHON_SITELIBDIR%%/quodlibet/util/i18n.pyc
257
%%PYTHON_SITELIBDIR%%/quodlibet/util/uri.pyc
258
%%PYTHON_SITELIBDIR%%/quodlibet/util/__init__.pyc
259
%%PYTHON_SITELIBDIR%%/quodlibet/player/_xine.pyc
260
%%PYTHON_SITELIBDIR%%/quodlibet/player/nullbe.pyc
261
%%PYTHON_SITELIBDIR%%/quodlibet/player/_base.pyc
262
%%PYTHON_SITELIBDIR%%/quodlibet/player/xinebe.pyc
263
%%PYTHON_SITELIBDIR%%/quodlibet/player/gstbe.pyc
264
%%PYTHON_SITELIBDIR%%/quodlibet/player/__init__.pyc
265
%%PYTHON_SITELIBDIR%%/quodlibet/debug/enc.pyc
266
%%PYTHON_SITELIBDIR%%/quodlibet/debug/debugwindow.pyc
267
%%PYTHON_SITELIBDIR%%/quodlibet/debug/__init__.pyc
268
%%PYTHON_SITELIBDIR%%/quodlibet/widgets.pyo
269
%%PYTHON_SITELIBDIR%%/quodlibet/config.pyo
270
%%PYTHON_SITELIBDIR%%/quodlibet/__init__.pyo
271
%%PYTHON_SITELIBDIR%%/quodlibet/stock.pyo
272
%%PYTHON_SITELIBDIR%%/quodlibet/const.pyo
273
%%PYTHON_SITELIBDIR%%/quodlibet/browsers/albums.pyo
274
%%PYTHON_SITELIBDIR%%/quodlibet/browsers/playlists.pyo
275
%%PYTHON_SITELIBDIR%%/quodlibet/browsers/media.pyo
276
%%PYTHON_SITELIBDIR%%/quodlibet/browsers/audiofeeds.pyo
277
%%PYTHON_SITELIBDIR%%/quodlibet/browsers/_base.pyo
278
%%PYTHON_SITELIBDIR%%/quodlibet/browsers/iradio.pyo
279
%%PYTHON_SITELIBDIR%%/quodlibet/browsers/search.pyo
280
%%PYTHON_SITELIBDIR%%/quodlibet/browsers/filesystem.pyo
281
%%PYTHON_SITELIBDIR%%/quodlibet/browsers/paned.pyo
282
%%PYTHON_SITELIBDIR%%/quodlibet/browsers/__init__.pyo
283
%%PYTHON_SITELIBDIR%%/quodlibet/devices/_base.pyo
284
%%PYTHON_SITELIBDIR%%/quodlibet/devices/ipod.pyo
285
%%PYTHON_SITELIBDIR%%/quodlibet/devices/storage.pyo
286
%%PYTHON_SITELIBDIR%%/quodlibet/devices/__init__.pyo
287
%%PYTHON_SITELIBDIR%%/quodlibet/formats/wav.pyo
288
%%PYTHON_SITELIBDIR%%/quodlibet/formats/spc.pyo
289
%%PYTHON_SITELIBDIR%%/quodlibet/formats/wavpack.pyo
290
%%PYTHON_SITELIBDIR%%/quodlibet/formats/_audio.pyo
291
%%PYTHON_SITELIBDIR%%/quodlibet/formats/xiph.pyo
292
%%PYTHON_SITELIBDIR%%/quodlibet/formats/mod.pyo
293
%%PYTHON_SITELIBDIR%%/quodlibet/formats/mp3.pyo
294
%%PYTHON_SITELIBDIR%%/quodlibet/formats/wma.pyo
295
%%PYTHON_SITELIBDIR%%/quodlibet/formats/_id3.pyo
296
%%PYTHON_SITELIBDIR%%/quodlibet/formats/mp4.pyo
297
%%PYTHON_SITELIBDIR%%/quodlibet/formats/mpc.pyo
298
%%PYTHON_SITELIBDIR%%/quodlibet/formats/__init__.pyo
299
%%PYTHON_SITELIBDIR%%/quodlibet/formats/_apev2.pyo
300
%%PYTHON_SITELIBDIR%%/quodlibet/formats/trueaudio.pyo
301
%%PYTHON_SITELIBDIR%%/quodlibet/formats/remote.pyo
302
%%PYTHON_SITELIBDIR%%/quodlibet/library/_library.pyo
303
%%PYTHON_SITELIBDIR%%/quodlibet/library/songs.pyo
304
%%PYTHON_SITELIBDIR%%/quodlibet/library/__init__.pyo
305
%%PYTHON_SITELIBDIR%%/quodlibet/parse/_match.pyo
306
%%PYTHON_SITELIBDIR%%/quodlibet/parse/_query.pyo
307
%%PYTHON_SITELIBDIR%%/quodlibet/parse/_pattern.pyo
308
%%PYTHON_SITELIBDIR%%/quodlibet/parse/__init__.pyo
309
%%PYTHON_SITELIBDIR%%/quodlibet/parse/_scanner.pyo
310
%%PYTHON_SITELIBDIR%%/quodlibet/plugins/songsmenu.pyo
311
%%PYTHON_SITELIBDIR%%/quodlibet/plugins/playorder.pyo
312
%%PYTHON_SITELIBDIR%%/quodlibet/plugins/editing.pyo
313
%%PYTHON_SITELIBDIR%%/quodlibet/plugins/events.pyo
314
%%PYTHON_SITELIBDIR%%/quodlibet/plugins/__init__.pyo
315
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/songlist.pyo
316
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/songsmenu.pyo
317
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/lyrics.pyo
318
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/logging.pyo
319
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/quodlibetwindow.pyo
320
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/filesel.pyo
321
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/playorder.pyo
322
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/tagscombobox.pyo
323
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/downloader.pyo
324
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/browser.pyo
325
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/info.pyo
326
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/msg.pyo
327
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/renamefiles.pyo
328
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/getstring.pyo
329
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/about.pyo
330
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/session.pyo
331
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/tracker.pyo
332
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/pluginwin.pyo
333
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/information.pyo
334
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/entry.pyo
335
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/ccb.pyo
336
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/completion.pyo
337
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/cbes.pyo
338
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/tracknumbers.pyo
339
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/controls.pyo
340
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/queue.pyo
341
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/delete.pyo
342
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/chooser.pyo
343
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/prefs.pyo
344
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/_editpane.pyo
345
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/mmkeys_.pyo
346
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/dbus_.pyo
347
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/config.pyo
348
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/wlw.pyo
349
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/bookmarks.pyo
350
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/views.pyo
351
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/cover.pyo
352
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/tagsfrompath.pyo
353
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/textedit.pyo
354
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/exfalsowindow.pyo
355
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/edittags.pyo
356
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/sliderbutton.pyo
357
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/__init__.pyo
358
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/x.pyo
359
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/properties.pyo
360
%%PYTHON_SITELIBDIR%%/quodlibet/qltk/remote.pyo
361
%%PYTHON_SITELIBDIR%%/quodlibet/util/logging.pyo
362
%%PYTHON_SITELIBDIR%%/quodlibet/util/copool.pyo
363
%%PYTHON_SITELIBDIR%%/quodlibet/util/titlecase.pyo
364
%%PYTHON_SITELIBDIR%%/quodlibet/util/tags.pyo
365
%%PYTHON_SITELIBDIR%%/quodlibet/util/massagers.pyo
366
%%PYTHON_SITELIBDIR%%/quodlibet/util/thumbnails.pyo
367
%%PYTHON_SITELIBDIR%%/quodlibet/util/i18n.pyo
368
%%PYTHON_SITELIBDIR%%/quodlibet/util/uri.pyo
369
%%PYTHON_SITELIBDIR%%/quodlibet/util/__init__.pyo
370
%%PYTHON_SITELIBDIR%%/quodlibet/player/_xine.pyo
371
%%PYTHON_SITELIBDIR%%/quodlibet/player/nullbe.pyo
372
%%PYTHON_SITELIBDIR%%/quodlibet/player/_base.pyo
373
%%PYTHON_SITELIBDIR%%/quodlibet/player/xinebe.pyo
374
%%PYTHON_SITELIBDIR%%/quodlibet/player/gstbe.pyo
375
%%PYTHON_SITELIBDIR%%/quodlibet/player/__init__.pyo
376
%%PYTHON_SITELIBDIR%%/quodlibet/debug/enc.pyo
377
%%PYTHON_SITELIBDIR%%/quodlibet/debug/debugwindow.pyo
378
%%PYTHON_SITELIBDIR%%/quodlibet/debug/__init__.pyo
379
@dirrm %%PYTHON_SITELIBDIR%%/quodlibet/browsers
380
@dirrm %%PYTHON_SITELIBDIR%%/quodlibet/devices
381
@dirrm %%PYTHON_SITELIBDIR%%/quodlibet/formats
382
@dirrm %%PYTHON_SITELIBDIR%%/quodlibet/library
383
@dirrm %%PYTHON_SITELIBDIR%%/quodlibet/parse
384
@dirrm %%PYTHON_SITELIBDIR%%/quodlibet/plugins
385
@dirrm %%PYTHON_SITELIBDIR%%/quodlibet/qltk
386
@dirrm %%PYTHON_SITELIBDIR%%/quodlibet/util
387
@dirrm %%PYTHON_SITELIBDIR%%/quodlibet/player
388
@dirrm %%PYTHON_SITELIBDIR%%/quodlibet/debug
389
@dirrm %%PYTHON_SITELIBDIR%%/quodlibet/images
390
@dirrm %%PYTHON_SITELIBDIR%%/quodlibet

Return to bug 144094