← back to Beverlyhillsvideos
social: brand assets — avatar, YouTube banner (safe-zone), 5 Story-highlight covers (Didot+Jost, site palette)
8389f02af3368c32b889c61c3ffa60c90d3f1675 · 2026-08-05 15:37:33 -0700 · Steve Abrams
Files touched
A filmgen/brand_assets.pyA filmgen/fonts/Jost.ttfA public/social/avatar.pngA public/social/banner.pngA public/social/highlight-dining.pngA public/social/highlight-guides.pngA public/social/highlight-hotels.pngA public/social/highlight-map.pngA public/social/highlight-shopping.png
Diff
commit 8389f02af3368c32b889c61c3ffa60c90d3f1675
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Wed Aug 5 15:37:33 2026 -0700
social: brand assets — avatar, YouTube banner (safe-zone), 5 Story-highlight covers (Didot+Jost, site palette)
---
filmgen/brand_assets.py | 50 +++++++++++++++++++++++++++++++++++
filmgen/fonts/Jost.ttf | Bin 0 -> 134996 bytes
public/social/avatar.png | Bin 0 -> 30439 bytes
public/social/banner.png | Bin 0 -> 57107 bytes
public/social/highlight-dining.png | Bin 0 -> 16980 bytes
public/social/highlight-guides.png | Bin 0 -> 18585 bytes
public/social/highlight-hotels.png | Bin 0 -> 16972 bytes
public/social/highlight-map.png | Bin 0 -> 16774 bytes
public/social/highlight-shopping.png | Bin 0 -> 21235 bytes
9 files changed, 50 insertions(+)
diff --git a/filmgen/brand_assets.py b/filmgen/brand_assets.py
new file mode 100644
index 0000000..e941a48
--- /dev/null
+++ b/filmgen/brand_assets.py
@@ -0,0 +1,50 @@
+#!/usr/bin/env python3
+"""Beverly Hills Videos brand assets: avatar, YouTube banner, Story-highlight covers."""
+from PIL import Image, ImageDraw, ImageFont, ImageFilter
+import os
+OUT = "public/social"; os.makedirs(OUT, exist_ok=True)
+CREAM=(246,243,236); INK=(21,19,16); GREEN=(31,61,48); GOLD=(184,147,90); MUTED=(150,143,130)
+SERIF="/System/Library/Fonts/Supplemental/Didot.ttc"
+SANS="filmgen/fonts/Jost.ttf"
+def sf(sz,i=0): return ImageFont.truetype(SERIF,sz,index=i)
+def jf(sz): return ImageFont.truetype(SANS,sz)
+def center(d,cx,y,txt,fnt,fill):
+ w=d.textlength(txt,font=fnt); d.text((cx-w/2,y),txt,font=fnt,fill=fill); return w
+def tracked(d,cx,y,txt,fnt,fill,tr):
+ ws=[d.textlength(c,font=fnt) for c in txt]; tot=sum(ws)+tr*(len(txt)-1); x=cx-tot/2
+ for c,w in zip(txt,ws): d.text((x,y),c,font=fnt,fill=fill); x+=w+tr
+
+def avatar():
+ S=1080; img=Image.new("RGB",(S,S),GREEN); d=ImageDraw.Draw(img)
+ # gold hairline ring
+ m=int(S*0.055); d.ellipse([m,m,S-m,S-m],outline=GOLD,width=3)
+ # BHV monogram
+ f=sf(430); center(d,S/2,S*0.20,"BHV",f,GOLD)
+ # micro wordmark
+ tracked(d,S/2,S*0.70,"BEVERLY HILLS VIDEOS",jf(34),CREAM,10)
+ img.save(f"{OUT}/avatar.png"); print("avatar.png 1080x1080")
+
+def banner():
+ W,H=2560,1440; img=Image.new("RGB",(W,H),CREAM); d=ImageDraw.Draw(img)
+ cx=W/2
+ # subtle top/bottom green hairlines outside safe zone for depth
+ d.rectangle([0,0,W,10],fill=GREEN); d.rectangle([0,H-10,W,H],fill=GREEN)
+ # safe zone reference: central 1546x423 (y 508..931)
+ y0=508
+ tracked(d,cx,y0+30,"THE INSIDER FILM GUIDE",jf(30),GOLD,14)
+ center(d,cx,y0+95,"BEVERLY HILLS VIDEOS",sf(150),INK)
+ # gold hairline rule under wordmark
+ d.line([(cx-90,y0+300),(cx+90,y0+300)],fill=GOLD,width=2)
+ center(d,cx,y0+320,"Restaurant Films · Rodeo Drive · Five-Star Living",sf(46,1),MUTED)
+ img.save(f"{OUT}/banner.png"); print("banner.png 2560x1440 (text within 1546x423 safe zone)")
+
+def highlight(label):
+ S=1080; img=Image.new("RGB",(S,S),CREAM); d=ImageDraw.Draw(img)
+ m=int(S*0.14); d.ellipse([m,m,S-m,S-m],outline=GREEN,width=6)
+ d.ellipse([m+18,m+18,S-m-18,S-m-18],outline=GOLD,width=2)
+ tracked(d,S/2,S*0.44,label.upper(),jf(88),GREEN,10)
+ img.save(f"{OUT}/highlight-{label.lower()}.png")
+
+avatar(); banner()
+for lb in ["Dining","Shopping","Hotels","Map","Guides"]: highlight(lb)
+print("highlight covers:", "Dining Shopping Hotels Map Guides")
diff --git a/filmgen/fonts/Jost.ttf b/filmgen/fonts/Jost.ttf
new file mode 100644
index 0000000..cdf8630
Binary files /dev/null and b/filmgen/fonts/Jost.ttf differ
diff --git a/public/social/avatar.png b/public/social/avatar.png
new file mode 100644
index 0000000..d38d55e
Binary files /dev/null and b/public/social/avatar.png differ
diff --git a/public/social/banner.png b/public/social/banner.png
new file mode 100644
index 0000000..8b457bf
Binary files /dev/null and b/public/social/banner.png differ
diff --git a/public/social/highlight-dining.png b/public/social/highlight-dining.png
new file mode 100644
index 0000000..1d0a698
Binary files /dev/null and b/public/social/highlight-dining.png differ
diff --git a/public/social/highlight-guides.png b/public/social/highlight-guides.png
new file mode 100644
index 0000000..4e91651
Binary files /dev/null and b/public/social/highlight-guides.png differ
diff --git a/public/social/highlight-hotels.png b/public/social/highlight-hotels.png
new file mode 100644
index 0000000..d9539f8
Binary files /dev/null and b/public/social/highlight-hotels.png differ
diff --git a/public/social/highlight-map.png b/public/social/highlight-map.png
new file mode 100644
index 0000000..06927a5
Binary files /dev/null and b/public/social/highlight-map.png differ
diff --git a/public/social/highlight-shopping.png b/public/social/highlight-shopping.png
new file mode 100644
index 0000000..bec08cb
Binary files /dev/null and b/public/social/highlight-shopping.png differ
← a06bcae social: 3-platform launch pack (YT/IG/TikTok) + auto 9:16 ve
·
back to Beverlyhillsvideos
·
films: integrate completed restaurant film(s) [auto] 05f63e3 →