gof.go 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package main
  2. import (
  3. "bytes"
  4. "log"
  5. "net/url"
  6. "text/template"
  7. "github.com/SlyMarbo/rss"
  8. )
  9. type article struct {
  10. Title, URL, Summary string
  11. }
  12. func main() {
  13. log.Println("gof starting up...")
  14. config := readConfig()
  15. var tpls = make(map[string]*template.Template)
  16. for _, f := range config.Feeds {
  17. tmpl, err := template.New(f.URL).Parse(f.Template)
  18. if err != nil {
  19. log.Fatalf("Failed to parse template [%s]. Error: %s", f.Template, err.Error())
  20. }
  21. tpls[f.URL] = tmpl
  22. }
  23. // Get feeds
  24. log.Println("Fetching feeds...")
  25. var feeds []*rss.Feed
  26. for _, source := range config.Feeds {
  27. feed, err := rss.Fetch(source.URL)
  28. if err != nil {
  29. log.Printf("Error fetching %s: %s", source.URL, err.Error())
  30. continue
  31. }
  32. feeds = append(feeds, feed)
  33. log.Printf("Fetched %s", feed.Title)
  34. }
  35. if len(feeds) == 0 {
  36. log.Fatal("Expected at least one feed to successfully fetch.")
  37. }
  38. // Loop through feeds
  39. for _, feed := range feeds {
  40. // Get feed items
  41. if len(feed.Items) == 0 {
  42. log.Printf("Warning: feed %s has no items.", feed.Title)
  43. continue
  44. }
  45. items := feed.Items
  46. if len(items) > 1 {
  47. items = items[:1]
  48. }
  49. base, err := url.Parse(feed.UpdateURL)
  50. if err != nil {
  51. log.Fatal("failed parsing update URL of the feed")
  52. }
  53. feedLink, _ := url.Parse(feed.Link)
  54. if err != nil {
  55. log.Fatal("failed parsing canonical feed URL of the feed")
  56. }
  57. // Loop through items
  58. for _, item := range items {
  59. if item.Date.Before(config.LastUpdated) {
  60. log.Println("No new items. Skipping.")
  61. continue
  62. }
  63. itemLink, err := url.Parse(item.Link)
  64. if err != nil {
  65. log.Fatal("failed parsing article URL of the feed item")
  66. }
  67. // Make sure data looks OK
  68. // TODO: remove before release
  69. log.Printf("Item Data:\n\tTimestamp: %s\n\tSite URL: %s\n\tFeed Title: %s\n\tItem Title: %s\n\tItem URL: %s\n",
  70. item.Date, base.ResolveReference(feedLink).String(),
  71. feed.Title, item.Title, base.ResolveReference(itemLink).String())
  72. i := article{
  73. Title: item.Title,
  74. URL: base.ResolveReference(itemLink).String(),
  75. }
  76. buf := new(bytes.Buffer)
  77. err = tpls[base.String()].Execute(buf, i)
  78. if err != nil {
  79. log.Fatalf("Error executing template [%s]. Error: %s", tpls[base.String()], err.Error())
  80. }
  81. log.Println("Message: ", buf.String())
  82. }
  83. }
  84. // update timestamp in config
  85. config.updateLastUpdated()
  86. // save config
  87. config.Save()
  88. }