GoBlog/feeds.go

87 lines
2.3 KiB
Go
Raw Permalink Normal View History

2020-09-02 15:48:37 +00:00
package main
import (
2024-04-22 13:49:22 +00:00
"cmp"
"io"
2020-09-02 15:48:37 +00:00
"net/http"
"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/bufferpool"
"go.goblog.app/app/pkgs/contenttype"
2020-09-02 15:48:37 +00:00
)
type feedType string
const (
noFeed feedType = ""
rssFeed feedType = "rss"
atomFeed feedType = "atom"
jsonFeed feedType = "json"
minRssFeed feedType = "min.rss"
minAtomFeed feedType = "min.atom"
minJsonFeed feedType = "min.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, description, path, query string) {
2020-09-02 15:48:37 +00:00
now := time.Now()
2024-04-22 13:49:22 +00:00
title = a.renderMdTitle(cmp.Or(title, a.cfg.Blogs[blog].Title))
description = cmp.Or(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(path) + query},
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{
2022-11-27 14:06:43 +00:00
Url: a.profileImagePath(profileImageFormatJPEG, 0, 0),
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 {
buf := bufferpool.Get()
switch f {
case minRssFeed, minAtomFeed, minJsonFeed:
a.minFeedHtml(buf, p)
default:
a.feedHtml(buf, p)
}
2020-09-02 15:48:37 +00:00
feed.Add(&feeds.Item{
2021-08-05 06:09:34 +00:00
Title: p.RenderedTitle,
Link: &feeds.Link{Href: a.fullPostURL(p)},
Description: a.postSummary(p),
2020-10-15 15:32:46 +00:00
Id: p.Path,
Content: buf.String(),
Created: noError(dateparse.ParseLocal(p.Published)),
Updated: noError(dateparse.ParseLocal(p.Updated)),
Tags: sortedStrings(p.Parameters[a.cfg.Micropub.CategoryParam]),
2020-09-02 15:48:37 +00:00
})
bufferpool.Put(buf)
2020-09-02 15:48:37 +00:00
}
var feedWriteFunc func(w io.Writer) error
2021-12-30 11:40:21 +00:00
var feedMediaType string
2020-09-02 15:48:37 +00:00
switch f {
case rssFeed, minRssFeed:
feedMediaType = contenttype.RSS
feedWriteFunc = feed.WriteRss
case atomFeed, minAtomFeed:
feedMediaType = contenttype.ATOM
feedWriteFunc = feed.WriteAtom
case jsonFeed, minJsonFeed:
feedMediaType = contenttype.JSONFeed
feedWriteFunc = feed.WriteJSON
default:
2021-12-30 11:40:21 +00:00
a.serve404(w, r)
return
2020-09-02 15:48:37 +00:00
}
pipeReader, pipeWriter := io.Pipe()
go func() {
_ = pipeWriter.CloseWithError(feedWriteFunc(pipeWriter))
}()
w.Header().Set(contentType, feedMediaType+contenttype.CharsetUtf8Suffix)
_ = pipeReader.CloseWithError(a.min.Get().Minify(feedMediaType, w, pipeReader))
2020-09-02 15:48:37 +00:00
}