From 313ddcebcb9524a0496050dc2b0bea4bedab78e0 Mon Sep 17 00:00:00 2001 From: FloatingGhost Date: Fri, 30 Dec 2022 04:57:23 +0000 Subject: [PATCH] Add blurhash support --- package.json | 1 + src/components/attachment/attachment.js | 7 +- src/components/attachment/attachment.vue | 8 +++ src/components/blurhash/Blurhash.vue | 66 ++++++++++++++++++ .../settings_modal/tabs/general_tab.vue | 9 +++ src/i18n/en.json | 1 + src/modules/config.js | 3 +- .../entity_normalizer.service.js | 3 +- static/blurhash-overlay.png | Bin 0 -> 27640 bytes yarn.lock | 5 ++ 10 files changed, 100 insertions(+), 3 deletions(-) create mode 100644 src/components/blurhash/Blurhash.vue create mode 100755 static/blurhash-overlay.png diff --git a/package.json b/package.json index e712cffd8..297a93796 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "@kazvmoe-infra/pinch-zoom-element": "1.2.0", "@vuelidate/core": "^2.0.0", "@vuelidate/validators": "^2.0.0", + "blurhash": "^2.0.4", "body-scroll-lock": "2.7.1", "chromatism": "3.0.0", "click-outside-vue3": "4.0.1", diff --git a/src/components/attachment/attachment.js b/src/components/attachment/attachment.js index 4dcacc7e4..3155abf0c 100644 --- a/src/components/attachment/attachment.js +++ b/src/components/attachment/attachment.js @@ -18,6 +18,7 @@ import { faPencilAlt, faAlignRight } from '@fortawesome/free-solid-svg-icons' +import Blurhash from '../blurhash/Blurhash.vue' library.add( faFile, @@ -63,7 +64,8 @@ const Attachment = { components: { Flash, StillImage, - VideoAttachment + VideoAttachment, + Blurhash }, computed: { classNames () { @@ -84,6 +86,9 @@ const Attachment = { useContainFit () { return this.$store.getters.mergedConfig.useContainFit }, + useBlurhash () { + return this.$store.getters.mergedConfig.useBlurhash + }, placeholderName () { if (this.attachment.description === '' || !this.attachment.description) { return this.type.toUpperCase() diff --git a/src/components/attachment/attachment.vue b/src/components/attachment/attachment.vue index 947b1bfc9..f9c4f1c8a 100644 --- a/src/components/attachment/attachment.vue +++ b/src/components/attachment/attachment.vue @@ -64,7 +64,15 @@ :title="attachment.description" @click.prevent.stop="toggleHidden" > + + + + + + + diff --git a/src/components/settings_modal/tabs/general_tab.vue b/src/components/settings_modal/tabs/general_tab.vue index 2fa20742a..5d1357112 100644 --- a/src/components/settings_modal/tabs/general_tab.vue +++ b/src/components/settings_modal/tabs/general_tab.vue @@ -407,6 +407,15 @@ {{ $t('settings.preload_images') }} +
  • + + {{ $t('settings.use_blurhash') }} + +
  • { if (masto) { // Not exactly same... output.mimetype = data.pleroma ? data.pleroma.mime_type : data.type - output.meta = data.meta // not present in BE yet + output.meta = data.meta output.id = data.id } else { output.mimetype = data.mimetype // output.meta = ??? missing } + output.blurhash = data.blurhash output.url = data.url output.large_thumb_url = data.preview_url output.description = data.description diff --git a/static/blurhash-overlay.png b/static/blurhash-overlay.png new file mode 100755 index 0000000000000000000000000000000000000000..209a9438ffad2f53209b202de7da5c25153782f2 GIT binary patch literal 27640 zcmeFZhgVZe+cv&Ig<}C!6qKscq$4fTu>qkfy`vz#hZ?$igo88*CDKJhZ_)|XhLli4 zZ;1*Cgbo2i3CV9oJ@0eg?|HuO_YXXKEmrng?7e5^o|${*zOL(@*!%jLOs6D12VHO0f2ic`0g#^;OwC(N zJ4$>Lm^M*aInzF|zI&vlvp(G-Q6}NuGTvcYQQz&$MF#)?5cPabCTD1y*)xkwkzh*BqQh+ePhVL|05>T=HM8?8*%yl62fX(A`4{pA$ zb)f?Q8^FG zm7@nDY4*-smo7=cuL48Llrr{C`v+yF6)&>4W|4l1K3}7dv$5k&Oh8Qn0K8;s1czv& z$HdJ^c?*~@)rqG8$D%yRy^9T=GxpB1^Z+>g#A|tq5|#D=6&6Moo--1f01!2H=>*Un zZE8XhXzZCcf`wSsMbHdl6U7FoFYcBZ?hh^!EgL*6Moh^c7vK+fqz z3o&r>w`k5f2(GvLVqah1($er-qAGQ7KB>QFgb8;Z004C}J^=8~wY#C_^HqK6Oo5@W zJg`YQ+;D&R@QSOF=5i0$&(42h21E@U8ly>8tqFPBA+?<|w5q&(R0jYx-)?}_QtI^4 zZu7*v(dtUpG=4B|kLM$G951cXTy(${B~_CET)4rpl@P?%>ZnKcED%j7pS^PT?SV)S zF*&}Sb$aQP38Ra0PH&QH{VW+;C@Sp!v`gxASEUhKNJb9?daD6t-$>4tGfGG4m}5L{ z3cY`N7XZ{d@MgE4>g#Zv4r^$w$!-j@^T~ff=-t-jKa#%}k$!xfGw{xWf_u5rs}7Bf znGK!pn68!wO5&iGBdf|82LhhOh+^VmJ#bluvMZ9~nz&M=*S!eS=4mu;2)*|?4DYMs zm*aol(WzZ56&^CE(;;D-XWOn6pi(%+C>*8+dyEvryou{@d@zx?A3DBPbKmy+?3-n5 z>P!$WnSK(R;U1X)iHj zUftL0>(18Och5pZvObqxINah??lEc$|C8O%7J1T=j}DXhQI1;!z4FWLUNB0eSeiDT zoKRQpZk*n$b7@1-l|M4ic-&WKHd-+pd+*v*t_vM7>0X9Va(hKhMC`|P+K=sQ&3DNu zD7Z%W*CXuA8rpQwCy*d1wURJ)k-S0osTxPh4kK^a>u=w_ef1FKKYBLH%o6l@y(er% zK*hvD6Jae;l)woZI8?r-25T|sNDUo$L;E0kc3h+1MUUY%m`y?7@IHsSsJLa__2n{^Qh$1Lk+eF`nTGBFU0vO!gOw_h zpn+CqB>N4luu0~RH0^@P%b%hz_2D4X?cpt^<>vV&Wu_&KjUfN2jEu`|+r6R(Q-cv~ ztrmN=h{y-sdc$A8zNRc!QMAj%nU|8U_UI-s;Y3UV6V)x3$Ic4E%t3TT-mMxb^*V`M2*u&qd~ z-?pC?BW&>7T_oR33yqHNAQHs7dyIcd+1i*VMhUG<+G6lJSRCh`JH>Ah_^n&dYcx1mQk0C z`n9QC`^O@{{p%O9x3;!ELsNA1^i1aJWFf~cT`ouT^gD3=lq7=>+ zB3+H=x{FG#@Mq-Y=vixWgZhZu3i9&fKB{*HoQs|Tsh7>hdv*FRZr{#-*(_Es1#JGg zAD-#QanmmE&vF@*74#r37KAce1f#{BJ9qT@ zljfU1B~OIpl#CV#=aC>ky%r1ovM-$Y(lB{Gtw(OJ9W_PoJ6T(ZO3ImZ$3#cFDMmjj z$~da`8q_Mx!3Vik!qt)f3#uRF9Fbx_v_l51MmPAKgEflsFZ1vl7X6Ra z1c9Mb{SoKCpX7=QGUSPq!*99V!+iPj9a9<>ZLBTrD(OM@a#oFDaRPQDEjwQFHZ*au;R2%Rz`D5;TXQbFc1^4!T*o+7@F(npI zAMZsSldeoL&5e6sU33D7O-&x%I`dMiq3F_SMPNw#s=+FHGY@^2d!wX8*f}h0)}S8q zkTJLJ%dVhpz$bGZR?O6tg<9k;#%0{+Q<#;?zHE}ibk<;TA;ME519@EsSKzoPaR1xf zgOwkBP*Ier+^{5DTr~5m&aEHJ${TR%*t2v z-Xj;bA*~05;i!S7rD7Rb*$ZR&$$6)q-!A1`e{a;<^sSDZ)%oGW2jfF!d3m-l_R+{` zQ}@~}j>J5*h#<7was_DBoSB(fFc%9!a(QSs%SoG6-1*fM0lKJ{cofQg&h{Y|-djvA zat+~LrQRC8Lvcikjn5u$ztiDdk(#z$^C?S6Z?nhB+n9&A-%6`OW`}x2sU@4jV=!@hYKpknF*b3Fn!d`#-_H8~W9M7ba$=RVkNKgYqmHA1ormOwt*4oRT z-2(&Vn{>@(`f+$=SCN>j{g6e0D#m45LyQ!b(4R7j03jB)n-lG>*tyzmxCr*@){CXW zn+J7Z>L>8KAr0)^)K{dS92H8W2@%~W$y)M7iOx}XYg9VBje&=Of%4_7rG>^WU%I+j^PUEm+`o>nwBzo&1Ib$a z;z`XDSs|j;GO$I^JZYah^;h{>Sc0)dP)jz5zUqx_lKxjEXCI$;xsL`v?ycxI-{9ur zI)mTh=1Vfc3Yfg0pXd>n%bsz1-Dixt4K3Mk4R&&Nrg;-+TK4VyuVWPeMbwKNM4c0YOVQ~69(}o{`x;#p$l9o ztl3ILbcsOc_};RL2=BWZeBLy~=wbh=#&q>j6~|L^$e$Ai0#i3|uH@?`K^M-X8tax7K^BeQ=Rjy>g0>yh(YbKdGoYzKs zw$VkY6EEibPH(QpcVi*Qs*8Q62QIl{M6dmy4pk61yUlxW^0-^G+- z5)#X<|0(Nd1AB+Wp`X4Jss3gb;EM zyQg;;scWFwhn6?%Zp+v!xwT%ye5%hLcI5#)9`?4JrchPSf zj<2~&?%f(OP^;i2e`QRT`9U&M(Zar7D0-gbq?6$q1TC?64cj-e;hG-wZ-8YM-oNg0 z_+zb_sB2)bQkdl>t#*+1k+|3sVzC;Ht<~@KhfcMHHeQZz?tn!I6aGSAzlbRoEF zBlkY>_Vsw17{2N00qYqUlvPzp?i{`kY{@_I{`N%4HoCZ}H(+Fe2&HWZPaW*+)X95e zJRD`pO*7SR=ieW)@@^|=3ngXphE5FREill-p3(u*e*pl{ zB$4c2HA@ndOvt(cN4d^_Nyx{BZ+>7*SoqNKD6#q5k8Gu&fozZEk>2AJJscBg_N>x8 zFLkf08MI9~+|cBChQZk4h|nBms3EK}{cxdte&e~h;Axxy5rWK)*ow3JY)VI%dK6 z4CnJnAKt%@ijIkC>rvC0zD}|s^IJ&7&25K{Gh2vA7U6RFxK%=As|`-|c$&O};I!w0 zu;C%NG_#$LrzKxalo@lM3BH5o>!r9`M2-Cc0Pp7RK(L-W7f+p-3n$H4HhS5trnCsQ zd_0`*6|E`{m@>%9O4EvST#zA5D(^3(h@-S#6SmyI!)^^Pbu VwNotf}W2uMFXCvq% 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