#!/bin/bash
#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 $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
Digitare INVIO per NON aggiungere commento musicale.'
read commento
#
#penultimo passo: vostro logo sul video
echo 'Se volete aggiungere un vostro logo sul video, immettere nome e percorso
del vostro logo.png, altrimenti digitare INVIO.'
read logo
#-----------------
#Ultimo passo i sottotitoli
echo 'Digitare il nome del file .srt per i sottotitoli. INVIO per non aggiungere titoli'
read srt
#fine spostamento domande all'inizio
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 
1)
#stringa='[0:v:0][0:a:0][outv][outa]'
mv $nuovo complex.mp4  #un solo video deve venir rinominato
;;
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  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

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
#mv complex.mp4 videosound.mp4
#echo 'Il video senza traccia sonora aggiunta e : videosound.mp4'
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
logo=1
if [ $sonoro = 1 ]
then
ffmpeg -i complex.mp4 -i $logo -filter_complex "overlay=1140:20" videosound0.mp4 #spostato il logo a dx prima era 20:20 perché su sharktube ho logo con faccia a sn
else
ffmpeg -i videosound.mp4 -i $logo -filter_complex "overlay=1140:20" videosound0.mp4 
fi
    else
#non mette logo, si danno 2 casi: musica si(videosound.mp4) e musica no(complex.mp4)
#+credo convenga rinominare
if [ "$logo" != "1" ]
then
mv complex.mp4 videosound0.mp4
fi
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 -e $Bred'Il tuo video completo di sottotitoli è videofinito.mp4'$BWhite
    else
# if [ "$sonoro" = 1 ]
# then
mv videosound0.mp4 videofinito.mp4
echo -e $Bred'Il tuo video senza sottotitoli e videofinito.mp4'
#fi
echo 'Grazie per aver usato il mio programma!'
    fi
exit 0