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}