Files
monica_site/proposal/powerpoint/capture_screenshots.py
T
2026-07-16 05:48:12 -05:00

101 lines
2.9 KiB
Python

#!/usr/bin/env python3
"""Capture proposal/pages HTML mockups → powerpoint/screenshots/*.png
Requires Chromium and a local HTTP server (started automatically).
"""
from __future__ import annotations
import subprocess
import sys
import time
import urllib.request
from pathlib import Path
ROOT = Path(__file__).resolve().parent
PAGES = ROOT.parent / "pages"
SHOTS = ROOT / "screenshots"
PORT = 8765
PAGES_LIST = [
"index.html",
"public-home.html",
"public-about.html",
"public-contact.html",
"public-unsubscribe.html",
"public-404.html",
"public-under-construction.html",
"portal-login.html",
"portal-dashboard.html",
"portal-leads.html",
"portal-lead-detail.html",
"portal-analytics.html",
"portal-contacts.html",
"portal-contacts-import.html",
"portal-campaign.html",
"portal-campaign-report.html",
"portal-postcard-designer.html",
"portal-social.html",
"portal-social-accounts.html",
]
def find_chromium() -> str:
for candidate in ("chromium", "google-chrome", "google-chrome-stable", "/snap/bin/chromium"):
path = Path(candidate) if candidate.startswith("/") else None
if path and path.exists():
return str(path)
found = subprocess.run(["which", candidate], capture_output=True, text=True)
if found.returncode == 0 and found.stdout.strip():
return found.stdout.strip()
raise SystemExit("Chromium/Chrome not found")
def main() -> None:
SHOTS.mkdir(parents=True, exist_ok=True)
chromium = find_chromium()
server = subprocess.Popen(
[sys.executable, "-m", "http.server", str(PORT)],
cwd=str(PAGES),
stdout=subprocess.DEVNULL,
stderr=subprocess.DEVNULL,
)
try:
for _ in range(30):
try:
urllib.request.urlopen(f"http://127.0.0.1:{PORT}/index.html", timeout=1)
break
except Exception:
time.sleep(0.2)
else:
raise SystemExit("HTTP server failed to start")
for page in PAGES_LIST:
stem = page.removesuffix(".html")
out = SHOTS / f"{stem}.png"
url = f"http://127.0.0.1:{PORT}/{page}"
print(f"screenshot {page}{out.name}")
subprocess.run(
[
chromium,
"--headless=new",
"--disable-gpu",
"--no-sandbox",
"--hide-scrollbars",
"--window-size=1440,900",
f"--virtual-time-budget=5000",
f"--screenshot={out}",
url,
],
check=True,
capture_output=True,
)
print(f"Done: {len(PAGES_LIST)} screenshots in {SHOTS}")
finally:
server.terminate()
server.wait(timeout=5)
if __name__ == "__main__":
main()