in lambda/go/add-podcasts/main.go [153:205]
func (h *Handler) importRSSFeed(ctx context.Context, feed *ImportRSSFeed) ([]workshop.Episode, error) {
log.Printf("attempting to import episodes from RSS feed")
req, err := http.NewRequest("GET", feed.URL, nil)
if err != nil {
return nil, err
}
resp, err := h.httpClient.Do(req)
if err != nil {
return nil, fmt.Errorf("failed to make request for media, %w", err)
}
defer resp.Body.Close()
var body bytes.Buffer
if _, err = io.Copy(&body, resp.Body); err != nil {
return nil, fmt.Errorf("failed to read RSS feed, %v", err)
}
var rss RSS
if err := xml.NewDecoder(&body).Decode(&rss); err != nil {
return nil, fmt.Errorf("failed to decode RSS feed, %w", err)
}
items := limitItems(rss.Channel.Items, feed.MaxNumEpisodes, h.maxNumEpisodes)
episodes := make([]workshop.Episode, 0, len(items))
log.Printf("found %v episodes in RSS", len(items))
for _, item := range items {
log.Printf("episode from RSS feed: %#v", item)
baseID := item.Guid
if baseID == "" {
baseID = item.Enclosure.URL
}
id, err := makeEpisodeID(baseID, h.uuidProvider)
if err != nil {
return nil, err
}
episodes = append(episodes, workshop.Episode{
ID: id,
Title: item.Title,
Description: item.Description,
PublishedDate: item.PublishedDate,
Podcast: rss.Channel.Title,
MediaURL: item.Enclosure.URL,
Status: workshop.EpisodeStatusPending,
})
}
return episodes, nil
}