This commit is contained in:
orangix
2026-01-23 19:27:24 +01:00
parent fd704f53e7
commit 7b1314fae3
3 changed files with 74 additions and 37 deletions

28
main.go
View File

@@ -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)

View File

@@ -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
View 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
}