#!/usr/bin/perl -w

if($#ARGV!=0) {
  print "Usage: perl force_titles.pl <dir>\n";
  exit;
}
my $sourcedir=$ARGV[0];
my $filmname;
my $lang;

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 forced_timecode {
  my $film=$_[0];
  my $langcode=$_[1];
  my $in=$_[2];
  my $out=$_[3];
  my @timein=split(/:/,$in);
  my @timeout=split(/:/,$out);
  my $do_titles=0;
  my $crawl_voiceover=0;
  my $alien_dub=0;
# these subtitles are forced for all languages except english (unlocalized onscreen text, such as signs)
  if($film eq "SW" && $langcode ne "eng") {
    if($timein[0]==1 && $timein[1]==23 && $timein[2]<9) { return 1; }
  }
  if($timeout[0]>0) { return 0; }
  if($langcode eq "deu" || $langcode eq "eng" || $langcode eq "spa" || $langcode eq "fra" || $langcode eq "ita") {
    $do_titles=1;
  }
  if($langcode eq "jpn") {
    $do_titles=1;
    if($film eq "SW") {
      $alien_dub=1;
    }
  }
# the voiceover-style russian dubs don't need any forced subtitles at all,
# so we're assuming we're trying to accompany the non-voiceover dubs
  if($langcode eq "rus" && ($film ne "SW")) {
    $do_titles=1;
  }
  if($langcode eq "tha" && ($film eq "SW")) {
    $do_titles=1;
    $crawl_voiceover=1;
  }
  if($do_titles==0) { return 0; }
# any subtitles during the titles and crawl text are forced
  if($crawl_voiceover==0) {
    if($timeout[1]==0 || $timeout[1]==1) { return 1; }
  }
# subtitles for burnt-in subtitles are forced
  if($alien_dub==0) {
    if($film eq "SW") {
      if($timein[1]==49 && $timein[2]==4) { return 1; }
      if($timein[1]==49 && $timein[2]>=10 && $timein[2]<=11) { return 1; }
      if($timein[1]==49 && $timein[2]>=15 && $timeout[2]<=22) { return 1; }
      if($timein[1]==49 && $timein[2]==22) { return 1; }
      if($timein[1]==49 && $timein[2]==26) { return 1; }
      if($timein[1]==49 && $timein[2]==33) { return 1; }
      if($timein[1]==49 && $timein[2]==36) { return 1; }
      if($timein[1]==49 && $timein[2]>=38 && $timein[2]<=39) { return 1; }
      if($timein[1]==49 && $timein[2]==45) { return 1; }
      if($timein[1]==49 && $timein[2]==51) { return 1; }
      if($timein[1]==49 && $timein[2]==53) { return 1; }
    } else {
      if($film eq "ROTJ") {
        if($timein[1]==9 && $timein[2]==59) { return 1; }
        if($timein[1]==10 && $timein[2]==5) { return 1; }
        if($timein[1]==10 && $timein[2]>=13 && $timein[2]<=14) { return 1; }
        if($timein[1]==14 && $timein[2]==15) { return 1; }
        if($timein[1]==14 && $timein[2]==25) { return 1; }
        if($timein[1]==14 && $timein[2]==56) { return 1; }
        if($timein[1]==15 && $timein[2]>=39 && $timeout[2]<=47) { return 1; }
        if($timein[1]==19 && $timein[2]==58) { return 1; }
        if($timein[1]==20 && $timein[2]==2) { return 1; }
        if($timein[1]==20 && $timein[2]==7) { return 1; }
        if($timein[1]==20 && $timein[2]==17) { return 1; }
        if($timein[1]==20 && $timein[2]==27) { return 1; }
        if($timein[1]==20 && $timein[2]==39) { return 1; }
        if($timein[1]==23 && $timein[2]==14) { return 1; }
        if($timein[1]==23 && $timein[2]==20) { return 1; }
        if($timein[1]==23 && $timein[2]==24) { return 1; }
        if($timein[1]==23 && $timein[2]==29) { return 1; }
        if($timein[1]==23 && $timein[2]==43) { return 1; }
        if($timein[1]==24 && $timein[2]==5) { return 1; }
        if($timein[1]==24 && $timein[2]>=10 && $timein[2]<=11) { return 1; }
        if($timein[1]==27 && $timein[2]==35) { return 1; }
        if($timein[1]==27 && $timein[2]==39) { return 1; }
        if($timein[1]==29 && $timein[2]==57) { return 1; }
        if($timein[1]==31 && $timein[2]==24) { return 1; }
        if($timein[1]==31 && $timein[2]==51) { return 1; }
      }
    }
  }
  return 0;
}

FILELOOP: for $sourcefile (@filelist) {
  my $in_timecode;
  my $out_timecode;
  my $xml_forced;
  my $graphic=0;
  my $y=0;
  my $token1="";
  my $token2="";
  my @arr;
  my $forced=0;
  my $full=0;
  my $sdh=0;
  if($^O eq "MSWin32") {
    @arr=split(/\\/,$sourcefile);
  } else {
    @arr=split(/\//,$sourcefile);
  }
  my $fname=$arr[-1];
  print "Processing ".$fname."...\n";
  open(OLDXML, "<".$sourcefile);
  if($^O eq "MSWin32") {
    open(NEWXML, '>' . $sourcedir . '\\_' . $fname);
  } else {
    open(NEWXML, '>' . $sourcedir . '/_' . $fname);
  }
  @arr=split(/-/,$fname);
  $filmname=$arr[0];
  $lang=$arr[1];
  if (index($fname,"-titles") != -1) {
    $forced=1;
  }
  if (index($fname,"-full") != -1 || index($fname,"-nocrawl") != -1) {
    $full=1;
  }
  if (index($fname,"-sdh-") != -1) {
    $sdh=1;
  }
  foreach my $line (<OLDXML>) {
    if (index($line, '<Event ') != -1) {
      $xml_forced="False";
      if (index($line, "InTC=") != -1) {
        @arr=split(/InTC="/,$line);
        $in_timecode=$arr[1];
        @arr=split(/"/,$in_timecode);
        $in_timecode=$arr[0];
      }
      if (index($line, "OutTC=") != -1) {
        @arr=split(/OutTC="/,$line);
        $out_timecode=$arr[1];
        @arr=split(/"/,$out_timecode);
        $out_timecode=$arr[0];
      }
      if (index($line, "Forced=") != -1) {
        @arr=split(/Forced="/,$line);
        $xml_forced=$arr[1];
        @arr=split(/"/,$xml_forced);
        $xml_forced=$arr[0];
        if(!$sdh) {
          if($forced || ($full && forced_timecode($filmname,$lang,$in_timecode,$out_timecode))) {
            $token1="Forced=\"".$xml_forced;
            $token2="Forced=\"True";
            $line=~s/$token1/$token2/;
          }
        }
        print NEWXML $line;
      } else {
        print NEWXML $line;
      }
    } else {
      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. Forced subtitles in $sourcedir have been marked.\n";
