#!/bin/bash
#primo tentativo di concatenazione automatico video, musica, sottotitoli
# Bold
BBlack='\e[1;30m'       # Nero
BRed='\e[1;31m'         # Rosso
BGreen='\e[1;32m'       # Verde
BYellow='\e[1;33m'      # Giallo
BBlue='\e[1;34m'        # Blu
BPurple='\e[1;35m'      # Viola
BCyan='\e[1;36m'        # Ciano
BWhite='\e[1;37m'       # Bianco

Color_Off='\e[0m'       # Text Reset
reset_console="\E[37;40m" #biancoBold
echo -e $BRed'PROGRAMMA shell PER CONCATENAZIONE N.6 VIDEO, IMMISSIONE MUSICALE E SOTTOTITOLI'
echo -e $BWhite'Titolo video in ordine di montaggio\n(INVIO per terminare immissione titoli)'
pad=1
sonoro=0
while read titolo; do
if [ "$titolo" != "" ]; then 
titoli[${pad}]=$titolo
pad=$(( $pad+1 ))
else 
break
fi
done
for ((i=1; i<$pad; i++))
do
echo -e $BYellow'['$i']-'${titoli[$i]}
done
numv=$(($i-1))
echo -e $BWhite'\n Titoli di '$numv' video acquisiti...'
echo -e $BRed'Uniformazione formati video attendere...'$BWhite
for ((i=1; i=$i; i++))
do
if [ "${titoli[$i]}" != "" ] 
then 
titolipos=`expr index "${titoli[$i]}" "."`
titolipos=$(( $titolipos-1 ))
stringa=${titoli[$i]}
nuovo=${stringa:0:$titolipos}'uni.mp4'
titunif[${i}]=$nuovo
echo -e $BYellow${titunif[$i]}$BWhite
#comando ffmpeg per uniformazione video
ffmpeg -i ${titoli[$i]} -vf scale=1280:720,setsar=1:1 $nuovo
else
break
fi
done
#adesso si tratta di concatenare: la stringa di concatenazione dipende dal
#+numero totale dei video
OPTION=$numv
case $OPTION in 
2 ) 
stringa='[0:v:0][0:a:0][1:v:0][1:a:0]concat=n=2:v=1:a=1[outv][outa]'
echo -e $BYellow'ffmpeg -i '${titunif[1]}' -i '${titunif[2]}' -filter_complex "'$stringa'" -map "[outv]" -map "[outa]" complex.mp4'
ffmpeg -i ${titunif[1]} -i ${titunif[2]} -filter_complex "$stringa" -map "[outv]" -map "[outa]" complex.mp4
;;
3 )
stringa='[0:v:0][0:a:0][1:v:0][1:a:0][2:v:0][2:a:0]concat=n=3:v=1:a=1[outv][outa]'
echo -e $BRed'ffmpeg -i '${titunif[1]}' -i '${titunif[2]}' -i '${titunif[3]}' -filter_complex "'$stringa'" -map "[outv]" -map "[outa]" complex.mp4'
ffmpeg -i ${titunif[1]} -i ${titunif[2]} -i ${titunif[3]} -filter_complex "$stringa" -map "[outv]" -map "[outa]" complex.mp4
;;
4 )
stringa='[0:v:0][0:a:0][1:v:0][1:a:0][2:v:0][2:a:0][3:v:0][3:a:0]concat=n=4:v=1:a=1[outv][outa]'
echo -e $BGreen'ffmpeg -i '${titunif[1]}' -i '${titunif[2]}' -i '${titunif[3]}' -i '${titunif[4]}' -filter_complex "'$stringa'" -map "[outv]" -map "[outa]" complex.mp4'
ffmpeg -i ${titunif[1]} -i ${titunif[2]} -i ${titunif[3]} -i ${titunif[4]} -filter_complex "$stringa" -map "[outv]" -map "[outa]" complex.mp4
;;
5 )
stringa='[0:v:0][0:a:0][1:v:0][1:a:0][2:v:0][2:a:0][3:v:0][3:a:0][4:v:0][4:a:0]concat=n=5:v=1:a=1[outv][outa]'
echo -e $BBlue'ffmpeg -i '${titunif[1]}' -i '${titunif[2]}' -i '${titunif[3]}' -i '${titunif[4]}' -i '${titunif[5]}' -filter_complex "'$stringa'" -map "[outv]" -map "[outa]" complex.mp4'
ffmpeg -i ${titunif[1]} -i ${titunif[2]} -i ${titunif[3]} -i ${titunif[4]} -i ${titunif[5]} -filter_complex "$stringa" -map "[outv]" -map "[outa]" complex.mp4
;;
6 )
stringa='[0:v:0][0:a:0][1:v:0][1:a:0][2:v:0][2:a:0][3:v:0][3:a:0][4:v:0][4:a:0][5:v:0][5:a:0]concat=n=6:v=1:a=1[outv][outa]'
echo -e $BPurple'ffmpeg -i '${titunif[1]}' -i '${titunif[2]}' -i '${titunif[3]}' -i '${titunif[4]}' -i '${titunif[5]}' -i '${titunif[6]}' -filter_complex "'$stringa'" -map "[outv]" -map "[outa]" complex.mp4'
ffmpeg -i ${titunif[1]} -i ${titunif[2]} -i ${titunif[3]} -i ${titunif[4]} -i ${titunif[5]} -i ${titunif[6]} -filter_complex "$stringa" -map "[outv]" -map "[outa]" complex.mp4
;;
*)
echo -e $BCyan"Hai immesso un solo video oppure piu' di 6 video, che non e' possibile concatenare.\n
In caso di maggior numero di video, procedere per gradi, ad esempio concatenandoli in volte\n
successive."
esac
echo -e $BWhite'Se si desidera inserire un commento sonoro indicare nome e percorso file AUDIO.\n
Il file audio dovrebbe essere di durata piu lunga della durata del video. Questo programma
esegue un controllo in tale senso e, in caso di video piu lungo, viene duplicata la durata\n
del file audio. Qualora non fosse sufficiente, la opzione -shortest taglierebbe il video\n
per adeguarlo alla lunghezza audio.\n
Digitaare INVIO per non aggiungere commento musicale.'
read commento
if [ "$commento" != "" ] 
then
#una volta acquisito il nome del file audio e necessario che esso sia PIU LUNGO del video
ffprobe -i $commento -show_entries format=duration -v quiet -of csv="p=0">duraudio.txt 
ffprobe -i complex.mp4 -show_entries format=duration -v quiet -of csv="p=0">durvideo.txt
filev="durvideo.txt"
filea="duraudio.txt"
while read -r line; do
echo -e $BCyan$line
tempovideo=${line}
done <$filev
echo -e $BRed"Durata del video :"$BYellow$(bc <<<"$tempovideo")
while read -r line; do
echo -e $BCyan$line
tempoaudio=${line}
echo -e $BRed"Durata del audio :"$BYellow$(bc <<<"$tempoaudio")
done <$filea
if [ "$tempoaudio" > "$tempovideo" ]
then
echo 'l audio e piu lungo del video di '$(bc  <<< "$tempoaudio"-"$tempovideo" )
#quindi non si deve fare nulla e vale l'opzione -shortest
#+viene aggiunto l'audio originale immesso
ffmpeg -i complex.mp4 -i $commento -filter_complex "[0:a][1:a]amerge=inputs=2[a]" -map 0:v -map "[a]" -c:v copy -ac 2 -shortest videosound.mp4
echo 'Il video con traccia sonora aggiunta e : videosound.mp4'
else
echo 'il video e piu lungo del audio di '$(bc <<<"$tempovideo"-"$tempoaudio")
#si deve raddoppiare l'audio per usare l'opzione -shortest
ffmpeg -i "concat:$commento|$commento" -c copy 'duplex'$commento 
echo "Il file audio troppo corto e stato raddoppiato nel file duplex"$commento
commentomusicale='duplex'$commento
#viene aggiunto il commento sonoro raddoppiato
ffmpeg -i complex.mp4 -i $commentomusicale -filter_complex "[0:a][1:a]amerge=inputs=2[a]" -map 0:v -map "[a]" -c:v copy -ac 2 -shortest videosound.mp4
echo 'Il video con traccia sonora aggiunta e : videosound.mp4'
fi
else
#caso in cui non e stato inserito file audio

echo 'Il video senza traccia sonora aggiunta e : complex.mp4'
sonoro=1
break
fi
#penultimo passo: vostro logo sul video
echo 'Se volete aggiungere un vostro logo sul video, immettere nome e percorso
del vostro logo.png'
read logo
    if [ "$logo" != "" ]
then
if [ $sonoro = 1 ]
then
ffmpeg -i complex.mp4 -i $logo -filter_complex "overlay=20:20" videosound0.mp4 
else
ffmpeg -i videosound.mp4 -i $logo -filter_complex "overlay=20:20" videosound0.mp4 
fi
    else
#non mette logo, si danno 2 casi: musica si(videosound.mp4) e musica no(complex.mp4)
#+credo convenga rinominare
mv complex.mp4 videosound0.mp4
break
    fi
#Ultimo passo i sottotitoli
echo 'Digitare il nome del file .srt per i sottotitoli. INVIO per non aggiungere titoli'
read srt
    if [ "$srt" != "" ]
    then
#trasformazione nel file .ass
ffmpeg -i $srt videofinito.ass
#aggiunta sottotitoli
ffmpeg -i videosound0.mp4 -vf subtitles=videofinito.ass videofinito.mp4
echo 'Il tuo video completo di sottotitoli e videofinito.mp4'
    else
if [ "$sonoro" = 1 ]
then
mv videosound.mp4 videofinito.mp4
echo 'Il tuo video senza sottotitoli e videofinito.mp4'
fi
echo 'Grazie per aver usato il mio programma!'
    fi
exit 0