diff --git a/src/routes/rss.nim b/src/routes/rss.nim index d378396..8464c78 100644 --- a/src/routes/rss.nim +++ b/src/routes/rss.nim @@ -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") diff --git a/src/routes/status.nim b/src/routes/status.nim index 7e89220..3369e36 100644 --- a/src/routes/status.nim +++ b/src/routes/status.nim @@ -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"] diff --git a/src/views/general.nim b/src/views/general.nim index 5e96d02..ed01167 100644 --- a/src/views/general.nim +++ b/src/views/general.nim @@ -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 diff --git a/src/views/rss.nimf b/src/views/rss.nimf index 036a7b9..d90709c 100644 --- a/src/views/rss.nimf +++ b/src/views/rss.nimf @@ -147,3 +147,20 @@ ${renderRssTweets(tweets, cfg)} #end proc +# +#proc renderThreadRss*(tweets: seq[Tweet]; username, tweetId: string; cfg: Config): string = +#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, cfg)} + + +#end proc