import sys from pathlib import Path import traceback # Add src to path sys.path.insert(0, str(Path(__file__).parent.parent)) from src.data_model import BookStructure, ManifestEntry from src.manifest_manager import ManifestManager from src.backfill_engine import BackfillEngine from src.bilingual_builder import BilingualBuilder from src.utils import setup_logger logger = setup_logger("build_final") def build_final(): BOOK_NAME = "Empire of AI Dreams and Nightmares in Sam Altmans OpenAI (Karen Hao)" WORK_DIR = Path(f".work/{BOOK_NAME}") MANIFEST_PATH = WORK_DIR / "manifest.json" STRUCTURE_PATH = WORK_DIR / "book_structure.json" OUTPUT_EPUB = Path("output/final_verification.epub") INPUT_EPUB = Path(f"input/{BOOK_NAME}.epub") if not MANIFEST_PATH.exists() or not STRUCTURE_PATH.exists(): logger.error("Missing manifest or structure. Run translation first.") return # 1. Load Data logger.info("Loading structure and manifest...") structure = BookStructure.load(STRUCTURE_PATH) manager = ManifestManager(MANIFEST_PATH) manager.load() # 2. Backfill logger.info("Backfilling translations...") backfiller = BackfillEngine() structure = backfiller.backfill(structure, manager.entries, mode="bilingual") # 3. Build logger.info(f"Building final EPUB to {OUTPUT_EPUB}...") builder = BilingualBuilder(WORK_DIR, original_epub_path=INPUT_EPUB) builder.build(structure, OUTPUT_EPUB) logger.info("Build complete.") if __name__ == "__main__": try: build_final() except Exception as e: traceback.print_exc() print(f"CRITICAL ERROR: {e}")