[object Object]

← back to Designer Wallcoverings

schumacher importer: dedup gallery images by URL at ingest (API repeats largeUrl across size-variant entries -> was producing 2-3x duplicate PDP galleries)

a1d4c12e7351758ecfca865f207f21ec04b9e31f · 2026-06-12 07:46:42 -0700 · SteveStudio2

Files touched

Diff

commit a1d4c12e7351758ecfca865f207f21ec04b9e31f
Author: SteveStudio2 <stevestudio2@SteveStacStudio.lan>
Date:   Fri Jun 12 07:46:42 2026 -0700

    schumacher importer: dedup gallery images by URL at ingest (API repeats largeUrl across size-variant entries -> was producing 2-3x duplicate PDP galleries)
---
 shopify/scripts/schu-api-recrawl.js  | 4 +++-
 shopify/scripts/schumacher-import.js | 9 +++++++--
 2 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/shopify/scripts/schu-api-recrawl.js b/shopify/scripts/schu-api-recrawl.js
index 5582f136..deead856 100644
--- a/shopify/scripts/schu-api-recrawl.js
+++ b/shopify/scripts/schu-api-recrawl.js
@@ -68,7 +68,9 @@ function attrMap(j) {
 function parse(j) {
   const a = attrMap(j);
   const img = j.imageUrl || (j.images && j.images[0] && j.images[0].largeUrl) || null;
-  const gallery = (j.images || []).map(x => x.largeUrl).filter(Boolean);
+  // Dedup: Schumacher's API repeats the same largeUrl across image entries
+  // (size variants of one photo) -> previously caused duplicate PDP galleries.
+  const gallery = [...new Set((j.images || []).map(x => x.largeUrl).filter(Boolean))];
   return {
     sku: j.itemNumber,
     priceUsd: (typeof j.priceUsd === 'number') ? j.priceUsd : null,
diff --git a/shopify/scripts/schumacher-import.js b/shopify/scripts/schumacher-import.js
index 70df2620..f9e76429 100644
--- a/shopify/scripts/schumacher-import.js
+++ b/shopify/scripts/schumacher-import.js
@@ -162,8 +162,13 @@ async function importProducts() {
       const prePasted = getAttr(attrs, 'pre-pasted');
       const yardsPerRoll = getAttr(attrs, 'yards-per-roll-fraction') || getAttr(attrs, 'yards-per-roll');
 
-      // Images - first is product swatch, rest may include room settings
-      const allImages = (detail.images || []).map(img => img.largeUrl).filter(Boolean);
+      // Images - first is product swatch, rest may include room settings.
+      // Schumacher's API repeats the same largeUrl across multiple image
+      // entries (size variants of one photo), which previously produced
+      // 2-3x duplicate galleries on the Shopify PDP. Dedup by URL, order-preserving.
+      const allImages = [...new Set(
+        (detail.images || []).map(img => img.largeUrl).filter(Boolean)
+      )];
       const mainImage = allImages[0] || item.imageUrl;
       const roomSettingImages = allImages.slice(1); // Images after the first are typically room settings/lifestyle
       const galleryImages = allImages;

← 4a502d3c cadence: support MAP-priced vendors (sellExpr) — Kravet fami  ·  back to Designer Wallcoverings  ·  vendors: wire Brewster & York (costExpr=cost) — price list a f3aead0e →