]> git.phdru.name Git - bookmarks_db.git/blobdiff - Robots/bkmk_rsimple.py
Change parse_html to parse strings, not files
[bookmarks_db.git] / Robots / bkmk_rsimple.py
index 69636d9ef09044905962a3930fc8789e32b45ebc..2c4df9e278f99b186daa869720f9437c81f7cefa 100644 (file)
@@ -1,9 +1,16 @@
-"""
-   Simple, strightforward robot
+"""Simple, strightforward robot
+
+This file is a part of Bookmarks database and Internet robot.
 
-   Written by Oleg Broytman. Copyright (C) 2000-2010 PhiloSoft Design.
 """
 
+__author__ = "Oleg Broytman <phd@phdru.name>"
+__copyright__ = "Copyright (C) 2000-2014 PhiloSoft Design"
+__license__ = "GNU GPL"
+
+__all__ = ['robot_simple', 'get_error']
+
+
 import sys, os
 import time, urllib
 from base64 import b64encode
@@ -13,13 +20,15 @@ from m_lib.net.www.util import parse_time
 from m_lib.md5wrapper import md5wrapper
 
 from bkmk_objects import Robot
-from parse_html import parse_html
+from parse_html import parse_filename
 
 
 class RedirectException(Exception):
    reloc_dict = {
       301: "perm.",
-      302: "temp.",
+      302: "temp2.",
+      303: "temp3.",
+      307: "temp7.",
       "html": "html"
    }
    def __init__(self, errcode, newurl):
@@ -105,6 +114,7 @@ icons = {} # Icon cache; maps URL to a tuple (content type, data)
 
 class robot_simple(Robot):
    def check_url(self, bookmark):
+      fname = None
       try:
          self.start = int(time.time())
          bookmark.icon = None
@@ -172,27 +182,9 @@ class robot_simple(Robot):
                else:
                   html = False
                if html:
-                  parser = parse_html(fname, charset, self.log)
+                  parser = parse_filename(fname, charset, self.log)
                   if parser:
                       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
                   else:
                      icon = None
@@ -204,9 +196,9 @@ class robot_simple(Robot):
                      if icons[icon]:
                         bookmark.icon_href = icon
                         content_type, bookmark.icon = icons[icon]
-                        self.log("       cached icon: %s" % content_type)
+                        self.log("   cached icon: %s" % content_type)
                      else:
-                        self.log("       cached icon: no icon")
+                        self.log("   cached icon: no icon")
                   else:
                      try:
                         _icon = icon
@@ -215,7 +207,7 @@ class robot_simple(Robot):
                               icon_fname, headers = urllib.urlretrieve(_icon)
                            except RedirectException, e:
                               _icon = e.url
-                              self.log("       redirect to : %s" % _icon)
+                              self.log("   redirect to : %s" % _icon)
                            else:
                               break
                         else:
@@ -223,24 +215,43 @@ 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/"):
+                        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_href = icon
-                           bookmark.icon = "data:%s;base64,%s" % (content_type, b64encode(icon_data))
                            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(icon_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, key:
                self.log("   no header: %s" % key)
@@ -277,7 +288,6 @@ class robot_simple(Robot):
       # Tested
       return 1
 
-
    def finish_check_url(self, bookmark, fname=None):
       # Calculate these attributes even in case of an error
       if fname and os.path.exists(fname):
@@ -291,3 +301,4 @@ class robot_simple(Robot):
 
       now = int(time.time())
       bookmark.test_time = str(now - start)
+      urllib.urlcleanup()