Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package main
- import (
- "fmt"
- "html/template"
- "net/http"
- "os"
- "sort"
- "sync"
- "time"
- "github.com/mmcdole/gofeed"
- )
- func getIndexHandle(items []Item) http.HandlerFunc {
- return func(w http.ResponseWriter, r *http.Request) {
- fmt.Println("serving")
- w.Header().Set("Content-Type", "text/html")
- t := template.Must(template.New("main").Parse(mainTemplate))
- if err := t.Execute(w, items); err != nil {
- panic(err)
- }
- }
- }
- func parseItem(item *gofeed.Item) Item {
- newItem := Item{
- Title: item.Title,
- Link: item.Link,
- }
- if item.PublishedParsed != nil {
- newItem.Date = *item.PublishedParsed
- } else {
- newItem.Date = *item.UpdatedParsed
- }
- if item.Author != nil {
- newItem.Author = item.Author.Name
- }
- if yt, isYt := item.Extensions["yt"]; isYt {
- id := yt["videoId"][0].Value
- 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>`)
- } else {
- newItem.Content = template.HTML(item.Description)
- }
- return newItem
- }
- // FetchFeed fetches single feed and reports parsed RSS Items to channel
- func FetchFeed(ch chan<- Item, url string) {
- fp := gofeed.NewParser()
- feed, err := fp.ParseURL(url)
- if err != nil {
- panic(err)
- }
- fmt.Println("fetching feed:", feed.Title)
- for _, item := range feed.Items {
- newItem := parseItem(item)
- if newItem.Date.After(time.Now().Add(-lastDays * 24 * time.Hour)) {
- ch <- newItem
- }
- }
- }
- // FetchFeeds concurrently fetches list of feeds by URL
- func FetchFeeds(urls []string) []Item {
- ch := make(chan Item)
- go func() {
- var wg sync.WaitGroup
- for _, url := range urls {
- wg.Add(1)
- go func(url string) {
- FetchFeed(ch, url)
- wg.Done()
- }(url)
- }
- wg.Wait()
- close(ch)
- }()
- items := []Item{}
- for i := range ch {
- items = append(items, i)
- }
- sort.Sort(ItemSlice(items))
- return items
- }
- func main() {
- port := defaultPort
- if len(os.Args) > 1 {
- port = os.Args[1]
- }
- items := FetchFeeds(Urls)
- fmt.Println("items:", len(items))
- fmt.Printf("newest item: [%v] %s\n", items[0].Date, items[0].Title)
- fmt.Print("listening on :", port, "\n")
- http.HandleFunc("/", getIndexHandle(items))
- if err := http.ListenAndServe("0.0.0.0:"+port, nil); err != nil {
- panic(err)
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement