aboutsummaryrefslogtreecommitdiff
path: root/src/FeedNim/jsonfeed.nim
diff options
context:
space:
mode:
authorJohn Conway <john.a.conway@gmail.com>2019-05-17 15:49:32 +0100
committerJohn Conway <john.a.conway@gmail.com>2019-05-17 15:49:32 +0100
commite80352a021ca0b0ebc330ca530b31eb2197949fd (patch)
treef087ff29340e8d727e358bfb2c7a2cdb0403d4e0 /src/FeedNim/jsonfeed.nim
parente9b43e1677abb3ecc5be8b4f995db09d77dd76a8 (diff)
downloadfeed-nim-e80352a021ca0b0ebc330ca530b31eb2197949fd.tar.gz
feed-nim-e80352a021ca0b0ebc330ca530b31eb2197949fd.zip
Stupid git case (in)sensetivity
Diffstat (limited to 'src/FeedNim/jsonfeed.nim')
-rw-r--r--src/FeedNim/jsonfeed.nim133
1 files changed, 133 insertions, 0 deletions
diff --git a/src/FeedNim/jsonfeed.nim b/src/FeedNim/jsonfeed.nim
new file mode 100644
index 0000000..e523778
--- /dev/null
+++ b/src/FeedNim/jsonfeed.nim
@@ -0,0 +1,133 @@
+# Nim JSONFeed Syndication module
+
+# Written by John Conway
+# Released under the MIT open source license.
+
+import strutils
+import sequtils
+import json
+import streams
+import sugar
+
+type
+ JSONFeed* = ref object of RootObj
+ author*: JSONFeedAuthor
+ version*: string
+ title*: string
+ home_page_url*: string
+ feed_url*: string
+ description*: string
+ next_url*: string
+ icon*: string
+ favicon*: string
+ expired*: bool
+ hubs*: seq[JSONFeedHub]
+ items*: seq[JSONFeedItem]
+
+ JSONFeedHub* = object
+ hubType: string
+ url: string
+
+ JSONFeedAuthor* = object
+ name*: string
+ url*: string
+ avatar*: string
+
+ JSONFeedItem* = object
+ author*: JSONFeedAuthor
+ id*: string
+ url*: string
+ external_url*: string
+ title*: string
+ content_html*: string
+ content_text*: string
+ summary*: string
+ image*: string
+ banner_image*: string
+ date_published*: string
+ date_modified*: string
+ tags*: seq[string]
+ attachments*: seq[JSONFeedAttachment]
+
+ JSONFeedAttachment* = object
+ url*: string
+ mime_type*: string
+ title*: string
+ size_in_bytes*: int
+ duration_in_seconds*: int
+
+proc parseItem( node: JsonNode) : JSONFeedItem =
+ var item: JSONFeedItem = JSONFeedItem()
+
+ if node.getOrDefault( "author" ) != nil:
+ let author = node["author"]
+ item.author.name = getStr( author.getOrDefault "name" )
+ item.author.url = getStr( author.getOrDefault "url" )
+ item.author.avatar = getStr( author.getOrDefault "avatar" )
+
+ item.id = getStr( node.getOrDefault "id" )
+ item.url = getStr( node.getOrDefault "url" )
+ item.external_url = getStr( node.getOrDefault "external_url" )
+ item.title = getStr( node.getOrDefault "title" )
+ item.content_html = getStr( node.getOrDefault "content_html" )
+ item.content_text = getStr( node.getOrDefault "content_text" )
+ item.summary = getStr( node.getOrDefault "summary" )
+ item.image = getStr( node.getOrDefault "image" )
+ item.banner_image = getStr( node.getOrDefault "banner_image" )
+ item.date_published = getStr( node.getOrDefault "date_published" )
+ item.date_modified = getStr( node.getOrDefault "date_modified" )
+
+ if node.getOrDefault( "tags" ) != nil:
+ for tag in node["tags"]:
+ item.tags.add( tag.to(string) )
+
+ if node.getOrDefault( "attachments" ) != nil:
+ for jattach in node["attachments"]:
+ var attachment: JSONFeedAttachment = JSONFeedAttachment()
+ attachment.url = getStr( jattach.getOrDefault "url" )
+ attachment.mime_type = getStr( jattach.getOrDefault "mime_type" )
+ attachment.title = getStr( jattach.getOrDefault "title" )
+ attachment.size_in_bytes = getInt( jattach.getOrDefault "size_in_bytes" )
+ attachment.duration_in_seconds = getInt( jattach.getOrDefault "duration_in_seconds" )
+
+ item.attachments.add( attachment )
+
+ return item
+
+proc parseJSONFeed*(data: string): JSONFeed =
+ let node = data.parseJson()
+ var feed: JSONFeed = JSONFeed()
+
+ if node.getOrDefault( "author" ) != nil:
+ let author = node["author"]
+ feed.author.name = getStr( author.getOrDefault "name" )
+ feed.author.url = getStr( author.getOrDefault "url" )
+ feed.author.avatar = getStr( author.getOrDefault "avatar" )
+
+ feed.version = getStr( node.getOrDefault "version" )
+ feed.title = getStr( node.getOrDefault "title" )
+ feed.home_page_url = getStr( node.getOrDefault "home_page_url" )
+ feed.feed_url = getStr( node.getOrDefault "feed_url" )
+ feed.description = getStr( node.getOrDefault "description" ) # What is this?
+ feed.next_url = getStr( node.getOrDefault "next_url" )
+ feed.icon = getStr( node.getOrDefault "icon" )
+ feed.favicon = getStr( node.getOrDefault "favicon" )
+
+ if node.getOrDefault( "expired" ) != nil:
+ feed.expired = node["expired"].getBool()
+
+ if node.getOrDefault( "hubs" ) != nil:
+ for jhub in node["hubs"]:
+ var hub: JSONFeedHub = JSONFeedHub()
+ hub.hubType = getStr( jhub.getOrDefault "url" )
+ hub.url = getStr( jhub.getOrDefault "mime_type" )
+
+ feed.hubs.add( hub )
+
+ feed.items = @[]
+ if node.getOrDefault( "items" ) != nil:
+ for item in node["items"]:
+ feed.items.add item.parseItem()
+
+
+ return feed \ No newline at end of file