1// SPDX-FileCopyrightText: Amolith <amolith@secluded.site>
2//
3// SPDX-License-Identifier: Apache-2.0
4
5package rss
6
7import (
8 "fmt"
9 "strings"
10 "time"
11
12 "github.com/microcosm-cc/bluemonday"
13 "github.com/mmcdole/gofeed"
14)
15
16type Release struct {
17 Tag string
18 Content string
19 URL string
20 Date time.Time
21}
22
23var (
24 bmUGC = bluemonday.UGCPolicy()
25 bmStrict = bluemonday.StrictPolicy()
26)
27
28func GetReleases(feedURL string) ([]Release, error) {
29 fp := gofeed.NewParser()
30
31 feed, err := fp.ParseURL(strings.TrimSuffix(feedURL, "/") + "/releases.atom")
32 if err != nil {
33 fmt.Println(err)
34 return nil, fmt.Errorf("failed to parse RSS feed: %w", err)
35 }
36
37 releases := make([]Release, 0)
38
39 for _, item := range feed.Items {
40 releases = append(releases, Release{
41 Tag: bmStrict.Sanitize(item.Title),
42 Content: bmUGC.Sanitize(item.Content),
43 URL: bmStrict.Sanitize(item.Link),
44 Date: *item.PublishedParsed,
45 })
46 }
47
48 return releases, nil
49}