← back to Beverlyhillsvideos
filmgen/store_card_anim.sh
26 lines
#!/bin/zsh
# store_card_anim.sh — animated store card ($0, local).
# filmgen/store_card_anim.sh "<Name>" "<tagline>" "<narration>" <slug>
set -e
cd "$(dirname "$0")/.."
NAME="$1"; TAGLINE="$2"; NARR="$3"; SLUG="$4"
VOICE="${STORE_VOICE:-Samantha}"; FPS=24
OUT="public/video/store"; mkdir -p "$OUT" filmgen/work
FRAMES="filmgen/work/${SLUG}-frames"; rm -rf "$FRAMES"
AIFF="filmgen/work/${SLUG}-narr.aiff"; MP4="${OUT}/${SLUG}.mp4"
say -v "$VOICE" -o "$AIFF" "$NARR"
NDUR=$(ffprobe -v error -show_entries format=duration -of csv=p=0 "$AIFF")
DUR=$(python3 -c "print(max(8.0,float('$NDUR')+1.4))")
END=$(python3 -c "print(round($DUR-0.6,2))")
python3 filmgen/store_card_anim.py "$NAME" "$TAGLINE" "$FRAMES" "$FPS" "$DUR"
# frames → mp4 with a very gentle zoom + fade-out, narration muxed
ffmpeg -y -framerate $FPS -i "$FRAMES/f%04d.png" -i "$AIFF" \
-filter_complex "[0:v]zoompan=z='min(zoom+0.0002,1.05)':d=1:fps=${FPS}:s=1080x1920,fade=out:st=${END}:d=0.6,format=yuv420p[v]" \
-map "[v]" -map 1:a -c:v libx264 -preset medium -crf 20 -c:a aac -b:a 128k \
-t "$DUR" -movflags +faststart "$MP4" 2>/dev/null
rm -rf "$FRAMES"
echo "wrote $MP4 (${DUR}s, voice=${VOICE})"