package main import ( "context" "github.com/mmcdole/gofeed" ) var _ Source = &RssFeed{} type RssFeed struct { name string url string content string language Language feed *gofeed.Feed } func (r *RssFeed) Name() string { return r.name } func (r *RssFeed) Language() Language { return r.language } func (r *RssFeed) getFeed(ctx context.Context) error { fp := gofeed.NewParser() feed, err := fp.ParseURLWithContext(r.url, ctx) if err != nil { return err } r.feed = feed return nil } func (r RssFeed) Len(ctx context.Context) (int, error) { if r.feed == nil { if err := r.getFeed(ctx); err != nil { return -1, err } } return r.feed.Len(), nil } func (r *RssFeed) Get(ctx context.Context, i int) (*Article, error) { if r.feed == nil { if err := r.getFeed(ctx); err != nil { return nil, err } } item := r.feed.Items[i] textOnly := extractText(item.Content) return &Article{raw: textOnly}, nil }