[object Object]

← back to Fabricut Landing

fabricut: filter dead _stylized_secondary room images (403 AccessDenied from vendor S3)

e5887060fdca73e81250c599a289f31105176610 · 2026-08-24 18:57:41 -0700 · Steve Abrams

Files touched

Diff

commit e5887060fdca73e81250c599a289f31105176610
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Mon Aug 24 18:57:41 2026 -0700

    fabricut: filter dead _stylized_secondary room images (403 AccessDenied from vendor S3)
---
 scripts/build-fabricut.js | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/scripts/build-fabricut.js b/scripts/build-fabricut.js
index ec0cfed..1c52f51 100644
--- a/scripts/build-fabricut.js
+++ b/scripts/build-fabricut.js
@@ -89,7 +89,11 @@ async function main() {
   const products = [];
   let dropped = 0;
   for (const r of rows) {
-    const imgs = String(r.all_images || r.image_url || '').split(',').map(s => s.trim()).filter(Boolean);
+    // Drop Fabricut's `_stylized_secondary` variants: those AI room shots return HTTP 403
+    // AccessDenied from the vendor's S3, so `room` (imgs[1]) would point at a dead image.
+    // Filtering them makes room fall back to the next real image (or the swatch). TK: fabricut-images
+    const imgs = String(r.all_images || r.image_url || '').split(',').map(s => s.trim())
+      .filter(Boolean).filter(s => !/_stylized_secondary/i.test(s));
     const primary = imgs[0] || r.image_url || null;
     if (!primary) { dropped++; continue; }
     const styles = (jparse(r.ai_styles) || []).filter(Boolean).map(cap);

← 41f035e fix(fabricut): make build schema-resilient + build on canoni  ·  back to Fabricut Landing  ·  auto-data-snapshot: 2026-08-24T19:04:21 (3 data files) — pub 77235df →