import sabctools import io import os import binascii import re # --- KONFIGURACE ---+ INPUT_FILE = r"u:\PycharmProjects\NewsGroups\downloads\raw\part_001.raw" OUTPUT_DIR = r"u:\PycharmProjects\NewsGroups\downloads\decoded" def ultimate_bomba_decoder(): if not os.path.exists(INPUT_FILE): print(f"❌ Soubor nenalezen: {INPUT_FILE}") return print(f"📖 Načítám soubor...") with open(INPUT_FILE, "rb") as f: raw_data = f.read() # 1. OPRAVA SYNTAX WARNING A VYTAŽENÍ METADAT # Používáme [0-9] místo \d pro odstranění varování v Pythonu 3.13 yend_match = re.search(b"=yend size=([0-9]+).*pcrc32=([0-9a-fA-F]+)", raw_data) expected_size = 0 expected_crc_str = "" if yend_match: expected_size = int(yend_match.group(1)) expected_crc_str = yend_match.group(2).decode().lower() print(f"🎯 Metadata nalezena: Očekávaná velikost={expected_size}, Očekávané CRC={expected_crc_str}") # 2. KLÍČOVÁ OPRAVA (Čištění dat) # Odstraníme prázdné znaky na začátku/konci a sjednotíme konce řádků na \r\n processed_data = raw_data.strip() # Tento trik zajistí, že i linuxové konce řádků budou pro yEnc správně \r\n processed_data = processed_data.replace(b"\r\n", b"\n").replace(b"\n", b"\r\n") # 3. ZABALENÍ DO NNTP OBÁLKY wrapped = b"222 0 \r\n" + processed_data + b"\r\n.\r\n" # 4. DEKÓDOVÁNÍ (Sabctools 3.13 Streaming API) decoder = sabctools.Decoder(len(wrapped)) buf = io.BytesIO(wrapped) n = buf.readinto(decoder) decoder.process(n) response = next(decoder, None) if response and response.data: # 5. KONTROLA INTEGRITY (Vlastní výpočet CRC32) # binascii.crc32 vrací integer, :08x ho převede na hexadecimální formát vypoctene_crc_int = binascii.crc32(response.data) vypoctene_crc_str = f"{vypoctene_crc_int:08x}".lower() real_size = len(response.data) print("-" * 40) print(f"📊 Kontrola integrity:") print(f" Skutečná velikost: {real_size} (Očekáváno: {expected_size})") print(f" Vypočítané CRC: {vypoctene_crc_str}") print(f" Očekávané CRC: {expected_crc_str}") if vypoctene_crc_str == expected_crc_str: print("✅ BINGO! Soubor je 100% v pořádku.") else: print("⚠️ POZOR: CRC nesouhlasí, data mohou být poškozena.") # 6. ULOŽENÍ if not os.path.exists(OUTPUT_DIR): os.makedirs(OUTPUT_DIR) # Jméno z yEnc hlavičky: PC Pro 2011-07.pdf out_name = response.file_name or "decoded_part.bin" out_path = os.path.join(OUTPUT_DIR, out_name) with open(out_path, "wb") as f_out: f_out.write(response.data) print(f"💾 Uloženo do: {out_path}") print("-" * 40) else: print("❌ Chyba: Dekodér nevrátil žádná data. Zkontrolujte, zda je soubor kompletní.") if __name__ == "__main__": ultimate_bomba_decoder()