#!/usr/bin/perl
#Aide à faire un fichier batch pour créer des webm en vf et vostfr
use Data::Dumper;

my $dir = shift // '.';
my $batch='./batch.sh';
unlink $batch;
my $vid; my $srt; my $conteur=1;
opendir my $dh, $dir or die "Could not open '$dir' for reading '$!'\n";
while (my $dirLocal = readdir $dh) {
    if ($dirLocal eq '.' or $dirLocal eq '..') {next;};
    my $dirrel=$dir."/".$dirLocal;
    if (-d $dirrel){$vid->[$conteur]->{titre}=$dirrel;
			($vid,$srt)=Analyse($conteur,$vid,$srt);
			$vid->[$conteur]->{done}=0; 
			$conteur++;
			};
};
closedir $dh;
#print Dumper($vid);
my $res=1;
while ($res){
	$res = Menu1($vid);
	my $ffmpeg=Menu2($res,$vid,$srt);
	open($F,">>",$batch);
	print $F $ffmpeg;
	close $F;
	$vid->[$res]{done}=1;
	};

sub Menu2 { (my $res,my $vid,my $sub)=@_;
my $numfile=0;my %nomfich;
my $ffmpeg="";
print("Titre du film : $vid->[$res]->{titre}\n");
foreach my $file (keys %{$vid->[$res]}){
	if (($file eq 'titre')||($file eq 'done')){next;};
	print ("$file\n");
	foreach my $piste (0..$#{$vid->[$res]{$file}}){
		my $description = $vid->[$res]{$file}[$piste]; $description=~s/^.*Stream \#0:\d//;
		print ("Piste = $numfile:$piste : $description\n");
		$nomfich{"$numfile:$piste"}->{fichier}=$file; $nomfich{"$numfile:$piste"}->{piste}=$piste;
		$nomfich{"$numfile:$piste"}->{description}=$description;
		}; $numfile++;
	};
print ("Quelle est la piste vidéo pour la version française ? [none]");my $videofr=<STDIN>; chop $videofr;
print ("Quelle est la piste audio pour la version française ? [none]");my $audiofr=<STDIN>; chop $audiofr;
print ("Quelle est la piste vidéo pour la version sous-titrée ? [none]");my $videoori=<STDIN>; chop $videoori;
print ("Quelle est la piste audio pour la version sous-titrée ? [none]");my $audioori=<STDIN>; chop $audioori;
if ($videoori){foreach my $i (0..$#{$sub->[$res]}){print ("$i : $sub->[$res][$i]\n")};
	print ("Quel est le fichier de sous-titre ?"); my $srt=<STDIN>;
	$vid->[$res]{titre}=~s/\/\//\//g;
	if ($videoori){$vid->[$res]{titre}=~/.*\/(.+)/; my $output=$1;
	if ($nomfich{$videoori}->{fichier} eq $nomfich{$audioori}->{fichier}){
	$ffmpeg=$ffmpeg.qq{ffmpeg -i "$vid->[$res]->{titre}/$nomfich{$videoori}->{fichier}" -vf subtitles="$vid->[$res]{titre}/$sub->[$res][$srt]":force_style=Fontsize=24 -c:v libsvtav1 -crf 31 -c:a libopus -ac 2 -map 0:$nomfich{$videoori}->{piste} -map 0:$nomfich{$audioori}->{piste} "$vid->[$res]{titre}/$output-vostfr.webm"\n};
	}
	else {$ffmpeg=$ffmpeg.qq{ffmpeg -i "$vid->[$res]{titre}/$nomfich{$videoori}->{fichier}" -i "$vid->[$res]{titre}$nomfich{$audioori}->{fichier}" -vf subtitles="$vid->[$res]{titre}/$sub->[$res][$srt]":force_style=Fontsize=24 -c:v libsvtav1 -crf 31 -c:a libopus -ac 2 -map 0:$nomfich{$videoori}->{piste} -map 1:$nomfich{$audioori}->{piste} "$vis->[$res]{titre}/$output-vostfr.webm"\n};}; 
	};};
if ($videofr){$vid->[$res]{titre}=~/.*\/(.+)/; my $output=$1;
	if ($nomfich{$videofr}->{fichier} eq $nomfich{$audiofr}->{fichier}){my $codec = 'libsvtav1 -crf 31'; if ($nomfich{$videofr}->{description}=~/Video: vp[89]/){$codec='copy';};
	$ffmpeg=$ffmpeg.qq{ffmpeg -i "$vid->[$res]->{titre}/$nomfich{$videofr}->{fichier}" -c:v $codec -c:a libopus -ac 2 -map 0:$nomfich{$videofr}->{piste} -map 0:$nomfich{$audiofr}->{piste} "$vid->[$res]{titre}/$output-vf.webm"\n};
	}
	else {$ffmpeg=$ffmpeg.qq{ffmpeg -i "$vid->[$res]{titre}/$nomfich{$videofr}->{fichier}" -i "$vid->[$res]{titre}/$nomfich{$audiofr}->{fichier}" -c:v $codec -c:a libopus -ac 2 -map 0:$nomfich{$videofr}->{piste} -map 1:$nomfich{$audiofr}->{piste} "$vis->[$res]{titre}/$output-vfr.webm"\n};}; 
	};
return $ffmpeg;
};

sub Menu1 { (my $vid) = @_; my $verif=1; my $defaut;
foreach my $film (1..$#{$vid}) {
	if (!$vid->[$film]{done}){print("$film - $vid->[$film]{titre}\n");$verif=0;$defaut=$film;}
	};
my $good=1; my $rep=0;
if ($verif){return $rep;};
while ($good){
	print ("Film à traiter ? \[1 - $#{$vid}\] ");$rep = <STDIN>;chop $rep;
	if (!$rep){$rep=$defaut;};
	if (($rep<1)||($rep>$#{$vid})){print ("Veuillez donner une réponse comprise entre 1 et $#{$vid}\n");}else{$good=0;};
	};
return $rep;
};

sub Analyse {
my $conteur = $_[0];
my $vid = $_[1]; my $srt = $_[2];
my $dir = $vid->[$conteur]->{titre};
opendir my $contenu, $dir;my $j=0;
while (my $file=readdir $contenu){
	if (($file=~/\.mkv/)||($file=~/\.avi/)||($file=~/\.mp4/)){
		open($retour,"-|",qq{ffmpeg -i "$dir/$file" -hide_banner 2>&1});
		while(my $i=<$retour>) {chop ($i);if ($i=~/Stream \#0:(\d)/){$vid->[$conteur]->{$file}->[$1]=$i;};
		};
		close($retour);
		};
	if ($file=~/\.srt/){$srt->[$conteur]->[$j]=$file;$j++;};
	};
close $contenu;
return ($vid,$srt);
};
