commit a415c3e1882767b12da854dd3dfa0b3286ef84a6
parent 1549b3ecd5527a122fd05e3ac5f6a001d5d65f8a
Author: David Eisinger <[email protected]>
Date: Tue, 7 Oct 2025 01:28:23 -0400
RSS improvements
Diffstat:
1 file changed, 19 insertions(+), 6 deletions(-)
diff --git a/internal/api.go b/internal/api.go
@@ -219,7 +219,7 @@ func NewHandlerWithConfig(db *DB, cfg HandlerConfig) (http.Handler, error) {
_ = json.NewEncoder(w).Encode(resp)
} else {
w.Header().Set("Content-Type", "application/rss+xml; charset=utf-8")
- _ = writeRSS(w, r, resp)
+ _ = writeRSS(w, r, resp, fmt.Sprintf("%s's Bookmarks", u.Username))
}
return
}
@@ -409,7 +409,13 @@ func NewHandlerWithConfig(db *DB, cfg HandlerConfig) (http.Handler, error) {
wantsRSS := r.URL.Path == "/bookmarks.xml" || strings.EqualFold(r.URL.Query().Get("format"), "rss") || strings.Contains(r.Header.Get("Accept"), "application/rss+xml")
if wantsRSS {
w.Header().Set("Content-Type", "application/rss+xml; charset=utf-8")
- if err := writeRSS(w, r, resp); err != nil {
+ feedTitle := "Bookmarks"
+ if uid > 0 {
+ if u, err := db.GetUserByID(r.Context(), uid); err == nil && u != nil {
+ feedTitle = fmt.Sprintf("%s's Bookmarks", u.Username)
+ }
+ }
+ if err := writeRSS(w, r, resp, feedTitle); err != nil {
log.Printf("write rss error: %v", err)
http.Error(w, "internal server error", http.StatusInternalServerError)
}
@@ -734,8 +740,11 @@ type rssItem struct {
PubDate string `xml:"pubDate"`
}
-func writeRSS(w http.ResponseWriter, r *http.Request, items []bookmarkResponse) error {
- chanTitle := "marky bookmarks"
+func writeRSS(w http.ResponseWriter, r *http.Request, items []bookmarkResponse, title string) error {
+ chanTitle := strings.TrimSpace(title)
+ if chanTitle == "" {
+ chanTitle = "Bookmarks"
+ }
chanLink := ""
if r != nil && r.Host != "" {
scheme := "http"
@@ -744,7 +753,7 @@ func writeRSS(w http.ResponseWriter, r *http.Request, items []bookmarkResponse)
}
chanLink = fmt.Sprintf("%s://%s/bookmarks", scheme, r.Host)
}
- chanDesc := "Bookmarks feed"
+ chanDesc := chanTitle
out := rssFeed{Version: "2.0", Channel: rssChannel{Title: chanTitle, Link: chanLink, Description: chanDesc}}
out.Channel.Items = make([]rssItem, 0, len(items))
for _, b := range items {
@@ -754,10 +763,14 @@ func writeRSS(w http.ResponseWriter, r *http.Request, items []bookmarkResponse)
} else if b.Description != nil {
desc = *b.Description
}
+ guid := fmt.Sprintf("marky:%d", b.ID)
+ if chanLink != "" {
+ guid = fmt.Sprintf("%s/%d", strings.TrimRight(chanLink, "/"), b.ID)
+ }
out.Channel.Items = append(out.Channel.Items, rssItem{
Title: b.Title,
Link: b.URL,
- GUID: fmt.Sprintf("marky:%d", b.ID),
+ GUID: guid,
Description: desc,
PubDate: b.UpdatedAt.Format(time.RFC1123Z),
})