← back to Dw Marketing Reels
auto-save: 2026-07-16T08:12:03 (9 files) — fetch-ol-images.cjs fetch-ol-manifest.json fetch-remaining.cjs fetch-remaining.json harvest-colorways-results.json
979735d45c0c6bc7fa44b55edef5d3c9fb5bda09 · 2026-07-16 08:12:09 -0700 · Steve Abrams
Files touched
A fetch-ol-images.cjsA fetch-ol-manifest.jsonA fetch-remaining.cjsA fetch-remaining.jsonA harvest-colorways-results.jsonA harvest-colorways.cjsA harvest-ol-family.cjsA harvest-ol-results.jsonA sourced-images/imageless-14/EUR-70328__5314.webpA sourced-images/imageless-14/EUR-70351__5223.webpA sourced-images/imageless-14/EUR-70402__5053.webpA sourced-images/imageless-14/NCW4270__3975.webpA sourced-images/imageless-14/NCW4352-05_bonnelles.jpgA sourced-images/imageless-14/W5223-03__w5223-03.webpA sourced-images/imageless-14/W6541-02__4591.webpA sourced-images/imageless-14/W7024-03__w7024-03.webpA sourced-images/imageless-14/W7334-1__w7334-01.webpA sourced-images/imageless-14/W7682-01__w7682-01_ff8svfx2jzq6e1ez.webpA sourced-images/imageless-14/W7814-01__w7814-01_n6lger3vo8gdn9ly.webp
Diff
commit 979735d45c0c6bc7fa44b55edef5d3c9fb5bda09
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Thu Jul 16 08:12:09 2026 -0700
auto-save: 2026-07-16T08:12:03 (9 files) — fetch-ol-images.cjs fetch-ol-manifest.json fetch-remaining.cjs fetch-remaining.json harvest-colorways-results.json
---
fetch-ol-images.cjs | 93 +++++++
fetch-ol-manifest.json | 212 +++++++++++++++
fetch-remaining.cjs | 107 ++++++++
fetch-remaining.json | 25 ++
harvest-colorways-results.json | 294 +++++++++++++++++++++
harvest-colorways.cjs | 58 ++++
harvest-ol-family.cjs | 82 ++++++
harvest-ol-results.json | 139 ++++++++++
sourced-images/imageless-14/EUR-70328__5314.webp | Bin 0 -> 124638 bytes
sourced-images/imageless-14/EUR-70351__5223.webp | Bin 0 -> 69098 bytes
sourced-images/imageless-14/EUR-70402__5053.webp | Bin 0 -> 160346 bytes
sourced-images/imageless-14/NCW4270__3975.webp | Bin 0 -> 39684 bytes
.../imageless-14/NCW4352-05_bonnelles.jpg | Bin 0 -> 192777 bytes
.../imageless-14/W5223-03__w5223-03.webp | Bin 0 -> 613622 bytes
sourced-images/imageless-14/W6541-02__4591.webp | Bin 0 -> 85054 bytes
.../imageless-14/W7024-03__w7024-03.webp | Bin 0 -> 147700 bytes
sourced-images/imageless-14/W7334-1__w7334-01.webp | Bin 0 -> 609682 bytes
.../W7682-01__w7682-01_ff8svfx2jzq6e1ez.webp | Bin 0 -> 481862 bytes
.../W7814-01__w7814-01_n6lger3vo8gdn9ly.webp | Bin 0 -> 75350 bytes
19 files changed, 1010 insertions(+)
diff --git a/fetch-ol-images.cjs b/fetch-ol-images.cjs
new file mode 100644
index 0000000..8d6fc81
--- /dev/null
+++ b/fetch-ol-images.cjs
@@ -0,0 +1,93 @@
+'use strict';
+// Final pass: through Browserbase (cloud IP can reach the blocked O&L host), for each PDP
+// (a) scroll to trigger lazy-load, (b) read the magento gallery JSON (full colorway swatches),
+// (c) fetch the chosen image bytes in-browser and return base64 so we can save locally.
+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';
+fs.mkdirSync(OUT, { recursive: true });
+
+// pages to open; each returns full gallery so we can pick colorway-correct swatch
+const pages = [
+ { key:'W7814-01', url:'https://www.osborneandlittle.com/colonnato-w7814.html' },
+ { key:'W7682-01', url:'https://www.osborneandlittle.com/coralline-w7682.html' },
+ { key:'W7024-03', url:'https://www.osborneandlittle.com/japanese-garden-w7024-w7024.html' },
+ { key:'W6541-02', url:'https://www.osborneandlittle.com/peacock-w6541.html' },
+ { key:'W5223-03', url:'https://www.osborneandlittle.com/tamba-w5223.html' },
+ { key:'W7334-1', url:'https://www.osborneandlittle.com/trailing-orchid-w7334.html' },
+ { key:'EUR-70328',url:'https://www.osborneandlittle.com/audley_W6297-W6297.html' },
+ { key:'EUR-70402',url:'https://www.osborneandlittle.com/canestra_W6341-W6341.html' },
+ { key:'EUR-70351',url:'https://www.osborneandlittle.com/chameleon_W6305-W6305.html' },
+ { key:'NCW4270', url:'https://www.osborneandlittle.com/coromandel_NCW4270-NCW4270.html' },
+];
+
+async function galleryOf(page){
+ // scroll to load lazy imgs
+ await page.evaluate(async()=>{ for(let y=0;y<3000;y+=400){window.scrollTo(0,y);await new Promise(r=>setTimeout(r,150));} window.scrollTo(0,0); });
+ await sleep(1500);
+ return await page.evaluate(() => {
+ const out = { imgs:[], magento:[] };
+ document.querySelectorAll('img').forEach(im => {
+ const s = im.currentSrc || im.src || im.getAttribute('data-src') || '';
+ if (/media\/catalog\/product/i.test(s) && !/AVATAR|white_logo|brand\//i.test(s)) out.imgs.push(s);
+ });
+ // magento fotorama/gallery json
+ const html = document.documentElement.innerHTML;
+ const re = /"(?:img|full|thumb)":"(https?:[^"]*media\/catalog\/product[^"]+)"/g; let m;
+ while((m=re.exec(html))) out.magento.push(m[1].replace(/\\\//g,'/'));
+ return { imgs:[...new Set(out.imgs)], magento:[...new Set(out.magento)] };
+ });
+}
+
+async function fetchBytes(page, url){
+ return await page.evaluate(async (u) => {
+ const r = await fetch(u); if(!r.ok) return null;
+ const b = await r.arrayBuffer(); const bytes = new Uint8Array(b);
+ let bin=''; for(let i=0;i<bytes.length;i++) bin+=String.fromCharCode(bytes[i]);
+ return { b64: btoa(bin), type: r.headers.get('content-type')||'', len: bytes.length };
+ }, url);
+}
+
+(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 manifest = [];
+ for (const p of pages){
+ const rec = { key:p.key, url:p.url };
+ try {
+ await page.goto(p.url, { waitUntil:'domcontentloaded' }).catch(()=>{});
+ await sleep(2500);
+ rec.gallery = await galleryOf(page);
+ // choose candidate imgs to download: SKU-named first, else all product imgs (non-hero)
+ const all = [...new Set([...rec.gallery.magento, ...rec.gallery.imgs])];
+ rec.candidates = all;
+ // download every candidate that isn't the collection hero pattern (mpiowebpcache/bff0.. = og hero)
+ const dl = all.filter(u=>/catalog\/product/i.test(u));
+ rec.saved = [];
+ for (let i=0;i<dl.length && i<8;i++){
+ const u = dl[i];
+ const r = await fetchBytes(page, u);
+ if (r && r.len>2000){
+ const ext = /webp/i.test(r.type)?'webp':(/png/i.test(r.type)?'png':'jpg');
+ const base = (u.split('/').pop()||('img'+i)).replace(/\.(webp|jpg|jpeg|png).*$/i,'');
+ const fn = `${p.key}__${base}.${ext}`;
+ fs.writeFileSync(path.join(OUT, fn), Buffer.from(r.b64,'base64'));
+ rec.saved.push({ file:fn, from:u, bytes:r.len, type:r.type });
+ }
+ }
+ } catch(e){ rec.error = e.message; }
+ console.error(`[${p.key}] mag=${rec.gallery?rec.gallery.magento.length:0} img=${rec.gallery?rec.gallery.imgs.length:0} saved=${rec.saved?rec.saved.length:0} ${rec.error||''}`);
+ manifest.push(rec);
+ }
+ await browser.close().catch(()=>{});
+ const fp = '/Users/macstudio3/Projects/dw-marketing-reels/fetch-ol-manifest.json';
+ fs.writeFileSync(fp, JSON.stringify(manifest,null,2));
+ console.log(fp);
+})().catch(e=>{ console.error('FATAL', e.message); process.exit(1); });
diff --git a/fetch-ol-manifest.json b/fetch-ol-manifest.json
new file mode 100644
index 0000000..18c61b7
--- /dev/null
+++ b/fetch-ol-manifest.json
@@ -0,0 +1,212 @@
+[
+ {
+ "key": "W7814-01",
+ "url": "https://www.osborneandlittle.com/colonnato-w7814.html",
+ "gallery": {
+ "imgs": [
+ "https://www.osborneandlittle.com/media/catalog/product/mpiowebpcache/84bc17ac2f8b054c2365f229ad79ced6/w/7/w7814-01_n6lger3vo8gdn9ly.webp"
+ ],
+ "magento": []
+ },
+ "candidates": [
+ "https://www.osborneandlittle.com/media/catalog/product/mpiowebpcache/84bc17ac2f8b054c2365f229ad79ced6/w/7/w7814-01_n6lger3vo8gdn9ly.webp"
+ ],
+ "saved": [
+ {
+ "file": "W7814-01__w7814-01_n6lger3vo8gdn9ly.webp",
+ "from": "https://www.osborneandlittle.com/media/catalog/product/mpiowebpcache/84bc17ac2f8b054c2365f229ad79ced6/w/7/w7814-01_n6lger3vo8gdn9ly.webp",
+ "bytes": 75350,
+ "type": "image/webp"
+ }
+ ]
+ },
+ {
+ "key": "W7682-01",
+ "url": "https://www.osborneandlittle.com/coralline-w7682.html",
+ "gallery": {
+ "imgs": [
+ "https://www.osborneandlittle.com/media/catalog/product/mpiowebpcache/84bc17ac2f8b054c2365f229ad79ced6/w/7/w7682-01_ff8svfx2jzq6e1ez.webp"
+ ],
+ "magento": []
+ },
+ "candidates": [
+ "https://www.osborneandlittle.com/media/catalog/product/mpiowebpcache/84bc17ac2f8b054c2365f229ad79ced6/w/7/w7682-01_ff8svfx2jzq6e1ez.webp"
+ ],
+ "saved": [
+ {
+ "file": "W7682-01__w7682-01_ff8svfx2jzq6e1ez.webp",
+ "from": "https://www.osborneandlittle.com/media/catalog/product/mpiowebpcache/84bc17ac2f8b054c2365f229ad79ced6/w/7/w7682-01_ff8svfx2jzq6e1ez.webp",
+ "bytes": 481862,
+ "type": "image/webp"
+ }
+ ]
+ },
+ {
+ "key": "W7024-03",
+ "url": "https://www.osborneandlittle.com/japanese-garden-w7024-w7024.html",
+ "gallery": {
+ "imgs": [
+ "https://www.osborneandlittle.com/media/catalog/product/mpiowebpcache/84bc17ac2f8b054c2365f229ad79ced6/w/7/w7024-03.webp"
+ ],
+ "magento": []
+ },
+ "candidates": [
+ "https://www.osborneandlittle.com/media/catalog/product/mpiowebpcache/84bc17ac2f8b054c2365f229ad79ced6/w/7/w7024-03.webp"
+ ],
+ "saved": [
+ {
+ "file": "W7024-03__w7024-03.webp",
+ "from": "https://www.osborneandlittle.com/media/catalog/product/mpiowebpcache/84bc17ac2f8b054c2365f229ad79ced6/w/7/w7024-03.webp",
+ "bytes": 147700,
+ "type": "image/webp"
+ }
+ ]
+ },
+ {
+ "key": "W6541-02",
+ "url": "https://www.osborneandlittle.com/peacock-w6541.html",
+ "gallery": {
+ "imgs": [
+ "https://www.osborneandlittle.com/media/catalog/product/mpiowebpcache/84bc17ac2f8b054c2365f229ad79ced6/4/5/4591.webp"
+ ],
+ "magento": []
+ },
+ "candidates": [
+ "https://www.osborneandlittle.com/media/catalog/product/mpiowebpcache/84bc17ac2f8b054c2365f229ad79ced6/4/5/4591.webp"
+ ],
+ "saved": [
+ {
+ "file": "W6541-02__4591.webp",
+ "from": "https://www.osborneandlittle.com/media/catalog/product/mpiowebpcache/84bc17ac2f8b054c2365f229ad79ced6/4/5/4591.webp",
+ "bytes": 85054,
+ "type": "image/webp"
+ }
+ ]
+ },
+ {
+ "key": "W5223-03",
+ "url": "https://www.osborneandlittle.com/tamba-w5223.html",
+ "gallery": {
+ "imgs": [
+ "https://www.osborneandlittle.com/media/catalog/product/mpiowebpcache/84bc17ac2f8b054c2365f229ad79ced6/w/5/w5223-03.webp"
+ ],
+ "magento": []
+ },
+ "candidates": [
+ "https://www.osborneandlittle.com/media/catalog/product/mpiowebpcache/84bc17ac2f8b054c2365f229ad79ced6/w/5/w5223-03.webp"
+ ],
+ "saved": [
+ {
+ "file": "W5223-03__w5223-03.webp",
+ "from": "https://www.osborneandlittle.com/media/catalog/product/mpiowebpcache/84bc17ac2f8b054c2365f229ad79ced6/w/5/w5223-03.webp",
+ "bytes": 613622,
+ "type": "image/webp"
+ }
+ ]
+ },
+ {
+ "key": "W7334-1",
+ "url": "https://www.osborneandlittle.com/trailing-orchid-w7334.html",
+ "gallery": {
+ "imgs": [
+ "https://www.osborneandlittle.com/media/catalog/product/mpiowebpcache/84bc17ac2f8b054c2365f229ad79ced6/w/7/w7334-01.webp"
+ ],
+ "magento": []
+ },
+ "candidates": [
+ "https://www.osborneandlittle.com/media/catalog/product/mpiowebpcache/84bc17ac2f8b054c2365f229ad79ced6/w/7/w7334-01.webp"
+ ],
+ "saved": [
+ {
+ "file": "W7334-1__w7334-01.webp",
+ "from": "https://www.osborneandlittle.com/media/catalog/product/mpiowebpcache/84bc17ac2f8b054c2365f229ad79ced6/w/7/w7334-01.webp",
+ "bytes": 609682,
+ "type": "image/webp"
+ }
+ ]
+ },
+ {
+ "key": "EUR-70328",
+ "url": "https://www.osborneandlittle.com/audley_W6297-W6297.html",
+ "gallery": {
+ "imgs": [
+ "https://www.osborneandlittle.com/media/catalog/product/mpiowebpcache/84bc17ac2f8b054c2365f229ad79ced6/5/3/5314.webp"
+ ],
+ "magento": []
+ },
+ "candidates": [
+ "https://www.osborneandlittle.com/media/catalog/product/mpiowebpcache/84bc17ac2f8b054c2365f229ad79ced6/5/3/5314.webp"
+ ],
+ "saved": [
+ {
+ "file": "EUR-70328__5314.webp",
+ "from": "https://www.osborneandlittle.com/media/catalog/product/mpiowebpcache/84bc17ac2f8b054c2365f229ad79ced6/5/3/5314.webp",
+ "bytes": 124638,
+ "type": "image/webp"
+ }
+ ]
+ },
+ {
+ "key": "EUR-70402",
+ "url": "https://www.osborneandlittle.com/canestra_W6341-W6341.html",
+ "gallery": {
+ "imgs": [
+ "https://www.osborneandlittle.com/media/catalog/product/mpiowebpcache/84bc17ac2f8b054c2365f229ad79ced6/5/0/5053.webp"
+ ],
+ "magento": []
+ },
+ "candidates": [
+ "https://www.osborneandlittle.com/media/catalog/product/mpiowebpcache/84bc17ac2f8b054c2365f229ad79ced6/5/0/5053.webp"
+ ],
+ "saved": [
+ {
+ "file": "EUR-70402__5053.webp",
+ "from": "https://www.osborneandlittle.com/media/catalog/product/mpiowebpcache/84bc17ac2f8b054c2365f229ad79ced6/5/0/5053.webp",
+ "bytes": 160346,
+ "type": "image/webp"
+ }
+ ]
+ },
+ {
+ "key": "EUR-70351",
+ "url": "https://www.osborneandlittle.com/chameleon_W6305-W6305.html",
+ "gallery": {
+ "imgs": [
+ "https://www.osborneandlittle.com/media/catalog/product/mpiowebpcache/84bc17ac2f8b054c2365f229ad79ced6/5/2/5223.webp"
+ ],
+ "magento": []
+ },
+ "candidates": [
+ "https://www.osborneandlittle.com/media/catalog/product/mpiowebpcache/84bc17ac2f8b054c2365f229ad79ced6/5/2/5223.webp"
+ ],
+ "saved": [
+ {
+ "file": "EUR-70351__5223.webp",
+ "from": "https://www.osborneandlittle.com/media/catalog/product/mpiowebpcache/84bc17ac2f8b054c2365f229ad79ced6/5/2/5223.webp",
+ "bytes": 69098,
+ "type": "image/webp"
+ }
+ ]
+ },
+ {
+ "key": "NCW4270",
+ "url": "https://www.osborneandlittle.com/coromandel_NCW4270-NCW4270.html",
+ "gallery": {
+ "imgs": [
+ "https://www.osborneandlittle.com/media/catalog/product/mpiowebpcache/84bc17ac2f8b054c2365f229ad79ced6/3/9/3975.webp"
+ ],
+ "magento": []
+ },
+ "candidates": [
+ "https://www.osborneandlittle.com/media/catalog/product/mpiowebpcache/84bc17ac2f8b054c2365f229ad79ced6/3/9/3975.webp"
+ ],
+ "saved": [
+ {
+ "file": "NCW4270__3975.webp",
+ "from": "https://www.osborneandlittle.com/media/catalog/product/mpiowebpcache/84bc17ac2f8b054c2365f229ad79ced6/3/9/3975.webp",
+ "bytes": 39684,
+ "type": "image/webp"
+ }
+ ]
+ }
+]
\ No newline at end of file
diff --git a/fetch-remaining.cjs b/fetch-remaining.cjs
new file mode 100644
index 0000000..c23e897
--- /dev/null
+++ b/fetch-remaining.cjs
@@ -0,0 +1,107 @@
+'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); });
diff --git a/fetch-remaining.json b/fetch-remaining.json
new file mode 100644
index 0000000..963020f
--- /dev/null
+++ b/fetch-remaining.json
@@ -0,0 +1,25 @@
+{
+ "dg_note": "no surimono link",
+ "rw_candidate": "https://retrowalls.com/?s=ANI-100#contact",
+ "rw_url": "https://retrowalls.com/?s=ANI-100#contact",
+ "rw_title": "retrowalls — vintage to midcentury, real samples ship free.",
+ "rw_imgs": [
+ "https://retrowalls.com/img/ba5f465cf7c1ae22529d.jpg",
+ "https://retrowalls.com/img/cb2315787905c61c7acc.jpg",
+ "https://retrowalls.com/img/3b65e8aa664c387b793e.jpg",
+ "https://retrowalls.com/img/9dceefa1726e46b06f60.jpg",
+ "https://retrowalls.com/img/8b6a508d69575ef40ba0.jpg",
+ "https://retrowalls.com/img/40027a37b6da7cb38036.jpg",
+ "https://retrowalls.com/img/a5fb4dc0fff07c6f7e3f.jpg",
+ "https://retrowalls.com/img/e9f6c8a147ca23cc0152.webp",
+ "https://retrowalls.com/img/bfc7e88f991a364f2d31.jpg",
+ "https://retrowalls.com/img/519327d8502b0f946f38.jpg",
+ "https://retrowalls.com/img/50c05fc00f7b6d93db71.jpg",
+ "https://retrowalls.com/img/038ad5a029ac42c3fa6a.jpg"
+ ],
+ "coro": {
+ "items": [],
+ "named": []
+ },
+ "saved": []
+}
\ No newline at end of file
diff --git a/harvest-colorways-results.json b/harvest-colorways-results.json
new file mode 100644
index 0000000..df52295
--- /dev/null
+++ b/harvest-colorways-results.json
@@ -0,0 +1,294 @@
+[
+ {
+ "sku": "EUR-70328",
+ "want": "Audley",
+ "vendor": "OL",
+ "url": "https://www.osborneandlittle.com/audley_W6297-W6297.html",
+ "finalUrl": "https://www.osborneandlittle.com/audley_W6297-W6297.html",
+ "title": "Strand Wallpapers | Osborne & Little",
+ "data": {
+ "imgs": [
+ {
+ "src": "https://www.osborneandlittle.com/media/catalog/product/mpiowebpcache/84bc17ac2f8b054c2365f229ad79ced6/5/3/5314.webp",
+ "alt": "",
+ "title": ""
+ }
+ ],
+ "colorways": [
+ {
+ "text": "BLOOMSBURY\n1 colourway",
+ "href": "https://www.osborneandlittle.com/bloomsbury_W6290-W6290.html",
+ "img": "https://www.osborneandlittle.com/media/lilo/brand/white_logo/o/s/osborne-whiter_2_1.svg"
+ },
+ {
+ "text": "GROSVENOR\n3 colourways",
+ "href": "https://www.osborneandlittle.com/grosvenor_W6291-W6291.html",
+ "img": "https://www.osborneandlittle.com/media/lilo/brand/white_logo/o/s/osborne-whiter_2_1.svg"
+ },
+ {
+ "text": "PORTLAND\n3 colourways",
+ "href": "https://www.osborneandlittle.com/portland_W6292-W6292.html",
+ "img": "https://www.osborneandlittle.com/media/lilo/brand/white_logo/o/s/osborne-whiter_2_1.svg"
+ },
+ {
+ "text": "ENNISMORE\n3 colourways",
+ "href": "https://www.osborneandlittle.com/ennismore_W6293-W6293.html",
+ "img": "https://www.osborneandlittle.com/media/lilo/brand/white_logo/o/s/osborne-whiter_2_1.svg"
+ },
+ {
+ "text": "MARYLEBONE\n2 colourways",
+ "href": "https://www.osborneandlittle.com/marylebone_W6294-W6294.html",
+ "img": "https://www.osborneandlittle.com/media/lilo/brand/white_logo/o/s/osborne-whiter_2_1.svg"
+ },
+ {
+ "text": "FITZROY\n4 colourways",
+ "href": "https://www.osborneandlittle.com/fitzroy_W6295-W6295.html",
+ "img": "https://www.osborneandlittle.com/media/lilo/brand/white_logo/o/s/osborne-whiter_2_1.svg"
+ },
+ {
+ "text": "CARNABY\n3 colourways",
+ "href": "https://www.osborneandlittle.com/carnaby_W6296-W6296.html",
+ "img": "https://www.osborneandlittle.com/media/lilo/brand/white_logo/o/s/osborne-whiter_2_1.svg"
+ },
+ {
+ "text": "AUDLEY\n1 colourway",
+ "href": "https://www.osborneandlittle.com/audley_W6297-W6297.html",
+ "img": "https://www.osborneandlittle.com/media/lilo/brand/white_logo/o/s/osborne-whiter_2_1.svg"
+ },
+ {
+ "text": "SHAFTESBURY\n2 colourways",
+ "href": "https://www.osborneandlittle.com/shaftesbury_W6298-W6298.html",
+ "img": "https://www.osborneandlittle.com/media/lilo/brand/white_logo/o/s/osborne-whiter_2_1.svg"
+ }
+ ]
+ }
+ },
+ {
+ "sku": "EUR-70402",
+ "want": "Canestra",
+ "vendor": "OL",
+ "url": "https://www.osborneandlittle.com/canestra_W6341-W6341.html",
+ "finalUrl": "https://www.osborneandlittle.com/canestra_W6341-W6341.html",
+ "title": "Rabanna Wallpapers | Osborne & Little",
+ "data": {
+ "imgs": [
+ {
+ "src": "https://www.osborneandlittle.com/media/catalog/product/mpiowebpcache/84bc17ac2f8b054c2365f229ad79ced6/5/0/5053.webp",
+ "alt": "",
+ "title": ""
+ }
+ ],
+ "colorways": [
+ {
+ "text": "RABANNA\n3 colourways",
+ "href": "https://www.osborneandlittle.com/rabanna_W6340-W6340.html",
+ "img": "https://www.osborneandlittle.com/media/lilo/brand/white_logo/o/s/osborne-whiter_2_1.svg"
+ },
+ {
+ "text": "CANESTRA\n1 colourway",
+ "href": "https://www.osborneandlittle.com/canestra_W6341-W6341.html",
+ "img": "https://www.osborneandlittle.com/media/lilo/brand/white_logo/o/s/osborne-whiter_2_1.svg"
+ },
+ {
+ "text": "HOUNDSTOOTH\n3 colourways",
+ "href": "https://www.osborneandlittle.com/houndstooth_W6342-W6342.html",
+ "img": "https://www.osborneandlittle.com/media/lilo/brand/white_logo/o/s/osborne-whiter_2_1.svg"
+ },
+ {
+ "text": "CHAMBRAY\n1 colourway",
+ "href": "https://www.osborneandlittle.com/chambray_W6343.html",
+ "img": "https://www.osborneandlittle.com/media/lilo/brand/white_logo/o/s/osborne-whiter_2_1.svg"
+ },
+ {
+ "text": "ZANELLA\n1 colourway",
+ "href": "https://www.osborneandlittle.com/zanella-w6344.html",
+ "img": "https://www.osborneandlittle.com/media/lilo/brand/white_logo/o/s/osborne-whiter_2_1.svg"
+ },
+ {
+ "text": "CORDOVAN\n1 colourway",
+ "href": "https://www.osborneandlittle.com/cordovan-w6345.html",
+ "img": "https://www.osborneandlittle.com/media/lilo/brand/white_logo/o/s/osborne-whiter_2_1.svg"
+ },
+ {
+ "text": "TABARET\n2 colourways",
+ "href": "https://www.osborneandlittle.com/tabaret_W6346-W6346.html",
+ "img": "https://www.osborneandlittle.com/media/lilo/brand/white_logo/o/s/osborne-whiter_2_1.svg"
+ }
+ ]
+ }
+ },
+ {
+ "sku": "EUR-70351",
+ "want": "Chameleon",
+ "vendor": "OL",
+ "url": "https://www.osborneandlittle.com/chameleon_W6305-W6305.html",
+ "finalUrl": "https://www.osborneandlittle.com/chameleon_W6305-W6305.html",
+ "title": "Komodo Wallpapers | Osborne & Little",
+ "data": {
+ "imgs": [
+ {
+ "src": "https://www.osborneandlittle.com/media/catalog/product/mpiowebpcache/84bc17ac2f8b054c2365f229ad79ced6/5/2/5223.webp",
+ "alt": "",
+ "title": ""
+ }
+ ],
+ "colorways": [
+ {
+ "text": "KOMODO\n2 colourways",
+ "href": "https://www.osborneandlittle.com/komodo_W6300-W6300.html",
+ "img": "https://www.osborneandlittle.com/media/lilo/brand/white_logo/o/s/osborne-whiter_2_1.svg"
+ },
+ {
+ "text": "COBRA\n4 colourways",
+ "href": "https://www.osborneandlittle.com/cobra_W6302.html",
+ "img": "https://www.osborneandlittle.com/media/lilo/brand/white_logo/o/s/osborne-whiter_2_1.svg"
+ },
+ {
+ "text": "MAKO\n3 colourways",
+ "href": "https://www.osborneandlittle.com/mako-w6303.html",
+ "img": "https://www.osborneandlittle.com/media/lilo/brand/white_logo/o/s/osborne-whiter_2_1.svg"
+ },
+ {
+ "text": "QUAGGA\n1 colourway",
+ "href": "https://www.osborneandlittle.com/quagga_W6304-W6304.html",
+ "img": "https://www.osborneandlittle.com/media/lilo/brand/white_logo/o/s/osborne-whiter_2_1.svg"
+ },
+ {
+ "text": "CHAMELEON\n3 colourways",
+ "href": "https://www.osborneandlittle.com/chameleon_W6305-W6305.html",
+ "img": "https://www.osborneandlittle.com/media/lilo/brand/white_logo/o/s/osborne-whiter_2_1.svg"
+ }
+ ]
+ }
+ },
+ {
+ "sku": "NCW4270-03",
+ "want": "Coromandel 03",
+ "vendor": "OL",
+ "url": "https://www.osborneandlittle.com/coromandel_NCW4270-NCW4270.html",
+ "finalUrl": "https://www.osborneandlittle.com/coromandel_NCW4270-NCW4270.html",
+ "title": "Coromandel Wallpapers | Osborne & Little",
+ "data": {
+ "imgs": [
+ {
+ "src": "https://www.osborneandlittle.com/media/catalog/product/mpiowebpcache/84bc17ac2f8b054c2365f229ad79ced6/3/9/3975.webp",
+ "alt": "",
+ "title": ""
+ }
+ ],
+ "colorways": [
+ {
+ "text": "COROMANDEL\n2 colourways",
+ "href": "https://www.osborneandlittle.com/coromandel_NCW4270-NCW4270.html",
+ "img": "https://www.osborneandlittle.com/media/lilo/brand/white_logo/n/i/nina-white_2.svg"
+ },
+ {
+ "text": "VIGNOLA\n1 colourway",
+ "href": "https://www.osborneandlittle.com/vignola_NCW4271-NCW4271.html",
+ "img": "https://www.osborneandlittle.com/media/lilo/brand/white_logo/n/i/nina-white_2.svg"
+ },
+ {
+ "text": "PAVILION GARDEN\n2 colourways",
+ "href": "https://www.osborneandlittle.com/pavilion-garden_NCW4272-NCW4272.html",
+ "img": "https://www.osborneandlittle.com/media/lilo/brand/white_logo/n/i/nina-white_2.svg"
+ },
+ {
+ "text": "GIOCONDA\n1 colourway",
+ "href": "https://www.osborneandlittle.com/gioconda_NCW4273-NCW4273.html",
+ "img": "https://www.osborneandlittle.com/media/lilo/brand/white_logo/n/i/nina-white_2.svg"
+ },
+ {
+ "text": "PALMETTO\n2 colourways",
+ "href": "https://www.osborneandlittle.com/palmetto-ncw4274-ncw4274.html",
+ "img": "https://www.osborneandlittle.com/media/lilo/brand/white_logo/n/i/nina-white_2.svg"
+ },
+ {
+ "text": "CONCERTINA\n2 colourways",
+ "href": "https://www.osborneandlittle.com/concertina-ncw4275-ncw4275.html",
+ "img": "https://www.osborneandlittle.com/media/lilo/brand/white_logo/n/i/nina-white_2.svg"
+ },
+ {
+ "text": "PERDANA\n2 colourways",
+ "href": "https://www.osborneandlittle.com/perdana_NCW4276-NCW4276.html",
+ "img": "https://www.osborneandlittle.com/media/lilo/brand/white_logo/n/i/nina-white_2.svg"
+ },
+ {
+ "text": "MEREDITH\n2 colourways",
+ "href": "https://www.osborneandlittle.com/meredith_ncw4277-ncw4277.html",
+ "img": "https://www.osborneandlittle.com/media/lilo/brand/white_logo/n/i/nina-white_2.svg"
+ }
+ ]
+ }
+ },
+ {
+ "sku": "NCW4270-05",
+ "want": "Coromandel 05",
+ "vendor": "OL",
+ "url": "https://www.osborneandlittle.com/coromandel_NCW4270-NCW4270.html",
+ "finalUrl": "https://www.osborneandlittle.com/coromandel_NCW4270-NCW4270.html",
+ "title": "Coromandel Wallpapers | Osborne & Little",
+ "data": {
+ "imgs": [
+ {
+ "src": "https://www.osborneandlittle.com/media/catalog/product/mpiowebpcache/84bc17ac2f8b054c2365f229ad79ced6/3/9/3975.webp",
+ "alt": "",
+ "title": ""
+ }
+ ],
+ "colorways": [
+ {
+ "text": "COROMANDEL\n2 colourways",
+ "href": "https://www.osborneandlittle.com/coromandel_NCW4270-NCW4270.html",
+ "img": "https://www.osborneandlittle.com/media/lilo/brand/white_logo/n/i/nina-white_2.svg"
+ },
+ {
+ "text": "VIGNOLA\n1 colourway",
+ "href": "https://www.osborneandlittle.com/vignola_NCW4271-NCW4271.html",
+ "img": "https://www.osborneandlittle.com/media/lilo/brand/white_logo/n/i/nina-white_2.svg"
+ },
+ {
+ "text": "PAVILION GARDEN\n2 colourways",
+ "href": "https://www.osborneandlittle.com/pavilion-garden_NCW4272-NCW4272.html",
+ "img": "https://www.osborneandlittle.com/media/lilo/brand/white_logo/n/i/nina-white_2.svg"
+ },
+ {
+ "text": "GIOCONDA\n1 colourway",
+ "href": "https://www.osborneandlittle.com/gioconda_NCW4273-NCW4273.html",
+ "img": "https://www.osborneandlittle.com/media/lilo/brand/white_logo/n/i/nina-white_2.svg"
+ },
+ {
+ "text": "PALMETTO\n2 colourways",
+ "href": "https://www.osborneandlittle.com/palmetto-ncw4274-ncw4274.html",
+ "img": "https://www.osborneandlittle.com/media/lilo/brand/white_logo/n/i/nina-white_2.svg"
+ },
+ {
+ "text": "CONCERTINA\n2 colourways",
+ "href": "https://www.osborneandlittle.com/concertina-ncw4275-ncw4275.html",
+ "img": "https://www.osborneandlittle.com/media/lilo/brand/white_logo/n/i/nina-white_2.svg"
+ },
+ {
+ "text": "PERDANA\n2 colourways",
+ "href": "https://www.osborneandlittle.com/perdana_NCW4276-NCW4276.html",
+ "img": "https://www.osborneandlittle.com/media/lilo/brand/white_logo/n/i/nina-white_2.svg"
+ },
+ {
+ "text": "MEREDITH\n2 colourways",
+ "href": "https://www.osborneandlittle.com/meredith_ncw4277-ncw4277.html",
+ "img": "https://www.osborneandlittle.com/media/lilo/brand/white_logo/n/i/nina-white_2.svg"
+ }
+ ]
+ }
+ },
+ {
+ "sku": "PDG1062-01",
+ "want": "Surimono Berry",
+ "vendor": "DG",
+ "url": "https://www.designersguild.com/en-gb/wallpaper/surimono-berry-wallpaper/pdg1062-01",
+ "finalUrl": "https://www.designersguild.com/en-gb/wallpaper/surimono-berry-wallpaper/pdg1062-01",
+ "title": "Designers Guild - Major Error",
+ "data": {
+ "imgs": [],
+ "colorways": []
+ }
+ }
+]
\ No newline at end of file
diff --git a/harvest-colorways.cjs b/harvest-colorways.cjs
new file mode 100644
index 0000000..b32c740
--- /dev/null
+++ b/harvest-colorways.cjs
@@ -0,0 +1,58 @@
+'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); });
diff --git a/harvest-ol-family.cjs b/harvest-ol-family.cjs
new file mode 100644
index 0000000..76faaca
--- /dev/null
+++ b/harvest-ol-family.cjs
@@ -0,0 +1,82 @@
+'use strict';
+// Harvest real product image URLs for the blocked O&L-family vendors (osborneandlittle.com,
+// designersguild.com) via ONE Browserbase cloud session (residential IP bypasses the local block).
+// For each target: goto known product_url OR run the site's own search by mfr_sku, then read
+// og:image + product-gallery <img> srcs. Prints JSON. Does NOT download (curl-download the URLs
+// afterward from this box — the CDN image hosts are reachable even when the html host isn't).
+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));
+
+// targets: {sku, pattern, url? , searchUrl?}
+const OL = 'https://www.osborneandlittle.com';
+const targets = [
+ { sku:'W7814-01', pattern:'Colonnato', url:`${OL}/colonnato-w7814.html` },
+ { sku:'W7682-01', pattern:'Coralline', url:`${OL}/coralline-w7682.html` },
+ { sku:'W7024-03', pattern:'Japanese Garden', url:`${OL}/japanese-garden-w7024-w7024.html` },
+ { sku:'W6541-02', pattern:'Peacock', url:`${OL}/peacock-w6541.html` },
+ { sku:'W5223-03', pattern:'Tamba', url:`${OL}/tamba-w5223.html` },
+ { sku:'W7334-1', pattern:'Trailing Orchid', search:`${OL}/catalogsearch/result/?q=W7334` },
+ { sku:'EUR-70328',pattern:'Audley', search:`${OL}/catalogsearch/result/?q=Audley` },
+ { sku:'EUR-70402',pattern:'Canestra', search:`${OL}/catalogsearch/result/?q=Canestra` },
+ { sku:'EUR-70351',pattern:'Chameleon', search:`${OL}/catalogsearch/result/?q=Chameleon` },
+ { sku:'PDG1062-01',pattern:'Surimono', search:`https://www.designersguild.com/uk/search?q=Surimono`, vendor:'DG' },
+ { sku:'NCW4270-03',pattern:'Coromandel', search:`${OL}/catalogsearch/result/?q=NCW4270`, vendor:'NC' },
+ { sku:'NCW4270-05',pattern:'Coromandel', search:`${OL}/catalogsearch/result/?q=NCW4270`, vendor:'NC' },
+];
+
+async function readImgs(page){
+ return await page.evaluate(() => {
+ const out = { og:null, gallery:[], title:document.title };
+ const og = document.querySelector('meta[property="og:image"]');
+ if (og) out.og = og.content;
+ // magento gallery
+ document.querySelectorAll('img').forEach(im => {
+ const s = im.src || im.getAttribute('data-src') || '';
+ if (/media\/catalog\/product|\/product\//i.test(s) && !/AVATAR|logo|placeholder/i.test(s)) out.gallery.push(s);
+ });
+ // magento JSON gallery in script
+ const m = document.body.innerHTML.match(/"data":\s*\[\s*\{[^\]]*?"img":"([^"]+)"/);
+ if (m) out.galleryJson = m[1].replace(/\\\//g,'/');
+ return out;
+ });
+}
+
+(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, 'debug:', session.debuggerUrl || '');
+ 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, pattern:t.pattern, vendor:t.vendor||'OL' };
+ try {
+ if (t.url){
+ await page.goto(t.url, { waitUntil:'domcontentloaded' }).catch(()=>{});
+ await sleep(2500);
+ if (/404|not found|page not found/i.test(await page.title())) { r.note='url-404, trying pattern search'; }
+ }
+ if (!t.url || (r.note && t.search)) {
+ if (t.search){ await page.goto(t.search, { waitUntil:'domcontentloaded' }).catch(()=>{}); await sleep(2500);
+ // click first product result
+ const link = await page.$('a.product-item-link, .product-item a[href*=".html"], a.product-item-photo, .product-item-info a');
+ if (link){ const href = await link.getAttribute('href'); r.resolvedUrl=href; await page.goto(href,{waitUntil:'domcontentloaded'}).catch(()=>{}); await sleep(2500); }
+ else r.note = (r.note?r.note+'; ':'') + 'no search result';
+ }
+ }
+ r.finalUrl = page.url();
+ const imgs = await readImgs(page);
+ r.pageTitle = imgs.title; r.og = imgs.og; r.gallery = [...new Set(imgs.gallery)].slice(0,6); r.galleryJson = imgs.galleryJson;
+ } catch(e){ r.error = e.message; }
+ console.error(`[${r.sku}] ${r.finalUrl||''} og=${r.og?'Y':'N'} gal=${(r.gallery||[]).length}`);
+ results.push(r);
+ }
+ await browser.close().catch(()=>{});
+ const fp = os.homedir()+'/Projects/dw-marketing-reels/harvest-ol-results.json';
+ fs.writeFileSync(fp, JSON.stringify(results,null,2));
+ console.log(fp);
+})().catch(e=>{ console.error('FATAL', e.message); process.exit(1); });
diff --git a/harvest-ol-results.json b/harvest-ol-results.json
new file mode 100644
index 0000000..075051e
--- /dev/null
+++ b/harvest-ol-results.json
@@ -0,0 +1,139 @@
+[
+ {
+ "sku": "W7814-01",
+ "pattern": "Colonnato",
+ "vendor": "OL",
+ "finalUrl": "https://www.osborneandlittle.com/colonnato-w7814.html",
+ "pageTitle": "RHAPSODY | Osborne & Little",
+ "og": "https://www.osborneandlittle.com/media/catalog/product/mpiowebpcache/bff0b9fa41d141612c9ab3208ff569a2/o/l/ol_05_rhap_wp_colonnato_w7814_1dgzonswvrsvirob_o4vvecawwfarwsl0.webp",
+ "gallery": [
+ "https://www.osborneandlittle.com/media/catalog/product/mpiowebpcache/84bc17ac2f8b054c2365f229ad79ced6/w/7/w7814-01_n6lger3vo8gdn9ly.webp"
+ ]
+ },
+ {
+ "sku": "W7682-01",
+ "pattern": "Coralline",
+ "vendor": "OL",
+ "finalUrl": "https://www.osborneandlittle.com/coralline-w7682.html",
+ "pageTitle": "LAMORRAN | Osborne & Little",
+ "og": "https://www.osborneandlittle.com/media/catalog/product/mpiowebpcache/bff0b9fa41d141612c9ab3208ff569a2/o/l/ol-03-lamorran-coralline-w7682_xlc4aqvycjqf9qlm.webp",
+ "gallery": [
+ "https://www.osborneandlittle.com/media/catalog/product/mpiowebpcache/84bc17ac2f8b054c2365f229ad79ced6/w/7/w7682-01_ff8svfx2jzq6e1ez.webp"
+ ]
+ },
+ {
+ "sku": "W7024-03",
+ "pattern": "Japanese Garden",
+ "vendor": "OL",
+ "finalUrl": "https://www.osborneandlittle.com/japanese-garden-w7024-w7024.html",
+ "pageTitle": "Enchanted Gardens Wallpapers | Osborne & Little",
+ "og": "https://www.osborneandlittle.com/media/catalog/product/mpiowebpcache/bff0b9fa41d141612c9ab3208ff569a2/j/a/japanese_garden_wp_detail_1.webp",
+ "gallery": [
+ "https://www.osborneandlittle.com/media/catalog/product/mpiowebpcache/84bc17ac2f8b054c2365f229ad79ced6/w/7/w7024-03.webp"
+ ]
+ },
+ {
+ "sku": "W6541-02",
+ "pattern": "Peacock",
+ "vendor": "OL",
+ "finalUrl": "https://www.osborneandlittle.com/peacock-w6541.html",
+ "pageTitle": "The Wallpaper Collection | Osborne & Little",
+ "og": "https://www.osborneandlittle.com/media/catalog/product/mpiowebpcache/bff0b9fa41d141612c9ab3208ff569a2/o/l/ol-01-mw-the-collection-peacock-w6541.webp",
+ "gallery": [
+ "https://www.osborneandlittle.com/media/catalog/product/mpiowebpcache/84bc17ac2f8b054c2365f229ad79ced6/4/5/4591.webp"
+ ]
+ },
+ {
+ "sku": "W5223-03",
+ "pattern": "Tamba",
+ "vendor": "OL",
+ "finalUrl": "https://www.osborneandlittle.com/tamba-w5223.html",
+ "pageTitle": "ARGENTARIO | Osborne & Little",
+ "og": "https://www.osborneandlittle.com/media/catalog/product/mpiowebpcache/bff0b9fa41d141612c9ab3208ff569a2/w/5/w5223-03_1.webp",
+ "gallery": [
+ "https://www.osborneandlittle.com/media/catalog/product/mpiowebpcache/84bc17ac2f8b054c2365f229ad79ced6/w/5/w5223-03.webp"
+ ]
+ },
+ {
+ "sku": "W7334-1",
+ "pattern": "Trailing Orchid",
+ "vendor": "OL",
+ "resolvedUrl": "https://www.osborneandlittle.com/trailing-orchid-w7334.html?fromsearch=1¤tPage=1",
+ "finalUrl": "https://www.osborneandlittle.com/trailing-orchid-w7334.html?fromsearch=1¤tPage=1",
+ "pageTitle": "FOLIUM | Osborne & Little",
+ "og": "https://www.osborneandlittle.com/media/catalog/product/mpiowebpcache/bff0b9fa41d141612c9ab3208ff569a2/O/L/OL-01-folium-trailing-orchid-main-W7334.webp",
+ "gallery": [
+ "https://www.osborneandlittle.com/media/catalog/product/mpiowebpcache/84bc17ac2f8b054c2365f229ad79ced6/w/7/w7334-01.webp"
+ ]
+ },
+ {
+ "sku": "EUR-70328",
+ "pattern": "Audley",
+ "vendor": "OL",
+ "resolvedUrl": "https://www.osborneandlittle.com/audley_W6297-W6297.html?fromsearch=1¤tPage=1",
+ "finalUrl": "https://www.osborneandlittle.com/audley_W6297-W6297.html?fromsearch=1¤tPage=1",
+ "pageTitle": "Strand Wallpapers | Osborne & Little",
+ "og": "https://www.osborneandlittle.com/media/catalog/product/mpiowebpcache/bff0b9fa41d141612c9ab3208ff569a2/5/3/5313.webp",
+ "gallery": [
+ "https://www.osborneandlittle.com/media/catalog/product/mpiowebpcache/84bc17ac2f8b054c2365f229ad79ced6/5/3/5314.webp"
+ ]
+ },
+ {
+ "sku": "EUR-70402",
+ "pattern": "Canestra",
+ "vendor": "OL",
+ "resolvedUrl": "https://www.osborneandlittle.com/canestra_W6341-W6341.html?fromsearch=1¤tPage=1",
+ "finalUrl": "https://www.osborneandlittle.com/canestra_W6341-W6341.html?fromsearch=1¤tPage=1",
+ "pageTitle": "Rabanna Wallpapers | Osborne & Little",
+ "og": "https://www.osborneandlittle.com/media/catalog/product/mpiowebpcache/bff0b9fa41d141612c9ab3208ff569a2/5/0/5052.webp",
+ "gallery": [
+ "https://www.osborneandlittle.com/media/catalog/product/mpiowebpcache/84bc17ac2f8b054c2365f229ad79ced6/5/0/5053.webp"
+ ]
+ },
+ {
+ "sku": "EUR-70351",
+ "pattern": "Chameleon",
+ "vendor": "OL",
+ "resolvedUrl": "https://www.osborneandlittle.com/chameleon_W6305-W6305.html?fromsearch=1¤tPage=1",
+ "finalUrl": "https://www.osborneandlittle.com/chameleon_W6305-W6305.html?fromsearch=1¤tPage=1",
+ "pageTitle": "Komodo Wallpapers | Osborne & Little",
+ "og": "https://www.osborneandlittle.com/media/catalog/product/mpiowebpcache/bff0b9fa41d141612c9ab3208ff569a2/5/2/5222.webp",
+ "gallery": [
+ "https://www.osborneandlittle.com/media/catalog/product/mpiowebpcache/84bc17ac2f8b054c2365f229ad79ced6/5/2/5223.webp"
+ ]
+ },
+ {
+ "sku": "PDG1062-01",
+ "pattern": "Surimono",
+ "vendor": "DG",
+ "note": "no search result",
+ "finalUrl": "https://www.designersguild.com/en-gb/search?q=Surimono",
+ "pageTitle": "Designers Guild - Major Error",
+ "og": null,
+ "gallery": []
+ },
+ {
+ "sku": "NCW4270-03",
+ "pattern": "Coromandel",
+ "vendor": "NC",
+ "resolvedUrl": "https://www.osborneandlittle.com/coromandel_NCW4270-NCW4270.html?fromsearch=1¤tPage=1",
+ "finalUrl": "https://www.osborneandlittle.com/coromandel_NCW4270-NCW4270.html?fromsearch=1¤tPage=1",
+ "pageTitle": "Coromandel Wallpapers | Osborne & Little",
+ "og": "https://www.osborneandlittle.com/media/catalog/product/mpiowebpcache/bff0b9fa41d141612c9ab3208ff569a2/c/o/coromandel_main_1__1.webp",
+ "gallery": [
+ "https://www.osborneandlittle.com/media/catalog/product/mpiowebpcache/84bc17ac2f8b054c2365f229ad79ced6/3/9/3975.webp"
+ ]
+ },
+ {
+ "sku": "NCW4270-05",
+ "pattern": "Coromandel",
+ "vendor": "NC",
+ "resolvedUrl": "https://www.osborneandlittle.com/coromandel_NCW4270-NCW4270.html?fromsearch=1¤tPage=1",
+ "finalUrl": "https://www.osborneandlittle.com/coromandel_NCW4270-NCW4270.html?fromsearch=1¤tPage=1",
+ "pageTitle": "Coromandel Wallpapers | Osborne & Little",
+ "og": "https://www.osborneandlittle.com/media/catalog/product/mpiowebpcache/bff0b9fa41d141612c9ab3208ff569a2/c/o/coromandel_main_1__1.webp",
+ "gallery": [
+ "https://www.osborneandlittle.com/media/catalog/product/mpiowebpcache/84bc17ac2f8b054c2365f229ad79ced6/3/9/3975.webp"
+ ]
+ }
+]
\ No newline at end of file
diff --git a/sourced-images/imageless-14/EUR-70328__5314.webp b/sourced-images/imageless-14/EUR-70328__5314.webp
new file mode 100644
index 0000000..0ffc96c
Binary files /dev/null and b/sourced-images/imageless-14/EUR-70328__5314.webp differ
diff --git a/sourced-images/imageless-14/EUR-70351__5223.webp b/sourced-images/imageless-14/EUR-70351__5223.webp
new file mode 100644
index 0000000..e61a91a
Binary files /dev/null and b/sourced-images/imageless-14/EUR-70351__5223.webp differ
diff --git a/sourced-images/imageless-14/EUR-70402__5053.webp b/sourced-images/imageless-14/EUR-70402__5053.webp
new file mode 100644
index 0000000..0cc46c5
Binary files /dev/null and b/sourced-images/imageless-14/EUR-70402__5053.webp differ
diff --git a/sourced-images/imageless-14/NCW4270__3975.webp b/sourced-images/imageless-14/NCW4270__3975.webp
new file mode 100644
index 0000000..4c4abb2
Binary files /dev/null and b/sourced-images/imageless-14/NCW4270__3975.webp differ
diff --git a/sourced-images/imageless-14/NCW4352-05_bonnelles.jpg b/sourced-images/imageless-14/NCW4352-05_bonnelles.jpg
new file mode 100644
index 0000000..e6dbcf7
Binary files /dev/null and b/sourced-images/imageless-14/NCW4352-05_bonnelles.jpg differ
diff --git a/sourced-images/imageless-14/W5223-03__w5223-03.webp b/sourced-images/imageless-14/W5223-03__w5223-03.webp
new file mode 100644
index 0000000..20bda52
Binary files /dev/null and b/sourced-images/imageless-14/W5223-03__w5223-03.webp differ
diff --git a/sourced-images/imageless-14/W6541-02__4591.webp b/sourced-images/imageless-14/W6541-02__4591.webp
new file mode 100644
index 0000000..e341bf3
Binary files /dev/null and b/sourced-images/imageless-14/W6541-02__4591.webp differ
diff --git a/sourced-images/imageless-14/W7024-03__w7024-03.webp b/sourced-images/imageless-14/W7024-03__w7024-03.webp
new file mode 100644
index 0000000..b025e85
Binary files /dev/null and b/sourced-images/imageless-14/W7024-03__w7024-03.webp differ
diff --git a/sourced-images/imageless-14/W7334-1__w7334-01.webp b/sourced-images/imageless-14/W7334-1__w7334-01.webp
new file mode 100644
index 0000000..da4694f
Binary files /dev/null and b/sourced-images/imageless-14/W7334-1__w7334-01.webp differ
diff --git a/sourced-images/imageless-14/W7682-01__w7682-01_ff8svfx2jzq6e1ez.webp b/sourced-images/imageless-14/W7682-01__w7682-01_ff8svfx2jzq6e1ez.webp
new file mode 100644
index 0000000..06bfdb1
Binary files /dev/null and b/sourced-images/imageless-14/W7682-01__w7682-01_ff8svfx2jzq6e1ez.webp differ
diff --git a/sourced-images/imageless-14/W7814-01__w7814-01_n6lger3vo8gdn9ly.webp b/sourced-images/imageless-14/W7814-01__w7814-01_n6lger3vo8gdn9ly.webp
new file mode 100644
index 0000000..eef5320
Binary files /dev/null and b/sourced-images/imageless-14/W7814-01__w7814-01_n6lger3vo8gdn9ly.webp differ
← cc29f33 auto-save: 2026-07-16T07:11:48 (2 files) — data/new-arrivals
·
back to Dw Marketing Reels
·
Source real product images for 12/14 imageless DW products v 51d3d22 →