80 lines
2.2 KiB
Nim
80 lines
2.2 KiB
Nim
import std/[algorithm, json, xmltree, times, options, sequtils]
|
|
import pkg/[mummy, rssatom, puppy, pretty]
|
|
|
|
const
|
|
atomTimeFormat {.strdefine.} = "yyyy-MM-dd'T'HH:mm:ss'Z'"
|
|
rssv2TimeFormat {.strdefine.} = "ddd',' dd MMM yyyy HH:mm:ss ZZZ"
|
|
|
|
type RssFeed = object # name:string
|
|
url: string
|
|
kind: FeedType
|
|
|
|
proc parseAtomTime(s: string): DateTime =
|
|
parse(s, atomTimeFormat)
|
|
|
|
proc parseRSSv2Time(s: string): DateTime =
|
|
parse(s, rssv2TimeFormat)
|
|
|
|
proc getrssv2Time(r:RssItem):DateTime=
|
|
result = dateTime(0, Month.low, MonthdayRange.low)
|
|
if r.pubDate.isSome():
|
|
result = parseRssv2Time(r.pubDate.get())
|
|
|
|
|
|
proc getTime(r: RssItem): DateTime =
|
|
result = dateTime(0, Month.low, MonthdayRange.low)
|
|
if r.updated.isSome():
|
|
result = parseAtomTime(r.updated.get())
|
|
elif r.pubDate.isSome():
|
|
result = parseAtomTime(r.pubDate.get())
|
|
|
|
proc cmpRssItem(x, y: RssItem): int =
|
|
cmp(x.getTime(), y.getTime())
|
|
|
|
proc mixRssFeeds(feeds: seq[RssFeed]): RSS =
|
|
result = RSS()
|
|
result.id = "https://example.com/".some()
|
|
result.title = "This is a test".some()
|
|
result.link = "link.com".some()
|
|
result.author.name = "Samuel R.".some()
|
|
result.description = "this is a test for this and that".some()
|
|
var entries: seq[RSS]
|
|
for feed in feeds:
|
|
case feed.kind
|
|
of Atom:
|
|
entries.add parseAtom(fetch(feed.url))
|
|
of RSSv2:
|
|
entries.add parseRss(fetch(feed.url))
|
|
|
|
entries[^1].items = entries[^1].items.mapIt(
|
|
block:
|
|
var item = it
|
|
item.pubdate = some(getRssv2Time(item).format(atomTimeFormat))
|
|
item
|
|
)
|
|
|
|
for feed in entries:
|
|
result.items.add feed.items
|
|
|
|
result.items.sort(cmp = cmpRssItem, order = Descending)
|
|
|
|
proc assembleAtom(r: RSS): XmlNode =
|
|
result = buildAtom(r)
|
|
result.attrs = {
|
|
"xmlns": "http://www.w3.org/2005/Atom",
|
|
"xmlns:thr": "http://purl.org/syndication/thread/1.0",
|
|
"xml:lang": "en-EN"
|
|
}.toXmlAttributes()
|
|
|
|
discard
|
|
|
|
echo assembleAtom(
|
|
mixRssFeeds(
|
|
@[
|
|
RssFeed(kind: Atom, url: "https://github.com/nim-lang/Nim/releases.atom"),
|
|
RssFeed(kind: Atom, url: "https://github.com/fatedier/frp/releases.atom"),
|
|
RssFeed(kind: RSSv2, url: "https://fedoramagazine.org/rss"),
|
|
RssFeed(kind: RSSv2, url: "http://communityblog.fedoraproject.org/?feed=rss2"),
|
|
]
|
|
)
|
|
)
|