aboutsummaryrefslogtreecommitdiff
path: root/src/feednim/jsonfeed.nim
blob: e6562a23952b59ade67a2f11168e0ce5efe10389 (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* = object
        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