← back to Dw Marketing Reels

fetch-remaining.cjs

108 lines

'use strict';
// Resolve the 3 stragglers via Browserbase: Designers Guild Surimono Berry (PDG1062-01),
// Retro Walls ANI-100 mural, and try to isolate Coromandel -03 vs -05 swatches.
const os = require('os'), fs = require('fs'), path = require('path');
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 OUT = '/Users/macstudio3/Projects/dw-marketing-reels/sourced-images/imageless-14';

async function fetchBytes(page, url){
  return await page.evaluate(async (u) => {
    try{ const r = await fetch(u); if(!r.ok) return null;
    const b = await r.arrayBuffer(); const by = new Uint8Array(b);
    let bin=''; for(let i=0;i<by.length;i++) bin+=String.fromCharCode(by[i]);
    return { b64: btoa(bin), type: r.headers.get('content-type')||'', len: by.length }; }catch(e){return null;}
  }, url);
}
async function grab(page, pat){ // return product imgs matching a regex
  return await page.evaluate((patS) => {
    const re = new RegExp(patS,'i'); const out=[];
    document.querySelectorAll('img,source').forEach(im=>{
      const s = im.currentSrc||im.src||im.getAttribute('data-src')||im.getAttribute('srcset')||'';
      s.split(',').forEach(x=>{ const u=x.trim().split(' ')[0]; if(u && re.test(u)) out.push(u); });
    });
    return [...new Set(out)];
  }, pat);
}

(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(60000);
  const out = {};

  // ---- 1. Designers Guild Surimono Berry PDG1062-01 ----
  try {
    await page.goto('https://www.designersguild.com/us/search?q=Surimono', { waitUntil:'domcontentloaded' }).catch(()=>{});
    await sleep(5000);
    console.error('DG search title:', await page.title(), 'url:', page.url());
    // collect product links
    let links = await page.evaluate(()=>[...document.querySelectorAll('a')].map(a=>a.href).filter(h=>/surimono/i.test(h)));
    console.error('DG surimono links:', links.slice(0,8));
    // pick a berry/wallpaper one
    let target = links.find(h=>/berry/i.test(h) && /wallpaper|pdg/i.test(h)) || links.find(h=>/berry/i.test(h)) || links[0];
    if (target){ await page.goto(target,{waitUntil:'domcontentloaded'}).catch(()=>{}); await sleep(4000);
      out.dg_url = page.url(); out.dg_title = await page.title();
      const imgs = await grab(page, 'media|/images/|cloudfront|\\.(jpg|jpeg|png|webp)');
      out.dg_imgs = imgs.filter(u=>!/logo|icon|sprite|flag|placeholder/i.test(u)).slice(0,12);
    } else out.dg_note='no surimono link';
  } catch(e){ out.dg_err=e.message; }

  // ---- 2. Retro Walls ANI-100 anime mural ----
  try {
    await page.goto('https://retrowalls.com/?s=ANI-100', { waitUntil:'domcontentloaded' }).catch(()=>{});
    await sleep(4000);
    let links = await page.evaluate(()=>[...document.querySelectorAll('a')].map(a=>a.href));
    let cand = links.find(h=>/anime-afternoon|ani-100/i.test(h));
    if(!cand){ // try search by name
      await page.goto('https://retrowalls.com/?s=Anime+Afternoon', {waitUntil:'domcontentloaded'}).catch(()=>{}); await sleep(4000);
      links = await page.evaluate(()=>[...document.querySelectorAll('a')].map(a=>a.href));
      cand = links.find(h=>/anime-afternoon/i.test(h));
    }
    out.rw_candidate = cand || null;
    if(cand){ await page.goto(cand,{waitUntil:'domcontentloaded'}).catch(()=>{}); await sleep(4000);
      out.rw_url=page.url(); out.rw_title=await page.title();
      const imgs = await grab(page, 'wp-content/uploads|\\.(jpg|jpeg|png|webp)');
      out.rw_imgs = imgs.filter(u=>!/logo|icon|sprite|placeholder|flag|thumb-150|-150x150/i.test(u)).slice(0,12);
    }
  } catch(e){ out.rw_err=e.message; }

  // ---- 3. Coromandel -03 vs -05 swatch isolation (related colours ajax) ----
  try {
    await page.goto('https://www.osborneandlittle.com/coromandel_NCW4270-NCW4270.html', {waitUntil:'domcontentloaded'}).catch(()=>{});
    await sleep(3000);
    // click any "colours"/"colourway" control, and read swatch grid
    out.coro = await page.evaluate(()=>{
      const items=[];
      document.querySelectorAll('a,li,div').forEach(el=>{
        const t=(el.getAttribute('aria-label')||el.title||'').trim();
        const im=el.querySelector && el.querySelector('img');
        const s=im?(im.src||im.getAttribute('data-src')):'';
        if(/NCW4270-0[35]/i.test((t+' '+s))) items.push({t,s});
      });
      // also scan all imgs for NCW4270-03 / -05 named files
      const named=[]; document.querySelectorAll('img,source').forEach(im=>{const s=im.currentSrc||im.src||im.getAttribute('data-src')||'';if(/ncw4270-0[35]/i.test(s))named.push(s);});
      return { items, named:[...new Set(named)] };
    });
  } catch(e){ out.coro_err=e.message; }

  // download DG + RW chosen images
  const saved=[];
  const dgPick = (out.dg_imgs||[]).find(u=>/pdg1062|surimono/i.test(u)) || (out.dg_imgs||[])[0];
  if(dgPick){ const r=await fetchBytes(page,dgPick); if(r&&r.len>3000){const ext=/webp/i.test(r.type)?'webp':/png/i.test(r.type)?'png':'jpg';const fn=`PDG1062-01__surimono-berry.${ext}`;fs.writeFileSync(path.join(OUT,fn),Buffer.from(r.b64,'base64'));saved.push({sku:'PDG1062-01',file:fn,from:dgPick,bytes:r.len});} }
  const rwPick = (out.rw_imgs||[]).find(u=>/anime/i.test(u)) || (out.rw_imgs||[])[0];
  if(rwPick){ const r=await fetchBytes(page,rwPick); if(r&&r.len>3000){const ext=/webp/i.test(r.type)?'webp':/png/i.test(r.type)?'png':'jpg';const fn=`ANI-100__anime-afternoon.${ext}`;fs.writeFileSync(path.join(OUT,fn),Buffer.from(r.b64,'base64'));saved.push({sku:'ANI-100',file:fn,from:rwPick,bytes:r.len});} }
  // download coro named swatches if found
  for(const s of (out.coro&&out.coro.named)||[]){ const r=await fetchBytes(page,s); if(r&&r.len>3000){const m=s.match(/ncw4270-0([35])/i);const fn=`NCW4270-0${m?m[1]:'x'}__swatch.webp`;fs.writeFileSync(path.join(OUT,fn),Buffer.from(r.b64,'base64'));saved.push({sku:'NCW4270-0'+(m?m[1]:'x'),file:fn,from:s,bytes:r.len});} }

  out.saved=saved;
  await browser.close().catch(()=>{});
  fs.writeFileSync('/Users/macstudio3/Projects/dw-marketing-reels/fetch-remaining.json', JSON.stringify(out,null,2));
  console.log(JSON.stringify(out,null,2));
})().catch(e=>{ console.error('FATAL', e.message); process.exit(1); });