Subscribe and post RSS feeds to Bluesky
rss bluesky
at main 1.5 kB view raw
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}