← 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
M scripts/build-fabricut.js
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 →