チェンジセット 83: trunk/install/perl/recwrap.pl

差分発生行の前後
無視リスト:
コミット日時:
2008/12/30 22:12:46 (15 年前)
コミッタ:
sorshi
ログメッセージ:

foltiaHD最初のリリース。
デジタル録画はFriio/Friio BS/CSのみに対応。
ivtvは1.0系使用になりました。

ファイル:

凡例:

変更無し
追加
削除
更新
コピー
移動
  • trunk/install/perl/recwrap.pl

    r70 r83  
    11#!/usr/bin/perl 
    2 #usage recwrap.pl ch length(sec) [bitrate(5)] [TID] [NO]  [PID] 
     2#usage recwrap.pl ch length(sec) [bitrate(5)] [TID] [NO] [PID] [stationid] [digitalflag] [digitalband] [digitalch]  
    33# 
    44# Anime recording system foltia 
     
    3939$tid  = $ARGV[3] ; 
    4040$countno  = $ARGV[4] ; 
    41 $pid  = $ARGV[5] ; 
     41$pid = $ARGV[5] ; 
     42$stationid = $ARGV[6] ; 
     43$usedigital = $ARGV[7] ; 
     44$digitalstationband = $ARGV[8] ; 
     45$digitalch= $ARGV[9] ; 
     46 
     47#DB初期化 
     48        my $data_source = sprintf("dbi:%s:dbname=%s;host=%s;port=%d", 
     49                $DBDriv,$DBName,$DBHost,$DBPort); 
     50         $dbh = DBI->connect($data_source,$DBUser,$DBPass) ||die $DBI::error;; 
     51 
     52 
     53if ($usedigital == 1){ 
     54        $extension = ".m2t";#TSの拡張子 
     55}else{ 
     56        $extension = ".m2p";#MPEG2の拡張子 
     57
    4258 
    4359$outputfile = `date  +%Y%m%d-%H%M --date "1 min "`; 
    4460chomp($outputfile); 
     61 
    4562if ($tid == 0){ 
    46                 $outputfilename = "0--".$outputfile."-".$recch.".m2p"
     63                $outputfilename = "0--".$outputfile."-".$recch.$extension
    4764                $mp4newstylefilename = "-0--".$outputfile."-".$recch; 
    4865}else{ 
    4966        if ($countno == 0){ 
    50                 $outputfilename = $tid ."--".$outputfile.".m2p"
     67                $outputfilename = $tid ."--".$outputfile.$extension
    5168                $mp4newstylefilename = "-" . $tid ."--".$outputfile; 
    5269        }else{ 
    53                 $outputfilename = $tid ."-".$countno."-".$outputfile.".m2p"
     70                $outputfilename = $tid ."-".$countno."-".$outputfile.$extension
    5471                $mp4newstylefilename = "-" . $tid ."-".$countno."-".$outputfile; 
    5572        } 
    5673} 
     74 
     75if ($usedigital == 1){ 
     76#デジタルなら 
     77&writelog("recwrap RECSTART DIGITAL $digitalstationband $digitalch $reclength $stationid 0 $outputfilename $tid $countno friio"); 
     78#録画 
     79$starttime = (`date +%s`); 
     80$oserr = system("$toolpath/perl/digitaltvrecording.pl $digitalstationband $digitalch $reclength $stationid 0 $outputfilename $tid $countno friio"); 
     81$oserr = $oserr / 256; 
     82 
     83if ($oserr == 1){ 
     84        &writelog("recwrap ABORT recfile exist. [$outputfilename] $digitalstationband $digitalch $reclength $stationid 0  $outputfilename $tid $countno"); 
     85        exit; 
     86}elsif ($oserr == 2){ 
     87        &writelog("recwrap ERR 2:friio busy;retry."); 
     88        &continuousrecordingcheck;#もうすぐ終わる番組をkill 
     89        sleep(2); 
     90        $oserr = system("$toolpath/perl/digitaltvrecording.pl $digitalstationband $digitalch $reclength $stationid N $outputfilename $tid $countno friio"); 
     91        $oserr = $oserr / 256; 
     92        if ($oserr == 2){ 
     93        &writelog("recwrap ERR 2:friio busy;Giving up digital recording."); 
     94        } 
     95}elsif ($oserr == 3){ 
     96&writelog("recwrap ABORT:ERR 3"); 
     97exit ; 
     98} 
     99}else{ 
    57100#リモコン操作 
    58101# $haveirdaunit = 1;リモコンつないでるかどうか確認 
     
    71114        exit; 
    72115        }#end if 
    73  
    74 &writelog("recwrap RECSTART $recch $reclength 0 $outputfilename $bitrate $tid $countno $pid"); 
     116# アナログ録画 
     117&writelog("recwrap RECSTART $recch $reclength 0 $outputfilename $bitrate $tid $countno $pid $usedigital $digitalstationband $digitalch"); 
     118 
    75119#録画 
    76120#system("$toolpath/perl/tvrecording.pl $recch $reclength 0 $outputfile $bitrate $tid $countno"); 
     
    83127        exit; 
    84128} 
     129 
     130}#endif #デジタル優先フラグ 
     131 
    85132#デバイスビジーで即死してないか検出 
    86133$now = (`date +%s`); 
    87134        if ($now < $starttime + 100){ #録画プロセス起動してから100秒以内に戻ってきてたら 
     135        $retrycounter == 0; 
    88136                while($now < $starttime + 100){ 
     137                        if($retrycounter >= 5){ 
     138                                &writelog("recwrap WARNING  Giving up recording."); 
     139                                last; 
     140                        } 
    89141                &writelog("recwrap retry recording $now $starttime"); 
     142                #アナログ録画 
    90143$starttime = (`date +%s`); 
     144if($outputfilename =~ /.m2t$/){ 
     145        $outputfilename =~ s/.m2t$/.m2p/; 
     146} 
    91147$oserr = system("$toolpath/perl/tvrecording.pl $recch $reclength N $outputfilename $bitrate $tid $countno"); 
    92148$now = (`date +%s`); 
     
    96152                                exit; 
    97153                        }# if 
     154                $retrycounter++; 
    98155                }# while 
    99156        } # if  
    100157 
    101  
    102158        &writelog("recwrap RECEND [$outputfilename] $recch $reclength 0 0 $bitrate $tid $countno $pid"); 
    103159 
    104 #DB初期化 
    105         my $data_source = sprintf("dbi:%s:dbname=%s;host=%s;port=%d", 
    106                 $DBDriv,$DBName,$DBHost,$DBPort); 
    107          $dbh = DBI->connect($data_source,$DBUser,$DBPass) ||die $DBI::error;; 
    108160 
    109161# m2pファイル名をPIDレコードに書き込み 
    110         $DBQuery =  "UPDATE  foltia_subtitle  SET  
    111         m2pfilename      = '$outputfilename'  
    112         WHERE pid =  '$pid' "; 
     162        $DBQuery =  "UPDATE foltia_subtitle SET m2pfilename = '$outputfilename' WHERE pid = '$pid' "; 
    113163         $sth = $dbh->prepare($DBQuery); 
    114164        $sth->execute(); 
    115 &writelog("recwrap UPDATEDB  $DBQuery"); 
     165&writelog("recwrap DEBUG UPDATEDB $DBQuery"); 
     166&changefilestatus($pid,$FILESTATUSRECEND); 
    116167 
    117168# m2pファイル名をPIDレコードに書き込み 
    118         $DBQuery =  "insert into foltia_m2pfiles values ('$outputfilename')"; 
     169        $DBQuery =  "insert into foltia_m2pfiles values ('$outputfilename')"; 
    119170         $sth = $dbh->prepare($DBQuery); 
    120171        $sth->execute(); 
    121 &writelog("recwrap UPDATEDB $DBQuery"); 
     172&writelog("recwrap DEBUG UPDATEDB $DBQuery"); 
    122173 
    123174# Starlight breaker向けキャプチャ画像作成 
    124175if (-e "$toolpath/perl/captureimagemaker.pl"){ 
    125176        &writelog("recwrap Call captureimagemaker $outputfilename"); 
     177&changefilestatus($pid,$FILESTATUSCAPTURE); 
    126178        system ("$toolpath/perl/captureimagemaker.pl $outputfilename"); 
    127 
    128  
    129  
    130  
    131 # PSP ------------------------------------------------------ 
    132 #PSPトラコン必要かどうか 
    133 $DBQuery =  "SELECT psp,aspect,title FROM  foltia_program WHERE tid = '$tid' "; 
     179&changefilestatus($pid,$FILESTATUSCAPEND); 
     180
     181 
     182 
     183 
     184# MPEG4 ------------------------------------------------------ 
     185#MPEG4トラコン必要かどうか 
     186$DBQuery =  "SELECT psp,aspect,title FROM foltia_program WHERE tid = '$tid' "; 
    134187         $sth = $dbh->prepare($DBQuery); 
    135188        $sth->execute(); 
    136189 @psptrcn= $sth->fetchrow_array; 
    137  if ($psptrcn[0]  == 1 ){#トラコン番組 
    138  
    139  
    140 #PSPムービーディレクトリがアルかどうか 
     190if ($psptrcn[0]  == 1 ){#トラコン番組 
     191&writelog("recwrap Launch ipodtranscode.pl"); 
     192exec ("$toolpath/perl/ipodtranscode.pl"); 
     193exit; 
     194
     195# ここから下は旧エンコード#2008/12/23  
     196# 新エンコードはDBを見て未完了MPEG2を順次トラコン処理、 
     197# 分散エンコードもきっとラクチンに対応可能 
     198# 新エンコードではXviD/M4VスタイルとPSPファイル名対応を廃止 
     199 
     200&changefilestatus($pid,80); 
     201#MPEG4ムービーディレクトリがあるかどうか 
    141202  
    142203#TIDが100以上の3桁の場合はそのまま 
    143204my $pspfilnamehd = ""; 
    144205 
    145         $pspfilnamehd = $tid; 
     206$pspfilnamehd = $tid; 
     207&makemp4dir($tid); 
    146208$pspdirname = "$tid.localized/"; 
    147209$pspdirname = $recfolderpath."/".$pspdirname; 
    148210 
    149211#なければ作る 
    150 unless (-e $pspdirname ){ 
    151       system("$toolpath/perl/mklocalizeddir.pl $tid"); 
    152       #&writelog("recwrap mkdir $pspdirname"); 
    153 
     212#unless (-e $pspdirname ){ 
     213#     system("$toolpath/perl/mklocalizeddir.pl $tid"); 
     214#     #&writelog("recwrap mkdir $pspdirname"); 
     215#
    154216$pspdirname = "$tid.localized/mp4/"; 
    155217$pspdirname = $recfolderpath."/".$pspdirname; 
    156218#なければ作る 
    157 unless (-e $pspdirname ){ 
    158       mkdir $pspdirname ,0777; 
    159       #&writelog("recwrap mkdir $pspdirname"); 
    160 
     219#unless (-e $pspdirname ){ 
     220#     mkdir $pspdirname ,0777; 
     221#     #&writelog("recwrap mkdir $pspdirname"); 
     222#
    161223 
    162224#ファイル名決定 
     
    350412 
    351413# MP4ファイル名をPIDレコードに書き込み 
    352         $DBQuery =  "UPDATE  foltia_subtitle  SET  
    353         PSPfilename      = '$mp4filename'  
    354         WHERE pid =  '$pid' "; 
     414        $DBQuery =  "UPDATE foltia_subtitle SET PSPfilename = '$mp4filename' WHERE pid = '$pid' "; 
    355415         $sth = $dbh->prepare($DBQuery); 
    356416        $sth->execute(); 
     
    358418 
    359419# MP4ファイル名をfoltia_mp4files挿入 
    360         $DBQuery = "insert into foltia_mp4files values ('$tid','$mp4filename') "; 
     420        $DBQuery = "insert into foltia_mp4files values ('$tid','$mp4filename') "; 
    361421         $sth = $dbh->prepare($DBQuery); 
    362422        $sth->execute(); 
    363423&writelog("recwrap UPDATEmp4DB  $DBQuery"); 
    364424 
     425&changefilestatus($pid,200); 
    365426}#PSPトラコンあり 
    366427 
    367  
    368  
    369  
     428sub continuousrecordingcheck(){ 
     429my $now = `date  +%s --date "2 min "`; 
     430&writelog("recwrap DEBUG continuousrecordingcheck() now $now"); 
     431my @processes =`ps ax | grep recfriio`; 
     432 
     433my $psline = ""; 
     434my @processline = ""; 
     435my $pid = ""; 
     436my @pid; 
     437my $sth; 
     438foreach (@processes){ 
     439        if (/friiodetect/) { 
     440                if (/^.[0-9]*\s/){ 
     441                        push(@pid, $&); 
     442                }#if 
     443        }#if 
     444}#foreach 
     445 
     446if (@pid > 0){ 
     447my @filenameparts; 
     448my $tid = ""; 
     449my $startdate = ""; 
     450my $starttime = ""; 
     451my $startdatetime = ""; 
     452my @recfile; 
     453my $endtime = ""; 
     454my $endtimeepoch = ""; 
     455foreach $pid (@pid){ 
     456#print "DEBUG  PID $pid\n"; 
     457&writelog("recwrap DEBUG continuousrecordingcheck() PID $pid"); 
     458 
     459        my @lsofoutput = `/usr/sbin/lsof -p $pid`; 
     460        my $filename = ""; 
     461        #print "recfolferpath $recfolderpath\n"; 
     462        foreach (@lsofoutput){ 
     463                if (/m2t/){ 
     464                @processline = split(/\s+/,$_); 
     465                $filename = $processline[8]; 
     466                #print "DEBUG  $_ \n"; 
     467                #print "DEBUG $processline[0]/$processline[1]/$processline[2]/$processline[3]/$processline[4]/$processline[5]/$processline[6]/$processline[7]/$processline[8] \n"; 
     468                $filename =~ s/$recfolderpath\///; 
     469                #print "DEBUG FILENAME $filename\n"; 
     470                        &writelog("recwrap DEBUG continuousrecordingcheck()  FILENAME $filename"); 
     471                # 1520-9-20081201-0230.m2t 
     472                @filenameparts = split(/-/,$filename); 
     473                $tid = $filenameparts[0]; 
     474                $startdate = $filenameparts[2]; 
     475                $starttime = $filenameparts[3]; 
     476                $startdatetime = $filenameparts[2].$filenameparts[3]; 
     477                #DBから録画中番組のデータ探す 
     478        $DBQuery =  " 
     479SELECT foltia_subtitle.tid,foltia_subtitle.countno,foltia_subtitle.subtitle,foltia_subtitle.startdatetime ,foltia_subtitle.enddatetime ,foltia_subtitle.lengthmin ,foltia_tvrecord.bitrate , foltia_subtitle.startoffset , foltia_subtitle.pid ,foltia_tvrecord.digital  
     480FROM foltia_subtitle ,foltia_tvrecord  
     481WHERE  
     482foltia_tvrecord.tid = foltia_subtitle.tid AND  
     483foltia_tvrecord.tid = $tid AND  
     484foltia_subtitle.startdatetime = $startdatetime AND  
     485foltia_tvrecord.digital = 1"; 
     486        &writelog("recwrap DEBUG continuousrecordingcheck() $DBQuery"); 
     487        $sth = $dbh->prepare($DBQuery); 
     488        &writelog("recwrap DEBUG continuousrecordingcheck() prepare"); 
     489        $sth->execute(); 
     490        &writelog("recwrap DEBUG continuousrecordingcheck() execute"); 
     491        @recfile = $sth->fetchrow_array; 
     492        &writelog("recwrap DEBUG continuousrecordingcheck() @recfile  $recfile[0] $recfile[1] $recfile[2] $recfile[3] $recfile[4] $recfile[5] $recfile[6] $recfile[7] $recfile[8] $recfile[9] "); 
     493        #終了時刻 
     494        $endtime = $recfile[4]; 
     495        $endtimeepoch = &foldate2epoch($endtime); 
     496        &writelog("recwrap DEBUG continuousrecordingcheck() $recfile[0] $recfile[1] $recfile[2] $recfile[3] $recfile[4] $recfile[5] endtimeepoch $endtimeepoch"); 
     497        if ($endtimeepoch < $now){#まもなく終わる番組なら 
     498                #kill 
     499                system("kill $pid"); 
     500                &writelog("recwrap recording process killed $pid/$endtimeepoch/$now"); 
     501        } 
     502                }#endif m2t 
     503        }#foreach lsofoutput 
     504}#foreach 
     505}else{ 
     506#print "DEBUG fecfriio NO PID\n"; 
     507&writelog("recwrap No recording process killed."); 
     508
     509}#endsub 
     510 
     511 
     512 
track feed