#!/usr/bin/perl
# Resync sub title file
# for Sub Title of types srt or sub.
#
my	$argc = scalar ( @ARGV );
sub usage {
	local	$prog=`basename $0`;
	chomp( $prog);
	print STDERR "usage : $prog offset (sec,millieme) infile outfile\n";
	print STDERR "\tinfile different from outfile\n";
	print STDERR "\toffset format for srt type : sec,millieme (eg 15,090 => +15 sec 90 milliemes)\n";
	print STDERR "\r\t$_[0]\n";
	exit 1;
}
if( $argc != 3 ) {
	usage "Need Args";
}
my	$offset=$ARGV[0];
my	$input=$ARGV[1];
my	$output=$ARGV[2];

printf STDERR "Input : $input\n";
printf STDERR "Output : $output\n";
printf STDERR "Offset : $offset\n";
if ( $input eq $output ) {
	usage "Output need to be diffrent from input";
}
#
# Search sub type
#
$type='no';
$type='srt' if ( $input =~ /.*\.srt$/i) ;
$type='sub' if ( $input =~ /.*\.sub$/i) ;
if( $type eq 'no' ) {
	usage "Your input file extension must be .srt or .sub";
}
if( $type eq 'srt' ) {
	if ( ! ($offset =~ /[+\-]*\d+[\-,:]\d+/ ) ) {
		usage "Bad format for offset";
	}
	my	($sec, $mill ) = split ( /,/, $offset);
	$mill *= -1 if( $sec < 0 );
	open(IN,"< $input") or die "Can't open file '$input':\n$!";
	open(OUT,"> $output") or die "Can't open file temporary file '$output':\n$!";
	# format : {2113}{2171}[Record Scratching]
	foreach $li ( <IN> ) {
		$li =~ s/[\r\n]*$//;
		if( $li =~ /(\d+):(\d+):(\d+),(\d+) --> (\d+):(\d+):(\d+),(\d+).*$/ ) {
			print STDERR "Par1 : $1, Par2 : $2, Par3 : $3, Par4, $4, Par5 $5, Par6 $6\n";
			#
			# ofset en seconde
			# Format 00:06:03,483 --> 00:06:06,452
			#        hh mm ss millieme
			# par1 par5 heures
			# par2 par6 minutes
			# par3 par7 secondes
			# par4 par8 millieme
			my	($h1, $m1, $s1, $ml1, $h2, $m2, $s2, $ml2) = ($1, $2, $3, $4, $5, $6, $7, $8);
			$s1 += $offset;
			$s2 += $offset;
			$ml1 += $mill;
			$ml2 += $mill;
			if( $offset > 0 ) {
				while( $ml1 > 999 ) {
					$ml1 -= 1000;
					$s1++;
				}
				while( $s1 > 59 ) {
					$s1 -= 60;
					$m1++;
				}
				while( $m1 > 59 ) {
					$m1 -= 60;
					$h1++;
				}
				while( $ml2 > 999 ) {
					$ml2 -= 1000;
					$s2++;
				}
				while( $s2 > 59 ) {
					$s2 -= 60;
					$m2++;
				}
				while( $m2 > 59 ) {
					$m2 -= 60;
					$h2++;
				}
			}
			else {
				while( $ml1 < 0 ) {
					$ml1 += 1000;
					$s1--;
				}
				while( $s1 < 0 ) {
					$s1 += 60;
					$m1--;
				}
				while( $m1 < 0 ) {
					$m1 += 60;
					$h1--;
				}
				while( $ml2 < 0 ) {
					$ml2 += 1000;
					$s2--;
				}
				while( $s2 < 0 ) {
					$s2 += 60;
					$m2--;
				}
				while( $m2 < 0 ) {
					$m2 += 60;
					$h2--;
				}
			}
			print OUT "$h1:$m1:$s1,$ml1 --> $h2:$m2:$s2,$ml2\n";
		}
		else {
			print OUT $li."\n";
		}
	}
}
if( $type eq 'sub' ) {
	foreach $li ( <IN> ) {
		chomp($li);
		if( $li =~ /\{(\d+)\}\{(\d+)\}(.*)$/ ) {
			#print "Par 1 : $1, Par 2 : $2\n";
			if( $offset > $1 ) {
				print STDERR "Error, offset too large, max $1\n";
				exit 1;
			}
			$start = $1 - $offset;
			$end = $2 - $offset;
			print OUT "{$start}{$end}$3\n";
		}
	}
}
close ( IN );
close ( OUT );
