#!/usr/bin/env python3 """Запекает векторные сцены дефолтных фонов (`*.svg`) в WebP для фронтенда. Исходники сцен — собственные рисунки VidConf (см. README рядом), поэтому лежат в репозитории вместе с результатом: чужих фотографий с их лицензиями в продукте нет. Запуск (нужен установленный Google Chrome и Pillow): python3 design/backgrounds/render.py Результат — `frontend/public/backgrounds/*.webp`, 1280×720. Chrome нужен только для растеризации SVG (rsvg/ImageMagick на машине может не быть), Pillow — для перевода PNG в WebP: браузерный скриншот WebP не отдаёт. """ import subprocess import sys import tempfile from pathlib import Path from PIL import Image CHROME = "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" WIDTH, HEIGHT = 1280, 720 # 82 — визуально неотличимо от исходника на плавных градиентах сцены, а вес # втрое меньше, чем при 95. Фон грузится по сети при каждом первом показе. WEBP_QUALITY = 82 SOURCE_DIR = Path(__file__).parent TARGET_DIR = SOURCE_DIR.parents[1] / "frontend" / "public" / "backgrounds" def render(svg_path: Path, out_path: Path, workdir: Path) -> None: """Растеризовать одну сцену и сохранить её в WebP.""" png_path = workdir / f"{svg_path.stem}.png" subprocess.run( [ CHROME, "--headless", "--disable-gpu", "--hide-scrollbars", "--default-background-color=00000000", f"--screenshot={png_path}", f"--window-size={WIDTH},{HEIGHT}", svg_path.resolve().as_uri(), ], check=True, capture_output=True, ) with Image.open(png_path) as image: image.convert("RGB").save(out_path, "WEBP", quality=WEBP_QUALITY, method=6) def main() -> int: if not Path(CHROME).exists(): print(f"не найден Chrome: {CHROME}", file=sys.stderr) return 1 TARGET_DIR.mkdir(parents=True, exist_ok=True) with tempfile.TemporaryDirectory() as tmp: workdir = Path(tmp) for svg_path in sorted(SOURCE_DIR.glob("*.svg")): out_path = TARGET_DIR / f"{svg_path.stem}.webp" render(svg_path, out_path, workdir) print( f"{svg_path.name} → {out_path.relative_to(SOURCE_DIR.parents[1])}" f" ({out_path.stat().st_size // 1024} КБ)" ) return 0 if __name__ == "__main__": raise SystemExit(main())