0.8.0-5
authorYves Marcoz <yves@marcoz.org>
Mon, 9 Aug 2010 14:12:45 +0000 (07:12 -0700)
committerYves Marcoz <yves@marcoz.org>
Mon, 9 Aug 2010 14:12:45 +0000 (07:12 -0700)
* Fixed feed listing background colour
* Added author item in articles
* Fixed dates of articles/feeds

debian/changelog
src/FeedingIt.py
src/feedingit_widget.py
src/rss_sqlite.py

index bdedc03..a7e98ae 100644 (file)
@@ -1,3 +1,17 @@
+feedingit (0.8.0-5) unstable; urgency=low
+
+  * Fixed feed listing background colour
+  * Added author item in articles
+  * Fixed dates of articles/feeds
+
+ -- Yves <yves@marcoz.org>  Sun, 8 Aug 2010 19:03:19 -0800
+
+feedingit (0.8.0-4) unstable; urgency=low
+
+  * Created widget option for small/large size
+
+ -- Yves <yves@marcoz.org>  Mon, 19 Jul 2010 23:12:19 -0800
+
 feedingit (0.8.0-3) unstable; urgency=low
 
   * Updated feed/article cell size in widget
index 613d457..2fa280c 100644 (file)
@@ -92,10 +92,18 @@ MARKUP_TEMPLATE_ENTRY = '<span font_desc="%s italic %%s" foreground="%s">%%s</sp
 head_font = style.get_font_desc('SystemFont')
 sub_font = style.get_font_desc('SmallSystemFont')
 
-head_color = style.get_color('ButtonTextColor')
+#head_color = style.get_color('ButtonTextColor')
+head_color = style.get_color('DefaultTextColor')
 sub_color = style.get_color('DefaultTextColor')
 active_color = style.get_color('ActiveTextColor')
 
+bg_color = style.get_color('DefaultBackgroundColor').to_string()
+c1=hex(min(int(bg_color[1:5],16)+10000, 65535))[2:6]
+c2=hex(min(int(bg_color[5:9],16)+10000, 65535))[2:6]
+c3=hex(min(int(bg_color[9:],16)+10000, 65535))[2:6]
+bg_color = "#" + c1 + c2 + c3
+
+
 head = MARKUP_TEMPLATE % (head_font.to_string(), head_color.to_string())
 normal_sub = MARKUP_TEMPLATE % (sub_font.to_string(), sub_color.to_string())
 
@@ -675,6 +683,8 @@ class DisplayFeed(hildon.StackableWindow):
         self.feedItems = gtk.ListStore(str, str)
         #self.feedList = gtk.TreeView(self.feedItems)
         self.feedList = hildon.GtkTreeView(gtk.HILDON_UI_MODE_NORMAL)
+        self.feedList.set_rules_hint(True)
+
         selection = self.feedList.get_selection()
         selection.set_mode(gtk.SELECTION_NONE)
         #selection.connect("changed", lambda w: True)
@@ -697,10 +707,10 @@ class DisplayFeed(hildon.StackableWindow):
 
         self.markup_renderer = gtk.CellRendererText()
         self.markup_renderer.set_property('wrap-mode', pango.WRAP_WORD_CHAR)
-        self.markup_renderer.set_property('background', "#333333")
+        self.markup_renderer.set_property('background', bg_color) #"#333333")
         (width, height) = self.get_size()
         self.markup_renderer.set_property('wrap-width', width-20)
-        self.markup_renderer.set_property('ypad', 5)
+        self.markup_renderer.set_property('ypad', 8)
         self.markup_renderer.set_property('xpad', 5)
         markup_column = gtk.TreeViewColumn('', self.markup_renderer, \
                 markup=FEED_COLUMN_MARKUP)
index b4b69b7..3176cab 100644 (file)
@@ -102,17 +102,21 @@ class FeedingItHomePlugin(hildondesktop.HomePluginItem):
         hildondesktop.HomePluginItem.__init__(self)
         self.set_settings(True)
         self.connect("show-settings", self.show_settings)
-        self.feed_list = {}
+        self.initialized = False
         self.total = 0
         self.status = 0 # 0=Showing feeds, 1=showing articles
         self.updateStatus = 0 # 0=Not updating, 1=Update in progress
         self.pageStatus = 0
+        self.pageSize = 10
+        self.size = 1 # 1=Big widget, 0=small widget
+        
         if isfile(SOURCE):
             file = open(SOURCE)
             self.autoupdateId = int(file.read())
             file.close() 
         else:
             self.autoupdateId=False
+        self.load_config()
         
         vbox = gtk.VBox(False, 0)
         
@@ -140,19 +144,21 @@ class FeedingItHomePlugin(hildondesktop.HomePluginItem):
         self.buttonUpdate.set_image(gtk.image_new_from_icon_name('general_refresh', gtk.ICON_SIZE_BUTTON))
         self.buttonUpdate.connect("clicked", self.buttonUpdate_clicked)
         
-        self.buttonUp = hildon.Button(gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT, hildon.BUTTON_ARRANGEMENT_VERTICAL)
-        self.buttonUp.set_image(gtk.image_new_from_icon_name('keyboard_move_up', gtk.ICON_SIZE_BUTTON))
-        self.buttonUp.set_sensitive(False)
-        self.buttonUp.connect("clicked", self.buttonUp_clicked)
-        
-        self.buttonDown = hildon.Button(gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT, hildon.BUTTON_ARRANGEMENT_VERTICAL)
-        self.buttonDown.set_image(gtk.image_new_from_icon_name('keyboard_move_down', gtk.ICON_SIZE_BUTTON))
-        self.buttonDown.set_sensitive(False)
-        self.buttonDown.connect("clicked", self.buttonDown_clicked)
+        if self.size==1:
+            self.buttonUp = hildon.Button(gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT, hildon.BUTTON_ARRANGEMENT_VERTICAL)
+            self.buttonUp.set_image(gtk.image_new_from_icon_name('keyboard_move_up', gtk.ICON_SIZE_BUTTON))
+            self.buttonUp.set_sensitive(False)
+            self.buttonUp.connect("clicked", self.buttonUp_clicked)
+            
+            self.buttonDown = hildon.Button(gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT, hildon.BUTTON_ARRANGEMENT_VERTICAL)
+            self.buttonDown.set_image(gtk.image_new_from_icon_name('keyboard_move_down', gtk.ICON_SIZE_BUTTON))
+            self.buttonDown.set_sensitive(False)
+            self.buttonDown.connect("clicked", self.buttonDown_clicked)
         
         self.hbox1.pack_start(self.buttonUpdate, expand=False)
-        self.hbox1.pack_start(self.buttonUp, expand=False)
-        self.hbox1.pack_start(self.buttonDown, expand=False)
+        if self.size==1:
+            self.hbox1.pack_start(self.buttonUp, expand=False)
+            self.hbox1.pack_start(self.buttonDown, expand=False)
         self.hbox1.pack_start(self.buttonApp, expand=False)
         
         #button.show_all()
@@ -223,8 +229,9 @@ class FeedingItHomePlugin(hildondesktop.HomePluginItem):
         else:
             self.status = 0
             self.pageStatus = 0
-            self.buttonUp.set_sensitive(False)
-            self.buttonDown.set_sensitive(False)
+            if self.size == 1:
+                self.buttonUp.set_sensitive(False)
+                self.buttonDown.set_sensitive(False)
             self.treeview.append_column(gtk.TreeViewColumn('Unread Items', self.unread_renderer, text = 1))
             self.update_list()
         #iface.StopUpdate()
@@ -268,10 +275,12 @@ class FeedingItHomePlugin(hildondesktop.HomePluginItem):
         db = sqlite3.connect(CONFIGDIR+self.key+".d/"+self.key+".db")
         count = db.execute("SELECT count(*) FROM feed WHERE read=0;").fetchone()[0]
         if count>0:
-            maxPage = count/10
+            maxPage = count/self.pageSize
+            print maxPage
             if self.pageStatus > maxPage:
                 self.pageStatus = maxPage
-        rows = db.execute("SELECT id, title FROM feed WHERE read=0 ORDER BY date DESC LIMIT 10 OFFSET ?;", (self.pageStatus*10,) )
+            print self.pageStatus
+        rows = db.execute("SELECT id, title FROM feed WHERE read=0 ORDER BY date DESC LIMIT ? OFFSET ?;", (self.pageSize, self.pageStatus*self.pageSize,) )
         treestore = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING)
         for row in rows:
             #title = fix_title(row[1][0:32])
@@ -282,16 +291,25 @@ class FeedingItHomePlugin(hildondesktop.HomePluginItem):
     
     def row_activated(self, treeview, treepath):
         if self.status == 0:
-            self.status = 1
-            self.pageStatus = 0
-            (model, iter) = self.treeview.get_selection().get_selected()
-            self.key = model.get_value(iter, 2)
-            treeviewcolumn = self.treeview.get_column(1)
-            self.treeview.remove_column(treeviewcolumn)
-            self.show_articles()
-            self.buttonApp.set_image(gtk.image_new_from_icon_name('general_back', gtk.ICON_SIZE_BUTTON))
-            self.buttonUp.set_sensitive(True)
-            self.buttonDown.set_sensitive(True)
+            if self.size == 1:
+                self.status = 1
+                self.pageStatus = 0
+                (model, iter) = self.treeview.get_selection().get_selected()
+                self.key = model.get_value(iter, 2)
+                treeviewcolumn = self.treeview.get_column(1)
+                self.treeview.remove_column(treeviewcolumn)
+                self.show_articles()
+                self.buttonApp.set_image(gtk.image_new_from_icon_name('general_back', gtk.ICON_SIZE_BUTTON))
+                self.buttonUp.set_sensitive(True)
+                self.buttonDown.set_sensitive(True)
+            else:
+                (model, iter) = self.treeview.get_selection().get_selected()
+                id = model.get_value(iter, 2)
+                remote_object = bus.get_object("org.maemo.feedingit", # Connection name
+                                   "/org/maemo/feedingit" # Object's path
+                                  )
+                iface = dbus.Interface(remote_object, 'org.maemo.feedingit')
+                iface.OpenFeed(id)
         else:
             (model, iter) = self.treeview.get_selection().get_selected()
             id = model.get_value(iter, 1)
@@ -302,46 +320,54 @@ class FeedingItHomePlugin(hildondesktop.HomePluginItem):
             iface = dbus.Interface(remote_object, 'org.maemo.feedingit')
             iface.OpenArticle(self.key, id)
 
+    def check_db(self, db):
+        table = db.execute("SELECT sql FROM sqlite_master").fetchone()
+        from string import find
+        if find(table[0], "widget")==-1:
+                db.execute("ALTER TABLE feeds ADD COLUMN widget int;")
+                db.execute("UPDATE feeds SET widget=1;")
+                db.commit()
+
+    def no_feeds_available(self, treestore):
+        treestore.append(["No feeds added yet", "", None])
+        treestore.append(["Start Application", "", None])
+        #self.update_label("No feeds added yet")
+        self.treeview.set_model(treestore)
 
     def update_list(self, *widget):
         #listing = Listing(CONFIGDIR)
-        if self.status == 0:
-            treestore = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING)
-            
-            if self.feed_list == {}:
-                self.load_config()
-    
-            if self.feed_list == None:
-                treestore.append(["No feeds added yet", "", None])
-                treestore.append(["Start Application", "", None])
-                #self.update_label("No feeds added yet")
-                self.treeview.set_model(treestore)
+        try:
+            if self.status == 0:
+                treestore = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING)
                 
-            else:
-                list = []
-                oldtotal = self.total
-                self.total = 0
-                #for key in listOfFeeds["feedingit-order"]:
-                db = sqlite3.connect(CONFIGDIR+"feeds.db")
-                for key in self.feed_list.keys():
-                    try:
-                        countUnread = db.execute("SELECT unread FROM feeds WHERE id=?;", (key,)).fetchone()[0]
-                        #list.append([self.feed_list[key][0:25], countUnread, key])
-                        list.append([self.feed_list[key], countUnread, key])
-                        self.total += countUnread
-                    except:
-                        pass
-                list = sorted(list, key=lambda item: item[1], reverse=True)
-                count = 0
-                for item in list[0:10]:
-                    count += 1
-                    treestore.append(item)
-                for i in range(count, 10):
-                    treestore.append( ("", "", None) )
+                #if self.feed_list == {}:
+                if self.initialized == False:
+                    self.load_config()
+                try:
+                    db = sqlite3.connect(CONFIGDIR+"feeds.db")
+                except:
+                    self.no_feeds_available(treestore)
+                    return True
+                try:
+                    rows = db.execute("SELECT id, title, unread FROM feeds WHERE widget=1 ORDER BY unread DESC LIMIT 10;")
+                except:
+                    self.check_db(db)
+                    rows = db.execute("SELECT id, title, unread FROM feeds WHERE widget=1 ORDER BY unread DESC LIMIT 10;")
+                self.pageSize = 0
+                for row in rows:
+                    self.pageSize += 1
+                    id = row[0]
+                    countUnread = row[2]
+                    name = row[1]
+                    treestore.append([name, countUnread, id])
                 self.treeview.set_model(treestore)
                 self.buttonApp.set_image(gtk.image_new_from_icon_name('feedingit', gtk.ICON_SIZE_BUTTON))
-                #self.update_label(self.total)
-        return True
+            return True
+        except:
+          import traceback
+          file = open("/home/user/feedingit_widget.log", "a")
+          traceback.print_exc(file=file)
+          file.close()
 
     def create_selector(self, choices, setting):
         #self.pickerDialog = hildon.PickerDialog(self.parent)
@@ -358,10 +384,16 @@ class FeedingItHomePlugin(hildondesktop.HomePluginItem):
         
     def selection_changed(self, selector, button, setting):
         tmp = selector.get_current_text()
-        if tmp == "Disabled":
-            self.autoupdate = 0
-        else:
-            self.autoupdate = tmp
+        if setting == "autoupdate":
+            if tmp == "Disabled":
+                self.autoupdate = 0
+            else:
+                self.autoupdate = tmp
+        elif setting == "sizing":
+            if tmp == "Large":
+                self.size=1
+            else:
+                self.size=0
         #current_selection = selector.get_current_text()
         #if current_selection:
         #    self.config[setting] = current_selection
@@ -380,6 +412,22 @@ class FeedingItHomePlugin(hildondesktop.HomePluginItem):
             #vbox.pack_start(picker, expand=False)
             return picker
         
+    def create_size_picker(self):
+            picker = hildon.PickerButton(gtk.HILDON_SIZE_FINGER_HEIGHT, hildon.BUTTON_ARRANGEMENT_VERTICAL)
+            selector = self.create_selector(["Small", "Large"], "sizing")
+            picker.set_selector(selector)
+            picker.set_title("Default Size For The Widget")
+            if self.size ==1:
+                tmp = "Large"
+            else:
+                tmp = "Small"
+            picker.set_text("Widget Size (requires restart)", tmp)
+            picker.set_name('HildonButton-finger')
+            picker.set_alignment(0,0,1,1)
+            #self.buttons[setting] = picker
+            #vbox.pack_start(picker, expand=False)
+            return picker
+        
     def show_settings(self, widget):
         if isfile(CONFIGDIR+"feeds.db"):
             db = sqlite3.connect(CONFIGDIR+"feeds.db")
@@ -399,12 +447,12 @@ class FeedingItHomePlugin(hildondesktop.HomePluginItem):
             self.treestore_settings = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING)
             self.treeview_settings.set_model(self.treestore_settings)
             
-            feeds = db.execute("SELECT title, id FROM feeds;")
+            feeds = db.execute("SELECT title, id, widget FROM feeds;")
             
             for feed in feeds:
                 # feed is (id, title)
-                item = self.treestore_settings.append(feed)
-                if feed[1] in self.feed_list:
+                item = self.treestore_settings.append(feed[0:2])
+                if feed[2]==1:
                     self.treeview_settings.get_selection().select_iter(item)
                 
             self.pannableArea.add(self.treeview_settings)
@@ -412,12 +460,13 @@ class FeedingItHomePlugin(hildondesktop.HomePluginItem):
             dialog.set_default_size(-1, 600)
             
             dialog.action_area.pack_start(self.create_autoupdate_picker())
+            dialog.action_area.pack_start(self.create_size_picker())
             
             dialog.show_all()
             response = dialog.run()
     
             if response == gtk.RESPONSE_ACCEPT:
-                self.feed_list = self.getItems()
+                self.getItems()
             dialog.destroy()
             self.save_config()
             self.update_list()
@@ -434,9 +483,15 @@ class FeedingItHomePlugin(hildondesktop.HomePluginItem):
         list = {}
         treeselection = self.treeview_settings.get_selection()
         (model, pathlist) = treeselection.get_selected_rows()
+        db = sqlite3.connect(CONFIGDIR+"feeds.db")
+        db.execute("UPDATE feeds SET widget=0;")
         for path in pathlist:
-            list[model.get_value(model.get_iter(path),1)] = model.get_value(model.get_iter(path),0)
-        return list
+            id = model.get_value(model.get_iter(path),1)
+            db.execute("UPDATE feeds SET widget=1 WHERE id=?;", (id,) )
+        db.commit()
+            #title = model.get_value(model.get_iter(path),0)
+            #list[model.get_value(model.get_iter(path),1)] = model.get_value(model.get_iter(path),0)
+        #return list
         
     def setupDbus(self):
         bus.add_signal_receiver(self.update_list, dbus_interface="org.marcoz.feedingit",
@@ -479,8 +534,8 @@ class FeedingItHomePlugin(hildondesktop.HomePluginItem):
             if not isdir(CONFIGDIR):
                 from os import mkdir
                 mkdir(CONFIGDIR)
-            file = open(CONFIGDIR+"widget", "w")
-            pickle.dump(self.feed_list, file )
+            file = open(CONFIGDIR+"widget2", "w")
+            pickle.dump(self.size, file )
             pickle.dump(self.autoupdate, file)
             file.close()
             self.setup_autoupdate()
@@ -507,21 +562,26 @@ class FeedingItHomePlugin(hildondesktop.HomePluginItem):
                 remove(SOURCE)
 
     def load_config(self):
-            if isfile(CONFIGDIR+"widget"):
+            if isfile(CONFIGDIR+"widget2"):
+                file = open(CONFIGDIR+"widget2", "r")
+                self.size = pickle.load( file )
+                self.autoupdate = pickle.load( file )
+                file.close()
+                self.setup_autoupdate()
+            elif isfile(CONFIGDIR+"widget"):
                 file = open(CONFIGDIR+"widget", "r")
-                self.feed_list = pickle.load( file )
+                feed_list = pickle.load( file )
                 self.autoupdate = pickle.load( file )
                 file.close()
                 self.setup_autoupdate()
-            elif isfile(CONFIGDIR+"feeds.db"):
-                db = sqlite3.connect(CONFIGDIR+"feeds.db")
-                feeds = db.execute("SELECT id, title FROM feeds;")
-            
-                for feed in feeds:
-                    self.feed_list[feed[0]] = feed[1]
-                self.autoupdate = 0
+                self.size = 1
+                self.save_config()
+                remove(CONFIGDIR+"widget")
             else:
-                self.feed_list = None
+                #self.feed_list = None
+                self.autoupdate = 0
+                self.size = 1
+            self.initialized = True
 
 
 hd_plugin_type = FeedingItHomePlugin
index fb62c4f..c248c73 100644 (file)
@@ -33,6 +33,7 @@ import time
 import urllib2
 from BeautifulSoup import BeautifulSoup
 from urlparse import urljoin
+from calendar import timegm
 
 def getId(string):
     return md5.new(string).hexdigest()
@@ -78,9 +79,10 @@ class Feed:
             tmp=feedparser.parse(url, etag = etag, modified = modified, handlers = [proxy])
         expiry = float(expiryTime) * 3600.
 
-        currentTime = time.time()
+        currentTime = 0
         # Check if the parse was succesful (number of entries > 0, else do nothing)
         if len(tmp["entries"])>0:
+           currentTime = time.time()
            # The etag and modified value should only be updated if the content was not null
            try:
                etag = tmp["etag"]
@@ -120,8 +122,12 @@ class Feed:
                    entry["link"]
                except:
                    entry["link"] = ""
+               try:
+                   entry["author"]
+               except:
+                   entry["author"] = None
                tmpEntry = {"title":entry["title"], "content":self.extractContent(entry),
-                            "date":date, "link":entry["link"]}
+                            "date":date, "link":entry["link"], "author":entry["author"]}
                id = self.generateUniqueId(tmpEntry)
                
                #articleTime = time.mktime(self.entries[id]["dateTuple"])
@@ -147,6 +153,8 @@ class Feed:
                    self.db.execute("INSERT INTO feed (id, title, contentLink, date, updated, link, read) VALUES (?, ?, ?, ?, ?, ?, ?);", values)
                else:
                    try:
+                       self.db.execute("UPDATE feed SET updated=? WHERE id=?;", (currentTime, id) )
+                       self.db.commit()
                        filename = configdir+self.key+".d/"+id+".html"
                        file = open(filename,"a")
                        utime(filename, None)
@@ -161,35 +169,39 @@ class Feed:
            self.db.commit()
             
            
-           rows = self.db.execute("SELECT id FROM feed WHERE (read=0 AND updated<?) OR (read=1 AND updated<?);", (2*expiry, expiry))
-           for row in rows:
-               self.removeEntry(row[0])
-            
-           from glob import glob
-           from os import stat
-           for file in glob(configdir+self.key+".d/*"):
-                #
-                stats = stat(file)
-                #
-                # put the two dates into matching format
-                #
-                lastmodDate = stats[8]
-                #
-                expDate = time.time()-expiry*3
-                # check if image-last-modified-date is outdated
+        rows = self.db.execute("SELECT id FROM feed WHERE (read=0 AND updated<?) OR (read=1 AND updated<?);", (currentTime-2*expiry, currentTime-expiry))
+        for row in rows:
+           self.removeEntry(row[0])
+        
+        from glob import glob
+        from os import stat
+        for file in glob(configdir+self.key+".d/*"):
+            #
+            stats = stat(file)
+            #
+            # put the two dates into matching format
+            #
+            lastmodDate = stats[8]
+            #
+            expDate = time.time()-expiry*3
+            # check if image-last-modified-date is outdated
+            #
+            if expDate > lastmodDate:
                 #
-                if expDate > lastmodDate:
+                try:
+                    #
+                    #print 'Removing', file
                     #
-                    try:
-                        #
-                        #print 'Removing', file
-                        #
-                        remove(file) # commented out for testing
-                        #
-                    except OSError:
-                        #
-                        print 'Could not remove', file
-        return (currentTime, etag, modified)
+                    remove(file) # commented out for testing
+                    #
+                except OSError:
+                    #
+                    print 'Could not remove', file
+        updateTime = 0
+        rows = self.db.execute("SELECT MAX(date) FROM feed;")
+        for row in rows:
+            updateTime=row[0]
+        return (updateTime, etag, modified)
     
     def setEntryRead(self, id):
         self.db.execute("UPDATE feed SET read=1 WHERE id=?;", (id,) )
@@ -265,6 +277,7 @@ class Feed:
         content = entry["content"]
 
         link = entry['link']
+        author = entry['author']
         date = time.strftime("%a, %d %b %Y %H:%M:%S", time.localtime(entry["date"]) )
 
         #text = '''<div style="color: black; background-color: white;">'''
@@ -273,6 +286,8 @@ class Feed:
         text += '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>\n'
         #text += '<style> body {-webkit-user-select: none;} </style>'
         text += '</head><body><div><a href=\"' + link + '\">' + title + "</a>"
+        if author != None:
+            text += "<BR /><small><i>Author: " + author + "</i></small>"
         text += "<BR /><small><i>Date: " + date + "</i></small></div>"
         text += "<BR /><BR />"
         text += content
@@ -291,9 +306,9 @@ class Feed:
     
     def extractDate(self, entry):
         if entry.has_key("updated_parsed"):
-            return time.mktime(entry["updated_parsed"])
+            return timegm(entry["updated_parsed"])
         elif entry.has_key("published_parsed"):
-            return time.mktime(entry["published_parsed"])
+            return timegm(entry["published_parsed"])
         else:
             return 0
         
@@ -327,9 +342,10 @@ class ArchivedArticles(Feed):
         self.db.commit()
 
     def updateFeed(self, configdir, url, etag, modified, expiryTime=24, proxy=None, imageCache=False):
-        currentTime = time.time()
+        currentTime = 0
         rows = self.db.execute("SELECT id, link FROM feed WHERE updated=0;")
         for row in rows:
+            currentTime = time.time()
             id = row[0]
             link = row[1]
             f = urllib2.urlopen(link)
@@ -357,7 +373,7 @@ class ArchivedArticles(Feed):
         #ids = self.getIds()
         for row in rows:
             self.removeArticle(row[0])
-                
+
     def removeArticle(self, id):
         rows = self.db.execute("SELECT imagePath FROM images WHERE id=?;", (id,) )
         for row in rows:
@@ -377,15 +393,22 @@ class Listing:
         self.db = sqlite3.connect("%s/feeds.db" % self.configdir)
         
         try:
-            self.db.execute("create table feeds(id text, url text, title text, unread int, updateTime float, rank int, etag text, modified text);")
-            if isfile(self.configdir+"feeds.pickle"):
-                self.importOldFormatFeeds()
+            table = self.db.execute("SELECT sql FROM sqlite_master").fetchone()
+            if table == None:
+                self.db.execute("CREATE TABLE feeds(id text, url text, title text, unread int, updateTime float, rank int, etag text, modified text, widget int);")
+                if isfile(self.configdir+"feeds.pickle"):
+                    self.importOldFormatFeeds()
+                else:
+                    self.addFeed("Maemo News", "http://maemo.org/news/items.xml")    
             else:
-                self.addFeed("Maemo News", "http://maemo.org/news/items.xml")
+                from string import find, upper
+                if find(upper(table[0]), "WIDGET")<0:
+                    self.db.execute("ALTER TABLE feeds ADD COLUMN (widget int);")
+                    self.db.execute("UPDATE feeds SET widget=1;")
+                    self.db.commit()
         except:
-            # Table already created
             pass
-        
+
     def importOldFormatFeeds(self):
         """This function loads feeds that are saved in an outdated format, and converts them to sqlite"""
         import rss
@@ -394,8 +417,8 @@ class Listing:
         for id in listing.getListOfFeeds():
             try:
                 rank += 1
-                values = (id, listing.getFeedTitle(id) , listing.getFeedUrl(id), 0, time.time(), rank, None, "None")
-                self.db.execute("INSERT INTO feeds (id, title, url, unread, updateTime, rank, etag, modified) VALUES (?, ?, ? ,? ,? ,?, ?, ?);", values)
+                values = (id, listing.getFeedTitle(id) , listing.getFeedUrl(id), 0, time.time(), rank, None, "None", 1)
+                self.db.execute("INSERT INTO feeds (id, title, url, unread, updateTime, rank, etag, modified, widget) VALUES (?, ?, ? ,? ,? ,?, ?, ?, ?);", values)
                 self.db.commit()
                 
                 feed = listing.getFeed(id)
@@ -408,7 +431,7 @@ class Listing:
                             read_status = 1
                         else:
                             read_status = 0 
-                        date = time.mktime(feed.getDateTuple(item))
+                        date = timegm(feed.getDateTuple(item))
                         title = feed.getTitle(item)
                         newId = new_feed.generateUniqueId({"date":date, "title":title})
                         values = (newId, title , feed.getContentLink(item), date, time.time(), feed.getExternalLink(item), read_status)
@@ -440,13 +463,16 @@ class Listing:
         archFeed = self.getFeed("ArchivedArticles")
         archFeed.addArchivedArticle(title, link, date, self.configdir)
         self.updateUnread("ArchivedArticles")
-            
+        
     def updateFeed(self, key, expiryTime=24, proxy=None, imageCache=False):
         feed = self.getFeed(key)
         db = sqlite3.connect("%s/feeds.db" % self.configdir)
         (url, etag, modified) = db.execute("SELECT url, etag, modified FROM feeds WHERE id=?;", (key,) ).fetchone()
         (updateTime, etag, modified) = feed.updateFeed(self.configdir, url, etag, eval(modified), expiryTime, proxy, imageCache)
-        db.execute("UPDATE feeds SET updateTime=?, etag=?, modified=? WHERE id=?;", (updateTime, etag, str(modified), key) )
+        if updateTime > 0:
+            db.execute("UPDATE feeds SET updateTime=?, etag=?, modified=? WHERE id=?;", (updateTime, etag, str(modified), key) )
+        else:
+            db.execute("UPDATE feeds SET etag=?, modified=? WHERE id=?;", (etag, str(modified), key) )
         db.commit()
         self.updateUnread(key, db=db)
         
@@ -528,8 +554,8 @@ class Listing:
             max_rank = self.db.execute("SELECT MAX(rank) FROM feeds;").fetchone()[0]
             if max_rank == None:
                 max_rank = 0
-            values = (id, title, url, 0, 0, max_rank+1, None, "None")
-            self.db.execute("INSERT INTO feeds (id, title, url, unread, updateTime, rank, etag, modified) VALUES (?, ?, ? ,? ,? ,?, ?, ?);", values)
+            values = (id, title, url, 0, 0, max_rank+1, None, "None", 1)
+            self.db.execute("INSERT INTO feeds (id, title, url, unread, updateTime, rank, etag, modified, widget) VALUES (?, ?, ? ,? ,? ,?, ?, ?, ?);", values)
             self.db.commit()
             # Ask for the feed object, it will create the necessary tables
             self.getFeed(id)