diff --git a/src/feed/rss.go b/src/feed/rss.go index ba1ab75..41ece39 100644 --- a/src/feed/rss.go +++ b/src/feed/rss.go @@ -6,21 +6,23 @@ package feed import ( "encoding/xml" + "fmt" + "io" ) type rssFeed struct { XMLName xml.Name `xml:"rss"` Version string `xml:"version,attr"` Title string `xml:"channel>title"` - Links []rssLink `xml:"channel>link"` + Link string `xml:"channel>link"` Items []rssItem `xml:"channel>item"` } type rssItem struct { GUID string `xml:"guid"` - Title []rssTitle `xml:"title"` - Links []rssLink `xml:"link"` - Description string `xml:"description"` + Title string `xml:"title"` + Link string `xml:"link"` + Description string `xml:"rss description"` PubDate string `xml:"pubDate"` EnclosureLinks []rssEnclosure `xml:"enclosure"` @@ -53,3 +55,31 @@ type rssEnclosure struct { Type string `xml:"type,attr"` Length string `xml:"length,attr"` } + +func ParseRSS(r io.Reader) (*Feed, error) { + f := rssFeed{} + + decoder := xml.NewDecoder(r) + decoder.DefaultSpace = "rss" + if err := decoder.Decode(&f); err != nil { + fmt.Println(err) + return nil, err + } + + feed := &Feed{ + Title: f.Title, + SiteURL: f.Link, + } + for _, e := range f.Items { + date, _ := dateParse(first(e.DublinCoreDate, e.PubDate)) + + feed.Items = append(feed.Items, Item{ + GUID: first(e.GUID, e.Link), + Date: date, + URL: e.Link, + Title: e.Title, + Content: e.Description, + }) + } + return feed, nil +} diff --git a/src/feed/rss_test.go b/src/feed/rss_test.go new file mode 100644 index 0000000..12fe701 --- /dev/null +++ b/src/feed/rss_test.go @@ -0,0 +1,56 @@ +package feed + +import ( + "reflect" + "strings" + "testing" +) + +func TestRSSFeed(t *testing.T) { + have, _ := ParseRSS(strings.NewReader(` + + + + + en + ??? + http://www.scripting.com/ + Scripting News + + Title 1 + http://www.scripting.com/one/ + Description 1 + + + Title 2 + http://www.scripting.com/two/ + Description 2 + + + + `)) + want := &Feed{ + Title: "Scripting News", + SiteURL: "http://www.scripting.com/", + Items: []Item{ + { + GUID: "http://www.scripting.com/one/", + URL: "http://www.scripting.com/one/", + Title: "Title 1", + Content: "Description 1", + }, + { + GUID: "http://www.scripting.com/two/", + URL: "http://www.scripting.com/two/", + Title: "Title 2", + Content: "Description 2", + }, + }, + } + + if !reflect.DeepEqual(want, have) { + t.Logf("want: %#v", want) + t.Logf("have: %#v", have) + t.Fatal("invalid rss") + } +}