-
Notifications
You must be signed in to change notification settings - Fork 83
Expand file tree
/
Copy pathrss1.go
More file actions
109 lines (92 loc) · 2.31 KB
/
rss1.go
File metadata and controls
109 lines (92 loc) · 2.31 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
package rss
import (
"context"
"io"
"log/slog"
"github.com/SlyMarbo/rss/v2/rss1"
)
func (r *Reader) parseRSS1(url string, data io.Reader) (*Feed, error) {
rssFeed, err := rss1.Parse(data)
if err != nil {
return nil, err
}
return r.ConvertRSS1(url, rssFeed)
}
// ConvertRSS1 transforms data in RSS 1.0 format to
// this package's equivalent data structures.
//
// Most users should use [Reader.Parse] instead.
func (r *Reader) ConvertRSS1(url string, rssFeed *rss1.Feed) (*Feed, error) {
ctx := context.Background()
feed := &Feed{
Title: rssFeed.Channel.Title,
Description: rssFeed.Channel.Description,
Items: make([]*Item, 0, len(rssFeed.Items)),
NextUpdate: r.nextUpdate(rssFeed.Channel.MinsToLive, rssFeed.Channel.SkipHours, rssFeed.Channel.SkipDays),
UpdateURL: url,
}
if rssFeed.Channel.Link != "" {
feed.Links = []*Link{
{Href: rssFeed.Channel.Link},
}
}
if rssFeed.Channel.Image != nil {
feed.Image = &Image{
Title: rssFeed.Channel.Image.Title,
URL: rssFeed.Channel.Image.URL,
Height: uint32(rssFeed.Channel.Image.Height),
Width: uint32(rssFeed.Channel.Image.Width),
}
}
// Process items.
seen := make(map[string]struct{})
for _, item := range rssFeed.Items {
if item.ID == "" {
if item.Link == "" {
r.warn(ctx, "item has no ID or link and will be ignored", slog.String("item-title", item.Title))
continue
}
item.ID = item.Link
}
// Skip items already seen.
if _, ok := seen[item.ID]; ok {
continue
}
next := &Item{
Title: item.Title,
Summary: item.Description,
Content: item.Content,
ID: item.ID,
Read: false,
}
if item.Link != "" {
next.Links = []*Link{
{Href: item.Link},
}
}
if item.Date != "" {
next.Date = r.parseTime(item.Date)
} else if item.PubDate != "" {
next.Date = r.parseTime(item.PubDate)
}
if len(item.Enclosures) > 0 {
next.Enclosures = make([]*Enclosure, len(item.Enclosures))
for i := range item.Enclosures {
next.Enclosures[i] = &Enclosure{
URL: item.Enclosures[i].URL,
Type: item.Enclosures[i].Type,
Length: item.Enclosures[i].Length,
}
}
}
seen[next.ID] = struct{}{}
feed.Items = append(feed.Items, next)
feed.Unread++
}
if feed.Links == nil {
feed.Links = []*Link{
{Href: url},
}
}
return feed, nil
}