File: generate_gallery_images.py

package info (click to toggle)
pydata-sphinx-theme 0.16.1%2Bdfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 6,088 kB
  • sloc: python: 2,796; javascript: 701; makefile: 42; sh: 12
file content (66 lines) | stat: -rw-r--r-- 2,447 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
"""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, sync_playwright
from rich import 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 TimeoutError:
                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 TimeoutError:
                    print(f"Page visit start timed out for: {item['link']}")
                    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():
                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()
    print(f"Finished generating gallery images at: {gallery_dir}")


if __name__ == "__main__":
    regenerate_gallery()