Implement link previews

This commit is contained in:
Zed 2019-08-07 22:02:19 +02:00
parent afdbb6ad9e
commit ec5f67123a
5 changed files with 44 additions and 9 deletions

View file

@ -27,7 +27,6 @@ is on implementing missing features.
- Search (images/videos, hashtags, etc.) - Search (images/videos, hashtags, etc.)
- Custom timeline filter - Custom timeline filter
- Nitter link previews
- More caching (waiting for [moigagoo/norm#19](https://github.com/moigagoo/norm/pull/19)) - More caching (waiting for [moigagoo/norm#19](https://github.com/moigagoo/norm/pull/19))
- Simple account system with customizable feed - Simple account system with customizable feed
- Video support with hls.js - Video support with hls.js

View file

@ -140,7 +140,7 @@ a:hover {
.replying-to { .replying-to {
color: hsla(240,1%,73%,.9); color: hsla(240,1%,73%,.9);
margin: -4px 0 4px 0; margin: -2px 0 4px 0;
} }
.status-el .status-content { .status-el .status-content {

View file

@ -68,9 +68,15 @@ proc getUserpic*(userpic: string; style=""): string =
proc getUserpic*(profile: Profile; style=""): string = proc getUserpic*(profile: Profile; style=""): string =
getUserPic(profile.userpic, style) getUserPic(profile.userpic, style)
proc getVideoEmbed*(video: Video): string =
&"https://twitter.com/i/videos/{video.videoId}?embed_source=facebook"
proc pageTitle*(profile: Profile): string = proc pageTitle*(profile: Profile): string =
&"{profile.fullname} (@{profile.username})" &"{profile.fullname} (@{profile.username})"
proc pageDesc*(profile: Profile): string =
"The latest tweets from " & profile.fullname
proc getTime*(tweet: Tweet): string = proc getTime*(tweet: Tweet): string =
tweet.time.format("d/M/yyyy', ' HH:mm:ss") tweet.time.format("d/M/yyyy', ' HH:mm:ss")

View file

@ -24,7 +24,7 @@ proc showSingleTimeline(name, after, agent: string; query: Option[Query]): Futur
return "" return ""
let profileHtml = renderProfile(profile, await timelineFut, await railFut) let profileHtml = renderProfile(profile, await timelineFut, await railFut)
return renderMain(profileHtml, title=cfg.title, titleText=pageTitle(profile)) return renderMain(profileHtml, title=cfg.title, titleText=pageTitle(profile), desc=pageDesc(profile))
proc showMultiTimeline(names: seq[string]; after, agent: string; query: Option[Query]): Future[string] {.async.} = proc showMultiTimeline(names: seq[string]; after, agent: string; query: Option[Query]): Future[string] {.async.} =
var q = query var q = query
@ -91,7 +91,17 @@ routes:
resp Http404, showError("Tweet not found", cfg.title) resp Http404, showError("Tweet not found", cfg.title)
let title = pageTitle(conversation.tweet.profile) let title = pageTitle(conversation.tweet.profile)
resp renderMain(renderConversation(conversation), title=cfg.title, titleText=title) let desc = conversation.tweet.text
let html = renderConversation(conversation)
if conversation.tweet.video.isSome():
let thumb = get(conversation.tweet.video).thumb
let vidUrl = getVideoEmbed(get(conversation.tweet.video))
resp renderMain(html, title=cfg.title, titleText=title, desc=desc,
images = @[thumb], `type`="video", video=vidUrl)
else:
resp renderMain(html, title=cfg.title, titleText=title,
desc=desc, images=conversation.tweet.photos)
get "/pic/@sig/@url": get "/pic/@sig/@url":
cond "http" in @"url" cond "http" in @"url"

View file

@ -1,16 +1,36 @@
import karax/[karaxdsl, vdom] import karax/[karaxdsl, vdom]
import ../utils
const doctype = "<!DOCTYPE html>\n" const doctype = "<!DOCTYPE html>\n"
proc renderMain*(body: VNode; title="Nitter"; titleText=""): string = proc renderMain*(body: VNode; title="Nitter"; titleText=""; desc="";
`type`="article"; video=""; images: seq[string] = @[]): string =
let node = buildHtml(html(lang="en")): let node = buildHtml(html(lang="en")):
head: head:
if titleText.len > 0:
title: text titleText & " | " & title
else:
title: text title
link(rel="stylesheet", `type`="text/css", href="/style.css") link(rel="stylesheet", `type`="text/css", href="/style.css")
title:
if titleText.len > 0:
text titleText & " | " & title
else:
text title
meta(name="og:type", content=`type`)
meta(name="og:title", content=titleText)
meta(name="og:description", content=desc)
meta(name="og:site_name", content="Twitter")
for url in images:
meta(name="og:image", content=getSigUrl(url, "pic"))
if video.len > 0:
meta(name="og:video:url", content=video)
meta(name="og:video:secure_url", content=video)
meta(name="og:video:type", content="text/html")
meta(name="og:video:width", content="1200")
meta(name="og:video:height", content="675")
body: body:
nav(id="nav", class="nav-bar container"): nav(id="nav", class="nav-bar container"):
tdiv(class="inner-nav"): tdiv(class="inner-nav"):