""" Delicious Deskbar A plugin for the Gnome deskbar applet that searches del.icio.us. Stuart Langridge, http://www.kryogenix.org/ Licenced under the GNU GPL, version 2.0 """ from deskbar.Utils import strip_html from gettext import gettext as _ import urllib, os import gnomevfs, gtk import deskbar.Handler, deskbar import xml.dom.minidom DELICIOUS_URL = 'http://del.icio.us/rss/%s/%s' MAX_QUERIES = 10 QUERY_DELAY = 1 USERNAME_FILE=os.path.expanduser('~/.gnome2/deskbar-applet/del.icio.us.username') DELICIOUS_ICON = [ "16 16 5 1", " c None", ". c #FFFFFF", "+ c #0000FF", "@ c #000000", "# c #DDDDDD", "........++++++++", "........++++++++", "........++++++++", "........++++++++", "........++++++++", "........++++++++", "........++++++++", "........++++++++", "@@@@@@@@########", "@@@@@@@@########", "@@@@@@@@########", "@@@@@@@@########", "@@@@@@@@########", "@@@@@@@@########", "@@@@@@@@########", "@@@@@@@@########" ] def _on_more_information(): # create a dialog to ask the question ask = gtk.Dialog(_("Setting Up Del.icio.us Search"), None, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, (gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT, gtk.STOCK_OK, gtk.RESPONSE_ACCEPT)) text = gtk.Entry() if os.path.exists(USERNAME_FILE): fp = open(USERNAME_FILE) text.set_text(fp.readline().strip()) fp.close() ask.vbox.add(text) text.show() resp = ask.run() if resp == gtk.RESPONSE_ACCEPT: username = text.get_text() if not username: if os.path.exists(USERNAME_FILE): os.remove(USERNAME_FILE) else: if len(username) < 255: # be paranoid fp = open(USERNAME_FILE,'w') fp.write(username) fp.close() ask.destroy() def _check_requirements(*args): if os.path.exists(USERNAME_FILE): fp = open(USERNAME_FILE) username = fp.readline().strip() fp.close() else: username = None if username: return (deskbar.Handler.HANDLER_IS_CONFIGURABLE, _("Remove your username (%s) to search all of del.icio.us" % username), _on_more_information) else: return (deskbar.Handler.HANDLER_IS_CONFIGURABLE, _("Enter your username to search your bookmarks"), _on_more_information) HANDLERS = { "DeliciousHandler" : { "name": _("Del.icio.us Search"), "description": _("Search del.icio.us for a tag"), "requirements" : _check_requirements } } class DeliciousMatch(deskbar.Match.Match): def __init__(self, handler, name, url, **args): deskbar.Match.Match.__init__ (self, handler, name=name, **args) self.url = url def get_verb(self): return "%(name)s" def action(self, text=None): gnomevfs.url_show(self.url) def get_category(self): return "web" def get_hash(self, text=None): return self.url class DeliciousHandler(deskbar.Handler.AsyncHandler): def __init__(self): deskbar.Handler.AsyncHandler.__init__(self, None) self._icon = gtk.gdk.pixbuf_new_from_xpm_data(DELICIOUS_ICON) self.server = None def query(self, qstring, defres): # Just to ensure we don't bork anything qmax = min (deskbar.DEFAULT_RESULTS_PER_HANDLER, MAX_QUERIES) # Delay before we query so we *don't* make four queries # "s", "sp", "spa", "spam". self.check_query_changed (timeout=QUERY_DELAY) if os.path.exists(USERNAME_FILE): fp = open(USERNAME_FILE) username = fp.readline().strip() fp.close() else: username = "tag" print 'Query del.icio.us for:', qstring, 'with', username stream = urllib.urlopen(DELICIOUS_URL % (username,qstring.replace(' ','+'))) dom = xml.dom.minidom.parse(stream) stream.close() print 'Got del.icio.us answer for:', qstring self.check_query_changed () # The del.icio.us search might have taken a long time # better check if we're still valid matches = [ DeliciousMatch(self, x.getElementsByTagName("title")[0].firstChild.nodeValue, x.getElementsByTagName("link")[0].firstChild.nodeValue) for x in dom.getElementsByTagName("item") ] self.check_query_changed () print "Returning del.icio.us answer for:", qstring return matches