From 353cef7dbda5d8284987d63c2c43e69d14919a8b Mon Sep 17 00:00:00 2001 From: Sucukdeluxe Date: Tue, 3 Mar 2026 16:35:43 +0100 Subject: [PATCH] Add JVM hybrid-extract retry and clean up Java extractor - Add automatic retry with 3s delay when JVM extractor fails with "codecs" or "can't be opened" error during hybrid-extract mode (handles transient Windows file locks after download completion) - Log archive file size before JVM extraction in hybrid mode - Remove unused ArchiveFormat import, RAR_MULTIPART_RE/RAR_OLDSPLIT_RE patterns, and hasOldStyleRarSplits() method from Java extractor - Keep simple openSevenZipArchive with currentVolumeName tracking Co-Authored-By: Claude Opus 4.6 --- .../extractor/JBindExtractorMain$1.class | Bin 1710 -> 1693 bytes .../JBindExtractorMain$Backend.class | Bin 2260 -> 2204 bytes .../JBindExtractorMain$ConflictMode.class | Bin 2014 -> 1958 bytes ...JBindExtractorMain$ExtractionRequest.class | Bin 2539 -> 2539 bytes .../JBindExtractorMain$ProgressTracker.class | Bin 1387 -> 1387 bytes ...ExtractorMain$SevenZipArchiveContext.class | Bin 1663 -> 1666 bytes ...ExtractorMain$SevenZipVolumeCallback.class | Bin 3742 -> 3763 bytes ...ExtractorMain$WrongPasswordException.class | Bin 458 -> 458 bytes .../extractor/JBindExtractorMain.class | Bin 20639 -> 19231 bytes .../extractor/JBindExtractorMain.java | 66 +------------- src/main/extractor.ts | 83 ++++++++++++------ 11 files changed, 57 insertions(+), 92 deletions(-) diff --git a/resources/extractor-jvm/classes/com/sucukdeluxe/extractor/JBindExtractorMain$1.class b/resources/extractor-jvm/classes/com/sucukdeluxe/extractor/JBindExtractorMain$1.class index 55f87ba814f8112b2582c5f6d5035bc72c8d65a0..9c99eaf749a8dfb599781b2f9298326fd73033c6 100644 GIT binary patch delta 831 zcmXw1K~EDw6#iznW!vpmS|}}`P>>>RX(=coC>8-hS}atG7{JR?M=X@3ZWkmmk&{2b z%-O`77h^QhV#Hv)deFb%-Tz>GTXB+o-+S}ky!XvF`_}u?yZ-&p=MwDi~65QNbk@E)2LZY~y7W4H&V#D=HL>su;sn6>YetU|hj<1?d-aee(?7 zeZ3qp`Ho&PO2#IGw4PoCL7~GsL>(wf+GNgqe zr`-$<Gsg;w^s5bE7vjOyZ`709rHz z5z^3#a~e7@qhMA;H*PUBZ|VDbsGZ?GX)g$Y{u7 zUc+tMbRef-LBk^Q8t!0;VL<$pl7S%xU%g>jH#Sp?8(X|+iLg8*en=B6K_!VKjpPRw z-PO8RvK|%qJ~!4%6$J$b|IEJxQCQ-S_juJ3&m3!gax}KW(E6X~Y^lr__pHjERj^F1 z@0_ZzB7U(k(IZ7X3@&Sza-_O=C?&-!DI8!>^auO8Q6$kE(X8DtZ8H|{9R5KJ(z`c- zm_hdWY`FkJQml?78vQ5|eI4kes<1e8w)9Hz6`5ONKNlx{jJpY8o$$D@<)y4DV$z3)0 z`cK|aQx6dg(h#XWEDn{1dEsVf;9-6=vjBpu2_e>u5!Qlf7DSGPkiW}X(L?OqaJX4k rK_rY`3LVr@fs6~}OXx$iz86CrXUS`)OdDc^?Ie!9T$rMG8ts1p*u$L= delta 864 zcmXw1OHv&Vf%p~W&=H#Ax???Yvf9TiW9~S@yvFe2jZV`fvDtPP@ z*Fb5jd&CJ=%kV;C@E5gQm&x}u-O!CJgKIPCq-7a?++dKMbl%+0n!Hf@IhBwQKu|=j zj5^da1a`Ed7SCx$HolbJ;Tem;lOQH*oWULGS(DI+kccK3&1kXPg!Z0yrfzYDs>tS4 z&zgvv40RO_eLp_GG;^5Yc}w3nM6}y|F4ZGKVF=lp5K<+C5v)ch`LldG$4w>8^*tq( z**3YJ=Ej)fRCLR@jXU;)Fe*uCMURXqV)lEXE9_)@W!y!Kq1xI{StjX~(1t!oOTYbD z==Dn&z@UgB8N(Q{e+%J&gi(x%cpxKzhYX3*Rf1%T+MA+gWJre)Njfqf*?(O9?ybmz ztq4taKYQKbP3c)fvkuJvV&`erDND=jE^7HzEuG``F`E;fGN`31wN=I!ogOr+ASY8+zWpbZ>Oa^M=9A>6}(5@B%~4^7Tpzt5m(qO%W>$66ww;SEV%+Pw!w`jm9FP7Ux_8LfF-h8 TDC5k+c}9`MGDV&frqJ>ar~sln diff --git a/resources/extractor-jvm/classes/com/sucukdeluxe/extractor/JBindExtractorMain$Backend.class b/resources/extractor-jvm/classes/com/sucukdeluxe/extractor/JBindExtractorMain$Backend.class index 2c503da0737e1d30407c4a92d221262c657b17d3..09518699da0d8717ce0b1ab36b33c596496374f9 100644 GIT binary patch literal 2204 zcmbVN-BTM?6#wn!V>inJaSK$iR6vSJfCiNoTd?xcv<(KR4Nybmsjp7T3jH-G>8+aCZX@gRZ_ zUT4d!ggML$NC>ztVE`$%+z@e7!Y!mDSi~FbD&9lG#!B)TF6e`DE6y4J%KVgyHqM%vvhTVd`G1j>DbnqzF7Gup3#9JmkV_1fBjYI4dtLal5t#gQE zjl88gu1&PMPq`Lnm~FdQSg&QgJ?l`Bm(-FMih%bxNUEmk=hAjX*7YCxqdw=mOMs;*I&NZF!mYx)g?736Gl7hYtYCF4cJWW?D}C1ku0Rlp{P z$yP#?k%T7WCD43;5+_5)wt&2h`!HneV3!6-b)BLN69pNA7^aP>hdbm@VuI#`8k|G4 ztnca8L!)%OCF26ahG=VYN5%+KhE4_}ZJK&sHRtTSThJ{hwXf+V$0%A9_6evqJ@c+% zZs|5-Nh#`Ev+}NPI!0c%2mGNNzpLBM)d3k6h-eAh3_Hn|mpOEt*kjcpswW#Y2gFh{ zix#E4E7n-@mCYSpbI9k||4A)}ON}k-y*JYhE#f~3jgA;Ea?{gz&xfU1hXv^sA>vQ7 z^8v^4xQ<~aGeu2htrNVnva(u#i5iZ`OPf>76hEMcP%RU3#P`{VX{1*764oEMs!5N} zQv>OzD89iVtd>gNJ3D?#7|kaAsuCg5Db~EqPS6uRK>r}2*d1Pf`QXiNbmx zi1xAeCq0Y^Mll8sA%Gy+k`trn4k0AQe*yOs=`{}>bPE1cg!xBk<3GbIbi&iWp@>U$j}^Ml z)BgR$Ul0}XN33t5kfiTTtJZz z(f=47o_ap0L_JmU)aOIW8BgsB|4!%tB_Nv%R-j~ap$fXPkHMehSz$HcKSC$}G0yX! cV4SKN@UuOG*T^N0Yj}aAL{vgpz|d^pe_|XdZ~y=R literal 2260 zcmbVNYg61*7=F&#U9ua(rICxJrBcKK3v^K_*n*VXViy;vU7&?}X$WB(2no$5$n>A+ zAMh(~6*^*TN1ds+(eeK{j_(O!cNM-!KIG&*@BMi%`Q`6#o&y+wn*c{dLR3KvRSW~V zvz03Ny1%(*SpKe&GIl*z(>=#c%}ki~TKbrr)l9o%Len=5dyOHsqglSepk_C;9W7;P zc0QH!T+_}E3kPup3CIl5@x_IChQaJvyabjM1vSD_O)kBZo?FS>o|(wZO$i@$3hD(X zMwbIK;zm{Q3K|%sj-~PJVmik#bpLFgWi+8#LW6==ah_c0mSa=44PD(8`OdFy7`its z;{q;9XjO0tuQAk?0ZH5b7DW?4HNVbqt*b(N($Wfr;fjk8zDf_mKw$r}f_A*lP&H!O zrZ>vaRB0;I%ycis@dg8AbfQZ_w}K>k80yOr9Z6DMs8kf%zw;^8uMbxxq!jey&0}rf zGp$tC(KU-;h~Al>UnteSf<>`*;%$Z6>>5M0=VYBv4R=y2kj|Ab;7aMrR72-+43T}! z_Z(sBx`G=RrnHSmzGf8|8Y|Nd@$X)V<6Tl3dc3h3$4v%Vd{OICGsZDa85E2i!+vaT zmv1MjrgSl|AtBAsUIr**Sw>#7#@)QXW!PSNS2wmj)3GJI$Ix7sI|_HgH?1|pl`)Ns zsL%{Uq)SvG%h0lD=Y7NS%)H^Yg>%z)*KoZXZ9;xd!8~qLYTEX8Fj0M#sfB2q1Ss@K zKu_b2f}E&t+;fiPWlUjF#If`rq>jx|WC@uDWmyQVFm#>bGjmEyl3q<5^+NSy1)t!7 zn6aR(sV3LEy3aUel>M=h=%lkoT~e1dZDY>gS~c7SZB_Kz%qbyupKYia5;-$(Yo70t z;l#S@Y%Lvav6`Gmi)~ih4xP%Ht{a6y$54NN5W$(Y*U92hC&x#0D;(il6+nwYA30lA zqhwXiIlikK)22YI`Q+ZdDjJtT$=Ei{qgXsfLBcje@Bhh+iXQgySU+{b1^S=F#?FgH z570?#Iyh-56Gs)l7ofgHtYo4klGE@2468)7(78N zE6MXfLsoh6DOz5DpOojKrztLBzZVfi=~R+E7Z1>u?E4z*%aVs$;(~vVD*gki`HwJ& z!?A=o)=M6Xq|fR8Ve%#7YR4C-N$%rH5xx6(E2|Fn?Bku!AQd6)sUw2;9F6Me(TAdr zmDtsL>O_gC-8;n8@*$>|4{%F;e;>1Cb9Nse9AM$QAO?|tJH-M15)J$(wDO;Eng5Cr z{u{>l@5t~!Fw6f$p5*FLmB>iw{0lYoZiy)MaXf?>BGyW$z&Mut3hV?}G|Du^p=c_A z3TUo+2EH7joN~+2BC2!Cu_9`7CzL6^4a|hf_o&X|88{?e^=?ERJixstkOK04R2>b- z>VW((rcMN8?Nfa81n0^XQAG&+Th#GqxWu2MkLn)@>#_-p>~n0vrc)-r91b3hwfqAR CZ8w?# diff --git a/resources/extractor-jvm/classes/com/sucukdeluxe/extractor/JBindExtractorMain$ConflictMode.class b/resources/extractor-jvm/classes/com/sucukdeluxe/extractor/JBindExtractorMain$ConflictMode.class index 6376bb2641afbe8505a14e6de333b3739a7e4e4c..3770d2101b57a2b2a42737daa6d1bc7a14e74753 100644 GIT binary patch literal 1958 zcmbtUZEw?76n^Zuv11$vrqEGdT1r=vmXdD37_{s9Lf8UH!GV(I!RCJ@D z;69h1@MT`b2^1CdspLek7ZnW3SP&2^lrr;6^Vx-r0BzQFR&C4l^KONansprJ&Duu2 z&gufjbEaEM*8?+Ht1vs*WNEhPdxq(|Ui$8g7wshPIWwWIQkQoWBHQ;PQ3v-n<`O)!0Wh@F%CQN$|G~Yot;{>&dLvWp>E~-U0@Jx2c;$`VM*!3&CIvU>QV?3mx zge4iD3b^^dCr85w${I#-MF1!}4G*v^<1-DP;|mQB@g)_=-C*8h&+?fD11lQ(FhB!W zU$fS!Vn%&U!$oe1ddx9uK%#AEf(z&}ZP%gF zb|+IEohz(7Vx~{!zx-e7DBybMNQLKkyaTm0zHJ(u7eA{s*u?LjB=+3*X$QV#r*p1p z@JW#73kAAM^d@@8F9JK_yE*qU-6KYwJcsrub^3Is+KLioUj>Fu$NFSv5_^?MJ)mwH z>+8&^2pH{jctcW6(_Z6d)4#Cyx0a^H=#D&3SF<#An$HqIk|rpWG&?||mybAk zbRmXINJ2o0v;mU*QMVy9AihRqi!=elv_|g;oqU?@-xJT8&I|pYe3EEM@AaZ zoN zi*E5doD;vt1@Q-56@SDH@h41)&v09Oj(5o~foLo%&J{Rtl9wsGREx6+QYJ`9&y=Vp-ZoqFC^k0~U?Ohd0!fufNEk=|RPW!N8}Awb literal 2014 zcmbtUTXWk~5dMzrShA3*E7FFh4Na5K=F-H4wv^T(I2X6Lwc}#vQnx@+@Fp3(8HcEA00&+b0`>&veJT*5~( zB!;V|TTRpgGgvEgJJ{q2zUh00>APOy=8WZ((`_+lSkBO_>#W+A>F3-skAfkrp$id) zXnrYOST1B1(hSM$b3-NtrlKJ#FvG=LncG6~f(A_}B8Bw)bS^DaFKRe~ID9WTj#%H`!u|Q)0FX~Ngs2IeMj8`?B#W{xfKBJ~3m6Bo+wSVT*f{9`TqcX-coX2?EJMb+#k#$YO zrZR*J`TPQd-X!1giMS3Tq2U5vqg(Rbtox9Avqp`4&bA15T6d<}3a;QHHIKW&y@#IV zbAfkR!yC9lx$}<$!>%zL>&(4%2_ttETqS0;HEUf#k|AW&))c%&ZXS1xDwpv#!@zze zGPcbthCS_7f+~0X^rp$zeam%ZOf&TC+ckO31eRUqo{AJ^#Z}BvfMHSY>kKCsol3xM z->Pu0zdaA*%iQy?^$Ul0G-Pm-h#2eZ+$l4Rck*xLeXta*kW|tXvKn&YCKcap+N+pC zUJ$wcuX42Eh+3CQbJ3?Dsz4KemozNnju??fLsB89hDQ!FB$QGcDLhN_&u}DbIeb2- zu5fR`SP`v~|Ib{Xe;-hD6s?M5_<=|0(N)i_E{XACh!uUqT+12jt;ouxX}5+Y*D+;c zq$Urs8K$VW)S?@BCckcp40{f4#R<_q3|huCiMF4 diff --git a/resources/extractor-jvm/classes/com/sucukdeluxe/extractor/JBindExtractorMain$ExtractionRequest.class b/resources/extractor-jvm/classes/com/sucukdeluxe/extractor/JBindExtractorMain$ExtractionRequest.class index 627e04160ff0f2b548a2f9741011252ccec264df..619418a6ce656d35200e766a89d1a28a52e04e84 100644 GIT binary patch literal 2539 zcmcguTT|0e5dKcMq?8~~R0IVSt3pB20)kjXpn#$v44^am;7mx57$~Xcg81N1!U0AG zM`!#2{wT*iX=4kG4^hUK-RwDg`Sy}ce*FCU9l$W=qfjtfN93*`V}jfhBrV8z6b<4w zhWmAB#e|FpQA9B+V@k#}L%n9{Z;Ty2XXH4;xrI$_M^lZwD&#anougSB+?g>f21U=C zuXBd(EatOZMutu@WhW%gnh4yS=iFVc@?FQ$bSH1AkEabY zJL`*!nqkJveNkk2UDLO?nUyg^!gN7k7zyXJXeTmxOR(POtt=sHDx~Q;MowKYY)4$L z8XKnOxE56*e(HL>Am=o5LtS+&!`w(ukV);hVH(Z^Lsd`jbB5{+m4%^k!7%w#cYB>% zYudUfYE;v8Zrkx>GRe?fOxnnsEBu|yZHHl{CtOk$F4DcH5ED8-YDz@iJ%b3Lnpvv5 zk7H2aSUv+BrzX_*KP3G7!mtoNoyP`X<+DnT>_=S>85=;ZU~4dNB-yGE32_UVSpZOl<1e+7d&57;_}) zquM|p-Wo`v;`Ahm@_U?m;c;pL@tEiX7_N9{9jGTwY8jnerITq?(G$>_IEI`!MC1q( zvAQGFB)%c~;u!Tus68MJhHFG)sHRYRsFwCoFC8Ez9X3VKjd;;t2XW!ACh-}y`@hX< z#i6uEsyA>mK(!`F^%i;pRI7tjdjnOgf>aae3-C(m_$m5WsVKNzrYd=99fOss;j2b4 z0JW&vMHLmQa-#3$5dzUB|DYU*H-*7K&jE-d7@|M1LSs+DsH`txyhA7@jNm-+Zt80c YlW3W2r~k7_Tq3RzzfRNBPxnCN7yPERcK`qY literal 2539 zcmcguT~pIg5IwgPLfgnkQBV+2tU?RYPf;vZXaPk*7(iz9!I?CTHBeGbQp5-UlB13c zj?VZ4{3p(+Kf!TtXl$YJA;{Q=ZfNsNDp6(E)Fs(0>(P5zRV&Qd%Oy$GLe-U8)>f4l6~!da#^5t0y{MS8s?N~1xGC*OQMDYM zS4)Zo>k!e&VF5{(pQ$?vf56?lM4ZMM1|cuWTZ&d-m~clZd*Ej!=@D@j=ZMR5$uM4) z^@73BaloZws-@_nYM5z1`gozw(<6&zNz#hZ<@}~1n?4L+P{0Kd7kQ;7k6jrC@7n!^ z6(24kB;c}$D_mpBRlKS&3N`a^eObT=LzhL^k}{*~(krgVk6|>Chc{{x z60ros6PF|>(ZC-$ z5ZOm>KnYC?+AE)An5to(TZ_ItMU5D z@_5aW59ogT$Bm~WH-g3xcYp?+pa~=$pzTi3lp{3Y1igj{hp0j$lo$7U9n@pV+6Svu zqbBPHCacgvswjsFk6l>mVN0TLiVRrnhSG2^&NQ7R;Cd1gG8 z!nA=I1Fs4sq99Ur0Z|q(YeAz~*O7Jw(sk8}DmtubKO$>MAUW;%UNj>R&zB2t5}ONL zEzq~*`T9z`v8KbTYOPKhQ#ZV*8mW*1V|jKplzT(@HL~@PzP7QfnqA)%`_2bGnbIuo zSB&RN9BEa9Hep!wIPq|K*7Mzk%_vm0C)w(Zqj9SYd1^KVsFS1zwERIB4Q z%6Og05{+Wg#xkxLSg}#T8wOSdrfG1+R=d{TaCN=Csf+p{#^Pbfrz&Bv9_m)>Dz&k} zwfYWe?2_;6aE^A+(k+4h1DGpo*L95s+k2o|R?*uu>4w^*b>_?E0#5q*v&FjQCM!2f~qCkd8IBi`W+8j=6=zEwTxW5gp=4c?WTM8>ajm8F?4O z@*c+Nd$OBtf~pDfO**k1BoAUO(nEfMg#41cC-$qqixlGIKR;&Pd>`>!&b5z`7*kZ& zA%TAJn;#(Uut2&j43qW5Jytac=Pu0mW}MM(HQ7NrL0KWcMpAwQLw<`R@;i*m?=dNV zz>NG6bMhxVK~>|B#wg)AwU56@vtayv4@)}z?!Ox8LbgqJb$57odc?f?J) literal 1387 zcmb7DTTc@~6#izX?RMLxlv1cbD~O`)s?_@pMCGEkf>dfqd@@6Kf-CKAv)vke^~oRL ztH!^ekxMl32l$(edZtu~q7OFNo|$jX(xDQ!7g;*(u1bTHOP4pqfkk}`)B!VZz zpdmIH!ufK!P*zORCI&D_NZQ9{V}zlP*qE%LWkiAMQ_4D0hW%FCQjk>Z^Bidw*uLq3|^bM z8d&Uf;dsT0@3=uV@TF)>=_oQ}_WL8)ao1dO0!|D89{?3){Wtl1*fVzpNREjGq#Z`tZwf;}XD5glx3FUv?#0+jQ zL<4UxKSMfyFp_fL!mN%t6Z2SL=>JRG40=+5xk)E$CKkbQe8a=(mh5WZuyk!(I9xRFT>@gtV_PwC_k!ScWrNP^|tVbV^85LC5q6K~ZuihYTsRdza z95xhA)=^M{cztCGFoDNhq;+8c{xg1Rtcf=zVvaZ_=5P@(NGdBfB`di{sa`#8ZE( zI?Ix@?~(t6$wxallRCSN^Vw}&PFc_W`qo8FS1w#gGPY}Y50qJq|t%8}xW`g(DfhKgoEHw@GFBNOrXfi{%eoN%2S z3Cyq-JzlDZ<4g}$ROx`&lvB#hdxkl0i3-~P?Ca>NUeHxEqDe&udQ^natfB>B6|Fd_ zU_wPVdKkijr`bBq|I&)*-WQT6m{f34!6k;ov1aLTNerQ1FS(gsH4Rd$x#+T7Eg{4& zHR5@kCLG4eUyo*NKlDAP;W(9T; zBu`))!A(k9p>o1xyAZ(up@vCJ5%OYcGoobv5eol=5dT7HeMT$)iZ1>Q5&j(md=F8H zL6am*N&!qsGA>IBW~EwOlY%%+>9#;gDL8}M!rT(3AykWA^q0%(CS=45hYuW6g_V)Fnr7)A022xt*t09e9K3rYHNdO+C&qvjT;wcN{C_!m_l?(;@-t{ z{(!r#n@CMvn7AR)-{8XdL)81QaWU__d*sYBfKb4@}s_1@r;Zxz)5P;@NcK9!R}4VMtI$5p?qA{wGtuus~C ztYRACSQPMftbYH%>Kr;nv7-l&KvKnJ4OdvS=t`UJPJcM+s#q3?zOvp}rM@+IQQCib zG<<6v^t%D9$bnUX6}z3ZKX?Luq$G1gplY`l?H@^I(vr!{{kP&OOo8xRt2ZpQq`Xve zCgRt!zBgtokF3}Gk`nM+olbW&O4Z9{fy0bb5e?q|nIWL<4hG$$R^J+px+4{Jf&8(O zcit;W5p$l4*aT(X(hGqsT!_g0IMRp=WR4ug961C=;xB+4cjx)G&694%g!u`onVUkG z`6+a>Fh$s0a!p~J@?U|1?2)>Zfs3;6k%=JX5T!gOOH|+%j`2eD8>7MlyXHrT8A1}y zu_SN;*F!G!f1G}fYyY|M3_<=CKEw5kE@K8iGsYQip0aC|w~68^k{o)Pv4jSij0(Ea z+y<`;sz9YGLR4pCH7w8?lGH?s?jTL;$k08MXcGtzbx&o< vC-QhK4?X1NhstsFN!dM$smoUq)eC1 zbPzKziZKgQffYb1h!C#IZ(EMi3Y;LSkWnzF;F^N@ARfe(0ItjaS=oFth#Gtk7W1 z;F}7*#Sql&C?vNhsK8@4KM7-8^rS>v>;tWP&ZA~QQC>|t%p zpqY{(M@!C-&F;4wq!$#t#!x&doC`L&Xgk*#j@S2@!il9PVrela%xCq~^q6jrQy^k; zQT%*+L*BsyW78t($S9B!ikHx48BS&m%@1P3j#}e!)7#iiSl#nUk#cm)q<{y~ z!Wp(4&DacptGCZ0X!0y^zhwYa+R$aqrVQZ-0<zsUkd?8M!c$b$dyYccJ@43B z(y{D*O*fmR8Wm@8kY-jg11#H;HM1LIh*e%9|Ngc_8I5Vn@V4oOcSpt<=O6~AXToXysX|V&mq@A zH!tFjur*2@T1Ew@bBuB|<7Bg|JeSd%J4<9~(_}^U5>TOUud43b$$GEIQ5{Wm_IESX z?pU|7)sPCbnAg(|0YQ0xnLc&5o)ZZF4-4cK<=zDcPqnmcmYkd`+t#X*&A3plp!3N) zhPwP}m95YD+c!!!Pi1KNscn|$mDT^Gz?T++cCZ(qmCaU-(L);wc3^3XldN7pyqMt(z>lg^Y2Pn_<9ZB$6}f_gef zC%VlHLR3G-5+*`iC6MSokpk`8m4k&$|;bM$nH++`UC-JEpC zk%zlBf!v%Y$Mp@i@4jbqE(>U@GNq*xR9*-M)9voP*EYbWyGdv^J=+mS9HaN& z2^xjuokFj{ki1FUo~|4)oThOBI&e7>yOaQXp`L{`8eYbY390bhbI z(zuMmW%!q%$YEd!MUm)-2!w(Q@I{wUe2X>}kW$ct&kyiQ_;@+W_-@qjD(vUgXyIXW zk-QNF>xhCYIIo~vK@S)W*GZB$Rp3fVgvaoB*0z&$Kmjc)ZF~pn+XzJ7MbRQ#q#5tv zQfWEg3x)54%4^-jIG9S?-afAY@;E8qY%7&A^x@Cm> z&`)mr+=Ces7|2F7OtTVkCJ|&Vf`013JE*P6e+>sl37mudgvgkxCqQVx||K^>hM2XjV-0Gz~0`EmBe*)#aA7P%rVLpHc{v;855FLC7=lL*t_y`90 zMGW&xF!?Cv_+?z@SMU;l8n4jY4L;^V7Dup@d7yoSJp|D@F(KfQ-pvY1jE~VTqhNZ= z?xJ*^nCs<;3o3$-y4cERix*S8M!k<>dQ#GJ6%CADJQ0Sz##J;jdTv(JAj%}AWpJCw z$Hc<=-@U~#hFi3KKkCqc<}5AuK_R~s=@fq@W8WC=wiO-^yo31YpOZt^5xFmh> k?7Ku1l%yNI3*04D1-MLB72qj+mHHqZ(?b7Reg!rE2EyUB{r~^~ literal 3742 zcmb7H`&$&(8Ga9EVU}e?AwgNI28|b37FUf?3u>Zx$yz`I1dGO+VHsd_m|16MQPbA6 zY3^xE%*BQzP1~fAB)yR|LJV!%pUm_0_x=g}BkGfuzGr4vR)wa0ba&3q`ObHFzxVsT z!{7e>#g_oK;?FUZL28KTC`X0Bl2gW*k+KbEICXg7l$r4bDt20qp| zQ751WyOx_eVA&?6hfROaK#uBsGkmk8u_@G0kO>ql(^0QZFQWJn!!sRU39C?+>-ZK{ z2*eC8Gh&UI`z%kO`c4h2bligm0gW2Ej8U4tyJ#rDvB&o;XShwNT%+S&tR;Y%yr)cs z!G?!wL(Qc}qF65gb+A!KlR6m98oAtA*Bh)vGm;uwbZkUQV3lL~soYR1r%-&{%AOh^ zz_gk=;!#?Xg;70oe$m2=VDF5ae$JSuQk5uEhl{pT`f z*0)?o!}kQ57P4OK0VU#(2`mfrl;m-5-m(Wxf_oA&ij2Uzkf9ByUB~gw2FJ>b_zlCR zJ2XT~4QEYn&~#cGl)R~92*c#1k!4#M6lf{Mw@|62*$!V7EV4RI!qRa{m3!28!_62@ zz*ew~3MA%HSCX#Y5zjqq4A>?yior!z!xni5jIXy)Y zcIgo#*TqSsWH0OZ8Qvt&4qx2fwhN`D>gX*UZ>!;0p0VAWsp02EatEZmnN$_@FLeB} zAZi+(hWFUi7NUE4PdHc(lZwTGr{UKETmF|5w+>1TR|GaLc&^<$pY`2?rr*m*j}&Hz zh7XIgoXKuiu_s=umf|POS?kr(*pGg(27WMcX@Kjm&U8M#vr+(lW&JZ@9V$$$!A+#56==23r3#Dz74zXr987DJ;E; zxLU5fiq(naSBTcGqpjpsZ1{wS%J5r$FGmF+A4WuWV6p7Ra@m75vKO1=BlsQnn^884 zq`HY#X{gcIa|D;O+$nig7VL5hzsDa6zHO(0GKy6q zlgFUTM+0LLLg(>Gd_o}=;6DjXIiD92&C}S_nY@mgo%L>tS^HZLjq|W$t7;0ZFDf7dwmLPfM zEy3m#E~r#p$F6v!wLD(_<+cjBO{>%DD&9jPUS6kdX^qCCL7ponP^*?JY5B=C@-LB|)4bKQ%!wUi(&DZdXz⪻cta>kD{#jdW7ov& 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 CRH<|T literal 20639 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 stem.length() + 1 && sibName.substring(0, stem.length()).equalsIgnoreCase(stem)) { - String suffix = sibName.substring(stem.length()); - if (RAR_OLDSPLIT_RE.matcher(suffix).matches() || suffix.toLowerCase(Locale.ROOT).matches("\\.r\\d{2,3}")) { - return true; - } - } - } - return false; - } - private static boolean isWrongPassword(ZipException error, boolean encrypted) { if (error == null) { return false; diff --git a/src/main/extractor.ts b/src/main/extractor.ts index ac8bbfa..ca10774 100644 --- a/src/main/extractor.ts +++ b/src/main/extractor.ts @@ -1169,38 +1169,63 @@ async function runExternalExtract( } logger.warn(`JVM-Extractor nicht verfügbar, nutze Legacy-Extractor: ${path.basename(archivePath)}`); } else { + if (hybridMode) { + try { + const archiveStat = await fs.promises.stat(archivePath); + logger.info(`Hybrid-Extract JVM: ${path.basename(archivePath)} (${(archiveStat.size / 1048576).toFixed(1)} MB)`); + } catch (statErr) { + logger.warn(`Hybrid-Extract JVM: Archiv nicht zugreifbar: ${path.basename(archivePath)} — ${String(statErr)}`); + } + } logger.info(`JVM-Extractor aktiv (${layout.rootDir}): ${path.basename(archivePath)}`); - const jvmResult = await runJvmExtractCommand( - layout, - archivePath, - targetDir, - conflictMode, - passwordCandidates, - onArchiveProgress, - signal, - timeoutMs - ); + const maxJvmAttempts = hybridMode ? 2 : 1; + for (let jvmAttempt = 1; jvmAttempt <= maxJvmAttempts; jvmAttempt++) { + const jvmResult = await runJvmExtractCommand( + layout, + archivePath, + targetDir, + conflictMode, + passwordCandidates, + onArchiveProgress, + signal, + timeoutMs + ); - if (jvmResult.ok) { - logger.info(`Entpackt via ${jvmResult.backend || "jvm"} [CPU=Idle, I/O=Normal, single-thread]: ${path.basename(archivePath)}`); - return jvmResult.usedPassword; - } - if (jvmResult.aborted) { - throw new Error("aborted:extract"); - } - if (jvmResult.timedOut) { - throw new Error(jvmResult.errorText || `Entpacken Timeout nach ${Math.ceil(timeoutMs / 1000)}s`); - } + if (jvmResult.ok) { + if (jvmAttempt > 1) { + logger.info(`JVM-Extractor Retry #${jvmAttempt - 1} erfolgreich: ${path.basename(archivePath)}`); + } + logger.info(`Entpackt via ${jvmResult.backend || "jvm"} [CPU=Idle, I/O=Normal, single-thread]: ${path.basename(archivePath)}`); + return jvmResult.usedPassword; + } + if (jvmResult.aborted) { + throw new Error("aborted:extract"); + } + if (jvmResult.timedOut) { + throw new Error(jvmResult.errorText || `Entpacken Timeout nach ${Math.ceil(timeoutMs / 1000)}s`); + } - jvmFailureReason = jvmResult.errorText || "JVM-Extractor fehlgeschlagen"; - const isUnsupportedMethod = jvmFailureReason.includes("UNSUPPORTEDMETHOD"); - if (backendMode === "jvm" && !isUnsupportedMethod) { - throw new Error(jvmFailureReason); - } - if (isUnsupportedMethod) { - logger.warn(`JVM-Extractor: Komprimierungsmethode nicht unterstützt, fallback auf Legacy: ${path.basename(archivePath)}`); - } else { - logger.warn(`JVM-Extractor Fehler, fallback auf Legacy: ${jvmFailureReason}`); + jvmFailureReason = jvmResult.errorText || "JVM-Extractor fehlgeschlagen"; + + // In hybrid mode, retry once on "codecs" / "can't be opened" errors — + // these can be caused by transient Windows file locks right after download completion. + const isTransientOpen = jvmFailureReason.includes("codecs") || jvmFailureReason.includes("can't be opened"); + if (hybridMode && isTransientOpen && jvmAttempt < maxJvmAttempts) { + logger.warn(`JVM-Extractor Hybrid-Retry: ${jvmFailureReason} — warte 3s vor Versuch #${jvmAttempt + 1}: ${path.basename(archivePath)}`); + await new Promise((r) => setTimeout(r, 3000)); + continue; + } + + const isUnsupportedMethod = jvmFailureReason.includes("UNSUPPORTEDMETHOD"); + if (backendMode === "jvm" && !isUnsupportedMethod) { + throw new Error(jvmFailureReason); + } + if (isUnsupportedMethod) { + logger.warn(`JVM-Extractor: Komprimierungsmethode nicht unterstützt, fallback auf Legacy: ${path.basename(archivePath)}`); + } else { + logger.warn(`JVM-Extractor Fehler, fallback auf Legacy: ${jvmFailureReason}`); + } + break; } } }