mirror of
https://codeberg.org/video-prize-ranch/rimgo.git
synced 2026-01-27 17:11:13 +00:00
rss
This commit is contained in:
28
main.go
28
main.go
@@ -58,11 +58,26 @@ func main() {
|
|||||||
app.Handle("GET /a/{postID}", wrapHandler(pages.HandlePost))
|
app.Handle("GET /a/{postID}", wrapHandler(pages.HandlePost))
|
||||||
app.Handle("GET /a/{postID}/embed", wrapHandler(pages.HandleEmbed))
|
app.Handle("GET /a/{postID}/embed", wrapHandler(pages.HandleEmbed))
|
||||||
// app.Handle("GET /t/:tag.:type", pages.HandleTagRSS)
|
// app.Handle("GET /t/:tag.:type", pages.HandleTagRSS)
|
||||||
app.Handle("GET /t/{tag}", wrapHandler(pages.HandleTag))
|
app.Handle("GET /t/{tag}", wrapHandler(func(w http.ResponseWriter, r *http.Request) error {
|
||||||
|
name, ext := utils.SplitNameExt(r.PathValue("tag"))
|
||||||
|
if ext != "" {
|
||||||
|
r.SetPathValue("tag", name[0:len(name)-1])
|
||||||
|
r.SetPathValue("type", ext)
|
||||||
|
return pages.HandleTagRSS(w, r)
|
||||||
|
}
|
||||||
|
return pages.HandleTag(w, r)
|
||||||
|
}))
|
||||||
app.Handle("GET /t/{tag}/{postID}", wrapHandler(pages.HandlePost))
|
app.Handle("GET /t/{tag}/{postID}", wrapHandler(pages.HandlePost))
|
||||||
app.Handle("GET /r/{sub}/{postID}", wrapHandler(pages.HandlePost))
|
app.Handle("GET /r/{sub}/{postID}", wrapHandler(pages.HandlePost))
|
||||||
// app.Handle("GET /user/:userID.:type", pages.HandleUserRSS)
|
app.Handle("GET /user/{userID}", wrapHandler(func(w http.ResponseWriter, r *http.Request) error {
|
||||||
app.Handle("GET /user/{userID}", wrapHandler(pages.HandleUser))
|
name, ext := utils.SplitNameExt(r.PathValue("userID"))
|
||||||
|
if ext != "" {
|
||||||
|
r.SetPathValue("userID", name[0:len(name)-1])
|
||||||
|
r.SetPathValue("type", ext)
|
||||||
|
return pages.HandleUserRSS(w, r)
|
||||||
|
}
|
||||||
|
return pages.HandleUser(w, r)
|
||||||
|
}))
|
||||||
app.Handle("GET /user/{userID}/favorites", wrapHandler(pages.HandleUserFavorites))
|
app.Handle("GET /user/{userID}/favorites", wrapHandler(pages.HandleUserFavorites))
|
||||||
app.Handle("GET /user/{userID}/comments", wrapHandler(pages.HandleUserComments))
|
app.Handle("GET /user/{userID}/comments", wrapHandler(pages.HandleUserComments))
|
||||||
app.Handle("GET /user/{userID}/cover", wrapHandler(pages.HandleUserCover))
|
app.Handle("GET /user/{userID}/cover", wrapHandler(pages.HandleUserCover))
|
||||||
@@ -81,7 +96,9 @@ func main() {
|
|||||||
case component == "trending":
|
case component == "trending":
|
||||||
return pages.HandleTrending(w, r)
|
return pages.HandleTrending(w, r)
|
||||||
case strings.HasPrefix(component, "trending."):
|
case strings.HasPrefix(component, "trending."):
|
||||||
// return pages.HandleTrendingRSS(w, r)
|
_, ext := utils.SplitNameExt(component)
|
||||||
|
r.SetPathValue("type", ext)
|
||||||
|
return pages.HandleTrendingRSS(w, r)
|
||||||
case strings.HasSuffix(component, ".gifv"):
|
case strings.HasSuffix(component, ".gifv"):
|
||||||
r.SetPathValue("postID", component)
|
r.SetPathValue("postID", component)
|
||||||
return pages.HandleGifv(w, r)
|
return pages.HandleGifv(w, r)
|
||||||
@@ -91,9 +108,8 @@ func main() {
|
|||||||
r.SetPathValue("postID", component)
|
r.SetPathValue("postID", component)
|
||||||
return pages.HandlePost(w, r)
|
return pages.HandlePost(w, r)
|
||||||
}
|
}
|
||||||
return nil
|
|
||||||
}))
|
}))
|
||||||
app.Handle("GET /stack/:baseName.:extension", wrapHandler(pages.HandleMedia))
|
// app.Handle("GET /stack/:baseName.:extension", wrapHandler(pages.HandleMedia))
|
||||||
// matches anything with no more specific route
|
// matches anything with no more specific route
|
||||||
app.Handle("GET /", wrapHandler(func(w http.ResponseWriter, r *http.Request) error {
|
app.Handle("GET /", wrapHandler(func(w http.ResponseWriter, r *http.Request) error {
|
||||||
err := render.Render(w, "errors/404", nil)
|
err := render.Render(w, "errors/404", nil)
|
||||||
|
|||||||
67
pages/rss.go
67
pages/rss.go
@@ -1,51 +1,54 @@
|
|||||||
//go:build fiber
|
|
||||||
|
|
||||||
package pages
|
package pages
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"mime"
|
||||||
|
"net/http"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"codeberg.org/rimgo/rimgo/api"
|
"codeberg.org/rimgo/rimgo/api"
|
||||||
"codeberg.org/rimgo/rimgo/utils"
|
"codeberg.org/rimgo/rimgo/utils"
|
||||||
"github.com/gofiber/fiber/v2"
|
|
||||||
"github.com/gorilla/feeds"
|
"github.com/gorilla/feeds"
|
||||||
)
|
)
|
||||||
|
|
||||||
func HandleTagRSS(c *fiber.Ctx) error {
|
func HandleTagRSS(w http.ResponseWriter, r *http.Request) error {
|
||||||
utils.SetHeaders(c)
|
utils.SetHeaders(w)
|
||||||
|
|
||||||
tag, err := ApiClient.FetchTag(c.Params("tag"), c.Query("sort"), "1")
|
tag, err := ApiClient.FetchTag(r.PathValue("tag"), r.URL.Query().Get("sort"), "1")
|
||||||
if err != nil && err.Error() == "ratelimited by imgur" {
|
if err != nil && err.Error() == "ratelimited by imgur" {
|
||||||
return c.Status(429).SendString("rate limited by imgur")
|
w.WriteHeader(429)
|
||||||
|
_, err := w.Write([]byte("rate limited by imgur"))
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if tag.Display == "" {
|
if tag.Display == "" {
|
||||||
return c.Status(404).SendString("tag not found")
|
w.WriteHeader(404)
|
||||||
|
_, err := w.Write([]byte("tag not found"))
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
instance := utils.GetInstanceUrl(c)
|
instance := utils.GetInstanceUrl(r)
|
||||||
|
|
||||||
feed := &feeds.Feed{
|
feed := &feeds.Feed{
|
||||||
Title: tag.Display + " on Imgur",
|
Title: tag.Display + " on Imgur",
|
||||||
Link: &feeds.Link{Href: instance + "/t/" + c.Params("tag")},
|
Link: &feeds.Link{Href: instance + "/t/" + r.PathValue("tag")},
|
||||||
Created: time.Now(),
|
Created: time.Now(),
|
||||||
}
|
}
|
||||||
|
|
||||||
return handleFeed(c, instance, feed, tag.Posts)
|
return handleFeed(w, r, instance, feed, tag.Posts)
|
||||||
}
|
}
|
||||||
|
|
||||||
func HandleTrendingRSS(c *fiber.Ctx) error {
|
func HandleTrendingRSS(w http.ResponseWriter, r *http.Request) error {
|
||||||
utils.SetHeaders(c)
|
utils.SetHeaders(w)
|
||||||
|
|
||||||
section := c.Query("section")
|
section := r.URL.Query().Get("section")
|
||||||
switch section {
|
switch section {
|
||||||
case "hot", "new", "top":
|
case "hot", "new", "top":
|
||||||
default:
|
default:
|
||||||
section = "hot"
|
section = "hot"
|
||||||
}
|
}
|
||||||
sort := c.Query("sort")
|
sort := r.URL.Query().Get("sort")
|
||||||
switch sort {
|
switch sort {
|
||||||
case "newest", "best", "popular":
|
case "newest", "best", "popular":
|
||||||
default:
|
default:
|
||||||
@@ -57,7 +60,7 @@ func HandleTrendingRSS(c *fiber.Ctx) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
instance := utils.GetInstanceUrl(c)
|
instance := utils.GetInstanceUrl(r)
|
||||||
|
|
||||||
feed := &feeds.Feed{
|
feed := &feeds.Feed{
|
||||||
Title: "Trending on Imgur",
|
Title: "Trending on Imgur",
|
||||||
@@ -65,24 +68,23 @@ func HandleTrendingRSS(c *fiber.Ctx) error {
|
|||||||
Created: time.Now(),
|
Created: time.Now(),
|
||||||
}
|
}
|
||||||
|
|
||||||
return handleFeed(c, instance, feed, results)
|
return handleFeed(w, r, instance, feed, results)
|
||||||
}
|
}
|
||||||
|
|
||||||
func HandleUserRSS(c *fiber.Ctx) error {
|
func HandleUserRSS(w http.ResponseWriter, r *http.Request) error {
|
||||||
utils.SetHeaders(c)
|
utils.SetHeaders(w)
|
||||||
|
|
||||||
user := c.Params("userID")
|
user := r.PathValue("userID")
|
||||||
|
|
||||||
submissions, err := ApiClient.FetchSubmissions(user, "newest", "1")
|
submissions, err := ApiClient.FetchSubmissions(user, "newest", "1")
|
||||||
if err != nil && err.Error() == "ratelimited by imgur" {
|
if err != nil && err.Error() == "ratelimited by imgur" {
|
||||||
c.Status(429)
|
return utils.RenderError(w, r, 429)
|
||||||
return utils.RenderError(c, 429)
|
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
instance := utils.GetInstanceUrl(c)
|
instance := utils.GetInstanceUrl(r)
|
||||||
|
|
||||||
feed := &feeds.Feed{
|
feed := &feeds.Feed{
|
||||||
Title: user + " on Imgur",
|
Title: user + " on Imgur",
|
||||||
@@ -90,10 +92,10 @@ func HandleUserRSS(c *fiber.Ctx) error {
|
|||||||
Created: time.Now(),
|
Created: time.Now(),
|
||||||
}
|
}
|
||||||
|
|
||||||
return handleFeed(c, instance, feed, submissions)
|
return handleFeed(w, r, instance, feed, submissions)
|
||||||
}
|
}
|
||||||
|
|
||||||
func handleFeed(c *fiber.Ctx, instance string, feed *feeds.Feed, posts []api.Submission) error {
|
func handleFeed(w http.ResponseWriter, r *http.Request, instance string, feed *feeds.Feed, posts []api.Submission) error {
|
||||||
feed.Items = []*feeds.Item{}
|
feed.Items = []*feeds.Item{}
|
||||||
|
|
||||||
for _, post := range posts {
|
for _, post := range posts {
|
||||||
@@ -112,27 +114,30 @@ func handleFeed(c *fiber.Ctx, instance string, feed *feeds.Feed, posts []api.Sub
|
|||||||
feed.Items = append(feed.Items, item)
|
feed.Items = append(feed.Items, item)
|
||||||
}
|
}
|
||||||
|
|
||||||
c.Type(c.Params("type"))
|
w.Header().Set("Content-Type", mime.TypeByExtension("."+r.PathValue("type")))
|
||||||
switch c.Params("type") {
|
switch r.PathValue("type") {
|
||||||
case "atom":
|
case "atom":
|
||||||
body, err := feed.ToAtom()
|
body, err := feed.ToAtom()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return c.SendString(body)
|
w.Write([]byte(body))
|
||||||
case "json":
|
case "json":
|
||||||
body, err := feed.ToJSON()
|
body, err := feed.ToJSON()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return c.JSON(body)
|
w.Write([]byte(body))
|
||||||
case "rss":
|
case "rss":
|
||||||
body, err := feed.ToRss()
|
body, err := feed.ToRss()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return c.SendString(body)
|
w.Write([]byte(body))
|
||||||
default:
|
default:
|
||||||
return c.Status(400).SendString("invalid type")
|
w.Header().Set("Content-Type", "text/plain")
|
||||||
|
w.WriteHeader(400)
|
||||||
|
w.Write([]byte("invalid type"))
|
||||||
}
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
16
utils/splitNameExt.go
Normal file
16
utils/splitNameExt.go
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
package utils
|
||||||
|
|
||||||
|
func SplitNameExt(path string) (name, ext string) {
|
||||||
|
name, ext = path, ""
|
||||||
|
for range 5 {
|
||||||
|
if len(name) == 0 || name[len(name)-1] == '.' || name[len(name)-1] == '/' {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
name = name[:len(name)-1]
|
||||||
|
ext = path[len(name):]
|
||||||
|
}
|
||||||
|
if len(name) == 0 || name[len(name)-1] != '.' {
|
||||||
|
return path, ""
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user