diff options
Diffstat (limited to 'src/FeedNim/jsonfeed.nim')
| -rw-r--r-- | src/FeedNim/jsonfeed.nim | 133 |
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 |
