Esta pagina se ve mejor con JavaScript habilitado

Django Gource video y Gitlog

 ·  🎃 kr0m

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:


Instalamos el software necesario:

pkg install ffmpeg gource mediainfo xorg-vfbserver

El script en cuestión es el siguiente:

vi .scripts/generateCreditsVideo.sh

#!/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:

chmod 700 .scripts/generateCreditsVideo.sh

Subimos la pista de audio que utilizaremos en el video:

scp credits.mp3 rxWod:/home/kr0m/

Ejecutamos el script:

.scripts/generateCreditsVideo.sh

Y podemos ver el fichero resultante:

ls -la /home/kr0m/rxWod/rxWodProject/assets/videos/creditsAudioFadded.mp4

-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á:

vi .scripts/deploy.sh

#!/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
Si te ha gustado el artículo puedes invitarme a un RedBull aquí