85 lines
3.0 KiB
Python
85 lines
3.0 KiB
Python
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 <part1@id>\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() |