From owner-freebsd-ports-bugs@FreeBSD.ORG Thu Dec 22 03:20:13 2005 Return-Path: X-Original-To: freebsd-ports-bugs@hub.freebsd.org Delivered-To: freebsd-ports-bugs@hub.freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 35AB416A41F for ; Thu, 22 Dec 2005 03:20:13 +0000 (GMT) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [216.136.204.21]) by mx1.FreeBSD.org (Postfix) with ESMTP id 8476B43D5D for ; Thu, 22 Dec 2005 03:20:12 +0000 (GMT) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (gnats@localhost [127.0.0.1]) by freefall.freebsd.org (8.13.4/8.13.4) with ESMTP id jBM3KAV0043657 for ; Thu, 22 Dec 2005 03:20:10 GMT (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.13.4/8.13.4/Submit) id jBM3KAWk043656; Thu, 22 Dec 2005 03:20:10 GMT (envelope-from gnats) Date: Thu, 22 Dec 2005 03:20:10 GMT Message-Id: <200512220320.jBM3KAWk043656@freefall.freebsd.org> To: freebsd-ports-bugs@FreeBSD.org From: Byung-Hee HWANG Cc: Subject: Re: ports/90627: [NEW PORTS] multimedia/quodlibet X-BeenThere: freebsd-ports-bugs@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: Byung-Hee HWANG List-Id: Ports bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 22 Dec 2005 03:20:13 -0000 The following reply was made to PR ports/90627; it has been noted by GNATS. From: Byung-Hee HWANG To: bug-followup@FreeBSD.org Cc: edwin@FreeBSD.org Subject: Re: ports/90627: [NEW PORTS] multimedia/quodlibet Date: Thu, 22 Dec 2005 12:15:01 +0900 --5mCyUwZo2JvN/JJP Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Wed, Dec 21, 2005 at 10:10:07PM +0000, Byung-Hee HWANG wrote: > The following reply was made to PR ports/90627; it has been noted by GNATS. > > From: Byung-Hee HWANG > To: bug-followup@FreeBSD.org > Cc: edwin@FreeBSD.org > Subject: Re: ports/90627: [NEW PORTS] multimedia/quodlibet > Date: Thu, 22 Dec 2005 07:08:29 +0900 > > On Wed, Dec 21, 2005 at 10:00:19AM +0000, Byung-Hee HWANG wrote: > > On Wed, Dec 21, 2005 at 04:37:38AM +0000, Edwin Groothuis wrote: > > > File "./check.py", line 20, in ? > > > import gtk > > > File "/usr/local/lib/python2.4/site-packages/gtk-2.0/gtk/__init__.py", line 37, in ? > > > from _gtk import * > > > RuntimeError: could not open display > > > > > > I take it this is an X issue. Wonder how other ports which require > > > X and sometimes require a terminal handle this on the package > > > building system. [...snip...] Reference: PR 53489 viola# echo $DISPLAY DISPLAY: Undefined variable. viola# make configure ===> Vulnerability check disabled, database not found ... ... ... ===> Configuring for quodlibet-0.15 /usr/X11R6/bin/Xvfb :1001 -screen 0 800x600x24 > /dev/null 2>&1 & echo $! > /usr/ports/multimedia/quodlibet/work/.Xvfb.pid Checking Python version: 2.4 Checking for PyGTK >= 2.6: found Checking for PyGSt >= 0.8.2: found ... ... ... Okay, it works fine. I reattach updated shar file. Sincerely, -- Byung-Hee --5mCyUwZo2JvN/JJP Content-Type: application/x-shar Content-Disposition: attachment; filename="ports-quodlibet-20051221.shar" Content-Transfer-Encoding: quoted-printable # This is a shell archive. Save it in a file, remove anything before=0A# t= his line, and then unpack it by entering "sh file". Note, it may=0A# creat= e directories; files and directories will be owned by you and=0A# have defa= ult permissions.=0A#=0A# This archive contains:=0A#=0A# /usr/ports/multimed= ia/quodlibet=0A# /usr/ports/multimedia/quodlibet/Makefile=0A# /usr/ports/mu= ltimedia/quodlibet/files=0A# /usr/ports/multimedia/quodlibet/files/patch-Ma= kefile=0A# /usr/ports/multimedia/quodlibet/files/qlscrobbler.py=0A# /usr/po= rts/multimedia/quodlibet/distinfo=0A# /usr/ports/multimedia/quodlibet/pkg-d= escr=0A# /usr/ports/multimedia/quodlibet/pkg-plist=0A#=0Aecho c - /usr/port= s/multimedia/quodlibet=0Amkdir -p /usr/ports/multimedia/quodlibet > /dev/nu= ll 2>&1=0Aecho x - /usr/ports/multimedia/quodlibet/Makefile=0Ased 's/^X//' = >/usr/ports/multimedia/quodlibet/Makefile << 'END-of-/usr/ports/multimedia/= quodlibet/Makefile'=0AX# New ports collection makefile for: quodlibet=0AX# = Date created: 19 December 2005=0AX# Whom: Byung-Hee HWANG =0AX#=0AX# $FreeBSD$=0AX#=0AX=0AXPORTNAME=3D quodlibet=0AXPORTVERSION= =3D 0.15=0AXCATEGORIES=3D multimedia audio=0AXMASTER_SITES=3D http://www.sa= credchao.net/~piman/software/ \=0AX http://izb.knu.ac.kr/~bh/software/=0AX= DISTNAME=3D ${PORTNAME}-${PORTVERSION}=0AX=0AXMAINTAINER=3D bh@izb.knu.ac.k= r=0AXCOMMENT=3D A GTK+-based audio player written in Python=0AX=0AXBUILD_DE= PENDS=3D ${PYTHON_SITELIBDIR}/gst/__init__.py:${PORTSDIR}/multimedia/py-gst= reamer \=0AX ${PYTHON_SITELIBDIR}/ogg/_ogg.so:${PORTSDIR}/audio/py-ogg \= =0AX ${PYTHON_SITELIBDIR}/ogg/vorbis.so:${PORTSDIR}/audio/py-vorbis \=0AX = ${PYTHON_SITELIBDIR}/madmodule.so:${PORTSDIR}/audio/py-mad \=0AX ${PYTHON= _SITELIBDIR}/gtk-2.0/egg/__init__.py:${PORTSDIR}/x11-toolkits/py-gnome-extr= as=0AXRUN_DEPENDS=3D ${BUILD_DEPENDS}=0AX=0AXUSE_PYTHON=3D 2.3+=0AXUSE_GNOM= E=3D pygtk2=0AXUSE_GMAKE=3D yes=0AXUSE_X_PREFIX=3D yes=0AXNO_BUILD=3D yes= =0AX=0AX.if !defined(DISPLAY)=0AXBUILD_DEPENDS+=3D Xvfb:${X_VFBSERVER_PORT}= =0AXDISPLAYHACK=3D localhost:1001=0AX.endif=0AX=0AXpre-configure:=0AX.if !d= efined(DISPLAY)=0AX.if exists(${WRKDIR}/.Xvfb.pid)=0AX @-${CAT} ${WRKDIR}/.= Xvfb.pid | ${XARGS} kill=0AX @${RM} -f ${WRKDIR}/.Xvfb.pid=0AX.endif=0AX ${= X11BASE}/bin/Xvfb :1001 -screen 0 800x600x24 > /dev/null 2>&1 & ${ECHO_CMD}= $$! > \=0AX ${WRKDIR}/.Xvfb.pid=0AX.endif=0AX=0AXdo-configure:=0AX.if !de= fined(DISPLAY)=0AX @${SETENV} DISPLAY=3D${DISPLAYHACK} ${PYTHON_CMD} ${WRKS= RC}/check.py=0AX.else=0AX @${PYTHON_CMD} ${WRKSRC}/check.py=0AX.endif=0AX= =0AXpost-configure:=0AX.if !defined(DISPLAY)=0AX @${CAT} ${WRKDIR}/.Xvfb.pi= d | ${XARGS} kill=0AX @${RM} ${WRKDIR}/.Xvfb.pid=0AX.endif=0AX=0AXpost-inst= all:=0AX.if !defined(WITHOUT_PLUGINS)=0AX @${MKDIR} ${PREFIX}/lib/${PORTNAM= E}/plugins=0AX @${INSTALL_SCRIPT} ${FILESDIR}/qlscrobbler.py ${PREFIX}/lib/= ${PORTNAME}/plugins=0AX.endif=0AX=0AX.include =0AEND-of-/usr/p= orts/multimedia/quodlibet/Makefile=0Aecho c - /usr/ports/multimedia/quodlib= et/files=0Amkdir -p /usr/ports/multimedia/quodlibet/files > /dev/null 2>&1= =0Aecho x - /usr/ports/multimedia/quodlibet/files/patch-Makefile=0Ased 's/^= X//' >/usr/ports/multimedia/quodlibet/files/patch-Makefile << 'END-of-/usr/= ports/multimedia/quodlibet/files/patch-Makefile'=0AX--- Makefile.orig 2005-= 11-11 08:06:26.000000000 -0700=0AX+++ Makefile 2005-12-21 17:30:49.44734188= 5 -0700=0AX@@ -28,9 +28,9 @@=0AX install-%: make-install-dirs=0AX install = -m 755 $*.py $(DESTDIR)$(PREFIX)/$(TO)=0AX install -m 644 $*.1 $(DESTDIR)$= (PREFIX)/share/man/man1/$*.1=0AX- install -D -m 644 $*.png $(DESTDIR)$(PREF= IX)/share/pixmaps/$*.png=0AX+ install -m 644 $*.png $(DESTDIR)$(PREFIX)/sha= re/pixmaps/$*.png=0AX install -m 644 $*.png $(DESTDIR)$(PREFIX)/$(TO)=0AX-= install -D -m 644 $*.desktop $(DESTDIR)$(PREFIX)/share/applications/$*.des= ktop=0AX+ install -m 644 $*.desktop $(DESTDIR)$(PREFIX)/share/applications/= $*.desktop=0AX ln -sf ../$(TO)/$*.py $(DESTDIR)$(PREFIX)/bin/$*=0AX =0AX c= lean:=0AEND-of-/usr/ports/multimedia/quodlibet/files/patch-Makefile=0Aecho = x - /usr/ports/multimedia/quodlibet/files/qlscrobbler.py=0Ased 's/^X//' >/u= sr/ports/multimedia/quodlibet/files/qlscrobbler.py << 'END-of-/usr/ports/mu= ltimedia/quodlibet/files/qlscrobbler.py'=0AX# QLScrobbler: an Audioscrobble= r client plugin for Quod Libet.=0AX# version 0.7=0AX# (C) 2005 by Joshua Kw= an ,=0AX# Joe Wreschnig =0AX# Licensed under GPLv2. See Quod Libet's COPYING for more informa= tion.=0AX=0AXimport random=0AXimport md5, urllib, urllib2, time, threading,= os=0AXimport player, config, const=0AXimport gobject, gtk=0AXfrom qltk imp= ort Message=0AXfrom util import to=0AX=0AXclass QLScrobbler(object):=0AX # = session invariants=0AX PLUGIN_NAME =3D "QLScrobbler"=0AX PLUGIN_DESC =3D "A= udioscrobbler client for Quod Libet"=0AX PLUGIN_ICON =3D gtk.STOCK_CONNECT= =0AX PLUGIN_VERSION =3D "0.7"=0AX CLIENT =3D "qlb"=0AX PROTOCOL_VERSION =3D= "1.1"=0AX DUMP =3D os.path.join(const.DIR, "scrobbler_cache")=0AX=0AX # th= ings that could change=0AX =0AX username =3D ""=0AX password =3D ""=0AX pwh= ash =3D ""=0AX =0AX timeout_id =3D -1=0AX submission_tid =3D -1=0AX=0AX cha= llenge =3D ""=0AX submit_url =3D ""=0AX =0AX # state management=0AX waiting= =3D False=0AX challenge_sent =3D False=0AX broken =3D False=0AX need_confi= g =3D False=0AX need_update =3D False=0AX already_submitted =3D False=0AX l= ocked =3D False=0AX flushing =3D False=0AX disabled =3D False=0AX=0AX # we = need to store this because not all events get the song=0AX song =3D None=0A= X=0AX queue =3D []=0AX=0AX def __init__(self):=0AX # Read dumped queue and= delete it=0AX try:=0AX dump =3D open(self.DUMP, 'r')=0AX self.read_du= mp(dump)=0AX except: pass=0AX =0AX # Set up exit hook to dump queue=0AX = gtk.quit_add(0, self.dump_queue)=0AX=0AX def read_dump(self, dump):=0AX p= rint "Loading dumped queue."=0AX =0AX current =3D {}=0AX=0AX for line in = dump.readlines():=0AX key =3D ""=0AX value =3D ""=0AX =0AX line =3D= line.rstrip()=0AX try: (key, value) =3D line.split(" =3D ", 1)=0AX exc= ept:=0AX if line =3D=3D "-":=0AX for key in ["album", "mbid"]:=0AX = if key not in current:=0AX current[key] =3D ""=0AX =0AX f= or reqkey in ["artist", "title", "length", "stamp"]:=0AX # discard if = somehow invalid=0AX if reqkey not in current:=0AX current =3D {}= =0AX=0AX if current !=3D {}:=0AX self.queue.append(current)=0AX = current =3D {}=0AX continue=0AX =0AX if key =3D=3D "length": cur= rent[key] =3D int(value)=0AX else: current[key] =3D value=0AX=0AX dump.c= lose()=0AX=0AX os.remove(self.DUMP)=0AX=0AX# print "Queue contents:"=0AX#= for item in self.queue:=0AX# print "\t%s - %s" % (item['artist'], item[= 'title'])=0AX=0AX # Try to flush it immediately=0AX if len(self.queue) > = 0:=0AX self.flushing =3D True=0AX self.submit_song()=0AX else: print "= Queue was empty!"=0AX=0AX def dump_queue(self):=0AX if len(self.queue) =3D= =3D 0: return 0=0AX =0AX print "Dumping offline queue, will submit next t= ime."=0AX=0AX dump =3D open(self.DUMP, 'w')=0AX =0AX for item in self.qu= eue:=0AX for key in item:=0AX dump.write("%s =3D %s\n" % (key, item[ke= y]))=0AX=0AX dump.close()=0AX=0AX return 0=0AX =0AX def plugin_on_remove= d(self, songs):=0AX try:=0AX if self.song in songs:=0AX self.already_= submitted =3D True=0AX except:=0AX # Older version compatibility.=0AX = if self.song is songs:=0AX self.already_submitted =3D True=0AX=0AX def p= lugin_on_song_ended(self, song, stopped):=0AX if song is None: return=0AX= =0AX if self.timeout_id > 0:=0AX gobject.source_remove(self.timeout_id)= =0AX self.timeout_id =3D -1=0AX =0AX def plugin_on_song_started(self, son= g):=0AX if song is None: return=0AX =0AX self.already_submitted =3D Fals= e=0AX if self.timeout_id > 0:=0AX gobject.source_remove(self.timeout_id)= =0AX =0AX self.timeout_id =3D -1=0AX=0AX # Protocol stipulation:=0AX # = * don't submit when length < 00:30=0AX # NOTE: >30:00 stipulation has = been REMOVED as of Protocol1.1=0AX # * don't submit if artist and title ar= e not available=0AX if song["~#length"] < 30: return=0AX elif 'title' not= in song: return=0AX elif "artist" not in song:=0AX if ("composer" not i= n song) and ("performer" not in song): return=0AX=0AX self.song =3D song= =0AX if player.playlist.paused =3D=3D False:=0AX self.prepare()=0AX=0AX = def plugin_on_paused(self):=0AX if self.timeout_id > 0:=0AX gobject.sour= ce_remove(self.timeout_id)=0AX # special value that will tell on_unpaused= to check song length=0AX self.timeout_id =3D -2=0AX=0AX def plugin_on_un= paused(self):=0AX if self.already_submitted =3D=3D False and self.timeout_= id =3D=3D -1: self.prepare()=0AX =0AX def plugin_on_seek(self, song, msec)= :=0AX if self.timeout_id > 0:=0AX gobject.source_remove(self.timeout_id)= =0AX self.timeout_id =3D -1=0AX =0AX if msec =3D=3D 0: #I think this i= s okay!=0AX self.prepare()=0AX else:=0AX self.already_submitted =3D Tr= ue # cancel=0AX =0AX def prepare(self):=0AX if self.song is None: return= =0AX=0AX # Protocol stipulations:=0AX # * submit 240 seconds in or at 50%= , whichever comes first=0AX delay =3D int(min(self.song["~#length"] / 2, 2= 40))=0AX=0AX if self.timeout_id =3D=3D -2: # change delta based on current= progress=0AX # assumption is that self.already_submitted =3D=3D 0, there= fore=0AX # delay - progress > 0=0AX progress =3D int(player.playlist.in= fo.time[0] / 1000)=0AX delay -=3D progress=0AX=0AX self.timeout_id =3D g= object.timeout_add(delay * 1000, self.submit_song)=0AX =0AX def read_config= (self):=0AX username =3D ""=0AX password =3D ""=0AX try:=0AX username = =3D config.get("plugins", "scrobbler_username")=0AX password =3D config.g= et("plugins", "scrobbler_password")=0AX except:=0AX if self.need_config = =3D=3D False:=0AX self.quick_info("Please visit the Preferences window t= o set QLScrobbler up. Until then, songs will not be submitted.")=0AX sel= f.need_config =3D True=0AX return=0AX =0AX self.username =3D username= =0AX =0AX hasher =3D md5.new()=0AX hasher.update(password);=0AX self.pa= ssword =3D hasher.hexdigest()=0AX self.need_config =3D False=0AX=0AX def _= _destroy_cb(self, dialog, response_id):=0AX dialog.destroy()=0AX=0AX def q= uick_error_helper(self, str):=0AX dialog =3D Message(gtk.MESSAGE_ERROR, No= ne, "QLScrobbler", str)=0AX dialog.connect('response', self.__destroy_cb)= =0AX dialog.show()=0AX=0AX def quick_error(self, str):=0AX gobject.idle_a= dd(self.quick_error_helper, str)=0AX =0AX def quick_info_helper(self, str):= =0AX dialog =3D Message(gtk.MESSAGE_INFO, widgets.widgets.main, "QLScrobbl= er", str).run()=0AX dialog.connect('response', self.__destroy_cb)=0AX dia= log.show()=0AX=0AX def quick_info(self, str):=0AX gobject.idle_add(self.qu= ick_info_helper, str)=0AX =0AX def clear_waiting(self):=0AX self.waiting = =3D False=0AX=0AX def send_handshake(self):=0AX # construct url=0AX url = =3D "http://post.audioscrobbler.com/?hs=3Dtrue&p=3D%s&c=3D%s&v=3D%s&u=3D%s"= % ( self.PROTOCOL_VERSION, self.CLIENT, self.PLUGIN_VERSION, self.username= )=0AX =0AX print "Sending handshake to Audioscrobbler."=0AX=0AX resp = =3D None=0AX=0AX try:=0AX resp =3D urllib2.urlopen(url);=0AX except:=0A= X print "Server not responding, handshake failed."=0AX return # challen= ge_sent is NOT set to 1=0AX =0AX # check response=0AX lines =3D resp.re= ad().rstrip().split("\n")=0AX status =3D lines.pop(0)=0AX=0AX print "Hand= shake status: %s" % status=0AX =0AX if status =3D=3D "UPTODATE" or statu= s.startswith("UPDATE"):=0AX if status.startswith("UPDATE"):=0AX self.q= uick_info("A new plugin is available at %s! Please download it, or your Aud= ioscrobbler stats may not be updated, and this message will be displayed ev= ery session." % status.split()[1])=0AX self.need_update =3D True=0AX=0AX= # Scan for submit URL and challenge.=0AX self.challenge =3D lines.pop(= 0)=0AX=0AX print "Challenge: %s" % self.challenge=0AX=0AX # determine p= assword=0AX hasher =3D md5.new()=0AX hasher.update(self.password)=0AX = hasher.update(self.challenge)=0AX self.pwhash =3D hasher.hexdigest()=0AX= =0AX self.submit_url =3D lines.pop(0)=0AX =0AX self.challenge_sent = =3D True=0AX elif status =3D=3D "BADUSER":=0AX self.quick_error("Authent= ication failed: invalid username %s or bad password." % self.username)=0AX = =0AX self.broken =3D True=0AX=0AX # Honor INTERVAL if available=0AX = try: interval =3D int(lines.pop(0).split()[1])=0AX except: interval =3D 0= =0AX=0AX if interval > 1:=0AX self.waiting =3D True=0AX gobject.timeou= t_add(interval * 1000, self.clear_waiting)=0AX print "Server says to wait= for %d seconds." % interval=0AX =0AX def submit_song(self):=0AX bg =3D th= reading.Thread(None, self.submit_song_helper)=0AX bg.setDaemon(True)=0AX = bg.start()=0AX=0AX def submit_song_helper(self):=0AX enabled =3D getattr(s= elf, 'PMEnFlag', False)=0AX if enabled and self.disabled:=0AX print "Plu= gin re-enabled - accepting new songs."=0AX self.disabled =3D False=0AX = if self.submission_tid !=3D -1:=0AX gobject.source_remove(self.submissio= n_tid);=0AX self.submission_tid =3D -1=0AX elif not enabled and not sel= f.disabled: #if we've already printed=0AX print "Plugin disabled - not ac= cepting any new songs."=0AX self.disabled =3D True=0AX if len(self.queu= e) > 0:=0AX self.submission_tid =3D gobject.timeout_add(120 * 1000, self= .submit_song_helper)=0AX print "Attempts will continue to submit the las= t %d songs." % len(self.queue)=0AX=0AX if self.already_submitted =3D=3D Tr= ue or self.broken =3D=3D True: return=0AX=0AX if self.flushing =3D=3D Fals= e:=0AX stamp =3D time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime())=0AX = =0AX store =3D {=0AX "title": self.song.comma("title"),=0AX "length= ": str(self.song["~#length"]),=0AX "album": self.song.comma("album"),=0A= X "mbid": "", # will be correctly set if available=0AX "stamp": stamp= =0AX }=0AX=0AX if "artist" in self.song:=0AX store["artist"] =3D sel= f.song.comma("artist")=0AX elif "composer" in self.song:=0AX store["ar= tist"] =3D self.song.comma("composer")=0AX elif "performer" in self.song:= =0AX performer =3D self.song.comma('performer')=0AX if performer[-1] = =3D=3D ")" and "(" in performer:=0AX store["artist"] =3D performer[:per= former.rindex("(")].strip()=0AX else:=0AX store["artist"] =3D perfor= mer=0AX elif "musicbrainz_trackid" in self.song:=0AX store["mbid"] =3D= self.song["musicbrainz_trackid"]=0AX=0AX self.queue.append(store)=0AX e= lse: self.flushing =3D False=0AX =0AX if self.locked =3D=3D True:=0AX #= another instance running, let it deal with this=0AX return=0AX=0AX self= .locked =3D True=0AX=0AX while self.waiting =3D=3D True: time.sleep(1)=0AX= =0AX # Read config, handshake, and send challenge if not already done=0AX = if self.challenge_sent =3D=3D False:=0AX self.read_config()=0AX if sel= f.broken =3D=3D False and self.need_config =3D=3D False:=0AX self.send_h= andshake()=0AX =0AX # INTERVAL may have been set during handshake.=0AX w= hile self.waiting =3D=3D True: time.sleep(1)=0AX =0AX if self.challenge_= sent =3D=3D False:=0AX self.locked =3D False=0AX return=0AX =0AX data= =3D {=0AX 'u': self.username,=0AX 's': self.pwhash=0AX }=0AX =0AX #= Flush the cache=0AX for i in range(len(self.queue)):=0AX print to("Send= ing song: %s - %s" % (self.queue[i]['artist'], self.queue[i]['title']))=0AX= data["a[%d]" % i] =3D self.queue[i]['artist'].encode('utf-8')=0AX data= ["t[%d]" % i] =3D self.queue[i]['title'].encode('utf-8')=0AX data["l[%d]"= % i] =3D str(self.queue[i]['length'])=0AX data["b[%d]" % i] =3D self.que= ue[i]['album'].encode('utf-8')=0AX data["m[%d]" % i] =3D self.queue[i]['m= bid']=0AX data["i[%d]" % i] =3D self.queue[i]['stamp']=0AX =0AX (host, = file) =3D self.submit_url[7:].split("/") =0AX=0AX resp =3D None=0AX =0AX = try:=0AX data_str =3D urllib.urlencode(data)=0AX resp =3D urllib2.urlo= pen("http://" + host + "/" + file, data_str)=0AX except:=0AX print "Audi= oscrobbler server not responding, will try later."=0AX self.locked =3D Fa= lse=0AX return # preserve the queue, yadda yadda=0AX=0AX resp_save =3D r= esp.read()=0AX lines =3D resp_save.rstrip().split("\n")=0AX =0AX try: (s= tatus, interval) =3D lines=0AX except:=0AX try: status =3D lines[0]=0AX = except:=0AX print "Truncated server response, will try later..."=0AX = self.locked =3D False=0AX return=0AX interval =3D None=0AX =0AX pr= int "Submission status: %s" % status=0AX=0AX if status =3D=3D "BADAUTH":= =0AX print "Attempting to re-authenticate."=0AX self.challenge_sent =3D= False=0AX self.send_handshake()=0AX if self.challenge_sent =3D=3D Fals= e:=0AX self.quick_error("Your Audioscrobbler login data is incorrect, so= you must re-enter it before any songs will be submitted.\n\nThis message w= ill not be shown again.")=0AX self.broken =3D True=0AX elif status =3D= =3D "OK":=0AX self.queue =3D []=0AX elif status.startswith("FAILED"):=0A= X if status.startswith("FAILED Plugin bug"):=0AX print "Plugin bug!? R= idiculous! Dumping queue contents."=0AX for item in self.queue:=0AX = for key in item:=0AX print "%s =3D %s" % (key, item[key])=0AX # poss= ibly handle other specific cases here for debugging later=0AX else:=0AX = print "Unknown response from server: %s" % status=0AX print "Dumping full= response:"=0AX print resp_save=0AX=0AX if interval !=3D None: interval_= secs =3D int(interval.split()[1])=0AX else: interval_secs =3D 0=0AX=0AX i= f interval_secs > 1:=0AX self.waiting =3D True=0AX gobject.timeout_add(= interval_secs * 1000, self.clear_waiting)=0AX print "Server says to wait = for %d seconds." % interval_secs=0AX=0AX if self.disabled and len(self.que= ue) =3D=3D 0 and self.submission_tid !=3D -1:=0AX print "All songs submit= ted, disabling retries."=0AX gobject.source_remove(self.submission_tid)= =0AX self.submission_tid =3D -1=0AX=0AX self.already_submitted =3D True= =0AX self.locked =3D False=0AX=0AX def PluginPreferences(self, parent):=0A= X def changed(entry, key):=0AX # having two functions is unnecessary..= =0AX config.set("plugins", "scrobbler_" + key, entry.get_text())=0AX=0AX = def destroyed(*args):=0AX # if changed, let's say that things just got b= etter and we should=0AX # try everything again=0AX newu =3D None=0AX = newp =3D None=0AX try:=0AX newu =3D config.get("plugins", "scrobbler_u= sername")=0AX newp =3D config.get("plugins", "scrobbler_password")=0AX = except:=0AX return=0AX=0AX if self.username !=3D newu or self.passwor= d !=3D newp:=0AX self.broken =3D False=0AX=0AX table =3D gtk.Table(3, 2= )=0AX table.set_col_spacings(3)=0AX lt =3D gtk.Label(_("Please enter your= Audioscrobbler username and password."))=0AX lt.set_size_request(260, -1)= =0AX lu =3D gtk.Label(_("Username:"))=0AX lp =3D gtk.Label(_("Password:")= )=0AX for l in [lt, lu, lp]:=0AX l.set_line_wrap(True)=0AX l.set_align= ment(0.0, 0.5)=0AX table.attach(lt, 0, 2, 0, 1, xoptions=3Dgtk.FILL)=0AX = table.attach(lu, 0, 1, 1, 2, xoptions=3Dgtk.FILL)=0AX table.attach(lp, 0, = 1, 2, 3, xoptions=3Dgtk.FILL)=0AX userent =3D gtk.Entry()=0AX pwent =3D g= tk.Entry()=0AX pwent.set_visibility(False)=0AX pwent.set_invisible_char('= *')=0AX table.set_border_width(6)=0AX=0AX try: userent.set_text(config.ge= t("plugins", "scrobbler_username"))=0AX except: pass=0AX try: pwent.set_t= ext(config.get("plugins", "scrobbler_password"))=0AX except: pass=0AX=0AX = table.attach(userent, 1, 2, 1, 2)=0AX table.attach(pwent, 1, 2, 2, 3)=0AX= pwent.connect('changed', changed, 'password')=0AX userent.connect('chang= ed', changed, 'username')=0AX table.connect('destroy', destroyed)=0AX ret= urn table=0AEND-of-/usr/ports/multimedia/quodlibet/files/qlscrobbler.py=0Ae= cho x - /usr/ports/multimedia/quodlibet/distinfo=0Ased 's/^X//' >/usr/ports= /multimedia/quodlibet/distinfo << 'END-of-/usr/ports/multimedia/quodlibet/d= istinfo'=0AXMD5 (quodlibet-0.15.tar.gz) =3D 09b14d03e587af6ba929b18ed8e0df5= 6=0AXSHA256 (quodlibet-0.15.tar.gz) =3D 20851cc270f17330204683b0a29ab86dcfb= bfdda0e1c399c8f97836347063cf5=0AXSIZE (quodlibet-0.15.tar.gz) =3D 476236=0A= END-of-/usr/ports/multimedia/quodlibet/distinfo=0Aecho x - /usr/ports/multi= media/quodlibet/pkg-descr=0Ased 's/^X//' >/usr/ports/multimedia/quodlibet/p= kg-descr << 'END-of-/usr/ports/multimedia/quodlibet/pkg-descr'=0AXQuod Libe= t is a GTK+-based audio player written in Python.=0AX=0AXWWW: http://www.sa= credchao.net/quodlibet/=0AEND-of-/usr/ports/multimedia/quodlibet/pkg-descr= =0Aecho x - /usr/ports/multimedia/quodlibet/pkg-plist=0Ased 's/^X//' >/usr/= ports/multimedia/quodlibet/pkg-plist << 'END-of-/usr/ports/multimedia/quodl= ibet/pkg-plist'=0AXbin/exfalso=0AXbin/quodlibet=0AXlib/quodlibet/exfalso.pn= g=0AXlib/quodlibet/exfalso.py=0AXlib/quodlibet/plugins/qlscrobbler.py=0AXli= b/quodlibet/ql-volume-max.png=0AXlib/quodlibet/ql-volume-medium.png=0AXlib/= quodlibet/ql-volume-min.png=0AXlib/quodlibet/ql-volume-zero.png=0AXlib/quod= libet/quodlibet.png=0AXlib/quodlibet/quodlibet.py=0AXlib/quodlibet/quodlibe= t.zip=0AXshare/applications/exfalso.desktop=0AXshare/applications/quodlibet= .desktop=0AXshare/locale/bg/LC_MESSAGES/quodlibet.mo=0AXshare/locale/de/LC_= MESSAGES/quodlibet.mo=0AXshare/locale/en_CA/LC_MESSAGES/quodlibet.mo=0AXsha= re/locale/en_GB/LC_MESSAGES/quodlibet.mo=0AXshare/locale/es/LC_MESSAGES/quo= dlibet.mo=0AXshare/locale/fi/LC_MESSAGES/quodlibet.mo=0AXshare/locale/fr/LC= _MESSAGES/quodlibet.mo=0AXshare/locale/gl/LC_MESSAGES/quodlibet.mo=0AXshare= /locale/he/LC_MESSAGES/quodlibet.mo=0AXshare/locale/it/LC_MESSAGES/quodlibe= t.mo=0AXshare/locale/nl/LC_MESSAGES/quodlibet.mo=0AXshare/locale/pl/LC_MESS= AGES/quodlibet.mo=0AXshare/locale/pt/LC_MESSAGES/quodlibet.mo=0AXshare/loca= le/ru/LC_MESSAGES/quodlibet.mo=0AXshare/man/man1/exfalso.1=0AXshare/man/man= 1/quodlibet.1=0AXshare/pixmaps/exfalso.png=0AXshare/pixmaps/quodlibet.png= =0AX@dirrm lib/quodlibet/plugins=0AX@dirrm lib/quodlibet=0AEND-of-/usr/port= s/multimedia/quodlibet/pkg-plist=0Aexit=0A=0A --5mCyUwZo2JvN/JJP--