-
Notifications
You must be signed in to change notification settings - Fork 0
/
feedwriter.py
130 lines (107 loc) · 4.76 KB
/
feedwriter.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# Write out an atom feed for the in-memory format described here:
# http://feedparser.org/
#
from elementtree.ElementTree import Element, SubElement, ElementTree
from rfc3339 import rfc3339
import time
def TextElement(root, name, detail_value):
if detail_value:
te = SubElement(root, name)
if detail_value.type == "text/html": detail_value.type = "html"
if detail_value.type == "text/plain": detail_value.type = "text"
te.attrib["type"] = detail_value.type
te.text = detail_value.value
def LinkElement(root, name, link):
if link:
le = SubElement(root, name)
AttribIf(le, "rel", link.get("rel"))
AttribIf(le, "title", link.get("title"))
AttribIf(le, "type", link.get("type"))
AttribIf(le, "href", link.get("href"))
AttribIf(le, "length", link.get("length"))
def PersonElement(root, name, detail):
if detail:
ae = SubElement(root, name)
if detail.has_key("name"):
SubElement(ae, "name").text = detail.name
if detail.has_key("href"):
SubElement(ae, "href").text = detail.href
if detail.has_key("email"):
SubElement(ae, "email").text = detail.email
def AttribIf(elem, name, text):
if text:
elem.attrib[name] = text
def SubElementIf(root, name, text):
if text:
SubElement(root, name).text = text
def DateTimeElement(root, name, element, key):
if element.has_key(key + "_parsed"):
SubElementIf(root, name, rfc3339(time.mktime(element[key + "_parsed"])))
else:
SubElementIf(root, name, element.get(key))
def CreateSourceElement(ee, feed):
"""Create an atom:source element in the provided entry element,
based on the provided feed metadata.
"""
if not feed: return
root = SubElement(ee, "source")
TextElement(root, "title", feed.get("title_detail"))
if feed.has_key("links"):
for link in feed.links:
LinkElement(root, "link", link)
TextElement(root, "subtitle", feed.get("subtitle_detail"))
TextElement(root, "rights", feed.get("rights_detail"))
SubElement(root, "generator").text = "feedarchive"
SubElement(root, "updated").text = rfc3339(time.time())
SubElementIf(root, "id", feed.get("id"))
if feed.has_key("image"):
SubElement(root, "icon").text = feed.image.href
if feed.has_key("tags"):
for tag in feed.tags:
te = SubElement(root, "category")
if tag.get("term"): te.attrib["term"] = tag.term
if tag.get("scheme"): te.attrib["scheme"] = tag.scheme
if tag.get("label"): te.attrib["label"] = tag.label
PersonElement(root, "author", feed.get("author_detail"))
def GetFeedElement(feed):
"""Create an atom:feed element for the provided feed.
The provided feed must be in the format described at http://feedparser.org.
"""
root = Element("feed")
root.attrib["xmlns"] = "http://www.w3.org/2005/Atom"
TextElement(root, "title", feed.feed.get("title_detail"))
if feed.feed.has_key("links"):
for link in feed.feed.links:
LinkElement(root, "link", link)
TextElement(root, "subtitle", feed.feed.get("subtitle_detail"))
TextElement(root, "rights", feed.feed.get("rights_detail"))
SubElement(root, "generator").text = "feedarchive"
SubElement(root, "updated").text = rfc3339(time.time())
SubElementIf(root, "id", feed.feed.get("id"))
if feed.feed.has_key("image"):
SubElement(root, "icon").text = feed.feed.image.href
if feed.feed.has_key("tags"):
for tag in feed.feed.tags:
te = SubElement(root, "category")
if tag.get("term"): te.attrib["term"] = tag.term
if tag.get("scheme"): te.attrib["scheme"] = tag.scheme
if tag.get("label"): te.attrib["label"] = tag.label
PersonElement(root, "author", feed.feed.get("author_detail"))
for entry in feed.entries:
ee = SubElement(root, "entry")
TextElement(ee, "title", entry.get("title_detail"))
if entry.has_key("links"):
for link in entry.links:
LinkElement(ee, "link", link)
TextElement(ee, "summary", entry.get("summary_detail"))
TextElement(ee, "content", entry.get("content_detail"))
DateTimeElement(ee, "published", entry, "published")
DateTimeElement(ee, "updated", entry, "updated")
SubElementIf(ee, "id", entry.get("id"))
PersonElement(ee, "author", entry.get("author_detail"))
PersonElement(ee, "publisher", entry.get("publisher_detail"))
if entry.has_key("contributors"):
for contributor in entry.contributors:
PersonElement(ee, "contributor", contributor)
CreateSourceElement(ee, entry.get("source"))
return root