2012/09/03

ってか既にあったし

Loggia Logic: setTsTitle v1.32を公開しました

先日(8/15頃に言ってますが)perlでepgdatabonのprogram.txtを読んでリネームしてくれるスクリプトを作ったのですが、実はとっくにlogoguilloの作者の方が作っていたという・・・
何という車輪の再発明・・・


というわけでもう自分で作らなくてよくなった(wので、遺物を置いておきます。
batの中での使い方はこんな感じで
'perl tsprginfo.pl -name "-scren=%SCRename%" "%~f1.program.txt"'
SCRename.vbsのフルパスを%SCRename%部分にセットしておくと、そこのフォルダの.rp2とかを勝手に読み込んで変換後、リネーム用の名前を吐き出します。

面倒なので、その他使用例は自分で作ってるbatファイル中の一部抜粋を以下に。
if exist "%%~fF.program.txt" (
 echo 番組情報を取得できなかったため強制的にリネームを行います >>"%LOGFILE%"
 for /F "tokens=*" %%G in (
  'perl "%tsprginfo%" -name "-scren=%SCRename%" "%%~fF.program.txt"'
 ) do (
  set SOURCE=%%~dpF%%~G
  set SPATH=%%~dpF
  set SNAME=%%G
  )
 for /F "tokens=*" %%G in (
  'perl "%tsprginfo%" -tgdir "-scren=%SCRename%" "%%~fF.program.txt"'
 ) do (
  set TGDIR=%%~dpF# %%~G\
 )
)
とか、
for /F "tokens=*" %%F in ('perl %tsprginfo% -amode "%SOURCE%.ts.program.txt"') do (
 
 set AUDIO_MODE=%%F
 echo 音声モード:%%F >>"%LOGFILE%"
 if "%%F"=="11" (
  echo デュアルモノラル音声のため、音声デコード、分離、再エンコードを行います >>"%LOGFILE%"
  for %%G in ("%SOURCE%*_trim.aac") do (
  
   echo 音声デコード >>"%LOGFILE%"
   %faad% --downmix "%%~G" -o "%%~dpnG_dec.wav" >>"%LOGFILE%"
   
   echo 音声分離 >>"%LOGFILE%"
   %waveflt2% -mix 1.0 "%%~dpnG_dec.wav" "%%~dpnG_dec1.wav" >>"%LOGFILE%"
   %waveflt2% -mix 0.0 "%%~dpnG_dec.wav" "%%~dpnG_dec2.wav" >>"%LOGFILE%"
   
   echo 音声再エンコード >>"%LOGFILE%"
   %neroAacEnc% -br 64000 -2pass -if "%%~dpnG_dec1.wav" -of "%%~dpnG_1.m4a" >>"%LOGFILE%"
   %neroAacEnc% -br 64000 -2pass -if "%%~dpnG_dec2.wav" -of "%%~dpnG_2.m4a" >>"%LOGFILE%"
   
   
   del "%%~dpnG_dec.wav" "%%~dpnG_dec1.wav" "%%~dpnG_dec2.wav">>"%LOGFILE%"
  )
 )
)
とか
if "%AUDIO_MODE%"=="11" (
 for %%F in ("%SOURCE%*_1.m4a") do (
  echo mp4box import "%%F">>"%LOGFILE%"
  rem mp4boxはutf8を入力しないと日本語が化ける
  for /F "tokens=*" %%G in ('perl %tsprginfo% -aname1 -utf8 "%SOURCE%.ts.program.txt"') do (
   %mp4box% -noprog -add "%%F:lang=jpn:group=1:name=%%G:delay=%AudioDelay%" "%SOURCE%.mp4" >>"%LOGFILE%"
  )
 )
 for %%F in ("%SOURCE%*_2.m4a") do (
  echo mp4box import "%%F">>"%LOGFILE%"
  rem mp4boxはutf8を入力しないと日本語が化ける
  for /F "tokens=*" %%G in ('perl %tsprginfo% -aname2 -utf8 "%SOURCE%.ts.program.txt"') do (
   %mp4box% -noprog -add "%%F:lang=jpn:group=1:name=%%G:delay=%AudioDelay%:disable" "%SOURCE%.mp4" >>"%LOGFILE%"
  )
 )
)
とかです。


以下が作ったスクリプトになります。
↓はutf8で保存してください
tsprginfo.pl

use utf8;
use strict;

use Encode;
binmode STDOUT, ":encoding(cp932)";
binmode STDERR, ":encoding(cp932)";

#### 引数チェック
# ($ARGV[0] and (!$ARGV[1])) || die "Please input only 1 arguments"; #因数が1つでなければexit


#### 入出力ファイルチェック
# (-r $ARGV[0]) or die "can't open $ARGV[0]: $!\n";


### option check
my ($flg_utf8,$flg_vmode,$flg_amode,$flg_aname1,$flg_aname2,$flg_name,$flg_tgdir,$flg_scren);
my ($screnname);
#my ($exe_neroaacenc,$exe_waveflt2);
foreach (@ARGV){
 /^\-utf8$/i and $flg_utf8=1;
 /^\-vmode$/i and $flg_vmode=1;
 /^\-amode$/i and $flg_amode=1;
 /^\-aname1$/i and $flg_aname1=1;
 /^\-aname2$/i and $flg_aname2=1;
 /^\-name$/i and $flg_name=1;
 /^\-tgdir$/i and $flg_tgdir=1;
 /^\-scren\=(.*)$/i and $flg_scren=1 and ($screnname=$1)=~s/\"//g;

}

### MAIN
#### ファイル読み込み
foreach (@ARGV){
 if ((!/^\-/) and (&name_ext($_) == "txt")) {
  my @data=&READsjis($_);
  my $data_join=join '',@data;
 
  if ($flg_utf8){
   binmode STDOUT, ":raw:encoding(utf8)";#utf8出力
  }else{
   binmode STDOUT, ":raw:encoding(cp932)";#cp932
  }
   
  
  my %epginfo=&tsprginfo($data_join);  #.program.txtから情報を取得
  
  $flg_vmode and print "$epginfo{video}";  #映像情報を取得
  
  
  if ($flg_amode) {
   my $ch0=&audiomode($epginfo{audio},0);
   if ($ch0=~/ステレオ/){    #2/0
    print '2';
   }elsif ($ch0=~/デュアルモノ/) {  #1/0+1/0
    print '11'; #デュアルモノはCM(ステレオ)に入ると2ch→0ch→2chとか情報が変化するためAACデコード要
   }else{
    print '0';
   }
  }
  
  (($flg_aname1) and print &audiomode($epginfo{audio},1)); #ch1ストリーム用の名前を取得
  (($flg_aname2) and print &audiomode($epginfo{audio},2)); #ch2ストリーム用の名前を取得
  
  
  
  
  #タイトル
  (my $title =$epginfo{title}) =~s/\[(?:字|生|デ)\]//g;
  
  #話数検索
  my $number =($epginfo{title}=~/\s*\#(\d+)/) ?  sprintf("第%2d話",$1) : "";
  $title=~s/#(\d+)//;#話数部分削除
  #サブタイトル 1行目のみからカッコでくくられている部分を抽出 epgdataは半角にしてある
  #my $subtitle=($epginfo{info}=~/(?:\(|\[|「)(.*?)(?:\)|\]|」).*\n/) ?  "「$1」" : "";
  my $subtitle;
  if ($epginfo{title}=~/「.*」/){
   $subtitle="$&";
   $title=~s/「.*」//;#titleの該当部分削除
  }elsif ($epginfo{info}=~/((?:「|\(|【).*(?:」|\)|】))\s*?\n/m){  #($epginfo{info}=~/「.*」/){
   #$subtitle="$&";
   $subtitle="$1";
  }else{
   $subtitle="";
  }
  #日付と時間
  my $date =($epginfo{date}=~/(\d+)\/(\d+)\/(\d+)\(.\) (\d+)\:(\d+).(\d+)\:(\d+)/) ? "$1$2$3$4$5" : "";

  #放送局
  my ($service,$scsrvname,$scrp2name);
  if ($flg_scren){
   $scsrvname =&ParentDir($screnname).'\SCRename.srv';
   $scrp2name =&ParentDir($screnname).'\SCRename.rp2';
   $service =&SCRservice($epginfo{service},$scsrvname);
  } 
   
  #名前整列
  my $name="$title $number $subtitle \[$date\]\($service\)";
  
  
  #フォルダ名用タイトル
  my $tgdir;
  if ($epginfo{category}=~/スポーツ/){
   $tgdir='SPORTS';
  }else{
   $tgdir =$title;
  }
  
    
  (-e $scrp2name) and $name=&SCRrp2($name,$scrp2name); #rp2があればその内容で置換
  
  
  
  $name=~s/\s+/ /g; #重複する空白を削除
  $tgdir=~s/\s+/ /g; #重複する空白を削除
  $name=~s/\n/ /g; #改行を削除
  $tgdir=~s/\n/ /g; #改行を削除
  
  
  ### ファイル名に使えない文字を変換
  $name=~tr/\\\/\:\*\?\"\<\>\|/¥/:*?”<>|/;
  $tgdir=~tr/\\\/\:\*\?\"\<\>\|/¥/:*?”<>|/;
  $name=~s/\s$//;
  $tgdir=~s/\s$//;
  
  ### 出力
  if ($flg_name){
   print "$name";
  }
  if ($flg_tgdir){
   print "$tgdir";
  }
 }
}


sub audiomode{
 my $ret;
 $_[0]=~/((.*\n)(.*\n)?(.*\n)?(?:.*\n)*?)サンプリング/m;
 ($_[1]==0) and $ret=$2;
 ($_[1]==1) and $ret=$3;
 ($_[1]==2) and $ret=$4;
 chomp($ret); #\nを避けて正規表現指定するのが面倒だったので・・・いや、できるけど
 return $ret;
}

sub tsprginfo{
 #$_[0]=~/(.+)\n(.+)\n((?:.+\n)+?)\n((?:.+\n)+?)\n(詳細情報(?:.+\n)+?)\n\n(ジャンル(?:.+\n)+?)\n(映像(?:.+\n)+?)(音声(?:.+\n)+?)\n/m;
 
 (my $data=$_[0])=~tr/ !”#$%&’()*+,-./0-9:;<=>?@A-Z[¥]^_`a-z{|}/ -}/;#全角→半角変換 並び順を変更すると動かないので注意 何やってるか理解できん・・・元々スペースから並んでるだけ?
 #tr/A-Za-z0-9!”#$%&’()/.\x{3000}/A-Za-z0-9!\"\#$%&'\(\)\/\.\x{0020}/ とかの方がわかりやすいけど
 #$data=~/(.+)\n(.+)\n((?:.+\n)+?)\n((?:.+\n)+?)\n詳細情報\n((?:.+\n)+?)\n\nジャンル : \n((?:.+\n)+?)\n映像 \: ((?:.+\n)+?)音声 \: ((?:.+\n)+?)\n/m;
 #$data=~/(.+)\n(.+)\n((?:.+\n)+?)\n((?:.*\n)+?)詳細情報\n((?:.*\n)+?)ジャンル : \n((?:.+\n)+?)\n映像 \: ((?:.+\n)+?)音声 \: ((?:.+\n)+?)\n/;
 $data=~/(.+)\n(.+)\n(.+)\n\n((?:.*\n)+?)詳細情報\n((?:.*\n)+?)ジャンル : \n((?:.*\n)+?)\n映像 \: ((?:.*\n)+?)音声 \: ((?:.+\n)+?)\n/;
 
 my %ret_hash=(
  "date"  =>$1,
  "service" =>$2,
  "title"  =>$3,
  "info"  =>$4,
  "detail" =>$5,
  "category" =>$6,
  "video"  =>$7,
  "audio"  =>$8,
 );
 #print "$1,$2,$3,$4,$5,$6,$7,$8";
 chomp %ret_hash;
 return %ret_hash;
}

sub SCRservice{
 my $name=$_[0];
 my $scsrvname=$_[1];
 my @data=&READsjis($scsrvname); #SCrenameのsrvファイル読み込み
 foreach (@data){
  $_=~/^\:/ and next;
  my ($name1,$name2)=$_=~/^(.*)\,.*\,(.*)$/; #
  $name=~/$name1/i and return $name2;
 }
 return '';
}
  
sub SCRrp2{
 my $name=$_[0];
 my $scrp2name=$_[1];
 my @data=&READutf16($scrp2name); #SCrenameのrp2ファイル読み込み これはunicode(utf16)なので注意
# chomp(@data);
 foreach (@data){
  $_=~/^\:/ and next;
  
  #utf16(notepadやsakuraはunicodeと表記する)の場合はperlが\nだけではなく\rを別に判定する?ため終端は\r\n$になる?(chompで消せるかと思ったらだめだった)
  #が、.は\rまで含んでしまうためおかしなことになる
  #そのため\s=\n\r\f\tでその分を吸収
  my ($name1,$name2)=$_=~/^(.*?)\,(.*?)\s*$/;
  
  $name=~s/\Q$name1/\Q$name2/; #\Qはメタ文字を含んでてもリテラルとして扱うようにするオプション
  
 }
 return $name;
}

### ファイルからの入力

sub READsjis{
 (-r $_[0]) or die "can't open $_[0]: $!\n";

 open(INPUT,"<:encoding(cp932)","$_[0]"); #入力OPEN cp932だとNECエンコーディング分がmapされないので注意
 #my $data=join '',<INPUT>;
 my @data=<INPUT>;
 close(INPUT);
 return @data;
}
sub READutf16{
 (-r $_[0]) or die "can't open $_[0]: $!\n";

 open(INPUT,"<:encoding(utf16)","$_[0]"); #入力OPEN
 #my $data=join '',<INPUT>;
 my @data=<INPUT>;
 close(INPUT);
 return @data;
}

#拡張子名取得
sub name_ext{
 my $ext = substr($_,rindex($_,'.')+1,length($_));
 return $ext;
}

### ディレクトリパス取得
sub ParentDir{
 my ($ret)=$_[0]=~/(^.*)\\/;
 return $ret;
}



0 件のコメント:

コメントを投稿