← 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); });