Advertisement
Guest User

main.go

a guest
Aug 8th, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 2.41 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "fmt"
  5.     "html/template"
  6.     "net/http"
  7.     "os"
  8.     "sort"
  9.     "sync"
  10.     "time"
  11.  
  12.     "github.com/mmcdole/gofeed"
  13. )
  14.  
  15. func getIndexHandle(items []Item) http.HandlerFunc {
  16.     return func(w http.ResponseWriter, r *http.Request) {
  17.         fmt.Println("serving")
  18.         w.Header().Set("Content-Type", "text/html")
  19.         t := template.Must(template.New("main").Parse(mainTemplate))
  20.         if err := t.Execute(w, items); err != nil {
  21.             panic(err)
  22.         }
  23.     }
  24. }
  25.  
  26. func parseItem(item *gofeed.Item) Item {
  27.     newItem := Item{
  28.         Title: item.Title,
  29.         Link:  item.Link,
  30.     }
  31.     if item.PublishedParsed != nil {
  32.         newItem.Date = *item.PublishedParsed
  33.     } else {
  34.         newItem.Date = *item.UpdatedParsed
  35.     }
  36.     if item.Author != nil {
  37.         newItem.Author = item.Author.Name
  38.     }
  39.     if yt, isYt := item.Extensions["yt"]; isYt {
  40.         id := yt["videoId"][0].Value
  41.         newItem.Content = template.HTML(`<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/` + id + `?rel=0" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe><a href="https://youtube.com/embed/` + id + `">Fullscreen</a>`)
  42.     } else {
  43.         newItem.Content = template.HTML(item.Description)
  44.     }
  45.     return newItem
  46. }
  47.  
  48. // FetchFeed fetches single feed and reports parsed RSS Items to channel
  49. func FetchFeed(ch chan<- Item, url string) {
  50.     fp := gofeed.NewParser()
  51.     feed, err := fp.ParseURL(url)
  52.     if err != nil {
  53.         panic(err)
  54.     }
  55.     fmt.Println("fetching feed:", feed.Title)
  56.     for _, item := range feed.Items {
  57.         newItem := parseItem(item)
  58.         if newItem.Date.After(time.Now().Add(-lastDays * 24 * time.Hour)) {
  59.             ch <- newItem
  60.         }
  61.     }
  62. }
  63.  
  64. // FetchFeeds concurrently fetches list of feeds by URL
  65. func FetchFeeds(urls []string) []Item {
  66.     ch := make(chan Item)
  67.     go func() {
  68.         var wg sync.WaitGroup
  69.         for _, url := range urls {
  70.             wg.Add(1)
  71.             go func(url string) {
  72.                 FetchFeed(ch, url)
  73.                 wg.Done()
  74.             }(url)
  75.         }
  76.         wg.Wait()
  77.         close(ch)
  78.     }()
  79.     items := []Item{}
  80.     for i := range ch {
  81.         items = append(items, i)
  82.     }
  83.     sort.Sort(ItemSlice(items))
  84.     return items
  85. }
  86.  
  87. func main() {
  88.     port := defaultPort
  89.     if len(os.Args) > 1 {
  90.         port = os.Args[1]
  91.     }
  92.     items := FetchFeeds(Urls)
  93.     fmt.Println("items:", len(items))
  94.     fmt.Printf("newest item: [%v] %s\n", items[0].Date, items[0].Title)
  95.     fmt.Print("listening on :", port, "\n")
  96.     http.HandleFunc("/", getIndexHandle(items))
  97.     if err := http.ListenAndServe("0.0.0.0:"+port, nil); err != nil {
  98.         panic(err)
  99.     }
  100. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement