This commit is contained in:
Faye Duxovni 2023-11-01 16:18:42 +00:00 committed by GitHub
commit 673cb4df17
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 56 additions and 7 deletions

View File

@ -163,3 +163,34 @@ proc createRssRouter*(cfg: Config) =
await cacheRss(key, rss)
respRss(rss, "List")
get "/@name/status/@id/rss":
cond '.' notin @"name"
let name = @"name"
let id = @"id"
var key = name & "/" & id
var rss = await getCachedRss(key)
if rss.cursor.len > 0:
respRss(rss, "Tweet")
var conv = await getTweet(id)
if conv == nil or conv.tweet == nil or conv.tweet.id == 0:
var error = "Tweet not found"
if conv != nil and conv.tweet != nil and conv.tweet.tombstone.len > 0:
error = conv.tweet.tombstone
resp Http404, showError(error, cfg)
while conv.after.hasMore:
let newer_conv = await getTweet($conv.after.content[^1].id)
if newer_conv == nil or newer_conv.tweet == nil or newer_conv.tweet.id == 0:
break
conv = newer_conv
let lastThreadTweets = conv.before.content & @[conv.tweet] & conv.after.content
let feed = compress renderThreadRss(lastThreadTweets, name, id, cfg)
rss = Rss(feed: feed, cursor: $lastThreadTweets[0].id)
await cacheRss(key, rss)
respRss(rss, "Tweet")

View File

@ -62,9 +62,11 @@ proc createStatusRouter*(cfg: Config) =
elif card.video.isSome():
images = @[card.video.get().thumb]
let rss = "/$1/status/$2/rss" % [@"name", @"id"]
let html = renderConversation(conv, prefs, getPath() & "#m")
resp renderMain(html, request, cfg, prefs, title, desc, ogTitle,
images=images, video=video)
images=images, video=video, rss=rss)
get "/@name/@s/@id/@m/?@i?":
cond @"s" in ["status", "statuses"]

View File

@ -45,7 +45,6 @@ proc renderHead*(prefs: Prefs; cfg: Config; req: Request; titleText=""; desc="";
let ogType =
if video.len > 0: "video"
elif rss.len > 0: "object"
elif images.len > 0: "photo"
else: "article"
@ -106,15 +105,15 @@ proc renderHead*(prefs: Prefs; cfg: Config; req: Request; titleText=""; desc="";
meta(property="og:image", content=image)
meta(property="twitter:image:src", content=image)
if rss.len > 0:
meta(property="twitter:card", content="summary")
else:
meta(property="twitter:card", content="summary_large_image")
if video.len > 0:
meta(property="twitter:card", content="summary_large_image")
meta(property="og:video:url", content=video)
meta(property="og:video:secure_url", content=video)
meta(property="og:video:type", content="text/html")
elif images.len > 0:
meta(property="twitter:card", content="summary_large_image")
else:
meta(property="twitter:card", content="summary")
# this is last so images are also preloaded
# if this is done earlier, Chrome only preloads one image for some reason

View File

@ -147,3 +147,20 @@ ${renderRssTweets(tweets, cfg)}
</channel>
</rss>
#end proc
#
#proc renderThreadRss*(tweets: seq[Tweet]; username, tweetId: string; cfg: Config): string =
#let urlPrefix = getUrlPrefix(cfg)
#result = ""
<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
<channel>
<atom:link href="${urlPrefix}/${username}/status/${tweetId}/rss" rel="self" type="application/rss+xml" />
<title>Thread for ${urlPrefix}/${username}/status/${tweetId}</title>
<link>${urlPrefix}/${username}/status/${tweetId}</link>
<description>${getDescription("Thread for " & urlPrefix & "/" & username & "/status/" & tweetId, cfg)}</description>
<language>en-us</language>
<ttl>40</ttl>
${renderRssTweets(tweets, cfg)}
</channel>
</rss>
#end proc