add encoding and copyright header
[enigma2-curlytx.git] / src / AtomFeed.py
1 # -*- coding: utf-8 -*-
2 # CurlyTx Atom feed parser
3 # Copyright (C) 2011 Christian Weiske <cweiske@cweiske.de>
4
5 from twisted.web.client import getPage
6 from xml.etree.cElementTree import fromstring
7
8 class AtomFeed:
9     """Simple XML parser that extracts pages from a atom feed
10     """
11     ns = "{http://www.w3.org/2005/Atom}"
12     def __init__(self, url, callback):
13         getPage(url).addCallback(self.parse, callback).addErrback(self.fail)
14
15
16     def fail(self, msg):
17         print("CurlyTx", msg)
18
19     def parse(self, data, callback):
20         xml = fromstring(data)
21         pages = []
22         for entry in xml.findall("{0}entry".format(self.ns)):
23             titleE = entry.find("{0}title".format(self.ns))
24             url   = self.bestLink(entry.findall("{0}link".format(self.ns)))
25             if titleE != None and titleE.text != "" and url != None:
26                 pages.append({"title": titleE.text, "url": url})
27
28         callback(pages)
29
30     def bestLink(self, list):
31         foundLevel = -1
32         foundHref = None
33         for link in list:
34             if link.get("rel") != "alternate" and link.get("rel") != "":
35                 continue
36             level = self.level(link)
37             if foundLevel > level:
38                 continue
39             foundLevel = level
40             foundHref = link.get("href")
41         return foundHref
42
43     def level(self, link):
44         type = link.get("type")
45         if type == "text/plain":
46             return 3
47         elif type == "":
48             return 2
49         return 1