#!/usr/bin/perl -w

use POSIX;

if($#ARGV!=1) {
  print "Usage: perl reframe_subs.pl <percent_in> <dir>\n";
  exit;
}
my $percent_in=$ARGV[0];
my $sourcedir=$ARGV[1];
my $res_y=720;

if(!($percent_in=~/[\d.\+\-%]/)) {
  print "Error: Invalid percentage: $percent_in\n";
  exit;
}
$percent_in=~s/%//g;

if($^O eq "MSWin32") {
  @filelist=glob("\"$sourcedir\\\*.xml\"");
} else {
  @filelist=glob("\"$sourcedir/\*.xml\"");
}
my $listsize=@filelist;
if($listsize==0) {
  print "Error: No XML files found in $sourcedir\n";
  exit;
}

sub round {
  $_[0] > 0 ? int($_[0] + .5) : -int(-$_[0] + .5)
}

FILELOOP: for $sourcefile (@filelist) {
  my $graphic=0;
  my $y=0;
  my $max_y=0;
  my $min_y=$res_y;
  my $max_y2=0;
  my $min_y2=$res_y;
  my $height;
  my $token1="";
  my $token2="";
  my @arr;
  if($^O eq "MSWin32") {
    @arr=split(/\\/,$sourcefile);
  } else {
    @arr=split(/\//,$sourcefile);
  }
  my $fname=$arr[-1];
  print "Processing ".$fname."...\n";
  open(OLDXML, "<".$sourcefile);
  foreach my $line (<OLDXML>) {
    if(index($line, '<Graphic') != -1) {
      if (index($line, "Y=") != -1) {
        @arr=split(/Y="/,$line);
        $y=$arr[1];
        @arr=split(/"/,$y);
        $y=$arr[0];
        @arr=split(/Height="/,$line);
        $height=$arr[1];
        @arr=split(/"/,$height);
        $height=$arr[0];
        if($y>$res_y/2) {
          if($y+$height>$max_y) {
            $max_y=$y+$height;
          }
          if($y<$min_y2) {
            $min_y2=$y;
          }
        } else {
          if($y<$min_y) {
            $min_y=$y;
          }
          if($y+$height>$max_y2) {
            $max_y2=$y;
          }
        }
      }
    } else {
      if (index($line, "VideoFormat") != -1) {
        if (index($line, "1080p") != -1) {
          $res_y=1080;
        }
        if (index($line, "720p") != -1) {
          $res_y=720;
        }
        if (index($line, "480i") != -1) {
          $res_y=480;
        }
        if (index($line, "576i") != -1) {
          $res_y=576;
        }
      }
    }
  }
  close(OLDXML);
  my $shift_in=round(($percent_in*$res_y)/100);
# it should be impossible to shift subs entirely offscreen, or to cross the centerline
  if($min_y+$shift_in<0) {
    $shift_in=0-$min_y;
  }
  if($max_y-$shift_in>$res_y) {
    $shift_in=$max_y-$res_y;
  }
  if($max_y2+$shift_in>$res_y/2) {
    $shift_in=$res_y/2-$max_y2;
  }
  if($min_y2-$shift_in<$res_y/2) {
    $shift_in=$min_y2-$res_y/2;
  }
  open(OLDXML, "<".$sourcefile);
  if($^O eq "MSWin32") {
    open(NEWXML, '>' . $sourcedir . '\\_' . $fname);
  } else {
    open(NEWXML, '>' . $sourcedir . '/_' . $fname);
  }
  foreach my $line (<OLDXML>) {
    if (index($line, '<Graphic') != -1) {
      $graphic=1;
    }
    if($graphic==1) {
      if (index($line, "Y=") != -1) {
        @arr=split(/Y="/,$line);
        $y=$arr[1];
        @arr=split(/"/,$y);
        $y=$arr[0];
        $token1="Y=\"".$y;
        if($y>$res_y/2) {
          $token2="Y=\"".($y-$shift_in);
        } else {
          $token2="Y=\"".($y+$shift_in);
        }
        $line=~s/$token1/$token2/;
      }
    }
    print NEWXML $line;
  }
  close(OLDXML);
  close(NEWXML);
  if($^O eq "MSWin32") {
    rename($sourcedir . '\\_' . $fname,$sourcedir . '\\' . $fname);
  } else {
    rename($sourcedir . '/_' . $fname,$sourcedir . '/' . $fname);
  }
}

print "Process complete. Subtitles in $sourcedir have been reframed.\n";
