[object Object]

← back to Rentv

fix(social): cross-platform fonts (DejaVu/Liberation fallback) + robust ElevenLabs key resolution for Kamatera prod (v0.13.1)

8bf8de3fe84371090bef897e10c71f21d095c822 · 2026-07-31 12:19:23 -0700 · Steve

Files touched

Diff

commit 8bf8de3fe84371090bef897e10c71f21d095c822
Author: Steve <steve@designerwallcoverings.com>
Date:   Fri Jul 31 12:19:23 2026 -0700

    fix(social): cross-platform fonts (DejaVu/Liberation fallback) + robust ElevenLabs key resolution for Kamatera prod (v0.13.1)
---
 package.json                 |  2 +-
 scripts/gen-social-frame.py  | 23 +++++++++++++++++++++--
 scripts/social-video-gen.mjs | 16 +++++++++++++---
 3 files changed, 35 insertions(+), 6 deletions(-)

diff --git a/package.json b/package.json
index 4f9d367f..86398314 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "rentv",
-  "version": "0.13.0",
+  "version": "0.13.1",
   "private": true,
   "main": "server.js",
   "scripts": {
diff --git a/scripts/gen-social-frame.py b/scripts/gen-social-frame.py
index 5706e5dd..37934692 100644
--- a/scripts/gen-social-frame.py
+++ b/scripts/gen-social-frame.py
@@ -14,11 +14,30 @@ W, H = 1080, 1920
 NAVY = (11, 37, 69)
 RED = (200, 16, 46)
 WHITE = (255, 255, 255)
-FONTDIR = "/System/Library/Fonts/Supplemental"
+
+# Cross-platform font resolution: macOS (Arial/Helvetica) locally, DejaVu/Liberation
+# on the Kamatera Linux box. Keyed by weight so callers stay platform-agnostic.
+_FONT_CANDIDATES = {
+    "black": ["/System/Library/Fonts/Supplemental/Arial Black.ttf",
+              "/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf",
+              "/usr/share/fonts/truetype/liberation/LiberationSans-Bold.ttf"],
+    "bold": ["/System/Library/Fonts/Supplemental/Arial Bold.ttf",
+             "/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf",
+             "/usr/share/fonts/truetype/liberation/LiberationSans-Bold.ttf"],
+    "regular": ["/System/Library/Fonts/Supplemental/Arial.ttf",
+                "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf",
+                "/usr/share/fonts/truetype/liberation/LiberationSans-Regular.ttf"],
+}
+# legacy filename -> weight (so existing call sites keep working)
+_WEIGHT = {"Arial Black.ttf": "black", "Arial Bold.ttf": "bold", "Arial.ttf": "regular"}
 
 
 def font(name, size):
-    return ImageFont.truetype(os.path.join(FONTDIR, name), size)
+    weight = _WEIGHT.get(name, "regular")
+    for p in _FONT_CANDIDATES[weight]:
+        if os.path.exists(p):
+            return ImageFont.truetype(p, size)
+    return ImageFont.load_default()
 
 
 def cover(img, w, h):
diff --git a/scripts/social-video-gen.mjs b/scripts/social-video-gen.mjs
index c399dc10..747e3188 100644
--- a/scripts/social-video-gen.mjs
+++ b/scripts/social-video-gen.mjs
@@ -37,9 +37,19 @@ function readJob() { return JSON.parse(fs.readFileSync(jobPath, 'utf8')); }
 function patch(o) { const j = { ...readJob(), ...o, updated_at: new Date().toISOString() }; fs.writeFileSync(jobPath, JSON.stringify(j, null, 2)); return j; }
 
 function elevenKey() {
-  const env = fs.readFileSync(path.join(process.env.HOME, 'Projects/secrets-manager/.env'), 'utf8');
-  const m = env.match(/^ELEVENLABS_API_KEY=(.+)$/m);
-  return m ? m[1].trim().replace(/^["']|["']$/g, '') : '';
+  // 1) process env (prod ecosystem.config.js / shell), then 2) known .env files.
+  if (process.env.ELEVENLABS_API_KEY) return process.env.ELEVENLABS_API_KEY.trim().replace(/^["']|["']$/g, '');
+  const candidates = [
+    path.join(ROOT, '.env'),                                    // project-local (Kamatera prod)
+    path.join(process.env.HOME || '', 'Projects/secrets-manager/.env'), // Mac master
+  ];
+  for (const f of candidates) {
+    try {
+      const m = fs.readFileSync(f, 'utf8').match(/^ELEVENLABS_API_KEY=(.+)$/m);
+      if (m) return m[1].trim().replace(/^["']|["']$/g, '');
+    } catch {}
+  }
+  return '';
 }
 
 /** Grounded, first-person Boomer narration keyed to target length. */

← 8336bfb8 feat(social): article→video studio — Boomer-voiced 5/15/30s  ·  back to Rentv  ·  feat(social): use Boomer's dedicated VO clone (EoZqhGRrFYVEn d55d5b82 →