From bb6eb81a20b482b6ba1dd6da3332cd292427778e Mon Sep 17 00:00:00 2001 From: Zed Date: Mon, 17 Nov 2025 10:59:50 +0100 Subject: [PATCH] Add support for tweet views --- public/css/fontello.css | 44 ++++++++++++++++++------------------ public/fonts/LICENSE.txt | 18 +++++++-------- public/fonts/fontello.eot | Bin 9264 -> 9368 bytes public/fonts/fontello.svg | 32 ++++++++++++++------------ public/fonts/fontello.ttf | Bin 9096 -> 9200 bytes public/fonts/fontello.woff | Bin 5752 -> 5812 bytes public/fonts/fontello.woff2 | Bin 4772 -> 4832 bytes src/parser.nim | 6 ++++- src/types.nim | 1 + src/views/general.nim | 4 ++-- src/views/tweet.nim | 2 ++ 11 files changed, 58 insertions(+), 49 deletions(-) diff --git a/public/css/fontello.css b/public/css/fontello.css index d022bb5..2453575 100644 --- a/public/css/fontello.css +++ b/public/css/fontello.css @@ -1,16 +1,15 @@ @font-face { font-family: 'fontello'; - src: url('/fonts/fontello.eot?21002321'); - src: url('/fonts/fontello.eot?21002321#iefix') format('embedded-opentype'), - url('/fonts/fontello.woff2?21002321') format('woff2'), - url('/fonts/fontello.woff?21002321') format('woff'), - url('/fonts/fontello.ttf?21002321') format('truetype'), - url('/fonts/fontello.svg?21002321#fontello') format('svg'); + src: url('/fonts/fontello.eot?61663884'); + src: url('/fonts/fontello.eot?61663884#iefix') format('embedded-opentype'), + url('/fonts/fontello.woff2?61663884') format('woff2'), + url('/fonts/fontello.woff?61663884') format('woff'), + url('/fonts/fontello.ttf?61663884') format('truetype'), + url('/fonts/fontello.svg?61663884#fontello') format('svg'); font-weight: normal; font-style: normal; } - - [class^="icon-"]:before, [class*=" icon-"]:before { +[class^="icon-"]:before, [class*=" icon-"]:before { font-family: "fontello"; font-style: normal; font-weight: normal; @@ -32,22 +31,23 @@ -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } - -.icon-heart:before { content: '\2665'; } /* '♥' */ -.icon-quote:before { content: '\275e'; } /* '❞' */ -.icon-comment:before { content: '\e802'; } /* '' */ -.icon-ok:before { content: '\e803'; } /* '' */ -.icon-play:before { content: '\e804'; } /* '' */ -.icon-link:before { content: '\e805'; } /* '' */ -.icon-calendar:before { content: '\e806'; } /* '' */ -.icon-location:before { content: '\e807'; } /* '' */ + +.icon-views:before { content: '\e800'; } /* '' */ +.icon-heart:before { content: '\e801'; } /* '' */ +.icon-quote:before { content: '\e802'; } /* '' */ +.icon-comment:before { content: '\e803'; } /* '' */ +.icon-ok: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: '\e80d'; } /* '' */ -.icon-search:before { content: '\e80e'; } /* '' */ -.icon-pin:before { content: '\e80f'; } /* '' */ -.icon-cog:before { content: '\e812'; } /* '' */ -.icon-rss-feed:before { content: '\e813'; } /* '' */ +.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-info:before { content: '\f128'; } /* '' */ .icon-bird:before { content: '\f309'; } /* '' */ diff --git a/public/fonts/LICENSE.txt b/public/fonts/LICENSE.txt index c8d90ff..41f18a8 100644 --- a/public/fonts/LICENSE.txt +++ b/public/fonts/LICENSE.txt @@ -1,6 +1,15 @@ Font license info +## Modern Pictograms + + Copyright (c) 2012 by John Caserta. All rights reserved. + + Author: John Caserta + License: SIL (http://scripts.sil.org/OFL) + Homepage: http://thedesignoffice.org/project/modern-pictograms/ + + ## Entypo Copyright (C) 2012 by Daniel Bruce @@ -37,12 +46,3 @@ Font license info Homepage: http://aristeides.com/ -## Modern Pictograms - - Copyright (c) 2012 by John Caserta. All rights reserved. - - Author: John Caserta - License: SIL (http://scripts.sil.org/OFL) - Homepage: http://thedesignoffice.org/project/modern-pictograms/ - - diff --git a/public/fonts/fontello.eot b/public/fonts/fontello.eot index aaddd6bf3959a71b00b92cd01dd4067db5d94b53..2b2982a5711bffac0cb1aad4690f661e34e308c4 100644 GIT binary patch delta 901 zcmYL`Pe>F|9LIle-kaGO-DaKLSzJZM*3HB}5teR{$kHLKgNjIG3c2d~Cw6skm(4=l zhy~(dEf8v{T}Z(zqi)0 zbU|DS0Q_7OgG}AbZY+itQtg4>EdbID0E5G^u<_az?MJ@`Aj}RY6V({U$9o1p>Zmam z8#=Ln6MY9-=U6yyV7vtVNu1@e=#A0-kF`GlSR;UQc03XuX?h#@fGMlE-a3u}#~u0@ z{U`K+@mQj7=3FkH2hbP>x}#IW;fl4g5%j(2>to>=g9O!w=x?E~o(#t#TaPL#(XU{E zTgFs8@$7s1X8_$QWYd_A7;~Ak8GxEzzC!vaqka4jX-k=~r_i4KHMl~bzynMr$p1$` zDIyfX$^nZZ3wF+Jj9S@^I2RS-3@)LUao|3)%{}irTC&*BT!&3ac;1@lp zBu?l7FQFpOQ>ijrNCdzY6QzZ9lv#lLSyxI%hk$~!ja7tc1I4Iqz=_%hj-a*y6}1hx zP}^A7X4-%TSo|U225iH57WxcyKzNRY zxf~u?R}xI8Ug}ZcmL{mZ}!k-3Fn0u z)JHq%HuJGLmK8h29jX2BdO%OV(iB2k__jMkTGIDC7YWh%JH1vRUJ#QLk?V1u(+6C1 VIv!^elcQ5?XkvN<(oyeA^)Fc#!jb?0 delta 802 zcmXw0O-vI}5T3Vhx3p5aZI=RKW02ss3MHhG)+h&#RY)*WNic|6+HDs@VWka0f;L7% zh$nI5PmB`O3nybJ;o!lO2M@(?FkZYUr;TZ12pTbw)Oox5Hs4IXZ)V?ov-|km>x9tN z2C%d&#QB5$NOHM%sW`uwoChEm0AMJUQ}n0zKQ$s>1K=K}W(qB+4 z_yG;LvHnJ%R`pw(XEy;_E5<4rri7-9KcuH9t9vebv3d+m34JsK4j@U;FkhF?n{A_)zGL}W7e9YDeZ>$TxBQxFIinchZrB^y4x6>n6Zr*{CE}A5m zjO-s=6?=YyNUgO$mw)x)AYj=j_~KNerm^lDIB^m**nl#8BO2M}yxd)Ghc?j_y2B^< zw?c#P!r`#&Nu^G|i;ynkw6saOO5dgPgh3lwtQPng*KAD-~$Hu4A JrH_Gkp1<)Mv_b#? diff --git a/public/fonts/fontello.svg b/public/fonts/fontello.svg index 1f30ccc..2a64343 100644 --- a/public/fonts/fontello.svg +++ b/public/fonts/fontello.svg @@ -1,26 +1,28 @@ -Copyright (C) 2020 by original authors @ fontello.com +Copyright (C) 2025 by original authors @ fontello.com - + - + - + - + - + - + - + - + + + @@ -28,19 +30,19 @@ - + - + - + - + - + - \ No newline at end of file + diff --git a/public/fonts/fontello.ttf b/public/fonts/fontello.ttf index 29f1ec6d6ee124b4f25d2cad015933efaf7f982b..ef775f87308c85319ecd0d8c36791622adf5c7eb 100644 GIT binary patch delta 903 zcmYL{TSyd97{|XeXJ&WC%j{LWpt7vCiSAlhvv!e9ddP}UiB&R{9Nk^l*vsJBX5yur zB|aHL1VKx^Nkm91zJ$<&kJ&@@6huK6279Q`pdPmE8y#uR{O0`s-#KT_cfOgqwjXT^ zu9-k>a2HpfTvlFLV!h~>0GP?4^q33dc$FN&hZs?Y(9DPK|g^8y9!739eAk2rYm(H<0g)5CsRzSwzfwB9QukK^!IDq zs1vkfhDV2hfW3jfvt|H=s12Y9wE+~PHUJT|0a#EQ=$}e602^S&JAfUqLOUcdH7rDa zgIQ!=qcY=$Qfm`WIKs`E2%%)wOeoM)@>6AkyNjJg-F>?_S1wo)kddB iASJ-1N5Yp=YL~OmLPt|6b|eu=vV$X|A;_*d*TjFl`^A+2 delta 787 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 delta 3710 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 O#fW*JpmUl- diff --git a/public/fonts/fontello.woff2 b/public/fonts/fontello.woff2 index 551f49d02d766d86f92cf78bc80f94379da58c6e..b7541f0278434295a1178b8d5a6adff4deea570c 100644 GIT binary patch literal 4832 zcmV<65+Ch%Pew8T0RR91021H;4*&oF03+}K01}A+0RR9100000000000000000000 z0000SR0d!GgnS4N37iZO2nv{dl^F{v00A}vBm+~VPdJ_!2WSTttvBuOt5t?NL)YmCJG~_qJ(8)J$XD0k zAj9=sLs%nncEeRTi$yi=m=Ti9^8CZSdT!Qw7*T1%LT*w=n#cfU6?OMFBsM2Y~^ z*2b|s{^x=!lE|2oF)EIH;t!rrTe=Pu6_5g7`Kj#D2FQRqO8D%M6qI}$hN9lCdRjZw zR~cI8L!l2uf;to*P-tuMu5E*V;+X#}5^!3g0hCoYK%W2KTwnIxN@{)$plUxz!k}d5 z(v?n5y-Geq`V*!Hc!5YLRR4@5$^xQV+ivmrwd>Zn6>_a#VdM^D7l4UtI6Z30w4#I< zC65(qHZt+QrGSwoIS|$iuivRkm-*}aswx6Npm}I6U%kkcUF{_Z1iMN_ecAT?)KB~|EvXr4LWh6@(%UWszrA%chGg-=9ma>qgEax1? z%4+t>(em9G|L4Afg6lAdBG>+6Y<~@P`5>^i%=kV%m-fyb%=156Y_BG|X{-hJfZFd6 zoJ!t7pq-yP7}TnDa7eSoXZBSmdqk9!d|@*^Uk2T$V7&8FC>V^r+#t?=cC4$5$j)OI7eE=|n5W zD46116V?}piYG`B5az!4CFqMmb1HBjhoZVtg!^_Ti%fLW>X&d78yc~E_FGdUK1XPn zKe-7*-4gS?WPz-$4-xGAQV7j2EkX68uI-&bXkG@C%u_Uwy`(?og((CQ$w}{}r}*_j zrNjd{M>ESOq9aAYZ0eK=qOxFA5uB<*P)$gx3q=iKQB&B|5>8hR)%`_L`P!YJQbW&c z$`c)P0TrqHzU6$y(ET`NZB#$ZlZ<^(`Bm5GMzWy;MHh-56n!WLPz<3MK{1A60>u>C zy8v0VR$5Fa%2|54jC$rQQf9$jYnE_hk~}?4$1+4lvLuU|XLX}~%c<5#PAi34v6T8M zXS)>3%_76>Ae@d8#;dBi<@DY)$OX`y>!{G(RQ#SAN-#oF5p(~*$27}2Th>A%=PB8M zEXoLa3n2dkIW|!rSafWKOCV03zQ{HTlhmb_5wJC7=t?^qSscj{Hq93I4Vdq?0?qE7 zcI*JmeP^Opc=E$!mx7$c~Y0@Jub}*p$R^q@ZPQx6xIoWl^mO>sBCDiojast2W*t3PQr7If>aeRdAGV$~(az5s zp?OCPRB8=+IXhz*n~fM`G1g@%#4|TrpV)W9jPL$rvRfSad7lD1X<<`OgWc4&wRW#Z z*lvYOp;)u@n$FZ?&Nbtx^|4IByx7`0jXv*}T4!0O&!V_J?%{22&;N>%18aHoHtgw( zI%}+}G};J}&UIlUX@t+OJl$xutR=aT__z?yuJUyq)^4-sOl>rGmNF($dQhzqWz+rOOE!ttcXf#oaU$|og>_p*y0YNi8jG-%L5@#-jjk~)W4|g}7 z?ryvSL~jXwB)#9ccjr;;`1&#*aF9ln4@F&Z{EFd=f*w6 zi0;xS&W9;#F>nV0!Sv;n4?Hws2goH#+8kLzULXxZ2uUt%m9D zY=7^KKX+u*5(3JDM2uSUKapVc01Q(BeH|Jb6GCNWrBVSj_-LQ}kZMv!uT zw|811Q%iY7qQHWA*Yfs$z8a!Ly^Dg9l0IJwh9E<^c8|8y9Vf zN=U|fwT(@TlJe7gE;X_d%_$P}3u@DmJ{r7ng+~0E+bALZUw?Aor zsB7!Vt%rmUPCj6TRkfxioJ~uTW=XTEC;v(b7mt5jsknI5-0WaM{>Gnw#(}z$77Qr8 z9+Wrv`Nv~rm2Cre%R7A(H5J>vMk2Oe_5;m07VeYGe_7I)&s7hFVd8B7FRP%XrF@Jd z>3rrr{UDBvJ$r@*K7Sn;*tKiVfNp3~-krYR>`d6k4!`5Fu+;ThdDZvp%h#I5-nzQp zMuj3RMPbJKK0Z!pxp29PZ9TbR**%Y|8+#l3`?E4~(neV8zF$ z%C>Fua^j@Rdev?Og{4JB_cAZ>{(D5x*UtIt#CD+raC23;)z%+-3ujsA`ZKlluxR$~_w6Y;l}1(+J0~qmOOr-_h&bD~9(w?<*-D*(VI` zcRXKQjDFH~e?od+*4yZC%{>5z6v#|iP}6bpfa};XvdfV-E2EMO(nK<*>7X z;Bm6a0Wp?Q$p-17ADKoy^|lPIxhH5t&zBh^$)Sn)bMmVR-zO%r{Fb2fjR7Z40aFvG zC@AaxK2b-<(RJ&NceH`c1L3+)`aPyS`k&L9abslmxucQpr-h(N)8F`}NrZ8lu!iI8 z)MIyXcePVrWZ$$iXY)D6M!xiE<*bfmx8~=!Gh2l0wt7zMfT)F?m(OgYc@=vxn%VWu zoLN>2n9|A;4X|78%A;jbua#Yp&uTB`wsIz~rB#-1tgP$;#noU(xj6MqiMJ#-HJ9&Y z*WJTdzD~ebru%0G3f8O^Gpm_V74cG9TW4*MG(g<=2g%|4=#VpE9ry&f;!2nF46fG4)?4&;h4SIB$H#Q^(|bw~B(#xJ;Vln8hdSD5P0%~TK!u}SG3 ziPY7Wh15foQOVVTBW&}SHz=& zC@!@L60ULrbQgloYM=1>SU=MlDy)RcKh4cX%*d()E9Fw&h2b_6@)Hmo@>wd;7_AEe zB6{!;{4(6bZ3GXe1HF(BdzDPLf>soTwi?LIDgcl09%3#9Gezq{q%Ld4l!NKep+TGk z;g1E58mUi4r|8o*35iNwH~{C%!(B;moIPpM z&Y;{$lX2v#vD{1oVipPM1PBwC(rkcmJ_u){EE)+l_)cwGABNxwm~4raivkmRjua(c z?G0161uZXkdVVfi4dU)><)f_olwNj43BV;Gw$gQ{tQ6vd3 znok!OrYreMyH$}ET)!rHmk6^g2x)tkC77eYIx@S&V}djZ;;0u|ZvC$)WnKEgzkc5g z;U@D3KxC!U2rv&x3F5N2-FLcXMxh>!X3HP`fpJE0-W>Lo8qUqh$!O4E(!)R+X~8{D z%H^*M`DH=4R*dAq1h6G>Jqo(R6f{vkysPhLH+|;s{crpB7l2>J`KD)%!+||t;%mnLNM_<%y*MMO@$rftU>pc zi)i8%4tgHIJ$ytkYQw0NG zog4A`z{sA>k@Bcyia=4*UQ5x~F!O9=4tEyW5nftlVHt{8p@2eUAMpmU#MwGw5wkH* zzmI1#Nqj-AvJgEb%cI=%BtJ&YK2k~3FB<6^M!-3;B1J5rT7cc^ix`iQ$0G?~s5wmsT_P-@^B~&rK09A}9K_#94z!IJjmdFuc=tWBqi$11u z7#RHWA{NfuGVb|4k#E5gz9TP-Ah`64AC~}$XA#hK!V_;H(n$zRds`Qt{sZ7uU-VA~ z;PhKRo$D`PKKCa{BF1fBTV)+syvP(^b;{p9RTOWUUft$ue13?^^p}5z_!YJ<{g5>Z GNo@dwG#q~b literal 4772 zcmV;V5?k$ePew8T0RR9101~7C4*&oF03(P101`?70RR9100000000000000000000 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 diff --git a/src/parser.nim b/src/parser.nim index aa0f8b2..f132dea 100644 --- a/src/parser.nim +++ b/src/parser.nim @@ -231,7 +231,8 @@ proc parseTweet(js: JsonNode; jsCard: JsonNode = newJNull()): Tweet = replies: js{"reply_count"}.getInt, retweets: js{"retweet_count"}.getInt, likes: js{"favorite_count"}.getInt, - quotes: js{"quote_count"}.getInt + quotes: js{"quote_count"}.getInt, + views: js{"views_count"}.getInt ) ) @@ -339,6 +340,9 @@ proc parseGraphTweet(js: JsonNode; isLegacy=false): Tweet = result.id = js{"rest_id"}.getId result.user = parseGraphUser(js{"core"}) + with count, js{"views", "count"}: + result.stats.views = count.getStr("0").parseInt + with noteTweet, js{"note_tweet", "note_tweet_results", "result"}: result.expandNoteTweetEntities(noteTweet) diff --git a/src/types.nim b/src/types.nim index 55d990d..5a08bb7 100644 --- a/src/types.nim +++ b/src/types.nim @@ -203,6 +203,7 @@ type retweets*: int likes*: int quotes*: int + views*: int Tweet* = ref object id*: int64 diff --git a/src/views/general.nim b/src/views/general.nim index 5ba40a3..0571aa7 100644 --- a/src/views/general.nim +++ b/src/views/general.nim @@ -53,7 +53,7 @@ proc renderHead*(prefs: Prefs; cfg: Config; req: Request; titleText=""; desc=""; buildHtml(head): link(rel="stylesheet", type="text/css", href="/css/style.css?v=19") - link(rel="stylesheet", type="text/css", href="/css/fontello.css?v=2") + link(rel="stylesheet", type="text/css", href="/css/fontello.css?v=3") if theme.len > 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?21002321", crossorigin="anonymous") + href="/fonts/fontello.woff2?61663884", 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 34dcd4c..6d76755 100644 --- a/src/views/tweet.nim +++ b/src/views/tweet.nim @@ -184,6 +184,8 @@ proc renderStats(stats: TweetStats; views: string): VNode = span(class="tweet-stat"): icon "retweet", formatStat(stats.retweets) span(class="tweet-stat"): icon "quote", formatStat(stats.quotes) span(class="tweet-stat"): icon "heart", formatStat(stats.likes) + if stats.views > 0: + span(class="tweet-stat"): icon "views", formatStat(stats.views) if views.len > 0: span(class="tweet-stat"): icon "play", insertSep(views, ',')