#!/bin/bash 

# Paquet à installer: zenity, bc, ffmpeg, avidemux

fichier="/tmp/master-tv"


# Limiter le nombre de coeurs utilisés pour garantir une température sous les 90°
# -------------------------------------------------------------------------------
# Nombre de coeur du pc 
Coeur="$(cat /proc/cpuinfo | grep processor | wc -l)"

# Pour du h264, créer un nombre de Noeud équivalent à 10% du nombre de coeur
Noeud="$(echo $Coeur / 10 | bc)"
Travail=4 #ou 4	# Travail par noeud (anciennement 3)

# Initialisation
# --------------
# Calcul des pipes
Pipe=$((Noeud + 1))
Pipe=$((Pipe * Travail))

# Noeud à ajouter à la séquence
Noeud=$((Noeud - 1)) 



# Nettoyage préventif
# -------------------
#Lister tous les processus cin actifs des port 1031 à 1131 et les détruits
for i in $(lsof -nP -i tcp:1031-$((1031 + 1131)) | grep LISTEN | grep cin | awk '{print  $2}')
do
	kill $i
done

#Détruit les pipes et rendus intermédiaires
rm -r /tmp/*.yuv /tmp/master-tv



# Création des répertoires et fichiers
# ------------------------------------
# Créer 10 cinelerraGG qui servirons de client
for n in $(seq 1031 $((1031 + Noeud))); do cin -d $n; done

# Créer 33 pipes (a adapter suivant nombre de travaux à effectuer par noeud) 
for n in $(seq -w 001 $((001 + Pipe))); do mknod /tmp/piper$n.yuv p; done



# Vérifie la bonne configuration de votre cinelerraGG
# ---------------------------------------------------
zenity --question --width=600 --title="Rendu de la partie vidéo" --text="Je viens de créer les pipes et les noeuds nécessaire dans le répertoire /tmp.\n\n\n<u><i>De votre côté, veuillez vous assurer que:</i></u>\n\n1. La porte frontale du boitier est bien ouverte afin d'améliorer le\n     refroidissement du Pc.\n\n2. Le proxy est désactivé.\n\n3. Menu /Configuration/Format\n\t- Le modèle couleurs:\t\t\t\t\t\t\t\t<b>Yuv-8 bit</b> ou du <b>YUVA 8 bit</b>.\n\n4. Menu /Configuration/Préférences/Performances\n\t- CPI SMP du projet:\t\t\t\t\t\t\t\t<b>$Coeur</b>\n\t- Utiliser une grappe de calcul pour le rendu:\t<b>coché</b>\n\t- Délais d'attent du watchdog du client:\t\t\t<b>60</b>\n\t- Nombre de travaux à créer:\t\t\t\t\t\t<b>$Pipe</b>\n\t- Noeuds déclarés\t\t\t\t\t\t\t\tPort <b>1031->$((1031 + Noeud))</b>\n\n5. Menu /fichier/rendu\n\t- Fichier de destination pour le rendu:\t\t\t<b>/tmp/piper001.yuv</b>\n\t- Fichier-type :\t\t\t\t\t\t\t\t\t<b>FFMPEG</b> - <b>yuv</b>\n\t- Préréglage vidéo :\tCompression:\t\t\t\t<b>raw.yuv</b>\n\t\t\t\t\t\t\tDébit binaire:\t\t\t\t<b>0</b>\n\t\t\t\t\t\t\tQualité:\t\t\t\t\t<b>-1</b>\n\t\t\t\t\t\t\tPixels:\t\t\t\t\t\t<b>yuv420p</b>\n\n\n<i><b>Après cette vérification, lancer le rendu puis passer à l'étape suivante.</b></i>"
if [[ $? != 0 ]] ; then exit; fi




# Lancement du rendu depuis les pipes vers les clients ffmpeg
# -----------------------------------------------------------
rm -r "${fichier}"
mkdir -p "${fichier}"
cd /tmp
ls piper*.yuv | parallel ffmpeg -f rawvideo -pixel_format yuv420p -video_size 1920x1080 -r 50 -i {} -c:v libx264 -preset slow -crf 20 -vf scale=1280:-1:flags=lanczos -ac 2 -c:a aac -b:a 224k "${fichier}"/{.}.mkv

# Concaténation des piper*.yuv
cd "${fichier}"
ffmpeg -f concat -safe 0 -i <(for f in ./*.mkv; do echo "file '$PWD/$f'"; done) -c copy piperMux.mkv



# Lancement du rendu audio sans les pipes
# ---------------------------------------
zenity --question  --width=600 --title="Rendu de la partie audio" --text="Le rendu de la partie vidéo est terminé.\n\n\nJe viens de réalisé la concaténation des fichiers vidéo <b>/tmp/master-tv/piper*.mkv</b>.\n\n\n<u><i>De votre côté, veuillez vous assurer que:</i></u>\n\n1. Menu /Configuration/Préférences/Performances\n\t- Utiliser une grappe de calcul pour le rendu:\t\t<b>Décoché</b>\n\n2. Menu /fichier/rendu\n\t- Fichier de destination pour le rendu:\t\t\t\t<b>/tmp/master-tv/piperMux.wav</b>\n\t- Fichier-type :\t\t\t\t\t\t\t\t\t\t<b>Microsoft WAV</b>\n\t- Préréglage audio :\tCompression:\t\t\t\t\t<b>16 Bits Linear</b>\n\t\t\t\t\t\t\tTramage:\t\t\t\t\t\t<b>Décoché</b>\n\n\n<i><b>Après cette vérification, lancer le rendu et attendre sa fin avant de passer à l'étape suivante.</b></i>"
if [[ $? != 0 ]] ; then exit; fi



# Mixage vidéo et audio
# ---------------------
nautilus /tmp/master-tv/
zenity --question --width=600 --title="Mixage de la video et de l'audio" --text="Le rendu de la partie audio est terminé\n\n\nJe viens d'ouvrir pour vous le contenu du répertoire <b>/tmp/master-tv</b>.\n\n\n<i><u>De votre côté, lancer Avidemux puis:</u></i>\n\n1. Click-déplacer <b>/tmp/master-tv/piperMux.mkv</b> sur la fenêtre d'Avidemux\n\n2. Menu /Audio/Choisir les pistes puis y ajouter\t\t\t<b>/tmp/master-tv/piperMux.wav</b>\n\n3. Configuration:\n\t- Décodeur vidéo:\t\t\t\t\t\t\t\t\t\t<b>Rien</b>\n\t- Sortie vidéo:\t\t\t\t\t\t\t\t\t\t\t<b>Copy</b>\n\t- Sortie audio:\t\tType:\t\t\t\t\t\t\t\t<b>AAC (FDK)</b>\n\t\t\t\t\t\tConfigurer:\tBitrate:\t\t\t<b>224</b> Kbits\n\t\t\t\t\t\t\t\t\t\tAfter burner:\t\t<b>Cocher</b>\n\t\t\t\t\t\tDécal:\t\t\t\t\t\t\t\t<b>Décoché</b>\n\t- Format de sortie\t\t\t\t\t\t\t\t\t<b>MKV Muxer</b>\n\n\n<i><b>Puis lancer le rendu, choisir un répertoire de sortie autre que /tmp, et attendre la fin du rendu avant de passer à l'étape suivante.</b></i>"




# Nettoyage final
# ---------------
zenity --info  --width=600 --title="Nettoyage" --text="Le mixage est terminé.\n\n\n<u><i>De votre côté, assurez-vous que le résultat final est correct et vous convient.</i></u>\n\n\n\nDès votre validation je vais faire un petit peu de ménage, à savoir:\n\n1. Tuer les noeuds CinelerraGG créés précédemment.\n\n2. Supprimer du disque:\n\n\t- Les fichier <b>/tmp/piper.yuv</b> (Les pipes)\n\n\t- Les fichier <b>/mp/master-tv.piper*.mkv</b> (Les rendus intermédiaires des $Noeud noeuds)\n\n\t- Le fichier <b>/tmp/master-tv/piperMux.mkv</b> (Les rendus intermédiaires concaténés)\n\n\t- Le fichier <b>/tmp/master-tv/piperMux.wav</b> (Le rendu audio)\n\n\n<i><b>Valider pour acter le nettoyage.</b></i>"

#Lister les pid de tous les processus cin actifs des port 1031 à 1131 et les détruits
for i in $(lsof -nP -i tcp:1031-$((1031 + Noeud)) | grep LISTEN | grep cin | awk '{print  $2}'
)
do
	kill $i
done

#Détruit les pipes et rendus intermédiaires
rm -r /tmp/*.yuv /tmp/master-tv


