blob: e523778bb051be40cd926023a0e38fd19a0e2ac8 (
plain)
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
131
132
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
|