Subscribe and post RSS feeds to Bluesky
rss
bluesky
1package rss
2
3import (
4 "context"
5 "fmt"
6 "time"
7
8 "github.com/mmcdole/gofeed"
9)
10
11// FeedItem represents a single RSS feed item
12type FeedItem struct {
13 GUID string
14 Title string
15 Description string
16 Link string
17 Published time.Time
18}
19
20// Checker handles RSS feed checking operations
21type Checker struct {
22 parser *gofeed.Parser
23}
24
25// NewChecker creates a new RSS feed checker
26func NewChecker() *Checker {
27 return &Checker{
28 parser: gofeed.NewParser(),
29 }
30}
31
32// FetchLatestItems fetches the latest items from an RSS feed
33func (c *Checker) FetchLatestItems(ctx context.Context, feedURL string) ([]*FeedItem, error) {
34 feed, err := c.parser.ParseURLWithContext(feedURL, ctx)
35 if err != nil {
36 return nil, fmt.Errorf("failed to parse RSS feed: %w", err)
37 }
38
39 if feed == nil || len(feed.Items) == 0 {
40 return []*FeedItem{}, nil
41 }
42
43 // Limit the number of items to return
44 items := make([]*FeedItem, 0, len(feed.Items))
45 for _, item := range feed.Items {
46 published := time.Now()
47 if item.PublishedParsed != nil {
48 published = *item.PublishedParsed
49 } else if item.UpdatedParsed != nil {
50 published = *item.UpdatedParsed
51 }
52
53 // Use GUID if available, otherwise use link
54 guid := item.GUID
55 if guid == "" {
56 guid = item.Link
57 }
58
59 items = append(items, &FeedItem{
60 GUID: guid,
61 Title: item.Title,
62 Description: item.Description,
63 Link: item.Link,
64 Published: published,
65 })
66 }
67
68 return items, nil
69}