home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2007 September / PCWSEP07.iso / Software / Linux / Linux Mint 3.0 Light / LinuxMint-3.0-Light.iso / casper / filesystem.squashfs / usr / lib / deskbar-applet / handlers / desklicious.py < prev    next >
Encoding:
Python Source  |  2007-04-09  |  4.2 KB  |  135 lines

  1. import os, cgi, os.path, deskbar, deskbar.Match, deskbar.Handler, deskbar.Utils
  2. import gnomevfs, gtk, gconf
  3.  
  4. from gettext import gettext as _
  5. import xml.dom.minidom, urllib
  6. from deskbar.defs import VERSION
  7.  
  8. GCONF_DELICIOUS_USER  = deskbar.GCONF_DIR+"/desklicious/user"
  9.  
  10. DEFAULT_QUERY_TAG = 'http://del.icio.us/rss/%s/%s'
  11. QUERY_DELAY = 1
  12.  
  13. def _check_requirements():
  14.     #We need user and password
  15.     if not deskbar.GCONF_CLIENT.get_string(GCONF_DELICIOUS_USER):
  16.         return (deskbar.Handler.HANDLER_HAS_REQUIREMENTS, _("You need to configure your del.icio.us account."), _on_config_account)
  17.     else:
  18.         return (deskbar.Handler.HANDLER_IS_CONFIGURABLE, _("You can modify your del.icio.us account."), _on_config_account)
  19.  
  20. HANDLERS = {
  21.     "DeliciousHandler" : {
  22.         "name": _("del.icio.us Bookmarks"),
  23.         "description": _("Search your del.icio.us bookmarks by tag name"),
  24.         "requirements" : _check_requirements,
  25.         "version": VERSION,
  26.     }
  27. }
  28.  
  29. def _on_config_account(dialog):
  30.     dialog = gtk.Dialog(_("del.icio.us Account"), dialog,
  31.                 gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
  32.                 (gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT,
  33.                 gtk.STOCK_OK, gtk.RESPONSE_ACCEPT))
  34.     
  35.     table = gtk.Table(rows=2, columns=2)
  36.     
  37.     table.attach(gtk.Label(_("Enter your del.icio.us username below")), 0, 2, 0, 1)
  38.  
  39.     user_entry = gtk.Entry()
  40.     t = deskbar.GCONF_CLIENT.get_string(GCONF_DELICIOUS_USER)
  41.     if t != None:
  42.         user_entry.set_text(t)
  43.     table.attach(gtk.Label(_("Username: ")), 0, 1, 1, 2)
  44.     table.attach(user_entry, 1, 2, 1, 2)
  45.     
  46.     table.show_all()
  47.     dialog.vbox.add(table)
  48.     
  49.     response = dialog.run()
  50.     dialog.destroy()
  51.     
  52.     if response == gtk.RESPONSE_ACCEPT and user_entry.get_text() != "":
  53.         deskbar.GCONF_CLIENT.set_string(GCONF_DELICIOUS_USER, user_entry.get_text())
  54.  
  55. class DeliciousMatch(deskbar.Match.Match):    
  56.     def __init__(self, handler, url=None, tags=None, author=None, **args):
  57.         deskbar.Match.Match.__init__ (self, handler, **args)
  58.         self.url = url
  59.         self.tags = tags
  60.         self.author = author
  61.         
  62.     def get_verb(self):
  63.         return "<b>%(name)s</b>\n<span size='small' foreground='grey'>%(tags)s</span>"
  64.     
  65.     def get_name(self, text=None):
  66.         return {
  67.             "name": cgi.escape(self.name),
  68.             "tags": cgi.escape(' '.join(self.tags)),
  69.         }
  70.         
  71.     def action(self, text=None):
  72.         deskbar.Utils.url_show(self.url)
  73.  
  74.     def get_category(self):
  75.         return "web"
  76.  
  77.     def get_hash(self, text=None):
  78.         return self.url
  79.         
  80. class DeliciousHandler(deskbar.Handler.AsyncHandler):
  81.     def __init__(self):
  82.         deskbar.Handler.AsyncHandler.__init__ (self, "delicious.png")
  83.         self._delicious = DeliciousTagQueryEngine(self)
  84.  
  85.     def query(self, tag):
  86.         #Hey man, calm down and query once a time :P
  87.         self.check_query_changed (timeout=QUERY_DELAY)
  88.         
  89.         # Yes, the google and yahoo search might take a long time
  90.         # and of course deliciuos too !!! ... better check if we're still valid    
  91.         self.check_query_changed ()
  92.         
  93.         #The queryyyyYyyYy :)
  94.         print "Asking del.icio.us tags for %s" % tag
  95.         posts = self._delicious.get_posts_by_tag(tag)
  96.  
  97.         self.check_query_changed (timeout=QUERY_DELAY)
  98.         print 'Returning del.icio.us result', posts
  99.         
  100.         return posts
  101.  
  102. class DeliciousTagQueryEngine:    
  103.     def __init__(self, handler):
  104.         """We need use the globals DELICIOUS_USER and DELICIOUS_PASS"""
  105.         self.handler = handler
  106.         
  107.         self._user = deskbar.GCONF_CLIENT.get_string(GCONF_DELICIOUS_USER)
  108.             
  109.         deskbar.GCONF_CLIENT.notify_add(GCONF_DELICIOUS_USER, lambda x, y, z, a: self.on_username_change(z.value))
  110.         
  111.     def on_username_change(self, value):
  112.         if value != None and value.type == gconf.VALUE_STRING:
  113.             self._user = value.get_string()
  114.             
  115.     def get_posts_by_tag(self, tag):
  116.         #Get the info from del.icio.us and parse
  117.         url = DEFAULT_QUERY_TAG % (urllib.quote_plus(self._user), urllib.quote_plus(tag))
  118.  
  119.         stream = urllib.urlopen(url, proxies=deskbar.Utils.get_proxy())
  120.         dom = xml.dom.minidom.parse(stream)
  121.         stream.close()
  122.         
  123.         #And return the results
  124.         posts=[]
  125.         for item in dom.getElementsByTagName("item"):
  126.             posts.append(
  127.                 DeliciousMatch(self.handler,
  128.                     name=item.getElementsByTagName("title")[0].firstChild.nodeValue,
  129.                     url=item.getElementsByTagName("link")[0].firstChild.nodeValue,
  130.                     tags=item.getElementsByTagName("dc:subject")[0].firstChild.nodeValue.split(" "),
  131.                     author=item.getElementsByTagName("dc:creator")[0].firstChild.nodeValue))
  132.         
  133.         return posts
  134.  
  135.