#!/usr/bin/env python3
"""Rend tools/art.html dans un Chromium headless (protocole CDP) : fond orbe (PNG transparent) et vidéo de démarrage (images PNG).
Usage : render.py """
import base64, json, os, sys, time, urllib.request
import websocket
url, cdp, out = sys.argv[1:4]
os.makedirs(out + "/frames", exist_ok=True)
t = json.load(urllib.request.urlopen(urllib.request.Request(cdp + "/json/new?about:blank", method="PUT")))
ws, n = websocket.create_connection(t["webSocketDebuggerUrl"], timeout=60), 0
def cmd(method, **params):
global n
n += 1
ws.send(json.dumps({"id": n, "method": method, "params": params}))
while True:
m = json.loads(ws.recv())
if m.get("id") == n:
return m.get("result", {})
def shot(path, w, h):
png = cmd("Page.captureScreenshot", format="png", clip={"x": 0, "y": 0, "width": w, "height": h, "scale": 1})["data"]
open(path, "wb").write(base64.b64decode(png))
def load(mode, w, h):
cmd("Emulation.setDeviceMetricsOverride", width=w, height=h, deviceScaleFactor=1, mobile=False)
cmd("Emulation.setDefaultBackgroundColorOverride", color={"r": 0, "g": 0, "b": 0, "a": 0})
cmd("Page.navigate", url=url + "?mode=" + mode)
time.sleep(1.5)
cmd("Runtime.evaluate", expression="document.fonts.ready", awaitPromise=True)
cmd("Page.enable")
load("bg", 1920, 1080)
cmd("Runtime.evaluate", expression="render(2)")
shot(out + "/orb.png", 1920, 1080)
load("boot", 1280, 800)
for i in range(120): # 4 s à 30 i/s
cmd("Runtime.evaluate", expression="render(%f)" % (i / 30))
shot("%s/frames/%03d.png" % (out, i), 1280, 800)
cmd("Page.close")