From bf028273c9f4b2f443fffd31bbbf54ad935ae85d Mon Sep 17 00:00:00 2001 From: scanash00 Date: Mon, 12 Jan 2026 18:38:40 -0900 Subject: [PATCH] make sure the collection url triggers the OG handler and add lucide to emoji to handle icons in og image --- backend/cmd/server/main.go | 1 + backend/internal/api/og.go | 91 +++++++++++++++++++++++++++++++++++++- 2 files changed, 90 insertions(+), 2 deletions(-) diff --git a/backend/cmd/server/main.go b/backend/cmd/server/main.go index c85f857..1059247 100644 --- a/backend/cmd/server/main.go +++ b/backend/cmd/server/main.go @@ -97,6 +97,7 @@ func main() { r.Get("/og-image", ogHandler.HandleOGImage) r.Get("/annotation/{did}/{rkey}", ogHandler.HandleAnnotationPage) r.Get("/at/{did}/{rkey}", ogHandler.HandleAnnotationPage) + r.Get("/collection/{uri}", ogHandler.HandleCollectionPage) staticDir := getEnv("STATIC_DIR", "../web/dist") serveStatic(r, staticDir) diff --git a/backend/internal/api/og.go b/backend/internal/api/og.go index 34eb79a..a88a8b6 100644 --- a/backend/internal/api/og.go +++ b/backend/internal/api/og.go @@ -101,6 +101,60 @@ var crawlerUserAgents = []string{ "Bluesky", } +var lucideToEmoji = map[string]string{ + "folder": "📁", + "star": "⭐", + "heart": "❤️", + "bookmark": "🔖", + "lightbulb": "💡", + "zap": "⚡", + "coffee": "☕", + "music": "🎵", + "camera": "📷", + "code": "💻", + "globe": "🌍", + "flag": "🚩", + "tag": "🏷️", + "box": "📦", + "archive": "🗄️", + "file": "📄", + "image": "🖼️", + "video": "🎬", + "mail": "✉️", + "pin": "📍", + "calendar": "📅", + "clock": "🕐", + "search": "🔍", + "settings": "⚙️", + "user": "👤", + "users": "👥", + "home": "🏠", + "briefcase": "💼", + "gift": "🎁", + "award": "🏆", + "target": "🎯", + "trending": "📈", + "activity": "📊", + "cpu": "🔲", + "database": "🗃️", + "cloud": "☁️", + "sun": "☀️", + "moon": "🌙", + "flame": "🔥", + "leaf": "🍃", +} + +func iconToEmoji(icon string) string { + if strings.HasPrefix(icon, "icon:") { + name := strings.TrimPrefix(icon, "icon:") + if emoji, ok := lucideToEmoji[name]; ok { + return emoji + } + return "📁" + } + return icon +} + func isCrawler(userAgent string) bool { ua := strings.ToLower(userAgent) for _, bot := range crawlerUserAgents { @@ -161,6 +215,39 @@ func (h *OGHandler) HandleAnnotationPage(w http.ResponseWriter, r *http.Request) h.serveIndexHTML(w, r) } +func (h *OGHandler) HandleCollectionPage(w http.ResponseWriter, r *http.Request) { + path := r.URL.Path + prefix := "/collection/" + if !strings.HasPrefix(path, prefix) { + h.serveIndexHTML(w, r) + return + } + + uriParam := strings.TrimPrefix(path, prefix) + if uriParam == "" { + h.serveIndexHTML(w, r) + return + } + + uri, err := url.QueryUnescape(uriParam) + if err != nil { + uri = uriParam + } + + if !isCrawler(r.UserAgent()) { + h.serveIndexHTML(w, r) + return + } + + collection, err := h.db.GetCollectionByURI(uri) + if err == nil && collection != nil { + h.serveCollectionOG(w, collection) + return + } + + h.serveIndexHTML(w, r) +} + func (h *OGHandler) serveBookmarkOG(w http.ResponseWriter, bookmark *db.Bookmark) { title := "Bookmark on Margin" if bookmark.Title != nil && *bookmark.Title != "" { @@ -347,7 +434,7 @@ func (h *OGHandler) serveHighlightOG(w http.ResponseWriter, highlight *db.Highli func (h *OGHandler) serveCollectionOG(w http.ResponseWriter, collection *db.Collection) { icon := "📁" if collection.Icon != nil && *collection.Icon != "" { - icon = *collection.Icon + icon = iconToEmoji(*collection.Icon) } title := fmt.Sprintf("%s %s", icon, collection.Name) @@ -663,7 +750,7 @@ func (h *OGHandler) HandleOGImage(w http.ResponseWriter, r *http.Request) { icon := "📁" if collection.Icon != nil && *collection.Icon != "" { - icon = *collection.Icon + icon = iconToEmoji(*collection.Icon) } text = fmt.Sprintf("%s %s", icon, collection.Name) if collection.Description != nil && *collection.Description != "" { -- 2.51.2