]> git.phdru.name Git - bookmarks_db.git/blobdiff - Robots/bkmk_rsimple.py
Changed wording.
[bookmarks_db.git] / Robots / bkmk_rsimple.py
index 228899629fb507e94a7877da50ca698c078bc666..88f5e16ab2339613b82432af553210685f476e3b 100644 (file)
@@ -105,9 +105,7 @@ icons = {} # Icon cache; maps URL to a tuple (content type, data)
 
 class robot_simple(Robot):
    def check_url(self, bookmark):
-      if not self.tempfname:
-         self.tempfname = bookmark.tempfname
-
+      fname = None
       try:
          self.start = int(time.time())
          bookmark.icon = None
@@ -120,7 +118,7 @@ class robot_simple(Robot):
          urllib._urlopener.addheaders[2] = ('Referer', "%s://%s%s" % (url_type, url_host, url_path))
 
          if bookmark.charset: urllib._urlopener.addheader('Accept-Charset', bookmark.charset)
-         fname, headers = urllib.urlretrieve("%s://%s%s" % (url_type, url_host, url_path), self.tempfname)
+         fname, headers = urllib.urlretrieve("%s://%s%s" % (url_type, url_host, url_path))
          if bookmark.charset: del urllib._urlopener.addheaders[-1]
 
          size = 0
@@ -152,12 +150,13 @@ class robot_simple(Robot):
          if urllib._urlopener.type == "ftp": # Pass welcome message through MD5
             md5.update(get_welcome())
 
-         md5.md5file(self.tempfname)
+         md5.md5file(fname)
          bookmark.md5 = str(md5)
 
          if headers:
             try:
                content_type = headers["Content-Type"]
+               self.log("   Content-Type: %s" % content_type)
                try:
                   # extract charset from "text/html; foo; charset=UTF-8, bar; baz;"
                   content_type, charset = content_type.split(';', 1)
@@ -167,34 +166,26 @@ class robot_simple(Robot):
                except (ValueError, IndexError):
                   charset = None
                   self.log("   no charset in Content-Type header")
-               if content_type in ("text/html", "application/xhtml+xml"):
+               for ctype in ("text/html", "application/xhtml+xml"):
+                  if content_type.startswith(ctype):
+                      html = True
+                      break
+               else:
+                  html = False
+               if html:
                   parser = parse_html(fname, charset, self.log)
-                  bookmark.real_title = parser.title
-                  if parser.refresh:
-                     refresh = parser.refresh
-                     try:
-                        url = refresh.split('=', 1)[1]
-                     except IndexError:
-                        url = "self"
-                     try:
-                        timeout = float(refresh.split(';')[0])
-                     except (IndexError, ValueError):
-                        raise RedirectException("html", "Bad redirect to %s (%s)" % (url, refresh))
-                     else:
-                        try:
-                           timeout = int(refresh.split(';')[0])
-                        except ValueError:
-                           pass # float timeout
-                        raise RedirectException("html", "%s (%s sec)" % (url, timeout))
-
-                  # Get favicon.ico
-                  icon = parser.icon
+                  if parser:
+                      bookmark.real_title = parser.title
+                      icon = parser.icon
+                  else:
+                     icon = None
                   if not icon:
                      icon = "/favicon.ico"
                   icon = urljoin("%s://%s%s" % (url_type, url_host, url_path), icon)
                   self.log("   looking for icon at: %s" % icon)
                   if icon in icons:
                      if icons[icon]:
+                        bookmark.icon_href = icon
                         content_type, bookmark.icon = icons[icon]
                         self.log("       cached icon: %s" % content_type)
                      else:
@@ -204,7 +195,7 @@ class robot_simple(Robot):
                         _icon = icon
                         for i in range(8):
                            try:
-                              fname, headers = urllib.urlretrieve(_icon)
+                              icon_fname, headers = urllib.urlretrieve(_icon)
                            except RedirectException, e:
                               _icon = e.url
                               self.log("       redirect to : %s" % _icon)
@@ -215,42 +206,62 @@ class robot_simple(Robot):
                      except:
                         etype, emsg, tb = sys.exc_info()
                         self.log("   no icon        : %s %s" % (etype, emsg))
-                        etype = None
-                        emsg = None
-                        tb = None
+                        etype = emsg = tb = None
                         icons[icon] = None
                      else:
                         content_type = headers["Content-Type"]
-                        if content_type.startswith("image/"):
-                           icon_file = open(fname, "rb")
-                           icon = icon_file.read()
+                        if content_type.startswith("application/") \
+                              or content_type.startswith("image/") \
+                              or content_type.startswith("text/plain"):
+                           icon_file = open(icon_fname, "rb")
+                           icon_data = icon_file.read()
                            icon_file.close()
-                           bookmark.icon = "data:%s;base64,%s" % (content_type, b64encode(icon))
+                           bookmark.icon_href = icon
                            self.log("   got icon       : %s" % content_type)
+                           if content_type.startswith("application/") \
+                                 or content_type.startswith("text/plain"):
+                              self.log("       non-image content type, assume x-icon")
+                              content_type = 'image/x-icon'
+                           bookmark.icon = "data:%s;base64,%s" % (content_type, b64encode(icon_data))
                            icons[icon] = (content_type, bookmark.icon)
                         else:
                            self.log("   no icon        : bad content type '%s'" % content_type)
                            icons[icon] = None
-                        os.remove(fname)
+                  if parser and parser.refresh:
+                     refresh = parser.refresh
+                     try:
+                        url = refresh.split('=', 1)[1]
+                     except IndexError:
+                        url = "self"
+                     try:
+                        timeout = float(refresh.split(';')[0])
+                     except (IndexError, ValueError):
+                        raise RedirectException("html", "Bad redirect to %s (%s)" % (url, refresh))
+                     else:
+                        try:
+                           timeout = int(refresh.split(';')[0])
+                        except ValueError:
+                           pass # float timeout
+                        raise RedirectException("html", "%s (%s sec)" % (url, timeout))
 
-            except KeyError:
-               pass
+            except KeyError, key:
+               self.log("   no header: %s" % key)
 
       except IOError, msg:
          if (msg[0] == "http error") and (msg[1] == -1):
             bookmark.no_error = "The server did not return any header - it is not an error, actually"
-            self.log(bookmark.no_error)
+            self.log('   no headers: %s' % bookmark.no_error)
          else:
             bookmark.error = get_error(msg)
-            self.log(bookmark.error)
+            self.log('   Error: %s' % bookmark.error)
 
       except EOFError:
          bookmark.error = "Unexpected EOF (FTP server closed connection)"
-         self.log(bookmark.error)
+         self.log('   EOF: %s' % bookmark.error)
 
       except RedirectException, msg:
          bookmark.moved = str(msg)
-         self.log(bookmark.moved)
+         self.log('   Moved: %s' % bookmark.moved)
 
       except KeyboardInterrupt:
          self.log("Keyboard interrupt (^C)")
@@ -260,19 +271,19 @@ class robot_simple(Robot):
          import traceback
          traceback.print_exc()
          bookmark.error = "Exception!"
-         self.log(bookmark.error)
+         self.log('   Exception: %s' % bookmark.error)
 
       finally:
-         self.finish_check_url(bookmark)
+         self.finish_check_url(bookmark, fname)
 
       # Tested
       return 1
 
 
-   def finish_check_url(self, bookmark):
+   def finish_check_url(self, bookmark, fname=None):
       # Calculate these attributes even in case of an error
-      if os.path.exists(self.tempfname):
-         size = str(os.path.getsize(self.tempfname))
+      if fname and os.path.exists(fname):
+         size = str(os.path.getsize(fname))
          if size[-1] == 'L':
             size = size[:-1]
          bookmark.size = size
@@ -282,3 +293,4 @@ class robot_simple(Robot):
 
       now = int(time.time())
       bookmark.test_time = str(now - start)
+      urllib.urlcleanup()