2020-09-02 15:48:37 +00:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
2024-04-22 13:49:22 +00:00
|
|
|
"cmp"
|
2022-02-12 21:29:45 +00:00
|
|
|
"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"
|
2021-07-04 16:33:24 +00:00
|
|
|
"github.com/jlelse/feeds"
|
2022-02-11 15:19:10 +00:00
|
|
|
"go.goblog.app/app/pkgs/bufferpool"
|
2021-06-28 20:17:18 +00:00
|
|
|
"go.goblog.app/app/pkgs/contenttype"
|
2020-09-02 15:48:37 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
type feedType string
|
|
|
|
|
|
|
|
const (
|
2022-08-07 11:11:43 +00:00
|
|
|
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
|
|
|
)
|
|
|
|
|
2023-09-07 15:01:53 +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,
|
2023-09-07 15:01:53 +00:00
|
|
|
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{
|
2021-06-06 12:39:42 +00:00
|
|
|
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 {
|
2022-02-11 15:19:10 +00:00
|
|
|
buf := bufferpool.Get()
|
2022-08-07 11:11:43 +00:00
|
|
|
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,
|
2021-06-06 12:39:42 +00:00
|
|
|
Link: &feeds.Link{Href: a.fullPostURL(p)},
|
2021-06-18 12:32:03 +00:00
|
|
|
Description: a.postSummary(p),
|
2020-10-15 15:32:46 +00:00
|
|
|
Id: p.Path,
|
2022-02-11 15:19:10 +00:00
|
|
|
Content: buf.String(),
|
2023-03-05 16:17:40 +00:00
|
|
|
Created: noError(dateparse.ParseLocal(p.Published)),
|
|
|
|
Updated: noError(dateparse.ParseLocal(p.Updated)),
|
2023-07-31 12:38:03 +00:00
|
|
|
Tags: sortedStrings(p.Parameters[a.cfg.Micropub.CategoryParam]),
|
2020-09-02 15:48:37 +00:00
|
|
|
})
|
2022-02-11 15:19:10 +00:00
|
|
|
bufferpool.Put(buf)
|
2020-09-02 15:48:37 +00:00
|
|
|
}
|
2022-02-12 21:29:45 +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 {
|
2022-08-07 11:11:43 +00:00
|
|
|
case rssFeed, minRssFeed:
|
2021-06-18 12:32:03 +00:00
|
|
|
feedMediaType = contenttype.RSS
|
2022-02-12 21:29:45 +00:00
|
|
|
feedWriteFunc = feed.WriteRss
|
2022-08-07 11:11:43 +00:00
|
|
|
case atomFeed, minAtomFeed:
|
2021-06-18 12:32:03 +00:00
|
|
|
feedMediaType = contenttype.ATOM
|
2022-02-12 21:29:45 +00:00
|
|
|
feedWriteFunc = feed.WriteAtom
|
2022-08-07 11:11:43 +00:00
|
|
|
case jsonFeed, minJsonFeed:
|
2021-06-18 12:32:03 +00:00
|
|
|
feedMediaType = contenttype.JSONFeed
|
2022-02-12 21:29:45 +00:00
|
|
|
feedWriteFunc = feed.WriteJSON
|
2020-09-14 14:07:37 +00:00
|
|
|
default:
|
2021-12-30 11:40:21 +00:00
|
|
|
a.serve404(w, r)
|
2020-09-14 14:07:37 +00:00
|
|
|
return
|
2020-09-02 15:48:37 +00:00
|
|
|
}
|
2022-02-12 21:29:45 +00:00
|
|
|
pipeReader, pipeWriter := io.Pipe()
|
|
|
|
go func() {
|
2023-01-24 08:40:54 +00:00
|
|
|
_ = pipeWriter.CloseWithError(feedWriteFunc(pipeWriter))
|
2022-02-12 21:29:45 +00:00
|
|
|
}()
|
2021-06-18 12:32:03 +00:00
|
|
|
w.Header().Set(contentType, feedMediaType+contenttype.CharsetUtf8Suffix)
|
2023-01-24 08:40:54 +00:00
|
|
|
_ = pipeReader.CloseWithError(a.min.Get().Minify(feedMediaType, w, pipeReader))
|
2020-09-02 15:48:37 +00:00
|
|
|
}
|