Skip to content

Commit 1b5e8dd

Browse files
committed
RSS feeds for threads
1 parent 6c5cb01 commit 1b5e8dd

File tree

3 files changed

+52
-1
lines changed

3 files changed

+52
-1
lines changed

src/routes/rss.nim

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,3 +133,34 @@ proc createRssRouter*(cfg: Config) =
133133

134134
await cacheRss(key, rss)
135135
respRss(rss)
136+
137+
get "/@name/status/@id/rss":
138+
cond '.' notin @"name"
139+
let name = @"name"
140+
let id = @"id"
141+
142+
var key = name & "/" & id
143+
144+
var rss = await getCachedRss(key)
145+
if rss.cursor.len > 0:
146+
respRss(rss)
147+
148+
var conv = await getTweet(id)
149+
if conv == nil or conv.tweet == nil or conv.tweet.id == 0:
150+
var error = "Tweet not found"
151+
if conv != nil and conv.tweet != nil and conv.tweet.tombstone.len > 0:
152+
error = conv.tweet.tombstone
153+
resp Http404, showError(error, cfg)
154+
155+
while conv.after.more != 0:
156+
let newer_conv = await getTweet($conv.after.content[^1].id)
157+
if newer_conv == nil or newer_conv.tweet == nil or newer_conv.tweet.id == 0:
158+
break
159+
conv = newer_conv
160+
161+
let lastThreadTweets = conv.before.content & @[conv.tweet] & conv.after.content
162+
let feed = compress renderThreadRss(lastThreadTweets, name, id, cfg)
163+
rss = Rss(feed: feed, cursor: $lastThreadTweets[0].id)
164+
165+
await cacheRss(key, rss)
166+
respRss(rss)

src/routes/status.nim

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,11 @@ proc createStatusRouter*(cfg: Config) =
5353
elif card.video.isSome():
5454
images = @[card.video.get().thumb]
5555

56+
57+
let rss = "/$1/status/$2/rss" % [@"name", @"id"]
5658
let html = renderConversation(conv, prefs, getPath() & "#m")
5759
resp renderMain(html, request, cfg, prefs, title, desc, ogTitle,
58-
images=images, video=video)
60+
images=images, video=video, rss=rss)
5961

6062
get "/@name/@s/@id/@m/?@i?":
6163
cond @"s" in ["status", "statuses"]

src/views/rss.nimf

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,3 +136,21 @@ ${renderRssTweets(tweets, prefs, cfg)}
136136
</channel>
137137
</rss>
138138
#end proc
139+
#
140+
#proc renderThreadRss*(tweets: seq[Tweet]; username, tweetId: string; cfg: Config): string =
141+
#let prefs = Prefs(replaceTwitter: cfg.hostname, replaceYouTube: cfg.replaceYouTube)
142+
#let urlPrefix = getUrlPrefix(cfg)
143+
#result = ""
144+
<?xml version="1.0" encoding="UTF-8"?>
145+
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
146+
<channel>
147+
<atom:link href="${urlPrefix}/${username}/status/${tweetId}/rss" rel="self" type="application/rss+xml" />
148+
<title>Thread for ${urlPrefix}/${username}/status/${tweetId}</title>
149+
<link>${urlPrefix}/${username}/status/${tweetId}</link>
150+
<description>${getDescription("Thread for " & urlPrefix & "/" & username & "/status/" & tweetId, cfg)}</description>
151+
<language>en-us</language>
152+
<ttl>40</ttl>
153+
${renderRssTweets(tweets, prefs, cfg)}
154+
</channel>
155+
</rss>
156+
#end proc

0 commit comments

Comments
 (0)