En este artículo explicaremos como generar un video al estilo Gource pero con la peculiaridad de que insertaremos mediante ffmpeg el texto de los logs de Git a modo de créditos. La idea es generar el video cada vez que hagamos un deploy de nuestro proyecto Django.
Como ya hemos comentado vamos a utilizar el script de generación de video en el propio script de deploy, para los que no sepan de que script estoy hablando dejo aquí los artículos anteriores sobre Django:
- Django: Venv bajo FreeBSD
- Django: MVT, Apps y URLs
- Django: Modelos de base de datos
- Django: Interfaz de administración
- Django: DTL(Django Template Language)
- Django: Debug Toolbar
- Django: Registro y autenticación de usuarios
- Django: Webpack
- Django: Bootstrap mediante WebPack
- Django: Proyecto en producción
- Django: Traducciones
- Django: Comandos administrativos
- Django: Updates
- Django: Backups
Instalamos el software necesario:
El script en cuestión es el siguiente:
#!/usr/local/bin/bash
# pkg install ffmpeg gource mediainfo xorg-vfbserver(HeadLess)
echo ">> Generating Gitlog file"
echo " " > ~/gitlog.log
for i in $(seq 1 50); do
echo " " >> ~/gitlog.log
done
echo "Credits:" >> ~/gitlog.log
echo " " >> ~/gitlog.log
echo ">> System Administrator: Kr0m" >> ~/gitlog.log
echo ">> WebPage Developer: Kr0m" >> ~/gitlog.log
echo ">> WebPage Design Consultants: Kalma" >> ~/gitlog.log
echo ">> JS Consultants: Fenollet, Fayu" >> ~/gitlog.log
echo " " >> ~/gitlog.log
echo "-------------------------------------------" >> ~/gitlog.log
echo " " >> ~/gitlog.log
echo "Git Logs:" >> ~/gitlog.log
echo " " >> ~/gitlog.log
cd /home/kr0m/rxWod/rxWodProject
git log --reverse --pretty=format:'%h -- %as %an: %s' >> ~/gitlog.log
for i in $(seq 1 11); do
echo " " >> ~/gitlog.log
done
echo ">> Wrapping Gitlog file lines"
fold -w120 ~/gitlog.log > ~/gitlog_wrapped.log
echo ">> Generating Gource video file"
killall -9 Xvfb 2>/dev/null
Xvfb :99 &
export DISPLAY=:99
gource --highlight-all-users --time-scale 4.0 -o - | ffmpeg -hide_banner -loglevel error -y -r 60 -f image2pipe -vcodec ppm -i - -vcodec libx264 -preset ultrafast -pix_fmt yuv420p -crf 1 -threads 0 -bf 0 ~/gource.mp4
cd
echo ">> Adding text lines to file"
# y=(h-text_h)/XXX*t -> XXX parameter controls text speed, depending of the length of our video we have to adjust the text speed consecuently
# High value -> Slower text speed
duration=$(mediainfo --Inform="Video;%Duration%" ~/gource.mp4)
# 1036s -> 1 txt speed unit
# N=duration/1036
N=$(echo "$duration / 1036" |bc)
ffmpeg -hide_banner -loglevel error -i ~/gource.mp4 -vf drawtext="fontcolor=white: fontsize=14: box=1: boxcolor=black@0.1: boxborderw=5: x=(w)/25: y=(h-text_h)/$N*t: textfile=$HOME/gitlog_wrapped.log" -y -codec:a copy ~/credits.mp4
echo ">> Adding audio"
if [ -f ~/credits.mp3 ]; then
# If video is longer than audio, loop it
ffmpeg -hide_banner -loglevel error -y -i ~/credits.mp4 -stream_loop -1 -i ~/credits.mp3 -map 0:v:0 -map 1:a:0 -shortest ~/creditsAudio.mp4
echo ">> Adding fade in/out effects"
VIDEO_DURATION=$(mediainfo --Inform="Video;%Duration%" creditsAudio.mp4)
START_TIME=$(echo "scale=3;($VIDEO_DURATION-4000)/1000" | bc -q)
#echo "VIDEO_DURATION: $VIDEO_DURATION"
#echo "START_TIME: $START_TIME"
ffmpeg -hide_banner -loglevel error -y -i ~/creditsAudio.mp4 -filter_complex "[0:v]fade=type=in:duration=4,fade=type=out:duration=4:start_time=$START_TIME[v];[0:a]afade=type=out:duration=4:start_time=$START_TIME[a]" -map "[v]" -map "[a]" ~/creditsAudioFadded.mp4
else
echo "++ Audio file not found, continuing without audio"
cp ~/credits.mp4 ~/creditsAudioFadded.mp4
fi
echo ">> Removing temporarily files"
rm ~/gitlog.log 2>/dev/null
rm ~/gitlog_wrapped.log 2>/dev/null
rm ~/gource.mp4 2>/dev/null
rm ~/credits.mp4 2>/dev/null
rm ~/creditsAudio.mp4 2>/dev/null
killall -9 Xvfb 2>/dev/null
if [ ! -d "/home/kr0m/rxWod/rxWodProject/assets/videos/" ]; then
mkdir /home/kr0m/rxWod/rxWodProject/assets/videos/
fi
cp ~/creditsAudioFadded.mp4 /home/kr0m/rxWod/rxWodProject/assets/videos/creditsAudioFadded.mp4
Básicamente añade algunas líneas de texto custom, añade los logs de Git, genera el video mediante Gource, entremezcla el texto con el video y le añade una pista de audio con efecto faded. Hay que tener en cuenta que el procesamiento de video es una tarea muy pesada y según la potencia de nuestro servidor puede llevar mas o menos tiempo.
Le asignamos los permisos necesarios al script:
Subimos la pista de audio que utilizaremos en el video:
Ejecutamos el script:
Y podemos ver el fichero resultante:
-rw-r--r-- 1 kr0m kr0m 22732923 Apr 6 22:09 /home/kr0m/rxWod/rxWodProject/assets/videos/creditsAudioFadded.mp4
El video final será como este:
Modificamos el script de deploy de este modo cada vez que subamos código al repositorio y ejecutemos el script de deploy el video se regenerará:
#!/usr/local/bin/bash
cd /home/kr0m/rxWod/rxWodProject
git pull
/home/kr0m/.scripts/generateCreditsVideo.sh
cd ..
source bin/activate
pip install -r rxWodProject/requirements.txt
cd rxWodProject
python manage.py makemigrations
python manage.py migrate
django-admin makemessages -l es -d djangojs -i node_modules
cd rxWod
django-admin makemessages -l es
cd ..
#cd usersAuth
#django-admin makemessages -l es
#cd ..
django-admin compilemessages
cp locale/es/LC_MESSAGES/djangojs.mo rxWod/locale/es/LC_MESSAGES/djangojs.mo
#cp locale/es/LC_MESSAGES/djangojs.mo usersAuth/locale/es/LC_MESSAGES/djangojs.mo
yarn install
yarn prod-build
python manage.py collectstatic --noinput
sudo /usr/sbin/service daphne restart