← back to Rentv 2026
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
M package.jsonM scripts/gen-social-frame.pyM scripts/social-video-gen.mjs
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 2026
·
feat(social): use Boomer's dedicated VO clone (EoZqhGRrFYVEn d55d5b82 →