From 6491a4b57d6248037613e4fdea3b52f8a3c449ca Mon Sep 17 00:00:00 2001 From: localhost Date: Wed, 7 Jan 2026 20:48:04 +0100 Subject: [PATCH] move away from s3 --- bun.lockb | Bin 53568 -> 53185 bytes package.json | 3 +-- src/utils/upload.ts | 45 ++++++++++++++++++++++---------------------- 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/bun.lockb b/bun.lockb index 62e448dc793cd9c86397619701b6c2ae1bf56eae..68ff44b5468acb7e6e84f642fb5dac97c6c31d27 100755 GIT binary patch delta 8298 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 HJM_N+x=~hf delta 8575 zcmeHMX;4*Hwm$m+$^kFPAaJ=LlM^T)Tt;OO(R;wd;26Xi1OXWh&|(z9M5D$?LRK75 zQE>#*nkbsqq|<3qUEOV-NyTTEdB&K;*PS+|(;2LK>5xI+x6VB`+Fj;Vb=CWst>69l z*4}6Dz1Ci5-*fIBIN5P54qy~ZkOjAx3PYQPTcMKCT{;5 zGhN~)zx0lzmu;OzAq$f`?85%(D@pDB_|px13~T~F2WES7b5$9)+9f1OfgUYOk_Xt| z;Ekwb-B7`;Bx!r+#gMF1&XVK>V@p$c9ber8&7BgM8*ehWp(47ft|>)&+)0w$^-iK2 z>g#KyI*Jq_ZO^$%QYfsg;1OU2>VxYSE=;bAi<58oA;2b{$}jHPW$ZO+$HO zaD=^`BaQzxed|k`SD*{Yk;Xn~&y$UT4bd!VpFP?hg{cOQL)EIlid6K_-@qy9p6UJ{UFTLuK?(>Ri^sfGooS$_T7ipEE zy0{2Qno4oiKGb5GD64{AQEcKQ2{%>Tpj>=5Qzt$z&^3JiKw<8xoaIC--EHD9opx8n z$291!DrVe~37CO1bq>pv^PTCbVK(tPT^^s37wnet>8DmB?eEA^RFF+g9L zRM}++P4ciQlZQxB2HFX_?2#$f&_xebyhvW2s<=nRo~l;@GJY27v2p0dn`RA5Ryts{ z!fK{0Ty=)xhO0^-Vli7E@w6#Z)X>0iRs5P1FIDkHn5S?bG%zYtnG2N%HWf2d8{Yh@w16CO7&O8UfSTV%3pZW36o8+B3Dw-PNE*SSo%nDrI!>}r5aYg+TQO` z>IvW#z8#<{UdVlJ?@SxKe{3)3deLKMn^;c+W>tR4OJC7XXjY&qM|;zrK$}=gHv?7i zJBqZZqLNlwROLK26ArJF?)Wz(f>b31Ny*`4l!rb$K3ol3xEdogTyKF^JDf${MRXI#%^^4wa;AjD}p& zi=a67WJQIQBPR%nh6$I9Q*Uk*e578}RuqU5r#^-*EDd zvWdA=9Hojq)DxvD*RgTg7aqNNjmI{`{a{1T3&wCuR_bBpTfn}i*f+oAI?!`%;VL#oRpekR$HU~EQdY96wXjL4c3;6sii5OLh!T!aOb>SWm!A{ur z!IlV{pfJBo@g9Z6s!AyKH%?(6>Iuvg3+Qxgb`^4$_invB$h=J;9reP@8Y!lihcWgM z2@9+jW{v_DQ7_Ccw0&Yo8%sE^mxnQ51!wj0AoJ*Oh`%)1Q@t>Ad))duWAoEF6U^ly z+@?2}f=cdiD!?6N16-I{Bm8>34a|j^?W)1psr2$N=6L z1nnyUXP^e)0qX!RKgDfa!3`S>eiY2*LFW1<-TH9m2{!|LXKw&Fq8kCWZvwb5b3dB_ zwr>H@u1(rz7@oEpq-Vg~u+v~Nc!$Be4DK>`ufg45F3k9XmJYE%`M((%#0@xP$GA1h zgUmBMu3PQQo}B>L{(@m=9!fW?{`8sEwT)}~jhcrs_wce&&&;l#H~1AWU;iq=g_-rQ z0dDsjL%$Aolz-VR7U*_1@&!IdD`wUs4E-=3iaOpVxG?j;yiIUn{&~B=w(;|JflS~` z`gyx}aGO9t^lgLhnSX1$DCa94woP!4Z2y1RE@*4YrMyKAeSeC-+Bz)c{Ch*BrPWXF zywX?fyk+*&eYf}gvEUCmU*yD&{p;+@do#bkc2(Q&7JKWW=sR_|Yk$MBKflsYwD{|r zn5mHNdfo*)QEqAxeUoaUlc}0;p+TtLNhVr6NfSepKK!2WKAekJh_Nm(@gXl zlshSDMRXpjHcb;Ix&T#~Zld6HO?XmOdJzR=nCLAiFEVEo(I25&Gc@5t7ol1*O%$D} zi4n9Wvxvq`G0_bue~O$^ME?b~eTpW`bPZ}tmWk4{G-08wSw)mG)kJ@X3Z~SlMf3?& z_f$=U&~2#Q*(S=*)KgHXNG;oo#kjHSNm@XrSS zY?_FqVjKKZ;UCm^QdIZ{RjXXrGvVJ%O{mm26aLMDf3q}^OU1L` z-)#5?rI9il{z28w)Ze^4hEXri13p?Vj>zlEBppuUChZxQ@kq=_mjUIhOZ z!#}8MQWnEMsM^JvsHF=~l}q5?5>3=o)e`u(6#hZ2BJ)!C2i3Y%6OD8cs%07cTc+XX zg*D6IUkUt!T1}B9@DFNxiH08mu0d@ng@2_Q-gdT@!oTJ452}??m%~4(?&X?jquWrs z%iv#`CN@x48T>1Ue^5_QZaMseI$5rXO*9DAy8`~L(D0tww*vlEz`qJjY^CCgBE06G zuGogxW?#HEJJXa(SC@mhi%s~A#GjrGckZvO{GBZB^hZ}8m*v3`6jS|(-f&`_tIKNq z=%w_>RX-v3w^ydfG}B{T|IE5x=b!laPIhbQ;Jr(d-tVBa?J4|xd-tBbu=NRm_dLf- zphNR_ien#iJUa5;7htsK$47ohV?+X6wgTLjD?c)#OyoyK6t}cyYkWp%LTF>vWAx?r znOVbOU619-4rpby|J`w(y#I07664gmZpc@Wr78#;W%3fj>Tk-7|e6fhbH z1o%;k-+}NluD`W;gI@#qS&pCY_<_6%sHU$vLfTH_uQkAWfJ3tySO@$9cnoL-T7Y(7 zEzk^11^B%o3K$PW0~3H$AOT1OCIRCB4oxgD7MKXc0ZBkI5YIze@kb0W21o(;NzVuH z1^DrjUkB=e8sH4Ti}@75@z;PnARm|p%mr*fI*+&jy7+0iXi>8pv;80UWrM z_+umx0)zr#z#L$iv3QG~rw_J|Y1<6bMqmTL!C3`xztsSD!Tn_coF7P0{T<2`%sIok zBmft{85jx-0sH`7F7_2aQ1Q>J{9~iU*~$6Hap2|i;y`iEcmSS&0%QWb#_UWQFd5(# z;2?5zIno?)$LjD(@rrPOc{MoT93b{L6kz`?0Ot@-fZGKF_ShgdIKd(S#7t+0<|U2- zVt`P9mz$TEQvpk?uP~}w>)p!gQ;FX*XOarnx9GrJ77SQER zpEh3nS-?zy7nc)(7nqY_9xxl=gy6Mgu;#kOz!G2uPz6*16+k&q1}q0kfn~r#fZOsl ziws_B=e8d^;>r@E^1;TAzqvDR!vi`7e^B#)59)g8I-nM)0XRO*;3l9EcvNRB2;aA> z0Zt#jM>$>E0aWSt?K&{uvwR<~2RLF+0FMJ43BGm{Pz^i@YysG|6?h7G_IZ4ue0|)` zZfOhSlNL9pWQ4{ig;F{BIKke(nzjjl6GnFY^eu}e6JsXEAP4*D-t%VsvTEL8mHlNZ z*b!hEE!%&%kGT5OK+lnNtI;?iCLsoiT1OjpSjFRXZb!alJ9_3WPrUqn;fopLe{dE{ z;$rYmlJ-#W&U}2sRPQuf9A{Oz?*u7})?QsNi}i6B7=887ft_Y?iZ1AFhweIu-@#wo zWwtmDf}ZJ8EALoN#OkB#S6rd5cA4>Gt^01X#c_z_opW6)src}e?ocw1eupx5o0A-; zQ0wwPtJ^tr@O{)L+Q)UAf2~{W{9;Sv+Fzl@YM*z2E4A+pNOBx##rywq%wuuuHlsl@ zF2!x)I0`#bwzTz7Ui}=S1~*QQE4{xvz~VSNI}-K5w&vW(8AbzmTTPx_W{cwt?n&Ek z*KW4fG@u@Fe!*S>2#1{M?8s2fviXH;VmCMDHKJ1b^67flqZ$ zz8q_!oqOW(aCC7`evso7t#EbJfyB!%-o?PY4A_T)Jt=-~e30XK&9`N}Wz@ls_T676 zdsOUU7q_T?Z+_4SZ~K8uW#g%P-+I1K&ZpuRMhYyp(f3T zKEnu(gFQ>w^}+m+^LOYC^hnO7kZyCLGl2QB*$stpjUbI-GsNg^otT= z;u55X)*yYceQ*~6;yjH#P=Uj!XAYPX9cOvz?z^r;`CfYMzCVuBzL);vm+wV=D9uBS z6|0aSNmuE{0kg$%N?4Fz<=o-CsR;GFN~r%Ec^x#1uW9^2bCBb#(YosFmea2;^u6DU zr-has%o9uK(z3^?@?l`*h6&dNF`i=aLQ2Qn|;d*Lm z`KMVYFfA-1$H*m&K0h3gqEcgb&iX%##oW0_&Rk*r|(XRny~&-#%{eP zE(W);cNnD|iI;Q3so_X~#c`hgOyU=QcN*_JEerk%<cj%4dmrTtyO^=q;R8>?qMK@Zh cqqjEfpDeM_vHzr_ar;ooKv@5Gy}uvxzYXH2*#H0l diff --git a/package.json b/package.json index e0758b4..00a0156 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,6 @@ "kysely": "^0.27.4", "pg": "^8.13.1", "readable-to-ms": "^1.0.3", - "rolling-rate-limiter": "^0.4.2", - "ultralight-s3": "^0.0.7" + "rolling-rate-limiter": "^0.4.2" } } \ No newline at end of file diff --git a/src/utils/upload.ts b/src/utils/upload.ts index 7c6b0d9..fd15fec 100644 --- a/src/utils/upload.ts +++ b/src/utils/upload.ts @@ -1,36 +1,37 @@ -import { S3 } from 'ultralight-s3'; import * as fs from 'node:fs' - const keys = JSON.parse(fs.readFileSync('s3.json', 'utf-8')) -const videos3 = new S3({ - endpoint: keys.endpoint, - accessKeyId: keys.videos[0].access, - secretAccessKey: keys.videos[0].secret, - bucketName: keys.videos[0].bucket -}) - -const images3 = new S3({ - endpoint: keys.endpoint, - accessKeyId: keys.images[0].access, - secretAccessKey: keys.images[0].secret, - bucketName: keys.images[0].bucket -}); async function uploadVideo(video: string) { - const videoFile = fs.readFileSync(video) - const uploaded = await videos3.put(video.split('/')[2], videoFile) + const uploaded = await fetch(`${keys.endpoint}/${video.split('/')[2]}`, { + method: 'PUT', + headers: { + 'x-authtoken': keys.videos[0].secret + }, + body: await Bun.file(video).arrayBuffer() + }) return uploaded.url.replace(keys.endpoint, 'https://s4.archive.party') } async function uploadImage(id: string, url: string) { const response = await fetch(url) - const buffer = Buffer.from(await response.arrayBuffer()) - const bufferHash = Bun.hash(buffer).toString() + const arrayBuffer = await response.arrayBuffer() + const bufferHash = Bun.hash(Buffer.from(arrayBuffer)).toString() - const exists = await images3.fileExists(`${id}-${bufferHash}.webp`) - if (exists) return `${keys.images[0].url}${id}-${bufferHash}.webp` + const exists = await fetch(`${keys.endpoint}/${id}-${bufferHash}.webp`, { + method: 'HEAD', + headers: { + 'x-authtoken': keys.videos[0].secret + } + }) + if (exists.status == 200) return `${keys.images[0].url}${id}-${bufferHash}.webp` - const uploaded = await images3.put(`${id}-${bufferHash}.webp`, buffer) + const uploaded = await fetch(`${keys.endpoint}/${id}-${bufferHash}.webp`, { + method: 'PUT', + headers: { + 'x-authtoken': keys.videos[0].secret + }, + body: await response.arrayBuffer() + }) return uploaded.url.replace(keys.endpoint, 'https://s4.archive.party') }