#!/usr/bin/perl
#Shift et Scale les fichiers de sous titre de type .srt
use Getopt::Std;
my $shift = 4; #en secondes
my $scale = 25/23.9;
my $numD=02;my $heureD="00:05:34,700" ; my $numF=539; my $heureF="01:47:50,000";
getopts('d:f:s', \my %arg);
if (!test($arg{d})){die &usage();};
if (!test($arg{f})){die &usage();};
my $fichier = $ARGV[0];
if ($arg{d}=~/^(\d+):(.*)/){$numD=$1;$heureD=$2;};
if ($arg{f}=~/^(\d+):(.*)/){$numF=$1;$heureF=$2;};
my $num=1; my @debut; my @fin; my @blabla;
open ($F,"<",$fichier) or die "Le fichier $fichier n'existe pas";
while (my $in=<$F>){chop($in);
	if ($in=~m/^\d+$/){$num=$in;next;};
	if ($in=~m/\d --> \d/){$in=~m/^(.*?)-->(.*?)$/;$debut[$num]=$1; $fin[$num]=$2; $fin[$num]=~s/ //g; $debut[$num]=~s/ //g; $blabla[$num]="";next;};
	if ($blabla[$num]){$blabla[$num]=$blabla[$num]."\n".$in;} else {$blabla[$num]=$in;};
	};
my $x0=HtoN($debut[$numD]); my $x1=HtoN($debut[$numF]); my $y0=HtoN($heureD); my $y1=HtoN($heureF);
if ($x1==$x0){die "problème de division par zéro : $x1-$debut[$numF] - $x0-$debut[$numD]\n"};
my $scale=($y1-$y0)/($x1-$x0); my $shift = $y0-$scale*$x0;
my $ddd=1; my $fff=$num;
if ($arg{s}){$ddd=$numD;$fff=$numF;};
for my $i ($ddd..$fff){
	my $d=HtoN($debut[$i]);
	my $f=HtoN($fin[$i]);
	$d=$d*$scale+$shift;$f=$f*$scale+$shift;
	my $hd = int($d/3600); my $md = int(($d-$hd*3600)/60); my $sd=$d-$hd*3600-$md*60;
	$hd=sprintf("%02.0f",$hd); $md=sprintf("%02.0f",$md); $sd=sprintf("%06.3f",$sd);$sd=~s/\./,/;
	my $hf = int($f/3600); my $mf = int(($f-$hf*3600)/60); my $sf=$f-$hf*3600-$mf*60;
	$hf=sprintf("%02.0f",$hf); $mf=sprintf("%02.0f",$mf); $sf=sprintf("%06.3f",$sf);$sf=~s/\./,/;
	print ("$i\n$hd:$md:$sd --> $hf:$mf:$sf\n$blabla[$i]\n");
	};
	
sub HtoN {
	my $h=$_[0];
	$h=~m/(\d\d):(\d\d):(\d\d,\d\d\d)/;my $min=$2;my $h=$1;my $d=$3;$d=~s/,/\./;$d=$d+$min*60+$h*3600;
	return $d;
	};

sub test {
my $in = $_[0]; my $r=0;
if ($in=~/\d+:\d\d:\d\d:\d\d,\d\d\d/){$r=1;};
return $r;
};

sub usage {
my $r = "Les options -d (début) et -f (fin) sont obligatoires. \nLeur forme est : 123:00:03:34,000 Le premier chiffre est le numéro de ligne. \nL'option -s limite la sortie entre les deux balises données.";
return $r;
};
