← back to Dw Marketing Reels

harvest-colorways.cjs

59 lines

'use strict';
// Deep pass: for products where the base PDP has MULTIPLE colorways, pull the full
// colorway swatch grid (color name + swatch img + sku) so we can pick the exact colorway.
// Also retry Designers Guild Surimono PDG1062-01 via the real DG product route.
const os = require('os'), fs = require('fs');
require('dotenv').config({ path: os.homedir() + '/.claude/skills/browserbase/.env' });
const Browserbase = require('@browserbasehq/sdk').default;
const { chromium } = require('playwright-core');
const sleep = ms => new Promise(r => setTimeout(r, ms));

const targets = [
  { sku:'EUR-70328', want:'Audley',  url:'https://www.osborneandlittle.com/audley_W6297-W6297.html' },
  { sku:'EUR-70402', want:'Canestra',url:'https://www.osborneandlittle.com/canestra_W6341-W6341.html' },
  { sku:'EUR-70351', want:'Chameleon',url:'https://www.osborneandlittle.com/chameleon_W6305-W6305.html' },
  { sku:'NCW4270-03',want:'Coromandel 03',url:'https://www.osborneandlittle.com/coromandel_NCW4270-NCW4270.html' },
  { sku:'NCW4270-05',want:'Coromandel 05',url:'https://www.osborneandlittle.com/coromandel_NCW4270-NCW4270.html' },
  { sku:'PDG1062-01',want:'Surimono Berry',url:'https://www.designersguild.com/en-gb/wallpaper/surimono-berry-wallpaper/pdg1062-01', vendor:'DG' },
];

(async () => {
  const bb = new Browserbase({ apiKey: process.env.BROWSERBASE_API_KEY });
  const session = await bb.sessions.create({ projectId: process.env.BROWSERBASE_PROJECT_ID, browserSettings: { solveCaptchas: true } });
  console.error('session', session.id);
  const browser = await chromium.connectOverCDP(session.connectUrl);
  const page = browser.contexts()[0].pages()[0] || await browser.contexts()[0].newPage();
  page.setDefaultTimeout(45000);
  const results = [];
  for (const t of targets){
    const r = { sku:t.sku, want:t.want, vendor:t.vendor||'OL', url:t.url };
    try {
      await page.goto(t.url, { waitUntil:'domcontentloaded' }).catch(()=>{});
      await sleep(3500);
      r.finalUrl = page.url(); r.title = await page.title();
      // Dump ALL imgs w/ their src + nearby text; and any colorway option list
      r.data = await page.evaluate(() => {
        const imgs = [];
        document.querySelectorAll('img').forEach(im => {
          const s = im.src || im.getAttribute('data-src') || im.getAttribute('data-original') || '';
          if (/media\/catalog\/product/i.test(s) && !/AVATAR|logo\/websites/i.test(s))
            imgs.push({ src:s, alt:im.alt||'', title:im.title||'' });
        });
        // colorway option swatches (magento swatch / related colours)
        const cw = [];
        document.querySelectorAll('.colour, .colourway, .swatch-attribute-options a, .related-colours a, [data-role="swatch-option"], .product-item').forEach(el=>{
          const a=el.querySelector('a')||el; const im=el.querySelector('img');
          cw.push({ text:(el.getAttribute('aria-label')||el.title||el.innerText||'').trim().slice(0,60), href:(a&&a.href)||'', img:(im&&(im.src||im.getAttribute('data-src')))||'' });
        });
        return { imgs:[...new Map(imgs.map(i=>[i.src,i])).values()].slice(0,20), colorways:cw.filter(c=>c.text||c.img).slice(0,30) };
      });
    } catch(e){ r.error = e.message; }
    console.error(`[${r.sku}] ${r.finalUrl} imgs=${(r.data&&r.data.imgs.length)||0} cw=${(r.data&&r.data.colorways.length)||0} ${r.error||''}`);
    results.push(r);
  }
  await browser.close().catch(()=>{});
  const fp = os.homedir()+'/Projects/dw-marketing-reels/harvest-colorways-results.json';
  fs.writeFileSync(fp, JSON.stringify(results,null,2));
  console.log(fp);
})().catch(e=>{ console.error('FATAL', e.message); process.exit(1); });