95 lines
2.5 KiB
Python
95 lines
2.5 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Extract presenter notes from a Keynote .key file.
|
|
|
|
Usage:
|
|
python extract_keynote_notes.py path/to/deck.key --out notes.json
|
|
|
|
Notes:
|
|
- A .key file is a package (zip). The presenter notes live in an XML-ish file
|
|
typically called index.apxl inside the package.
|
|
- This script tries to be robust across minor format changes by searching for
|
|
likely note fields.
|
|
"""
|
|
import json
|
|
import os
|
|
import subprocess
|
|
import argparse
|
|
import json
|
|
import os
|
|
import re
|
|
import shutil
|
|
import tempfile
|
|
import zipfile
|
|
from pathlib import Path
|
|
|
|
from gnommo.parser import _read_json
|
|
|
|
|
|
def write_manuscript(data: Path, out_path: Path):
|
|
|
|
data = _read_json(data.read_text(encoding="utf-8"))
|
|
lines = []
|
|
i = 0
|
|
for item in data:
|
|
print(f"Writing notes for slide {i} to file")
|
|
idx = item.get("slide_index")
|
|
notes = (item.get("notes") or "").rstrip()
|
|
|
|
lines.append(f"[S{idx}]")
|
|
lines.append(notes)
|
|
lines.append("") # blank line between slides
|
|
i += 1
|
|
|
|
out_path.write_text("\n".join(lines).rstrip() + "\n", encoding="utf-8")
|
|
print(f"Wrote {out_path}")
|
|
|
|
|
|
def main():
|
|
keynote_file = Path("video1/video1.key").expanduser().resolve()
|
|
if not keynote_file.exists():
|
|
raise FileNotFoundError(f"Keynote file not found: {keynote_file}")
|
|
|
|
script_file = Path("gnommo/extract_keynote_notes.js").expanduser().resolve()
|
|
if not script_file.exists():
|
|
raise FileNotFoundError(f"Extractor script not found: {script_file}")
|
|
|
|
presenter_notes_json_file = Path("video1/manuscript.json").expanduser().resolve()
|
|
|
|
# Run JXA extractor
|
|
proc = subprocess.run(
|
|
[
|
|
"osascript",
|
|
"-l",
|
|
"JavaScript",
|
|
str(script_file),
|
|
str(keynote_file),
|
|
],
|
|
capture_output=True,
|
|
text=True,
|
|
)
|
|
|
|
if proc.returncode != 0:
|
|
raise RuntimeError(
|
|
"Failed to extract presenter notes:\n"
|
|
f"STDERR:\n{proc.stderr}\n"
|
|
f"STDOUT:\n{proc.stdout}"
|
|
)
|
|
|
|
# Write JSON output
|
|
presenter_notes_json_file.write_text(proc.stdout, encoding="utf-8")
|
|
|
|
if not presenter_notes_json_file.exists():
|
|
raise FileNotFoundError(
|
|
f"Failed to extract presenter notes to {presenter_notes_json_file}"
|
|
)
|
|
|
|
# Convert JSON → manuscript.txt
|
|
write_manuscript(
|
|
presenter_notes_json_file, out_path=keynote_file.parent / "manuscript.txt"
|
|
)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|