package pages
import (
"mime"
"net/http"
"time"
"codeberg.org/rimgo/rimgo/api"
"codeberg.org/rimgo/rimgo/utils"
"github.com/gorilla/feeds"
)
func HandleTagRSS(w http.ResponseWriter, r *http.Request) error {
utils.SetHeaders(w)
tag, err := ApiClient.FetchTag(r.PathValue("tag"), r.URL.Query().Get("sort"), "1")
if err != nil && err.Error() == "ratelimited by imgur" {
w.WriteHeader(429)
_, err := w.Write([]byte("rate limited by imgur"))
return err
}
if err != nil {
return err
}
if tag.Display == "" {
w.WriteHeader(404)
_, err := w.Write([]byte("tag not found"))
return err
}
instance := utils.GetInstanceUrl(r)
feed := &feeds.Feed{
Title: tag.Display + " on Imgur",
Link: &feeds.Link{Href: instance + "/t/" + r.PathValue("tag")},
Created: time.Now(),
}
return handleFeed(w, r, instance, feed, tag.Posts)
}
func HandleTrendingRSS(w http.ResponseWriter, r *http.Request) error {
utils.SetHeaders(w)
section := r.URL.Query().Get("section")
switch section {
case "hot", "new", "top":
default:
section = "hot"
}
sort := r.URL.Query().Get("sort")
switch sort {
case "newest", "best", "popular":
default:
sort = "popular"
}
results, err := ApiClient.FetchTrending(section, sort, "1")
if err != nil {
return err
}
instance := utils.GetInstanceUrl(r)
feed := &feeds.Feed{
Title: "Trending on Imgur",
Link: &feeds.Link{Href: instance + "/trending"},
Created: time.Now(),
}
return handleFeed(w, r, instance, feed, results)
}
func HandleUserRSS(w http.ResponseWriter, r *http.Request) error {
utils.SetHeaders(w)
user := r.PathValue("userID")
submissions, err := ApiClient.FetchSubmissions(user, "newest", "1")
if err != nil && err.Error() == "ratelimited by imgur" {
return utils.RenderError(w, r, 429)
}
if err != nil {
return err
}
instance := utils.GetInstanceUrl(r)
feed := &feeds.Feed{
Title: user + " on Imgur",
Link: &feeds.Link{Href: instance + "/user/" + user},
Created: time.Now(),
}
return handleFeed(w, r, instance, feed, submissions)
}
func handleFeed(w http.ResponseWriter, r *http.Request, instance string, feed *feeds.Feed, posts []api.Submission) error {
feed.Items = []*feeds.Item{}
for _, post := range posts {
link := instance + post.Link
item := &feeds.Item{
Title: post.Title,
Link: &feeds.Link{Href: link},
Description: "
",
}
if post.Cover.Type == "video" {
item.Description = "🎞️ Video
" + item.Description
}
feed.Items = append(feed.Items, item)
}
w.Header().Set("Content-Type", mime.TypeByExtension("."+r.PathValue("type")))
switch r.PathValue("type") {
case "atom":
body, err := feed.ToAtom()
if err != nil {
return err
}
w.Write([]byte(body))
case "json":
body, err := feed.ToJSON()
if err != nil {
return err
}
w.Write([]byte(body))
case "rss":
body, err := feed.ToRss()
if err != nil {
return err
}
w.Write([]byte(body))
default:
w.Header().Set("Content-Type", "text/plain")
w.WriteHeader(400)
w.Write([]byte("invalid type"))
}
return nil
}