func parseRSS(c appengine.Context, body []byte, charsetReader func(string, io.Reader) (io.Reader, error)) (*Feed, []*Story, error) { var f Feed var s []*Story r := rss.Rss{} d := xml.NewDecoder(bytes.NewReader(body)) d.CharsetReader = charsetReader d.DefaultSpace = "DefaultSpace" if err := d.Decode(&r); err != nil { return nil, nil, err } f.Title = r.Title if t, err := parseDate(c, &f, r.LastBuildDate, r.PubDate); err == nil { f.Updated = t } else { c.Warningf("no rss feed date: %v", f.Link) } f.Link = r.BaseLink() f.Hub = r.Hub() for _, i := range r.Items { st := Story{ Link: i.Link, Author: i.Author, } if i.Content != "" { st.content = i.Content } else if i.Description != "" { st.content = i.Description } if i.Title != "" { st.Title = i.Title } else if i.Description != "" { st.Title = i.Description } if st.content == st.Title { st.Title = "" } st.Title = textTitle(st.Title) if i.Guid != nil { st.Id = i.Guid.Guid } if i.Enclosure != nil && strings.HasPrefix(i.Enclosure.Type, "audio/") { st.MediaContent = i.Enclosure.Url } else if i.Media != nil && strings.HasPrefix(i.Media.Type, "audio/") { st.MediaContent = i.Media.URL } if t, err := parseDate(c, &f, i.PubDate, i.Date, i.Published); err == nil { st.Published = t st.Updated = t } s = append(s, &st) } return &f, s, nil }