marky

Lightweight bookmarking + plaintext archive
Log | Files | Refs | README | LICENSE

commit a415c3e1882767b12da854dd3dfa0b3286ef84a6
parent 1549b3ecd5527a122fd05e3ac5f6a001d5d65f8a
Author: David Eisinger <[email protected]>
Date:   Tue,  7 Oct 2025 01:28:23 -0400

RSS improvements

Diffstat:
Minternal/api.go | 25+++++++++++++++++++------
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), })