#!/bin/bash # Configuration SOURCEDIR=$(pwd) PROJECT=$1 BASETEMPLATE="nluug-title-template.svg" SOURCEFILE="event.svg" VIDEODIR="${SOURCEDIR}/output" PROJDIR="/tmp/nluug-intro-${PROJECT}" CONV="convert -background black -fill black -alpha off" FRAMENUM=0 # Validate input validate_input() { if [ -z "${PROJECT}" ]; then echo "Usage: $0 " exit 1 fi if [ -z "$EVENTNAME" ]; then echo "Specify EVENTNAME env-var" exit 2 fi if [ -z "$SPEAKERNAME" ]; then echo "Specify SPEAKERNAME env-var" exit 3 fi if [ -z "$TITLE1" ] || [ -z "$TITLE2" ] || [ -z "$TITLE3" ]; then echo "Specify TITLE1/TITLE2/TITLE3 env-vars" exit 4 fi } # Setup project directory setup_project_dir() { mkdir -p "${PROJDIR}" || { echo "Failed to create project directory"; exit 1; } cd "${PROJDIR}" || { echo "Failed to change to project directory"; exit 1; } } # Generate frames generate_frames() { echo "Generate fade-in-from-black sequence" for i in $(seq 100 -3 0); do echo "Generate frame ${FRAMENUM}" ${CONV} -colorize ${i}% frameclear.svg "frame-${FRAMENUM}.webp" ((FRAMENUM++)) done echo "Add speakername sequence" SLEN=${#SPEAKERNAME} for i in $(seq 0 ${SLEN}); do echo "Generate frame ${FRAMENUM}" SN="${SPEAKERNAME:0:i}" awk -v sn="$SN" '{gsub(/TITLE[123]/, ""); gsub(/SPEAKERSPEAKERSPEAKERSPEAKER/, sn); print}' ${SOURCEFILE} > "${PROJDIR}/frame-${FRAMENUM}.svg" ${CONV} "frame-${FRAMENUM}.svg" "frame-${FRAMENUM}.webp" ((FRAMENUM++)) done echo "Add title sequence" for i in $(seq 0 40); do echo "Generate frame ${FRAMENUM}" T1="${TITLE1:0:i}" T2="${TITLE2:0:i}" T3="${TITLE3:0:i}" awk -v t1="$T1" -v t2="$T2" -v t3="$T3" -v sn="$SN" '{gsub(/TITLE1/, t1); gsub(/TITLE2/, t2); gsub(/TITLE3/, t3); gsub(/SPEAKERSPEAKERSPEAKERSPEAKER/, sn); print}' ${SOURCEFILE} > "${PROJDIR}/frame-${FRAMENUM}.svg" ${CONV} "frame-${FRAMENUM}.svg" "frame-${FRAMENUM}.webp" ((FRAMENUM++)) done echo "Generate completed title" awk -v t1="$TITLE1" -v t2="$TITLE2" -v t3="$TITLE3" -v sn="$SPEAKERNAME" '{gsub(/TITLE1/, t1); gsub(/TITLE2/, t2); gsub(/TITLE3/, t3); gsub(/SPEAKERSPEAKERSPEAKERSPEAKER/, sn); print}' ${SOURCEFILE} > "${PROJDIR}/frame-${FRAMENUM}.svg" ${CONV} "frame-${FRAMENUM}.svg" "frame-${FRAMENUM}.webp" LASTFRAME=$FRAMENUM ((FRAMENUM++)) for i in $(seq 0 1 100); do echo "Duplicating frame ${FRAMENUM}" cp "frame-${LASTFRAME}.webp" "frame-${FRAMENUM}.webp" ((FRAMENUM++)) done echo "Generate fade-out-sequence" for i in $(seq 0 3 100); do echo "Generate frame ${FRAMENUM}" ${CONV} -colorize ${i}% "frame-${LASTFRAME}.svg" "frame-${FRAMENUM}.webp" ((FRAMENUM++)) done } # Render video render_video() { echo "Rendering to video" ffmpeg -f lavfi -i anullsrc=channel_layout=stereo:sample_rate=44100 -framerate 25 -i frame-%d.webp -c:a aac -c:v libx264 -shortest -profile:v baseline -pix_fmt yuv420p -colorspace:v 'bt709' -color_primaries:v 'bt709' -color_trc:v 'bt709' -color_range:v 'tv' -r 30 "${VIDEODIR}/${PROJECT}-x264.mkv" } # Cleanup temporary files cleanup() { echo "Cleaning up temporary files" rm -rf "${PROJDIR}" } # Main execution main() { validate_input setup_project_dir # Customize template to this event from base template awk -v eventname="$EVENTNAME" '{gsub(/EVENTNAMEEVENTNAME/, eventname); print}' "${SOURCEDIR}/${BASETEMPLATE}" > ${SOURCEFILE} # Create initial image without title/speaker info awk '{gsub(/SPEAKERSPEAKERSPEAKERSPEAKER/, ""); gsub(/TITLE[123]/, ""); print}' ${SOURCEFILE} > frameclear.svg generate_frames render_video cleanup } main