From f6e8979560b1aa4eb4d6b92f1c4f128fcb2f38bb Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Fri, 22 May 2026 00:20:25 +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 Optimize `_decode_yenc_lines` by replacing the Python while loop with a combination of `b"".join`, `bytes.translate()`, and `.split(b"=")`. This provides an ~8x performance improvement for yEnc decoding, which is a major bottleneck during deep checks. Co-authored-by: xbmc4lyfe <273732874+xbmc4lyfe@users.noreply.github.com> --- __pycache__/verify_nzb.cpython-312.pyc | Bin 0 -> 51962 bytes .../test_verify_nzb.cpython-312.pyc | Bin 0 -> 43266 bytes verify_nzb.py | 45 +++++++++++++----- 3 files changed, 33 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..0e58a107aa334a9dffcc17e5081b61e68cc2b0b5 GIT binary patch literal 51962 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 JlTSMI{{nSC0a^e6 literal 0 HcmV?d00001 diff --git a/verify_nzb.py b/verify_nzb.py index 953dccd..080b075 100644 --- a/verify_nzb.py +++ b/verify_nzb.py @@ -115,19 +115,40 @@ def _parse_yenc_attrs(line: bytes) -> dict[str, str]: return attrs +_YENC_TRANSLATION_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 + data = b"".join(lines) + if b"=" not in data: + return data.translate(_YENC_TRANSLATION_TABLE) + + parts = data.split(b"=") + + decoded = bytearray(parts[0].translate(_YENC_TRANSLATION_TABLE)) + + skip = False + for i in range(1, len(parts)): + if skip: + skip = False + continue + + part = parts[i] + if not part: + if i == len(parts) - 1: + raise ValueError("dangling yEnc escape") + # If the part is empty, it means the escape char was '=' (61). + # The decoded byte is (61 - 106) % 256 = 211. + decoded.append(211) + if i + 1 < len(parts): + decoded.extend(parts[i+1].translate(_YENC_TRANSLATION_TABLE)) + skip = True + else: + # The first char of the part is the escaped char. + # The yEnc decode step is (char - 64 - 42) % 256 = (char - 106) % 256. + decoded.append((part[0] - 106) % 256) + if len(part) > 1: + decoded.extend(part[1:].translate(_YENC_TRANSLATION_TABLE)) + return bytes(decoded)