← back to Goodquestion Ai

scripts/capture-3d-screenshots.cjs

57 lines

/**
 * Capture screenshots from 3D War Room for blog posts.
 * Authenticates, navigates to different rooms, captures views.
 */
const { chromium } = require('playwright');
const path = require('path');
const fs = require('fs');

const BASE_URL = 'http://127.0.0.1:4060';
const AUTH = { user: 'admin', pass: process.env.BASIC_AUTH_PASS || process.env.AUTH_PASS };
const OUT_DIR = path.join(__dirname, '..', 'public', 'images', 'warroom');

async function capture() {
  fs.mkdirSync(OUT_DIR, { recursive: true });

  const browser = await chromium.launch({ headless: true });
  const context = await browser.newContext({
    viewport: { width: 1920, height: 1080 },
    httpCredentials: { username: AUTH.user, password: AUTH.pass },
  });

  const page = await context.newPage();

  // Load War Room
  console.log('Loading War Room...');
  await page.goto(BASE_URL, { waitUntil: 'networkidle', timeout: 30000 });
  await page.waitForTimeout(5000); // Let Three.js render

  // Screenshot 1: Default overview
  console.log('Capturing overview...');
  await page.screenshot({ path: path.join(OUT_DIR, '3d-overview.png') });

  // Try different camera views via keyboard shortcuts if available
  const views = [
    { key: '1', name: 'boardroom', wait: 3000 },
    { key: '2', name: 'executive', wait: 3000 },
    { key: '3', name: 'birds-eye', wait: 3000 },
  ];

  for (const view of views) {
    try {
      console.log(`Capturing ${view.name} view...`);
      await page.keyboard.press(view.key);
      await page.waitForTimeout(view.wait);
      await page.screenshot({ path: path.join(OUT_DIR, `3d-${view.name}.png`) });
    } catch (e) {
      console.log(`Skipped ${view.name}: ${e.message}`);
    }
  }

  await browser.close();
  console.log(`Screenshots saved to ${OUT_DIR}`);
  console.log(fs.readdirSync(OUT_DIR).join(', '));
}

capture().catch(e => console.error('Error:', e.message));