]> git.phdru.name Git - bookmarks_db.git/blobdiff - Robots/bkmk_rsimple.py
Handle redirects when downloading the icon.
[bookmarks_db.git] / Robots / bkmk_rsimple.py
index 421d677530d88fefa0239e2aa388db70533517b2..ae7c39e481be8e30b144981bf18a1a8aa32b19d2 100644 (file)
@@ -21,6 +21,7 @@ class RedirectException(Exception):
    }
    def __init__(self, errcode, newurl):
       Exception.__init__(self, "(%s) to %s" % (self.reloc_dict[errcode], newurl))
+      self.url = newurl
 
 
 class MyURLopener(urllib.URLopener):
@@ -167,9 +168,18 @@ class robot_simple(Robot):
                      if not icon:
                         icon = "/favicon.ico"
                      icon = urljoin("%s://%s%s" % (url_type, url_host, url_path), icon)
-                     if self.log: self.log("   icon           : %s" % icon)
+                     if self.log: self.log("   looking for icon at : %s" % icon)
                      try:
-                        fname, headers = urllib.urlretrieve(icon)
+                        for i in range(8):
+                           try:
+                              fname, headers = urllib.urlretrieve(icon)
+                           except RedirectException, e:
+                              icon = e.url
+                              if self.log: self.log("       redirect to : %s" % icon)
+                           else:
+                              break
+                        else:
+                           raise IOError("Too many redirects")
                      except:
                         etype, emsg, tb = sys.exc_info()
                         if self.log: self.log("   no icon        : %s %s" % (etype, emsg))
@@ -183,8 +193,9 @@ class robot_simple(Robot):
                            icon = icon_file.read()
                            icon_file.close()
                            bookmark.icon = "data:%s;base64,%s" % (content_type, b64encode(icon))
+                           if self.log: self.log("   got icon       : %s" % content_type)
                         else:
-                           if self.log: self.log("   no icon        : %s" % content_type)
+                           if self.log: self.log("   no icon        : bad content type %s" % content_type)
                         os.remove(fname)
 
                except KeyError: