From 1b5e8dd1ad535fb0bb8c37156613567d19b7c329 Mon Sep 17 00:00:00 2001 From: Faye Duxovni Date: Sun, 4 Jul 2021 02:39:07 -0400 Subject: [PATCH 1/3] RSS feeds for threads --- src/routes/rss.nim | 31 +++++++++++++++++++++++++++++++ src/routes/status.nim | 4 +++- src/views/rss.nimf | 18 ++++++++++++++++++ 3 files changed, 52 insertions(+), 1 deletion(-) diff --git a/src/routes/rss.nim b/src/routes/rss.nim index 69264a6..47c5038 100644 --- a/src/routes/rss.nim +++ b/src/routes/rss.nim @@ -133,3 +133,34 @@ proc createRssRouter*(cfg: Config) = await cacheRss(key, rss) respRss(rss) + + 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) + + 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.more != 0: + 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) diff --git a/src/routes/status.nim b/src/routes/status.nim index 3125bb3..ea8de71 100644 --- a/src/routes/status.nim +++ b/src/routes/status.nim @@ -53,9 +53,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"] diff --git a/src/views/rss.nimf b/src/views/rss.nimf index 1728b02..52d26b8 100644 --- a/src/views/rss.nimf +++ b/src/views/rss.nimf @@ -136,3 +136,21 @@ ${renderRssTweets(tweets, prefs, cfg)} #end proc +# +#proc renderThreadRss*(tweets: seq[Tweet]; username, tweetId: string; cfg: Config): string = +#let prefs = Prefs(replaceTwitter: cfg.hostname, replaceYouTube: cfg.replaceYouTube) +#let urlPrefix = getUrlPrefix(cfg) +#result = "" + + + + + Thread for ${urlPrefix}/${username}/status/${tweetId} + ${urlPrefix}/${username}/status/${tweetId} + ${getDescription("Thread for " & urlPrefix & "/" & username & "/status/" & tweetId, cfg)} + en-us + 40 +${renderRssTweets(tweets, prefs, cfg)} + + +#end proc From 78c6250cac70a37054281e64dbc93e912ceb86aa Mon Sep 17 00:00:00 2001 From: Faye Duxovni Date: Sat, 8 Jan 2022 18:37:19 -0500 Subject: [PATCH 2/3] Properly set preview card type for tweets with images --- src/views/general.nim | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/views/general.nim b/src/views/general.nim index 341e3c0..838f347 100644 --- a/src/views/general.nim +++ b/src/views/general.nim @@ -36,7 +36,6 @@ proc renderHead*(prefs: Prefs; cfg: Config; titleText=""; desc=""; video=""; rss=""): VNode = let ogType = if video.len > 0: "video" - elif rss.len > 0: "object" elif images.len > 0: "photo" else: "article" @@ -93,15 +92,15 @@ proc renderHead*(prefs: Prefs; cfg: Config; titleText=""; desc=""; video=""; 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 From 31fdc369f9d81e6ea4969a907ec492c3104f936e Mon Sep 17 00:00:00 2001 From: Faye Duxovni Date: Tue, 25 Jan 2022 10:08:14 -0500 Subject: [PATCH 3/3] Use Chain.hasMore, not Chain.more --- src/routes/rss.nim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/rss.nim b/src/routes/rss.nim index 35763a5..8688d42 100644 --- a/src/routes/rss.nim +++ b/src/routes/rss.nim @@ -180,7 +180,7 @@ proc createRssRouter*(cfg: Config) = error = conv.tweet.tombstone resp Http404, showError(error, cfg) - while conv.after.more != 0: + 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