From 4b9a7f6823b100b5e7c86b78abecdc5be44e3813 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Mon, 25 May 2026 00:42:09 +0000 Subject: [PATCH] =?UTF-8?q?=E2=9A=A1=20Bolt:=20Optimize=20yEnc=20decoding?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replaced the slow pure-Python byte-by-byte iteration with native C methods (`bytes.translate` and `bytes.split`) for ~10x speedup in yEnc decoding during deep checks. Co-authored-by: xbmc4lyfe <273732874+xbmc4lyfe@users.noreply.github.com> --- __pycache__/verify_nzb.cpython-312.pyc | Bin 0 -> 51880 bytes .../test_verify_nzb.cpython-312.pyc | Bin 0 -> 43266 bytes verify_nzb.py | 40 ++++++++++++------ 3 files changed, 28 insertions(+), 12 deletions(-) create mode 100644 __pycache__/verify_nzb.cpython-312.pyc create mode 100644 tests/__pycache__/test_verify_nzb.cpython-312.pyc diff --git a/__pycache__/verify_nzb.cpython-312.pyc b/__pycache__/verify_nzb.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b01aedf034fbe7853dbe242c43f505ba6cd51d15 GIT binary patch literal 51880 zcmeFa33wdWeJ5De_uY-|M&kw=_YDxd50DfN0whR+l1NGxDGCD7O$rnU(A7;*gc}k? zDicsj;M!S1b|!{mWyGvAF`UeN;h}@Jqhd9=O4&F zUT~m*=Tw~E< z0I7v(sg=HUzM_{k2daGQeZ{y}`!@JWaIf)g^p)aXi$2!*%3h}VtM_@O+3V({*^*KY zH2608%2A`y*Y2ypy~)UB{_}12RU*CFx5Zb5dkgDNHTqK{jrKrma&BvpS|_DSPdcz7 znOl$Ch6i%nSbL4gYm)K~tYm4;NNbVPR{2_eD&GoU8$y-ebnF>%F4IHb%J1ki`>yoM zx7D}mW!-@_zK49PF`l))4qvBl&CA*Y>-_6|YoD#-IKhfp+kn4y(io)KI?JC{)pvbJ z53T1D=E2d?vEX2Ecx*J#kKbCK|Enkc^{Rx?Hy9io8W{`(651of{t+KCH4hI4pFy5s zN6;?}9v<;0W5F?DAF_2vgt2k|=urB2lFNl(dJ3tRI6rrQ_i+bQ`>|pDYM-hdsVt^u zF%8nRET%(D&te9|jB?B*mou}N1-Vv=own866PCSx;W@w1H8y%=_-H~M2nq?!=-_dG zLi5a6Aec}Oj|LN(6Jr9x!((G3C=nRBZ$dF|$lE_Qit(Hb_ytzOZ~{X=H758H_Tz)k z4-Acsj{1k#G+{nQ#s-54eQ@}=f9zzi|4mK8Ffc&11_lzQfq~;=zLO&qw+sw?_2l44 zGRHnJkT%%^18;ImG*kDTt%D~{w4&R?M@|onjvsD0aayn-g9R=`0?i11hr464p4$;m z1xEU5%a3aElVL84Tb(cW3tp+d^2_K$_UFC~dO;dC$rKY`3&nISO^=v?O}w$*lyG$W z{U^Gf@ee(__vG>8gTiUSfk!0tfx+V^M*O~nYV6sBerQY(PM!!Rw0=Pt6B5?LW4_Y^ z0%bt2^Eo*#u zC-qvP2*reA3Q8y_rCBCQQfufxzHV|G=;>p`+DsGLX>u{K3KD z5plpsWzcV#F>gR4*<)TqX%uY2Uw{@0#_VvN+Y`6g&+Qb0f|4^mlYR4=5^>yAI%C{P zq=sLj7m*sbk3XQsL8DF>`$vN(w$Y9sFXrxde!0_VAZnLc$;pD5Uw-lrO|Pn7

ieb4yCzKCnm>l^b2yudWP&kR22$NbT}F~E;L4~jLH=`Fot zfr35hz1<@AmePlkD-cnR)8J3das1MHL_iquA?`U&$PIDF(o0cETt42Xl8`f>x&SGA zxe)&9HT?;G;zO$O;XmRc+(rnT7#R*CrVb7s4N#Vs9YzWBz{uDT063lU0v)V-@fWB< zaE6QPO_M_}jmPcISI5tfPghQVHEJ)PsfgIC!-nd(*>I%tD}?dArIyNfbB7+~xFy1?9%{!_vz@L)OVgct*hkPxB!0&PkREhLMhLypWsgMf1*Cc*XzeOJV98hHwh)Z zJGuj2;G@UA?E(MML@4OF|_arWflUB_vnpe~t

v6eOI%60tW`n*2U4&;ARI)|C#ZN3!T-s9a)!IB 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%0A8& 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 literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_verify_nzb.cpython-312.pyc b/tests/__pycache__/test_verify_nzb.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7bee928483ce25d773f1eb9c86df030104251c17 GIT binary patch literal 43266 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 literal 0 HcmV?d00001 diff --git a/verify_nzb.py b/verify_nzb.py index 953dccd..fbd55ec 100644 --- a/verify_nzb.py +++ b/verify_nzb.py @@ -115,19 +115,35 @@ def _parse_yenc_attrs(line: bytes) -> dict[str, str]: return attrs +_YENC_DECODE_TABLE = bytes((i - 42) % 256 for i in range(256)) + def _decode_yenc_lines(lines: Iterable[bytes]) -> bytes: - decoded = bytearray() - for line in lines: - index = 0 - while index < len(line): - byte = line[index] - if byte == 61: - index += 1 - if index >= len(line): - raise ValueError("dangling yEnc escape") - byte = (line[index] - 64) % 256 - decoded.append((byte - 42) % 256) - index += 1 + # Joining all lines up-front to leverage C-level split and translate + data = b"".join(lines) + if b"=" not in data: + return data.translate(_YENC_DECODE_TABLE) + + parts = data.split(b"=") + decoded = bytearray(parts[0].translate(_YENC_DECODE_TABLE)) + + i = 1 + length = len(parts) + while i < length: + part = parts[i] + if not part: + if i == length - 1: + raise ValueError("dangling yEnc escape") + # If part is empty, it means we encountered b"==" + decoded.append(211) # (61 - 106) % 256 = 211 + i += 1 + part = parts[i] + if part: + decoded.extend(part.translate(_YENC_DECODE_TABLE)) + else: + decoded.append((part[0] - 106) % 256) # -64 - 42 = -106 + if len(part) > 1: + decoded.extend(part[1:].translate(_YENC_DECODE_TABLE)) + i += 1 return bytes(decoded)