[object Object]

← 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

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&currentPage=1",
+    "finalUrl": "https://www.osborneandlittle.com/trailing-orchid-w7334.html?fromsearch=1&currentPage=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&currentPage=1",
+    "finalUrl": "https://www.osborneandlittle.com/audley_W6297-W6297.html?fromsearch=1&currentPage=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&currentPage=1",
+    "finalUrl": "https://www.osborneandlittle.com/canestra_W6341-W6341.html?fromsearch=1&currentPage=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&currentPage=1",
+    "finalUrl": "https://www.osborneandlittle.com/chameleon_W6305-W6305.html?fromsearch=1&currentPage=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&currentPage=1",
+    "finalUrl": "https://www.osborneandlittle.com/coromandel_NCW4270-NCW4270.html?fromsearch=1&currentPage=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&currentPage=1",
+    "finalUrl": "https://www.osborneandlittle.com/coromandel_NCW4270-NCW4270.html?fromsearch=1&currentPage=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 →