diff options
| author | eltrac <hi@eltr.ac> | 2026-03-19 22:22:07 +0800 |
|---|---|---|
| committer | eltrac <hi@eltr.ac> | 2026-03-19 22:22:22 +0800 |
| commit | aa3f1573272a5c87a627bf4baf0e6d9e025d06a8 (patch) | |
| tree | bec0c7cffc2291ebd9610201dc0ed434b4a9295a /src | |
| parent | d4ed811bdde40e17f79bf28fb91dd50f2ea9a426 (diff) | |
feat: rss feed for each domain
Diffstat (limited to 'src')
| -rw-r--r-- | src/weepinbell/feed.clj | 32 | ||||
| -rw-r--r-- | src/weepinbell/handler.clj | 3 |
2 files changed, 35 insertions, 0 deletions
diff --git a/src/weepinbell/feed.clj b/src/weepinbell/feed.clj new file mode 100644 index 0000000..638699d --- /dev/null +++ b/src/weepinbell/feed.clj @@ -0,0 +1,32 @@ +(ns weepinbell.feed + (:require [clj-rss.core :as rss] + [weepinbell.utils :refer [get-domain]] + [weepinbell.config :refer [get-config]] + [weepinbell.storage :as storage] + [digest :as digest]) + (:import [java.time Instant])) + +(def feed-length (get-config :feed-length)) + +(defn rss + [domain] + (let [wms (storage/get-wms-by-domain domain)] + {:headers {"Content-Type" "application/xml"} + :body (rss/channel-xml + {:title "Weepinbell Feed" + :link (get-config :base-url) + :description (str "Webmentions sent to " domain)} + (->> wms + (map #(let [wm (:webmention %) + id (if-let [id (:id wm)] id + (digest/md5 (str (:source wm) (:target wm)))) + permalink (str (get-config :base-url) "/api/mention/" id) + modified (:modified wm) + pub-date (when modified + (Instant/ofEpochMilli modified))] + {:title (str (-> wm :source get-domain) " -> " (:target wm)) + :link (:source wm) + :guid permalink + :pubDate pub-date})) + (take-last feed-length) + doall))})) diff --git a/src/weepinbell/handler.clj b/src/weepinbell/handler.clj index f1d0c7f..80c2d2f 100644 --- a/src/weepinbell/handler.clj +++ b/src/weepinbell/handler.clj @@ -9,6 +9,7 @@ [weepinbell.retriever :as retriever] [weepinbell.processor :refer [process-webmention]] [weepinbell.ui :as ui] + [weepinbell.feed :as feed] [clojure.core.async :refer [chan]])) (def wmc (chan)) @@ -34,6 +35,8 @@ (context "/mention" [] (GET "/:id" [id] (retriever/by-id id)) (GET "/" [source target] (retriever/by-st-pair source target)))) + ;; RSS feed + (GET "/feed/:domain" [domain] (feed/rss domain)) ;; host proxied avatars (microformats photos) (route/files "/avatars/" {:root "data/avatars"}) ;; 404 |
