func()

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
}