← back to Dw Marketing Reels
auto-save: 2026-07-22T07:12:00 (3 files) — data/new-arrivals.json data/reels.json scripts/video-runner.mjs
c0278ded55420b94901c0190f44f4949c74f3f9f · 2026-07-22 07:12:15 -0700 · Steve Abrams
Files touched
M data/new-arrivals.jsonM data/reels.jsonM scripts/video-runner.mjs
Diff
commit c0278ded55420b94901c0190f44f4949c74f3f9f
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Wed Jul 22 07:12:15 2026 -0700
auto-save: 2026-07-22T07:12:00 (3 files) — data/new-arrivals.json data/reels.json scripts/video-runner.mjs
---
data/new-arrivals.json | 152 +++++++++++++++++++++++------------------------
data/reels.json | 40 +++++++++++++
scripts/video-runner.mjs | 49 ++++++++++++---
3 files changed, 157 insertions(+), 84 deletions(-)
diff --git a/data/new-arrivals.json b/data/new-arrivals.json
index 16ccc8e..2849080 100644
--- a/data/new-arrivals.json
+++ b/data/new-arrivals.json
@@ -1,8 +1,83 @@
{
"source": "https://designerwallcoverings.com/collections/new-arrivals",
- "fetched_at": "2026-07-21T14:10:05.721Z",
+ "fetched_at": "2026-07-22T14:10:06.011Z",
"count": 24,
"items": [
+ {
+ "id": 7895904583731,
+ "handle": "flower-fall-pearl-wallcoverings-dwrw-361341",
+ "title": "Flower Fall, Pearl Wallcoverings | Rebel Walls",
+ "pattern": "Flower Fall",
+ "color": "Pearl",
+ "vendor": "Rebel Walls",
+ "product_type": "Mural",
+ "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/R19251_interior1.jpg?v=1784706015",
+ "image_hi": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/R19251_interior1_1200x.jpg?v=1784706015",
+ "price": "191.00",
+ "url": "https://designerwallcoverings.com/products/flower-fall-pearl-wallcoverings-dwrw-361341",
+ "created_at": "2026-07-22T00:40:09-07:00",
+ "published_at": "2026-07-22T01:25:47-07:00"
+ },
+ {
+ "id": 7895904550963,
+ "handle": "flower-art-pastel-wallcoverings-dwrw-361338",
+ "title": "Flower Art, Pastel Wallcoverings | Rebel Walls",
+ "pattern": "Flower Art",
+ "color": "Pastel",
+ "vendor": "Rebel Walls",
+ "product_type": "Mural",
+ "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/R20396_interior1.jpg?v=1784706011",
+ "image_hi": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/R20396_interior1_1200x.jpg?v=1784706011",
+ "price": "191.00",
+ "url": "https://designerwallcoverings.com/products/flower-art-pastel-wallcoverings-dwrw-361338",
+ "created_at": "2026-07-22T00:40:08-07:00",
+ "published_at": "2026-07-22T01:25:40-07:00"
+ },
+ {
+ "id": 7895904518195,
+ "handle": "flower-art-green-wallcoverings-dwrw-361337",
+ "title": "Flower Art, Green Wallcoverings | Rebel Walls",
+ "pattern": "Flower Art",
+ "color": "Green",
+ "vendor": "Rebel Walls",
+ "product_type": "Mural",
+ "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/R20397_interior1.webp?v=1784706010",
+ "image_hi": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/R20397_interior1_1200x.webp?v=1784706010",
+ "price": "191.00",
+ "url": "https://designerwallcoverings.com/products/flower-art-green-wallcoverings-dwrw-361337",
+ "created_at": "2026-07-22T00:40:06-07:00",
+ "published_at": "2026-07-22T01:25:32-07:00"
+ },
+ {
+ "id": 7895904485427,
+ "handle": "flower-art-blue-wallcoverings-dwrw-361336",
+ "title": "Flower Art, Blue Wallcoverings | Rebel Walls",
+ "pattern": "Flower Art",
+ "color": "Blue",
+ "vendor": "Rebel Walls",
+ "product_type": "Mural",
+ "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/R20395_interior1.webp?v=1784706008",
+ "image_hi": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/R20395_interior1_1200x.webp?v=1784706008",
+ "price": "191.00",
+ "url": "https://designerwallcoverings.com/products/flower-art-blue-wallcoverings-dwrw-361336",
+ "created_at": "2026-07-22T00:40:05-07:00",
+ "published_at": "2026-07-22T01:25:21-07:00"
+ },
+ {
+ "id": 7895904452659,
+ "handle": "flow-mini-shallow-grey-wallcoverings-dwrw-361334",
+ "title": "Flow Mini Shallow Grey Wallcoverings | Rebel Walls",
+ "pattern": "Flow Mini Shallow Grey",
+ "color": "",
+ "vendor": "Rebel Walls",
+ "product_type": "Mural",
+ "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/R18524_interior1.webp?v=1784706007",
+ "image_hi": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/R18524_interior1_1200x.webp?v=1784706007",
+ "price": "375.00",
+ "url": "https://designerwallcoverings.com/products/flow-mini-shallow-grey-wallcoverings-dwrw-361334",
+ "created_at": "2026-07-22T00:40:04-07:00",
+ "published_at": "2026-07-22T01:25:12-07:00"
+ },
{
"id": 7894970695731,
"handle": "flow-mini-deep-blue-wallcoverings-dwrw-361333",
@@ -287,81 +362,6 @@
"url": "https://designerwallcoverings.com/products/floral-garden-summer-wallcoverings-dwrw-361317",
"created_at": "2026-07-19T00:40:10-07:00",
"published_at": "2026-07-19T00:40:11-07:00"
- },
- {
- "id": 7890539544627,
- "handle": "floral-garden-red-wallcoverings-dwrw-361316",
- "title": "Floral Garden, Red Wallcoverings | Rebel Walls",
- "pattern": "Floral Garden",
- "color": "Red",
- "vendor": "Rebel Walls",
- "product_type": "Mural",
- "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/R18923_interior1.jpg?v=1784446811",
- "image_hi": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/R18923_interior1_1200x.jpg?v=1784446811",
- "price": "191.00",
- "url": "https://designerwallcoverings.com/products/floral-garden-red-wallcoverings-dwrw-361316",
- "created_at": "2026-07-19T00:40:07-07:00",
- "published_at": "2026-07-19T00:40:08-07:00"
- },
- {
- "id": 7890539511859,
- "handle": "floral-garden-pink-wallcoverings-dwrw-361315",
- "title": "Floral Garden, Pink Wallcoverings | Rebel Walls",
- "pattern": "Floral Garden",
- "color": "Pink",
- "vendor": "Rebel Walls",
- "product_type": "Mural",
- "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/R18924_interior1.webp?v=1784446807",
- "image_hi": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/R18924_interior1_1200x.webp?v=1784446807",
- "price": "191.00",
- "url": "https://designerwallcoverings.com/products/floral-garden-pink-wallcoverings-dwrw-361315",
- "created_at": "2026-07-19T00:40:04-07:00",
- "published_at": "2026-07-19T00:40:05-07:00"
- },
- {
- "id": 7888771252275,
- "handle": "inverness-wide-width-grey-dwtt-74387",
- "title": "Inverness Wide Width, Grey Wallcoverings | Thibaut",
- "pattern": "Inverness Wide Width",
- "color": "Grey",
- "vendor": "Thibaut",
- "product_type": "Wallcovering",
- "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/TWW10980_41e89dfd-4fc3-4294-975d-e791b6dbe22a.jpg?v=1784392814",
- "image_hi": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/TWW10980_41e89dfd-4fc3-4294-975d-e791b6dbe22a_1200x.jpg?v=1784392814",
- "price": "58.64",
- "url": "https://designerwallcoverings.com/products/inverness-wide-width-grey-dwtt-74387",
- "created_at": "2026-07-18T09:40:11-07:00",
- "published_at": "2026-07-18T09:40:12-07:00"
- },
- {
- "id": 7888771219507,
- "handle": "inverness-wide-width-fog-dwtt-74386",
- "title": "Inverness Wide Width, Fog Wallcoverings | Thibaut",
- "pattern": "Inverness Wide Width",
- "color": "Fog",
- "vendor": "Thibaut",
- "product_type": "Wallcovering",
- "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/TWW10977_d4be4b87-a1b7-4d0f-ae35-e55a62e79c1b.jpg?v=1784392811",
- "image_hi": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/TWW10977_d4be4b87-a1b7-4d0f-ae35-e55a62e79c1b_1200x.jpg?v=1784392811",
- "price": "58.64",
- "url": "https://designerwallcoverings.com/products/inverness-wide-width-fog-dwtt-74386",
- "created_at": "2026-07-18T09:40:07-07:00",
- "published_at": "2026-07-18T09:40:09-07:00"
- },
- {
- "id": 7888770924595,
- "handle": "geode-wide-width-denim-dwtt-74385",
- "title": "Geode Wide Width, Denim Wallcoverings | Thibaut",
- "pattern": "Geode Wide Width",
- "color": "Denim",
- "vendor": "Thibaut",
- "product_type": "Wallcovering",
- "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/TWW10973.jpg?v=1784392805",
- "image_hi": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/TWW10973_1200x.jpg?v=1784392805",
- "price": "58.64",
- "url": "https://designerwallcoverings.com/products/geode-wide-width-denim-dwtt-74385",
- "created_at": "2026-07-18T09:40:03-07:00",
- "published_at": "2026-07-18T09:40:05-07:00"
}
]
}
\ No newline at end of file
diff --git a/data/reels.json b/data/reels.json
index 01e1d62..bf85bf6 100644
--- a/data/reels.json
+++ b/data/reels.json
@@ -1,4 +1,44 @@
[
+ {
+ "file": "new-arrivals-2026-07-22-14-10.mp4",
+ "created_at": "2026-07-22T14:10:32.853Z",
+ "products": 6,
+ "seconds": 19,
+ "titles": [
+ "Flower Fall / Pearl",
+ "Flower Art / Pastel",
+ "Flower Art / Green",
+ "Flower Art / Blue",
+ "Flow Mini Shallow Grey / ",
+ "Flow Mini Deep Blue / "
+ ],
+ "caption": "New arrivals just landed ✨ Flower Fall, Flower Art, Flow Mini Shallow Grey & more from Rebel Walls. Discover the latest wallcoverings — shop the collection at designerwallcoverings.com 🔗\n\n#DesignerWallcoverings #NewArrivals #Wallcovering #Wallcoverings #InteriorDesign #InteriorDecor #HomeDesign #LuxuryInteriors #DesignInspo #RebelWalls",
+ "hashtags": [
+ "#DesignerWallcoverings",
+ "#NewArrivals",
+ "#Wallcovering",
+ "#Wallcoverings",
+ "#InteriorDesign",
+ "#InteriorDecor",
+ "#HomeDesign",
+ "#LuxuryInteriors",
+ "#DesignInspo",
+ "#RebelWalls"
+ ],
+ "publish": {
+ "instagram": {
+ "status": "pending-creds",
+ "account": "dw",
+ "note": "Designer Wallcoverings @designerwallcoverings: IG_AGENT_AUTH not set (route via secrets skill)",
+ "at": "2026-07-22T14:10:32.896Z"
+ },
+ "tiktok": {
+ "status": "pending-reconnect",
+ "note": "TikTok channel not connected",
+ "at": "2026-07-22T14:10:32.896Z"
+ }
+ }
+ },
{
"file": "new-arrivals-2026-07-21-14-10.mp4",
"created_at": "2026-07-21T14:10:32.095Z",
diff --git a/scripts/video-runner.mjs b/scripts/video-runner.mjs
index 6ffda24..8d5ab6b 100644
--- a/scripts/video-runner.mjs
+++ b/scripts/video-runner.mjs
@@ -19,6 +19,24 @@ import { dirname, join } from 'node:path';
const ROOT = dirname(dirname(fileURLToPath(import.meta.url)));
const JOBS = join(ROOT, 'data', 'video-jobs.json');
const ARMED = process.env.VIDEO_AUTORUN === '1';
+// A single transient Anthropic API blip ("Server is temporarily limiting requests",
+// overloaded, 429/529) used to permanently kill a render. Retry those with backoff.
+const MAX_TRIES = Math.max(1, Number(process.env.VIDEO_MAX_TRIES || 3));
+const BACKOFF_MS = Math.max(1000, Number(process.env.VIDEO_BACKOFF_MS || 20000));
+const sleep = ms => new Promise(r => setTimeout(r, ms));
+const isTransient = s => /rate limit|temporarily limiting|overloaded|Overloaded|\b429\b|\b529\b|ECONNRESET|ETIMEDOUT|socket hang up/i.test(s || '');
+
+// Run one `claude -p` render, capturing stderr (still echoed to the parent) so we can
+// classify failures. Resolves { ok, code, err }.
+function runClaude(CLAUDE_BIN, pr) {
+ return new Promise(resolve => {
+ let err = '';
+ const ch = spawn(CLAUDE_BIN, ['-p', pr], { cwd: ROOT, stdio: ['ignore', 'inherit', 'pipe'] });
+ ch.stderr.on('data', d => { err += d; process.stderr.write(d); });
+ ch.on('close', code => resolve({ ok: code === 0, code, err }));
+ ch.on('error', e => resolve({ ok: false, code: -1, err: String(e.message) }));
+ });
+}
const prompt = (j) => {
const fmt = j.format === '1:1' ? '1:1 (1080×1080)' : '9:16 Instagram Reels (1080×1920)';
@@ -50,14 +68,29 @@ const prompt = (j) => {
const pr = prompt(j); if (!pr) { j.status = 'error'; j.note = 'unknown kind'; continue; }
j.status = 'running'; j.started_at = new Date().toISOString();
await writeFile(JOBS, JSON.stringify(jobs, null, 2));
- try {
- await new Promise((resolve, reject) => {
- const ch = spawn(CLAUDE_BIN, ['-p', pr], { cwd: ROOT, stdio: 'inherit' });
- ch.on('close', code => code === 0 ? resolve() : reject(new Error('claude exit ' + code)));
- ch.on('error', reject);
- });
- j.status = 'done'; j.finished_at = new Date().toISOString();
- } catch (e) { j.status = 'error'; j.note = String(e.message).slice(0, 120); }
+ let res, tries = 0;
+ for (;;) {
+ tries++;
+ res = await runClaude(CLAUDE_BIN, pr);
+ j.attempts = tries;
+ if (res.ok) break;
+ // Only retry self-healing API throttles — a real skill/code failure fails fast.
+ if (tries < MAX_TRIES && isTransient(res.err)) {
+ const wait = BACKOFF_MS * tries;
+ j.note = `transient API error (try ${tries}/${MAX_TRIES}) — backing off ${Math.round(wait/1000)}s`;
+ await writeFile(JOBS, JSON.stringify(jobs, null, 2));
+ console.error(`video-runner: ${j.id} ${j.note}`);
+ await sleep(wait);
+ continue;
+ }
+ break;
+ }
+ if (res.ok) { j.status = 'done'; j.finished_at = new Date().toISOString(); delete j.note; }
+ else {
+ j.status = 'error'; j.finished_at = new Date().toISOString();
+ j.note = (isTransient(res.err) ? `rate-limited after ${tries} tr${tries===1?'y':'ies'} — safe to requeue` : ('claude exit ' + res.code))
+ + (res.err ? (' · ' + res.err.replace(/\s+/g, ' ').trim().slice(0, 140)) : '');
+ }
await writeFile(JOBS, JSON.stringify(jobs, null, 2));
}
})().catch(e => { console.error('video-runner FAILED:', e.message); process.exit(1); });
← 96a00f6 Add hypergen daily video-suggestions tab (4 ideas/day, dated
·
back to Dw Marketing Reels
·
Harden video-runner: retry transient API rate-limits before 6eb3061 →