2020-09-02 15:48:37 +00:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"net/http"
|
2020-09-15 15:01:53 +00:00
|
|
|
"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"
|
2020-10-06 17:07:48 +00:00
|
|
|
"github.com/gorilla/feeds"
|
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-11-01 17:37:21 +00:00
|
|
|
|
|
|
|
feedAudioURL = "audio"
|
|
|
|
feedAudioType = "audiomime"
|
|
|
|
feedAudioLength = "audiolength"
|
2020-09-02 15:48:37 +00:00
|
|
|
)
|
|
|
|
|
2020-10-15 15:32:46 +00:00
|
|
|
func 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()
|
2020-09-20 19:37:04 +00:00
|
|
|
if title == "" {
|
2020-10-06 17:07:48 +00:00
|
|
|
title = appConfig.Blogs[blog].Title
|
2020-09-20 19:37:04 +00:00
|
|
|
}
|
|
|
|
if description == "" {
|
2020-10-06 17:07:48 +00:00
|
|
|
description = appConfig.Blogs[blog].Description
|
2020-09-20 19:37:04 +00:00
|
|
|
}
|
2020-09-02 15:48:37 +00:00
|
|
|
feed := &feeds.Feed{
|
|
|
|
Title: title,
|
|
|
|
Description: description,
|
2020-09-15 15:01:53 +00:00
|
|
|
Link: &feeds.Link{Href: appConfig.Server.PublicAddress + 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{
|
2021-01-31 21:34:02 +00:00
|
|
|
Name: appConfig.User.Name,
|
|
|
|
Email: appConfig.User.Email,
|
2020-11-01 17:37:21 +00:00
|
|
|
},
|
|
|
|
Image: &feeds.Image{
|
|
|
|
Url: appConfig.User.Picture,
|
|
|
|
},
|
2020-09-02 15:48:37 +00:00
|
|
|
}
|
2020-10-15 15:32:46 +00:00
|
|
|
for _, p := range posts {
|
2020-12-16 19:21:35 +00:00
|
|
|
created, _ := dateparse.ParseLocal(p.Published)
|
|
|
|
updated, _ := dateparse.ParseLocal(p.Updated)
|
2020-11-01 17:37:21 +00:00
|
|
|
var enc *feeds.Enclosure
|
|
|
|
if p.firstParameter(feedAudioURL) != "" {
|
|
|
|
enc = &feeds.Enclosure{
|
|
|
|
Url: p.firstParameter(feedAudioURL),
|
|
|
|
Type: p.firstParameter(feedAudioType),
|
|
|
|
Length: p.firstParameter(feedAudioLength),
|
|
|
|
}
|
|
|
|
}
|
2020-09-02 15:48:37 +00:00
|
|
|
feed.Add(&feeds.Item{
|
2020-10-15 15:32:46 +00:00
|
|
|
Title: p.title(),
|
2020-11-16 17:34:29 +00:00
|
|
|
Link: &feeds.Link{Href: p.fullURL()},
|
2020-10-15 15:32:46 +00:00
|
|
|
Description: p.summary(),
|
|
|
|
Id: p.Path,
|
2020-12-23 13:36:27 +00:00
|
|
|
Content: string(p.absoluteHTML()),
|
2020-11-01 17:37:21 +00:00
|
|
|
Created: created,
|
|
|
|
Updated: updated,
|
|
|
|
Enclosure: enc,
|
2020-09-02 15:48:37 +00:00
|
|
|
})
|
|
|
|
}
|
|
|
|
var err error
|
2021-02-16 15:26:21 +00:00
|
|
|
var feedString, feedMediaType string
|
2020-09-02 15:48:37 +00:00
|
|
|
switch f {
|
2020-10-06 17:07:48 +00:00
|
|
|
case rssFeed:
|
2021-02-16 15:26:21 +00:00
|
|
|
feedMediaType = contentTypeRSS
|
|
|
|
feedString, err = feed.ToRss()
|
2020-10-06 17:07:48 +00:00
|
|
|
case atomFeed:
|
2021-02-16 15:26:21 +00:00
|
|
|
feedMediaType = contentTypeATOM
|
|
|
|
feedString, err = feed.ToAtom()
|
2020-10-06 17:07:48 +00:00
|
|
|
case jsonFeed:
|
2021-02-16 15:26:21 +00:00
|
|
|
feedMediaType = contentTypeJSONFeed
|
|
|
|
feedString, err = feed.ToJSON()
|
2020-09-14 14:07:37 +00:00
|
|
|
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)
|
2020-12-24 09:09:34 +00:00
|
|
|
serveError(w, r, err.Error(), http.StatusInternalServerError)
|
2020-09-02 15:48:37 +00:00
|
|
|
return
|
|
|
|
}
|
2021-02-16 15:26:21 +00:00
|
|
|
w.Header().Set(contentType, feedMediaType+charsetUtf8Suffix)
|
|
|
|
_, _ = writeMinified(w, feedMediaType, []byte(feedString))
|
2020-09-02 15:48:37 +00:00
|
|
|
}
|