#!/usr/bin/env python3 """ p2_unzip.py — Распаковка ZIP-потоков из извлечённых стримов """ import io import os import zipfile STREAMS_DIR = "hbk_streams" OUTPUT_DIR = "hbk_content" zip_streams = ["FileStorage", "PackBlock", "IndexPackBlock"] for name in zip_streams: path = os.path.join(STREAMS_DIR, name) if not os.path.exists(path): print(f" {name} — не найден, пропуск") continue out_dir = os.path.join(OUTPUT_DIR, name) os.makedirs(out_dir, exist_ok=True) try: with zipfile.ZipFile(path, "r") as zf: entries = zf.namelist() print(f"\n{'=' * 60}") print(f" {name}: {len(entries)} файлов") # Показать первые 20 for e in entries[:20]: info = zf.getinfo(e) print(f" {e} ({info.file_size:,} байт)") if len(entries) > 20: print(f" ... и ещё {len(entries) - 20}") # Извлечь всё zf.extractall(out_dir) print(f" Извлечено в: {out_dir}/") except zipfile.BadZipFile as e: print(f" {name}: не ZIP или повреждён — {e}") except Exception as e: print(f" {name}: ошибка — {e}") # Также копируем текстовые потоки for name in ["Book", "MainData", "IndexMainData", "PackLookup"]: src = os.path.join(STREAMS_DIR, name) if os.path.exists(src): dst_dir = os.path.join(OUTPUT_DIR, "_metadata") os.makedirs(dst_dir, exist_ok=True) with open(src, "rb") as f: data = f.read() with open(os.path.join(dst_dir, name), "wb") as f: f.write(data) # Показать содержимое если текстовый try: text = data.decode("utf-8-sig") print(f"\n{'=' * 60}") print(f" {name}:") for line in text.splitlines()[:10]: print(f" {line}") except: pass print(f"\n{'=' * 60}") print("Готово! Теперь можно редактировать файлы в hbk_content/FileStorage/")