use hard-coded name for plugin browser
[enigma2-curlytx.git] / src / AtomFeed.py
index 2a9f55d319be2a473ebd7a1be899c221adbb4656..eff3eaad74f0ea48357abef5716531433271b828 100644 (file)
@@ -4,25 +4,40 @@
 # License: GPLv3 or later
 
 from twisted.web.client import getPage
-from xml.etree.cElementTree import fromstring
+from xml.etree.cElementTree import fromstring, ParseError
+
+import os
 
 class AtomFeed:
     """ Simple XML parser that extracts pages from a atom feed """
     ns = "{http://www.w3.org/2005/Atom}"
-    def __init__(self, url, callback):
+    nsc = "{http://ns.cweiske.de/curlytx}"
+    errorCallback = None
+
+    def __init__(self, url, callback, errorCallback):
         """ Fetches the URL
 
         Parsed pages are sent back to callback by parse()
         """
-        getPage(url).addCallback(self.parse, callback).addErrback(self.fail)
-
+        self.errorCallback = errorCallback
+        if (url.startswith('file://')):
+            file = url[7:]
+            if not os.path.exists(file):
+                errorCallback('Settings atom feed file does not exist: ' + file)
+                return
 
-    def fail(self, msg):
-        print("CurlyTx", msg)
+            with open(file, 'r') as f:
+                self.parse(f.read(), callback)
+        else:
+            getPage(url).addCallback(self.parse, callback).addErrback(self.onError)
 
     def parse(self, data, callback):
         """ Parse atom feed data into pages list and run callback """
-        xml = fromstring(data)
+        try:
+            xml = fromstring(data)
+        except ParseError:
+            return self.errorCallback("Invalid XML")
+
         pages = []
         for entry in xml.findall("{0}entry".format(self.ns)):
             titleE = entry.find("{0}title".format(self.ns))
@@ -30,7 +45,12 @@ class AtomFeed:
             if titleE != None and titleE.text != "" and url != None:
                 pages.append({"title": titleE.text, "url": url})
 
-        callback(pages)
+        settings = dict()
+        for entry in list(xml):
+            if (entry.tag.startswith(self.nsc)):
+                settings[entry.tag[len(self.nsc):]] = entry.text
+
+        callback(pages, settings)
 
     def bestLink(self, list):
         """ Fetch the best matching link from an atom feed entry """
@@ -58,3 +78,7 @@ class AtomFeed:
         elif type == "":
             return 2
         return 1
+
+    def onError(self, error):
+        """ Pass the error message only """
+        self.errorCallback(error.getErrorMessage())