101 lines
2.9 KiB
Python
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()
|