#!/usr/bin/env perl
# vim:ts=3:sw=3:et:co=80
# Walter Doekes (2005)
### Welcome message
print "srtresync - An srt subtitle file time resync utility\n";
print "Public Domain, Walter Doekes, 2005\n";
print "\n";
print "Reads the srt supplied on the command line,\n";
print "reads a time found in the srt from stdin,\n";
print "reads a the time that should've been in the srt,\n";
print "(this for two values, so the time can be linearly stretched),\n";
print "and outputs a new srt.\n";
print "\n";
### Read arguments, open IO files
@ARGV >= 2 or die "usage: $0 [-f]";
open INPUT, "< $ARGV[0]" or
die "can't open ``$ARGV[0]'' for reading: $!";
$ARGV[2] eq '-f' or open OUTPUT, "< $ARGV[1]" and
die "output file ``$ARGV[1]'' exits: use -f to overwrite";
open OUTPUT, "> $ARGV[1]" or
die "can't open ``$ARGV[1]'' for writing: $!";
### Read data
print "Supply two times in the srt time format (xx:xx:xx,xxx) and " .
"their correct time:\n";
my %TIMES;
for(my $i = 0; $i < 2; ++$i) {
print "Input file time $i: ";
$TIMES{'file'.$i} = ;
$TIMES{'file'.$i} =~ /^((\d{2}:){2}\d{2},\d{3})\r?\n?$/ or
die "incorrect time format";
$TIMES{'file'.$i} = srt_to_time($1);
print "Time $i ($1) should be: ";
$TIMES{'correct'.$i} = ;
$TIMES{'correct'.$i} =~ /^((\d{2}:){2}\d{2},\d{3})\r?\n?$/ or
die "incorrect time format";
$TIMES{'correct'.$i} = srt_to_time($1);
$TIMES{'diff'.$i} = $TIMES{'correct'.$i} - $TIMES{'file'.$i}
}
### Functions
sub srt_to_time {
my $in = shift;
$in =~ /^(\d{2}):(\d{2}):(\d{2}),(\d{3})$/ or die $in;
return $1 * 3600 + $2 * 60 + $3 + $4 / 1000.0;
}
sub time_to_srt {
my $in = shift;
return sprintf("%02i:%02i:%02i,%03i", $in / 3600, ($in % 3600) / 60,
($in % 60), ($in - int($in)) * 1000);
}
### Calculate factors for file and correct
$TIMES{'file_factor'} = $TIMES{'file1'} - $TIMES{'file0'};
$TIMES{'correct_factor'} = $TIMES{'correct1'} - $TIMES{'correct0'};
# usage:
# $x = ($time - $TIMES{'file0'}) / $TIMES{'file_factor'}
# $out = ($x * $TIMES{'correct_factor'}) + $TIMES{'correct0'}
### Read the SRT and output correct values
for( ) {
if(/^(\d{2}:\d{2}:\d{2},\d{3}) --> (\d{2}:\d{2}:\d{2},\d{3})(\r?\n?)$/) {
$x0 = (srt_to_time($1) - $TIMES{'file0'}) / $TIMES{'file_factor'};
$x1 = (srt_to_time($2) - $TIMES{'file0'}) / $TIMES{'file_factor'};
$out0 = $x0 * $TIMES{'correct_factor'} + $TIMES{'correct0'};
$out1 = $x1 * $TIMES{'correct_factor'} + $TIMES{'correct0'};
print OUTPUT time_to_srt($out0) . " --> " . time_to_srt($out1) . $3;
} else {
print OUTPUT $_;
}
}