diff --git a/src/routes/embed.nim b/src/routes/embed.nim index 994364b..7f58ef9 100644 --- a/src/routes/embed.nim +++ b/src/routes/embed.nim @@ -34,3 +34,6 @@ proc createEmbedRouter*(cfg: Config) = redirect(&"/i/status/{id}/embed") else: resp Http404 + + get "/oembed.json": + respJson generateOembed(cfg, @"type", @"title", @"user", @"url") diff --git a/src/views/embed.nim b/src/views/embed.nim index f244c8b..981e28f 100644 --- a/src/views/embed.nim +++ b/src/views/embed.nim @@ -1,9 +1,9 @@ # SPDX-License-Identifier: AGPL-3.0-only -import options, algorithm, sequtils +import options, algorithm, sequtils, json import karax/[karaxdsl, vdom] from jester import Request -import ../types +import ".."/[types, formatters] import general, tweet const doctype = "\n" @@ -22,3 +22,14 @@ proc renderVideoEmbed*(tweet: Tweet; cfg: Config; req: Request): string = renderVideo(video, prefs, "") result = doctype & $node + +proc generateOembed*(cfg: Config; typ, title, user, url: string): JsonNode = + %*{ + "type": typ, + "version": "1.0", + "provider_name": "Nitter", + "provider_url": getUrlPrefix(cfg), + "title": title, + "author_name": user, + "author_url": url + } \ No newline at end of file diff --git a/src/views/general.nim b/src/views/general.nim index 53bd6b2..78b8fe9 100644 --- a/src/views/general.nim +++ b/src/views/general.nim @@ -91,7 +91,10 @@ proc renderHead*(prefs: Prefs; cfg: Config; req: Request; titleText=""; desc=""; meta(name="viewport", content="width=device-width, initial-scale=1.0") meta(name="theme-color", content="#1F1F1F") meta(property="og:type", content=ogType) - meta(property="og:title", content=(if ogTitle.len > 0: ogTitle else: titleText)) + if video.len > 0: + meta(property="og:title", content=stripHtml(desc)) + else: + meta(property="og:title", content=(if ogTitle.len > 0: ogTitle else: titleText)) meta(property="og:description", content=stripHtml(desc)) meta(property="og:site_name", content="Nitter") meta(property="og:locale", content="en_US") @@ -119,6 +122,10 @@ proc renderHead*(prefs: Prefs; cfg: Config; req: Request; titleText=""; desc=""; meta(property="og:video:url", content=video) meta(property="og:video:secure_url", content=video) meta(property="og:video:type", content="video/mp4") + verbatim &" 0: ogTitle else: titleText)}\" type=\"application/json+oembed\" />" + #link(rel="alternate", + # href=getUrlPrefix(cfg) & "/oembed.json?type=video&title=" & encodeUrl(stripHtml(desc)) & "&user=" & encodeUrl(if ogTitle.len > 0: ogTitle else: titleText), + # `type`="application/json+oembed") # this is last so images are also preloaded # if this is done earlier, Chrome only preloads one image for some reason