"""Use playwright to build a gallery of website using this theme."""
from pathlib import Path
from shutil import copy
from playwright.sync_api import TimeoutError as PlaywrightTimeoutError
from playwright.sync_api import sync_playwright
from rich import print as rich_print
from rich.progress import track
from yaml import safe_load
def regenerate_gallery() -> None:
"""Regenerate images of snapshots for our gallery.
This function should only be triggered in RTD builds as it increases the build time
by 30-60s. Developers can still execute this function from time to time to populate
their local gallery images with updated files.
"""
# get the existing folders path
_static_dir = Path(__file__).parents[1] / "_static"
# create the static gallery folder where we'll put the gallery source files
gallery_dir = _static_dir / "gallery"
gallery_dir.mkdir(exist_ok=True)
# load gallery data
gallery_items = safe_load((_static_dir / "gallery.yaml").read_text())
image_404 = _static_dir / "404.png"
with sync_playwright() as p:
# Generate our browser to visit pages and generate images
for ii in range(3):
try:
browser = p.chromium.launch()
break
except PlaywrightTimeoutError:
rich_print(
f"Browser start timed out. Trying again (attempt {ii + 2}/3)",
)
page = browser.new_page()
for item in track(gallery_items, description="Generating screenshots..."):
item["id"] = item["title"].lower().replace(" ", "_")
screenshot = gallery_dir / f"{item['id']}.png"
# Visit the page and take a screenshot
for ii in range(3):
try:
page.goto(item["link"])
page.screenshot(path=screenshot)
break
except PlaywrightTimeoutError:
rich_print(f"Page visit start timed out for: {item['link']}")
rich_print(f"Trying again (attempt {ii + 2}/3)")
# copy the 404 only if the screenshot file was not manually
# generated by a maintainer
if not screenshot.is_file():
rich_print(
f"Could not generate screenshot for {item['title']}, using 404.",
)
copy(image_404, screenshot)
# Clean up the browser since we no longer need it
browser.close()
rich_print(f"Finished generating gallery images at: {gallery_dir}")
if __name__ == "__main__":
regenerate_gallery()