#!/usr/bin/env perl
#
# dcnote-smil :
#   SMIL ファイルを作成する.
#
# Copyright (C) GFD_Dennou_Club, 2001-.  All rights reserved.
#
#  ●Usage : dcreal-smil.pl (引数無し)
#
#  ●準備するファイル, 作成されるファイル
#
#      (講演者名)
#      |-- src/           [準備] 一次製作物置場.
#      |  |
#      |  |-- dcreal.conf        (必須) dcreal-conf.pl で作成される設定ファイル
#      |  |
#      |  |-- GFDseminar_2006_03_31_13_00.trt
#      |  |                      (必須) タイミングファイル
#      |  |
#      |  `-- GFDseminar_2006_03_31_13_00.rm
#      |                         (必須) RealMedia ファイル
#      |
#      `-- pub-real/      [作成] RealPlayer から閲覧する資料置場
#
#
#== History
#
#These entries is generated by CVS automatically.
#So don't add new information manually.
#(But please adjust old log format to latest log format manually,
#if format gap between them causes).
#
#$Log: dcreal-smil.pl,v $
#Revision 1.16  2006-04-11 11:28:34  morikawa
#* dcreal.conf の $RM_DURS を smil ファイルの clip-end 属性として
#  付加するよう修正.
#
#Revision 1.15  2006/04/07 04:53:12  morikawa
#* タイミングファイル内の区切り文字の前後の空白を許容.
#
#Revision 1.14  2006/04/06 08:07:48  morikawa
#* コメント部に書かれる解説に追記.
#* 履歴情報は CVS log を用いるように修正.
#* ディレクトリ生成時にメッセージを表示するよう修正.
#* pub-web, pub-real 以下の既存の html, smil ファイルを一度綺麗に
#  削除するよう修正.
#
#
#* 2006/04/04 森川靖大    : 設定ファイルの書式変更に伴う修正
#* 2006/03/31 森川靖大    : 上記修正を dcreal ツール群に統合
#* 2004/08/16 中神雄一    : 森羅万象学校用に改訂 (RealPix ファイルを作成しない)
#* 2003/09/06 杉山耕一朗
#* 2002/11/27 小高正嗣
#* 2001/04/10 杉山耕一朗
#
######################################################################
#Jcode.pm モジュールの読み込み
use Jcode; 
use File::Basename;

#文字コード設定
$target_code = "euc"; 

# 設定ファイルの読み込み
$CONF = 'dcreal.conf'; 
while (@ARGV) {
    last unless ($ARGV[0] =~ /^-/);
    $_ = shift;                           
    if (/^-c/) { $CONF = shift; next; }; 
    die "unknown option $_";
}
require "$CONF";

#画像用として使える広さを計算
#修正 2004/08/16 
if ($DOUBLE_MOVIE) {
    $WIDTH = $WIDTH_SLIDE + $WIDTH_PERSON; 
    if ($HEIGHT_SLIDE <= $HEIGHT_PERSON) {
	$HEIGHT = $HEIGHT_PERSON ;
    }else{
	$HEIGHT = $HEIGHT_SLIDE ;
    }
} else {
    $WIDTH = $WIDTH_SLIDE;
    $HEIGHT = $HEIGHT_SLIDE;
}

#格納先ディレクトリ定義
$RMDIR = "../$RMDIR"; 
$SMILDIR = "$RMDIR/smi";
$IMGDIR = "$RMDIR/img-real";

#ビデオ資源ディレクトリ作成 & リンク
#スライドビデオ、講演者ビデオの 2 つを用意 : 2004/08/17

unless (-d $RMDIR) {
    print "mkdir $RMDIR, 0777\n";
    mkdir $RMDIR, 0777  ;
    $i = 0; 
    while ($TRT_FILES[$i]) {
	if ($RM_FILES_SLIDE[$i] !~ /^$/){
	    print "cd $RMDIR; ln -s ../$SRC/$RM_FILES_SLIDE[$i] ./ \n";
	    system("cd $RMDIR; ln -s ../$SRC/$RM_FILES_SLIDE[$i] ./");
	}
	if ($RM_FILES_PERSON[$i] !~ /^$/){
	    print "cd $RMDIR; ln -s ../$SRC/$RM_FILES_PERSON[$i] ./ \n";
	    system("cd $RMDIR; ln -s ../$SRC/$RM_FILES_PERSON[$i] ./");
	}
	$i++;
    }
}

#SMIL ファイル格納ディレクトリ作成
unless (-d $SMILDIR) {
    print "mkdir $SMILDIR, 0777\n";
    mkdir $SMILDIR, 0777;
}

#タイミングファイルが存在するか確認
foreach $TRT (@TRT_FILES) {
    unless (-f $TRT) {
	print "  Error: Timing file \"$TRT\" is not found. \n"; 
	exit 1;
    }
}


#タイミングファイルのオープン, 必要な情報の抽出.
$i = 0;
$e = 0;
while (@TRT_FILES[$e]) {
    open (TIMING, "$TRT_FILES[$e]");
    $start[$e] = $i;
    while (<TIMING>) {
	chomp(@_);
	#開始時間, OHP 番号, OHP タイトルを別々に保存
	$_ =~ /^\s*([0-9]+:[0-9]+:[0-9]+),\s*(\d+)\s*:(.*)$/;
	$time[$i] = $1;
	$ohp_num[$i] = $2;
	($code, $nmatch) = getcode($3);
#	print "$code, $nmatch \n"; 
	$ohp_title[$i] = Jcode::convert($3, $target_code, $code); 
	$end[$e] = $i; 
#	print "$time[$i], $ohp_num[$i], $ohp_title[$i] \n"; 
	$i++;
    }
    $e++;
    close (TIMING);
}
#print "@start, @end \n" ;


# $SMILDIR 以下の 数字 3 桁.smi ファイルを削除
print "Cleaning in $SMILDIR/???.smi .. ";
opendir DIR, $SMILDIR or die "$dir:$!";
while (my $files_in_smildir = readdir DIR) {
    next if $files_in_smildir =~ /^\.{1,2}$/; # '.'や'..'も取れるので、スキップする
    if ($files_in_smildir =~ /^[0-9][0-9][0-9]\.smi$/) {
	unlink "$SMILDIR/$files_in_smildir";
    }
}
closedir DIR;
print " done.\n";

# SMIL ファイルの作成
$i = 0;
$skipped_num = 0;
$| = 1; # print 後にフラッシュ
$ret = "";
print "Making SMIL files in \n";
while ($ohp_num[$i]) {
    #ファイル名の準備
    $num = sprintf("%03d", $ohp_num[$i]);
    
    #既にファイルが存在しない場合のみ SMIL ファイルを作成
    $SMIL = "$SMILDIR/$num.smi";
    
    $e = 0;
    while ($end[$e]) {
	if ($i >= $start[$e]) {
	    $RM_SLIDE = "$RM_FILES_SLIDE[$e]";
	    $RM_PERSON = "$RM_FILES_PERSON[$e]";
	    $RM_CLIP_END = "$RM_DURS[$e]";
	}
	$e ++;
    }
    unless (-f $SMIL) {
	$ret = "\r" if ($i > 0);
	print "${ret} [$i/$#ohp_num] -> $SMIL";
	print "\n                        :\n" if ($i == 0);
	&print_smi($SMIL, $time[$i], $RM_SLIDE, $RM_PERSON, $RM_CLIP_END);
    } else {
	$skipped_num++;
    }
    $i++;
}
print "\n $skipped_num files are skipped for overlap. ";
print "   ... done.\n ";
$| = 0; # デフォルトのバッファリングへ戻す

#print "@ohp_num \n";


print basename($0) . ": Successful \n";

exit 0;

#=======================================================================


# SMIL ファイル作成用サブルーチン
sub print_smi{
    my($smifile, $time, $RM_SLIDE, $RM_PERSON, $clip_end_time) = @_;
    open (SMIL, ">$smifile");

    if ($clip_end_time =~ /^\s*[0-9]+:[0-9]+:[0-9]+\s*$/) {
	$clip_end = " clip-end=\"$clip_end_time\"";
    } else {
	$clip_end = "";
    }

    #ファイルへの書き出し. 所々変数を代入.
    if ($DOUBLE_MOVIE) {
	print SMIL <<EOT
<smil>
<head>
  <meta name="title" content="$TITLE_EN"/>
  <meta name="author" content="$NAME_EN"/>
  <meta name="copyright" content="$COPYRIGHT"/>
  <layout>
    <root-layout width="$WIDTH" height="$HEIGHT"/>
    <region id="slide" top="0" left="0" width="$WIDTH_SLIDE" height="$HEIGHT_SLIDE"/>
    <region id="person" top="0" left="$WIDTH_SLIDE" width="$WIDTH_PERSON" height="$HEIGHT_PERSON"/>
  </layout>
</head>
<body>
  <par>
     <seq>
       <video src="../$RM_SLIDE" region="slide" clip-begin="$time" $clip_end/>
     </seq>
     <seq>
       <video src="../$RM_PERSON" region="person" clip-begin="$time" $clip_end/>
     </seq>
  </par>
</body>
</smil>
EOT
;
    }else{
	print SMIL <<EOT
<smil>
<head>
  <meta name="title" content="$TITLE_EN"/>
  <meta name="author" content="$NAME_EN"/>
  <meta name="copyright" content="$COPYRIGHT"/>
  <layout>
    <root-layout width="$WIDTH" height="$HEIGHT"/>
    <region id="slide" top="0" left="0" width="$WIDTH" height="$HEIGHT"/>
  </layout>
</head>
<body>
  <par>
     <seq>
       <video src="../$RM_SLIDE" region="slide" clip-begin="$time" $clip_end/>
     </seq>
  </par>
</body>
</smil>
EOT
;
    }
    close (SMIL);
}
