-
Notifications
You must be signed in to change notification settings - Fork 83
Expand file tree
/
Copy pathatom1.go
More file actions
121 lines (103 loc) · 2.53 KB
/
atom1.go
File metadata and controls
121 lines (103 loc) · 2.53 KB
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
package rss
import (
"context"
"io"
"log/slog"
"github.com/SlyMarbo/rss/v2/atom1"
)
func (r *Reader) parseAtom1(url string, data io.Reader) (*Feed, error) {
atomFeed, err := atom1.Parse(data)
if err != nil {
return nil, err
}
return r.ConvertAtom1(url, atomFeed)
}
// ConvertAtom1 transforms data in Atom 1.0 format to
// this package's equivalent data structures.
//
// Most users should use [Reader.Parse] instead.
func (r *Reader) ConvertAtom1(url string, atomFeed *atom1.Feed) (*Feed, error) {
ctx := context.Background()
feed := &Feed{
Title: atomFeed.Title,
Description: atomFeed.Description,
NextUpdate: r.now().Add(r.defaultUpdateInterval),
Items: make([]*Item, 0, len(atomFeed.Items)),
UpdateURL: url,
}
if atomFeed.Image != nil {
feed.Image = &Image{
Title: atomFeed.Image.Title,
URL: atomFeed.Image.URL,
Height: uint32(atomFeed.Image.Height),
Width: uint32(atomFeed.Image.Width),
}
}
if atomFeed.Author != nil && (atomFeed.Author.Name != "" || atomFeed.Author.URI != "" || atomFeed.Author.Email != "") {
feed.Author = &Author{
Name: atomFeed.Author.Name,
URL: atomFeed.Author.URI,
Email: atomFeed.Author.Email,
}
if atomFeed.Author.Links != nil {
feed.Author.Links = make([]*Link, len(atomFeed.Author.Links))
for i, link := range atomFeed.Author.Links {
feed.Author.Links[i] = &Link{
Href: link.Href,
Rel: link.Rel,
Type: link.Type,
}
}
}
}
if atomFeed.Link != nil {
feed.Links = make([]*Link, len(atomFeed.Link))
for i, link := range atomFeed.Link {
feed.Links[i] = &Link{
Href: link.Href,
Rel: link.Rel,
Type: link.Type,
}
}
}
// Process items.
seen := make(map[string]struct{})
for _, item := range atomFeed.Items {
// Skip items already seen.
if _, ok := seen[item.ID]; ok {
continue
}
if item.ID == "" {
r.warn(ctx, "item has no ID or link and will be ignored", slog.String("item-title", item.Title))
continue
}
next := &Item{
Title: item.Title,
Summary: item.Summary,
ID: item.ID,
Read: false,
}
if item.Content != nil {
next.Content = item.Content.RAWContent
}
if item.Date != "" {
next.Date = r.parseTime(item.Date)
}
for _, link := range item.Links {
next.Links = append(next.Links, &Link{
Href: link.Href,
Rel: link.Rel,
Type: link.Type,
})
}
seen[next.ID] = struct{}{}
feed.Items = append(feed.Items, next)
feed.Unread++
}
if feed.Links == nil {
feed.Links = []*Link{
{Href: url},
}
}
return feed, nil
}