-
-class FeedX:
- # Contains all the info about a single feed (articles, ...), and expose the data
- def __init__(self, name, url):
- self.entries = []
- self.readItems = {}
- self.countUnread = 0
- self.name = name
- self.url = url
- self.updateTime = "Never"
-
- def editFeed(self, url):
- self.url = url
-
- def saveFeed(self, configdir):
- file = open(configdir+getId(self.name), "w")
- pickle.dump(self, file )
- file.close()
-
- def updateFeed(self, configdir, expiryTime=24):
- # Expiry time is in hours
- tmp=feedparser.parse(self.url)
- # Check if the parse was succesful (number of entries > 0, else do nothing)
- if len(tmp["entries"])>0:
- #reversedEntries = self.getEntries()
- #reversedEntries.reverse()
- tmpIds = []
- for entry in tmp["entries"]:
- tmpIds.append(self.getUniqueId(-1, entry))
- for entry in self.getEntries():
- currentTime = time.time()
- expiry = float(expiryTime) * 3600.
- if entry.has_key("updated_parsed"):
- articleTime = time.mktime(entry["updated_parsed"])
- if currentTime - articleTime < expiry:
- id = self.getUniqueId(-1, entry)
- if not id in tmpIds:
- tmp["entries"].append(entry)
-
- self.entries = tmp["entries"]
- self.countUnread = 0
- # Initialize the new articles to unread
- tmpReadItems = self.readItems
- self.readItems = {}
- for index in range(self.getNumberOfEntries()):
- if not tmpReadItems.has_key(self.getUniqueId(index)):
- self.readItems[self.getUniqueId(index)] = False
- else:
- self.readItems[self.getUniqueId(index)] = tmpReadItems[self.getUniqueId(index)]
- if self.readItems[self.getUniqueId(index)]==False:
- self.countUnread = self.countUnread + 1
- del tmp
- self.updateTime = time.asctime()
- self.saveFeed(configdir)
-
- def setEntryRead(self, index):
- if self.readItems[self.getUniqueId(index)]==False:
- self.countUnread = self.countUnread - 1
- self.readItems[self.getUniqueId(index)] = True
-
- def setEntryUnread(self, index):
- if self.readItems[self.getUniqueId(index)]==True:
- self.countUnread = self.countUnread + 1
- self.readItems[self.getUniqueId(index)] = False
-
- def isEntryRead(self, index):
- return self.readItems[self.getUniqueId(index)]
-
- def getTitle(self, index):
- return self.entries[index]["title"]
-
- def getLink(self, index):
- return self.entries[index]["link"]
-
- def getDate(self, index):
- try:
- return self.entries[index]["updated_parsed"]
- except:
- return time.localtime()
-
- def getUniqueId(self, index, entry=None):
- if index >=0:
- entry = self.entries[index]
- if entry.has_key("updated_parsed"):
- return getId(time.strftime("%a, %d %b %Y %H:%M:%S",entry["updated_parsed"]) + entry["title"])
- elif entry.has_key("link"):
- return getId(entry["link"] + entry["title"])
- else:
- return getId(entry["title"])
-
- def getUpdateTime(self):
- return self.updateTime
-
- def getEntries(self):
- try:
- return self.entries
- except:
- return []
-
- def getNumberOfUnreadItems(self):
- return self.countUnread
-
- def getNumberOfEntries(self):
- return len(self.entries)
-
- def getItem(self, index):
- try:
- return self.entries[index]
- except:
- return []
-
- def getContent(self, index):
- content = ""
- entry = self.entries[index]
- if entry.has_key('summary'):
- content = entry.get('summary', '')
- if entry.has_key('content'):
- if len(entry.content[0].value) > len(content):
- content = entry.content[0].value
- if content == "":
- content = entry.get('description', '')
- return content
-
- def getArticle(self, index):
- self.setEntryRead(index)
- entry = self.entries[index]
- title = entry.get('title', 'No title')
- #content = entry.get('content', entry.get('summary_detail', {}))
- content = self.getContent(index)
-
- link = entry.get('link', 'NoLink')
- if entry.has_key("updated_parsed"):
- date = time.strftime("%a, %d %b %Y %H:%M:%S",entry["updated_parsed"])
- elif entry.has_key("published_parsed"):
- date = time.strftime("%a, %d %b %Y %H:%M:%S", entry["published_parsed"])
- else:
- date = ""
- #text = '''<div style="color: black; background-color: white;">'''
- text = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">'
- text += "<html><head><title>" + title + "</title>"
- text += '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>\n'
- text += '<style> body {-webkit-user-select: none;} </style></head>'
- text += '<body><div><a href=\"' + link + '\">' + title + "</a>"
- text += "<BR /><small><i>Date: " + date + "</i></small></div>"
- text += "<BR /><BR />"
- text += content
- text += "</body></html>"
- return text
-