From 279fa097715323abc6ffeeb697c145535ec33102 Mon Sep 17 00:00:00 2001 From: Zed Date: Sun, 21 Jun 2026 20:37:29 +0200 Subject: [PATCH] Add video download button Fixes #263 --- public/css/fontello.css | 71 +++++++++++++++++++----------------- public/fonts/fontello.eot | Bin 10072 -> 10228 bytes public/fonts/fontello.svg | 6 ++- public/fonts/fontello.ttf | Bin 9904 -> 10060 bytes public/fonts/fontello.woff | Bin 6320 -> 6432 bytes public/fonts/fontello.woff2 | Bin 5176 -> 5284 bytes src/sass/tweet/_base.scss | 2 +- src/sass/tweet/video.scss | 34 +++++++++++++++++ src/views/general.nim | 6 +-- src/views/tweet.nim | 15 +++++++- 10 files changed, 93 insertions(+), 41 deletions(-) diff --git a/public/css/fontello.css b/public/css/fontello.css index eb41de7..8f9abad 100644 --- a/public/css/fontello.css +++ b/public/css/fontello.css @@ -1,12 +1,12 @@ @font-face { font-family: "fontello"; - src: url("/fonts/fontello.eot?49059696"); + src: url("/fonts/fontello.eot?59696369"); src: - url("/fonts/fontello.eot?49059696#iefix") format("embedded-opentype"), - url("/fonts/fontello.woff2?49059696") format("woff2"), - url("/fonts/fontello.woff?49059696") format("woff"), - url("/fonts/fontello.ttf?49059696") format("truetype"), - url("/fonts/fontello.svg?49059696#fontello") format("svg"); + url("/fonts/fontello.eot?59696369#iefix") format("embedded-opentype"), + url("/fonts/fontello.woff2?59696369") format("woff2"), + url("/fonts/fontello.woff?59696369") format("woff"), + url("/fonts/fontello.ttf?59696369") format("truetype"), + url("/fonts/fontello.svg?59696369#fontello") format("svg"); font-weight: normal; font-style: normal; } @@ -36,113 +36,118 @@ -moz-osx-font-smoothing: grayscale; } +.icon-group:before { + content: "\e0c3"; +} + +/* '' */ .icon-views:before { content: "\e800"; } -/* '' */ +/* '' */ .icon-heart:before { content: "\e801"; } -/* '' */ +/* '' */ .icon-quote:before { content: "\e802"; } -/* '' */ +/* '' */ .icon-comment:before { content: "\e803"; } -/* '' */ -.icon-group:before { - content: "\e804"; -} - -/* '' */ +/* '' */ .icon-play:before { content: "\e805"; } -/* '' */ +/* '' */ .icon-link:before { content: "\e806"; } -/* '' */ +/* '' */ .icon-calendar:before { content: "\e807"; } -/* '' */ +/* '' */ .icon-location:before { content: "\e808"; } -/* '' */ +/* '' */ .icon-picture:before { content: "\e809"; } -/* '' */ +/* '' */ .icon-lock:before { content: "\e80a"; } -/* '' */ +/* '' */ .icon-down:before { content: "\e80b"; } -/* '' */ +/* '' */ .icon-retweet:before { content: "\e80c"; } -/* '' */ +/* '' */ .icon-search:before { content: "\e80d"; } -/* '' */ +/* '' */ .icon-pin:before { content: "\e80e"; } -/* '' */ +/* '' */ .icon-cog:before { content: "\e80f"; } -/* '' */ +/* '' */ .icon-rss:before { content: "\e810"; } -/* '' */ +/* '' */ .icon-ok:before { content: "\e811"; } -/* '' */ -.icon-attention:before { +/* '' */ +.icon-attention-circled:before { content: "\e812"; } -/* '' */ +/* '' */ +.icon-download-alt:before { + content: "\e813"; +} + +/* '' */ .icon-circle:before { content: "\f111"; } -/* '' */ +/* '' */ .icon-info:before { content: "\f128"; } -/* '' */ +/* '' */ .icon-bird:before { content: "\f309"; } -/* '' */ +/* '' */ diff --git a/public/fonts/fontello.eot b/public/fonts/fontello.eot index ed1dba857060b1a79481fb41b396899d62adf5c7..a5b8b1c828238c11e8974fa766522101f98eedda 100644 GIT binary patch delta 831 zcmYL{T}TvB6vxk^AP$Zd87drG0ItxP=OBuOe9yr1Y`Q?#`|oyF1f5ek73< zh&@Q4BN0I&QLs;9EJ*aK4-pAHL?oE(gVgv`i$)2$)0y3%8UFX&-?{gkdk*)0xvF zBG>gLw4UKh56o=spqnOXUMGbnn&~S^tsgwXiI)O5Dj3o>(V^}qTtC*hzIGm9# z0DFmz=U9xO0?)gTSGLqvl4hY+XeQLyQP)XoJs*5BKF)NInS3xmim^b+i!V$ z%w47pt#!%PcOMoYORDr)vD!Jo&)HgS_(TeK>dCwp%P8^apWWU=WFK(Rlro@lgE4ui zpTp;u(zx3LiYD7aN+KaAHT|&XW_5X38A`?#DST3jYkVk{3dLnMmW(KDFqR5KX4qZp1Qrd-3#Dxn{#6esbs$f8gcan&2ICI}Q=iYbkoB1*F?zD1# zFR&7sSK?A?t-L;e{Qm7@1827Yb_PH?V`%1=!Dp|CuK>bwX3FX%omS`Ja(zX+(^#Cs<+L*IO~tA}`!2HZ3YC9Ch= zY>@_NBmbjW)XiI~!>d3<<&W6~mgc`%QgFZ%!oiURFiHaEAl7&LDYnpE7a(Db^cHv_ zKyW%M9hK;|uT}#b{NLAWDV_3S?!#XTLv)a`#6)(IOm_mXa5F9F7B}EFbDE$AaGId@ zaGIbI;MBoSNXz||4p3*RS1CptKmgeGHGm-Oe&sD&+9NZ&>Ur<8k9O`8y4TBVsmtxj zpJ*4|=J@>S!-Id3-&K#W5Pzu#_!~7DO4a@d!+=z^oO zp9{2#R5lup^+BGxqF*n`^cRbkd~LE|>7Go%F!Tva&K3)kCbz?vcu!Z*KHT-f{}(#z BnKu9c diff --git a/public/fonts/fontello.svg b/public/fonts/fontello.svg index 19db3bd..5dc65a8 100644 --- a/public/fonts/fontello.svg +++ b/public/fonts/fontello.svg @@ -6,6 +6,8 @@ + + @@ -14,8 +16,6 @@ - - @@ -44,6 +44,8 @@ + + diff --git a/public/fonts/fontello.ttf b/public/fonts/fontello.ttf index be34c4eb29f2d82cecf4fa1e586298f6c227dc50..a2b972e4e7bd607a369601898c58629f84572d35 100644 GIT binary patch delta 747 zcmYL`T}TvB6vzK}?(FQY+HULYHrto3Az@#eX_}-D+iUcVkV}}(eroJG!@8MCWd-7k zh&d4vbAIREd+t4)#mlQ#W@R)xVAb@(0>)AE1EqDSt=&gSc@Zn~#oOe^S~3{C*1bXSBE) z9y{JaoF{I{s-rsV^vn^@6NiS>Y;x`O;X2}v^uaY<8_sV}Y(xO%CG8jWTvC6u)VTy4 zU3|8EizSV2)+H2{jahc4Zyt=!0B^v{-bu1mRO&oLP|5JX1p!iF+2WR5^c9=7+@%sg z49oGK%Q-3wqdOk>(QHqnRyfTRGa~F^7aIQ^Qtay$*-u&&wnfjtvf2I+Cu=i_J_5^T zZcOuquqBgAq8Cu~RfGW9ri!o+*m73{#XKu9W~$;RX0|yu+)2t;y2CAgqg-ZNq@{{M zV3)uJJ|Qvz!UWaMaFg=0J_mX1D&TfGC5K2ixKEOl6M?pd0BiL%_*xmae(Reox49d8 zF*zw*WOKW*-Eo*6UsyQQQ~T|6pSSBLyu4iAm)`XiN(J@Pq6(2g53a=>^mcN`?2 zM@xT%PO^5}?C}^&D6l$XTdwy`Nej;NPHK9&O+oXBznZh45mv%(wjYjkPP?lcy~+XO op>n&vCZXLM%4llhl$yy)@xfd?lN1MsQkobW%q3ucS5`cK0c(r51poj5 delta 615 zcmYLFOK1~O6g}_FG@quVjTt+GRE=6fi;^lxg*NEYRsBFW!J?T?zLIH%X_Q*OxY11| z`mof6rJ#$hLSdka;7T__yDP4`5JeoM3qujog~U5a#5bI|@0@e*yZ60~3u_bA*!{DE zlUo401R!mgy7goD?I+@E0IwN0D>2e(sSWytb5`D*PVCJCT7YOzUZ1r{?<4;g#X!Dv zD>rs$fqXel{#GHYXGS#nJrF%j{%C;&|3m3D@e=XDf>}w;O}uFCkx(UJs#G@g`0DTm z@g3qPO?}Q{W8q~$86X~;(ar4U%Y%oACuzVXG`;Zm`(|T>Rg+YAK!a z65c0{@)0`7Cv@Hr77v~GCIHhqdHr5>8(ufJ1L^>`1L_aA1DXMD3t~m89jiw`t*Kt2 zIMfFA1G~XC&=2Q!*Jt+XuFRav{_UXiJaU{5d{}yuy4IWgjb6!Xj_=>TJoy*JcJxeC z^>n@pNK=Frf-B<6IW^V%!^ep&dD*l^k;XE9iU-Q!(7fO0zutN=)u|~ViK*h9nqUxh k^?7`$l(KShCRdiHi+09&tbGjs1)d_6qW}N^ diff --git a/public/fonts/fontello.woff b/public/fonts/fontello.woff index 699b2ba8dac6b7779f2af3fa038c640a520a8706..65508cab902dc908c494270d67bd581be72ab387 100644 GIT binary patch delta 3952 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 diff --git a/public/fonts/fontello.woff2 b/public/fonts/fontello.woff2 index cfe8dfb8c45eda69650856a8a6f5f37cd2a39e6e..a8d96dae603809573488cac09a3d37788567612e 100644 GIT binary patch literal 5284 zcmV;V6kF?ePew8T0RR9102HJE4*&oF04GcU02E9B0RR9100000000000000000000 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 qTJ2n)vJ2M?0dl8k{Dr literal 5176 zcmV-86vyj#Pew8T0RR9102DX?4*&oF04A^i02AK;0RR9100000000000000000000 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 0: link(rel="stylesheet", type="text/css", href=(&"/css/themes/{theme}.css")) @@ -119,7 +119,7 @@ proc renderHead*(prefs: Prefs; cfg: Config; req: Request; titleText=""; desc=""; # this is last so images are also preloaded # if this is done earlier, Chrome only preloads one image for some reason link(rel="preload", type="font/woff2", `as`="font", - href="/fonts/fontello.woff2?61663884", crossorigin="anonymous") + href="/fonts/fontello.woff2?59696369", crossorigin="anonymous") proc renderMain*(body: VNode; req: Request; cfg: Config; prefs=defaultPrefs; titleText=""; desc=""; ogTitle=""; rss=""; video=""; diff --git a/src/views/tweet.nim b/src/views/tweet.nim index 3d785ae..b66269a 100644 --- a/src/views/tweet.nim +++ b/src/views/tweet.nim @@ -97,6 +97,12 @@ proc renderVideoUnavailable(video: Video): VNode = else: p: text "This media is unavailable" +proc getVideoDownloadUrl(videoData: Video): string = + let mp4Vars = videoData.variants.filterIt(it.contentType == mp4) + if mp4Vars.len == 0: return "" + let best = mp4Vars.sortedByIt(it.bitrate)[^1].url + if best.startsWith("http"): getVidUrl(best) else: best + proc renderVideoAttachment(videoData: Video; prefs: Prefs; path=""; bigThumb=false): VNode = let playbackType = if not prefs.proxyVideos and videoData.hasMp4Url: mp4 @@ -127,6 +133,11 @@ proc renderVideoAttachment(videoData: Video; prefs: Prefs; path=""; bigThumb=fal if videoData.durationMs > 0: tdiv(class="overlay-duration"): text getDuration(videoData) verbatim "" + if videoData.available: + let dlUrl = getVideoDownloadUrl(videoData) + if dlUrl.len > 0: + a(class="video-download", href=dlUrl, download="", + title="Download video"): icon "download-alt" proc renderVideo*(video: Video; prefs: Prefs; path: string; bigThumb=false): VNode = let hasCardContent = video.description.len > 0 or video.title.len > 0 @@ -345,10 +356,10 @@ proc renderDisclosures*(tweet: Tweet): VNode = buildHtml(tdiv(class="disclosures")): if tweet.isAI: span(data-disclosure="ai"): - icon "attention", "Made with AI" + icon "attention-circled", "Made with AI" if tweet.isAd: span(data-disclosure="ad"): - icon "attention", "Paid partnership (ad)" + icon "attention-circled", "Paid partnership (ad)" proc renderLocation*(tweet: Tweet): string = let (place, url) = tweet.getLocation()