GoBlog/feeds.go

77 lines
1.9 KiB
Go
Raw Normal View History

2020-09-02 15:48:37 +00:00
package main
import (
"net/http"
"strings"
2020-09-02 15:48:37 +00:00
"time"
2020-10-06 17:07:48 +00:00
2020-11-01 17:37:21 +00:00
"github.com/araddon/dateparse"
"github.com/jlelse/feeds"
"go.goblog.app/app/pkgs/contenttype"
2020-09-02 15:48:37 +00:00
)
type feedType string
const (
2020-10-06 17:07:48 +00:00
noFeed feedType = ""
rssFeed feedType = "rss"
atomFeed feedType = "atom"
jsonFeed feedType = "json"
2020-09-02 15:48:37 +00:00
)
func (a *goBlog) generateFeed(blog string, f feedType, w http.ResponseWriter, r *http.Request, posts []*post, title string, description string) {
2020-09-02 15:48:37 +00:00
now := time.Now()
if title == "" {
title = a.cfg.Blogs[blog].Title
}
if description == "" {
description = a.cfg.Blogs[blog].Description
}
2020-09-02 15:48:37 +00:00
feed := &feeds.Feed{
Title: title,
Description: description,
Link: &feeds.Link{Href: a.getFullAddress(strings.TrimSuffix(r.URL.Path, "."+string(f)))},
2020-09-02 15:48:37 +00:00
Created: now,
2020-11-01 17:37:21 +00:00
Author: &feeds.Author{
Name: a.cfg.User.Name,
Email: a.cfg.User.Email,
2020-11-01 17:37:21 +00:00
},
Image: &feeds.Image{
Url: a.cfg.User.Picture,
2020-11-01 17:37:21 +00:00
},
2020-09-02 15:48:37 +00:00
}
2020-10-15 15:32:46 +00:00
for _, p := range posts {
2020-09-02 15:48:37 +00:00
feed.Add(&feeds.Item{
2021-08-04 21:26:38 +00:00
Title: a.renderMdTitle(p.Title()),
Link: &feeds.Link{Href: a.fullPostURL(p)},
Description: a.postSummary(p),
2020-10-15 15:32:46 +00:00
Id: p.Path,
Content: string(a.postHtml(p, true)),
Created: timeNoErr(dateparse.ParseLocal(p.Published)),
Updated: timeNoErr(dateparse.ParseLocal(p.Updated)),
2020-09-02 15:48:37 +00:00
})
}
var err error
var feedString, feedMediaType string
2020-09-02 15:48:37 +00:00
switch f {
2020-10-06 17:07:48 +00:00
case rssFeed:
feedMediaType = contenttype.RSS
feedString, err = feed.ToRss()
2020-10-06 17:07:48 +00:00
case atomFeed:
feedMediaType = contenttype.ATOM
feedString, err = feed.ToAtom()
2020-10-06 17:07:48 +00:00
case jsonFeed:
feedMediaType = contenttype.JSONFeed
feedString, err = feed.ToJSON()
default:
return
2020-09-02 15:48:37 +00:00
}
if err != nil {
2020-10-13 11:40:16 +00:00
w.Header().Del(contentType)
a.serveError(w, r, err.Error(), http.StatusInternalServerError)
2020-09-02 15:48:37 +00:00
return
}
w.Header().Set(contentType, feedMediaType+contenttype.CharsetUtf8Suffix)
_, _ = a.min.Write(w, feedMediaType, []byte(feedString))
2020-09-02 15:48:37 +00:00
}