root/trunk/install/perl/recwrap.pl

リビジョン 138, 10.3 kB (コミッタ: sorshi, コミット時期: 13 年 前)

radiko/らじる録音のリトライ機能追加

  • svn:executable 属性の設定値:
Line 
1 #!/usr/bin/perl
2 #usage recwrap.pl ch length(sec) [bitrate(5)] [TID] [NO] [PID] [stationid] [digitalflag] [digitalband] [digitalch]
3 #
4 # Anime recording system foltia
5 # http://www.dcc-jpl.com/soft/foltia/
6 #
7 #
8 #レコーディングラッパ
9 #atから呼び出され、tvrecordingを呼び出し録画
10 #そのあとMPEG4トラコンを呼び出す
11 #
12 # DCC-JPL Japan/foltia project
13 #
14
15 use DBI;
16 use DBD::Pg;
17 use DBD::SQLite;
18 use Schedule::At;
19 use Time::Local;
20 use Jcode;
21
22 $path = $0;
23 $path =~ s/recwrap.pl$//i;
24 if ($path ne "./"){
25 push( @INC, "$path");
26 }
27
28 require "foltialib.pl";
29 #引き数がアルか?
30 $recch = $ARGV[0] ;
31 if ($recch eq "" ){
32         #引き数なしで実行されたら、終了
33         print "usage recwrap.pl  ch length(sec) [bitrate(5)] [TID] [NO] [PID]\n";
34         exit;
35 }
36
37 $recch = $ARGV[0] ;
38 $reclength = $ARGV[1] ;
39 $bitrate  = $ARGV[2] ;
40 $tid  = $ARGV[3] ;
41 $countno  = $ARGV[4] ;
42 $pid = $ARGV[5] ;
43 $stationid = $ARGV[6] ;
44 $usedigital = $ARGV[7] ;
45 $digitalstationband = $ARGV[8] ;
46 $digitalch= $ARGV[9] ;
47
48 #DB初期化
49 $dbh = DBI->connect($DSN,$DBUser,$DBPass) ||die $DBI::error;;
50
51
52 if ($usedigital == 1){
53         $extension = ".m2t";#TSの拡張子
54 }else{
55         $extension = ".m2p";#MPEG2の拡張子
56 }
57 if ($recch == -2 ){ #ラジオ局
58         $extension = ".aac";#MPEG2の拡張子
59 }
60
61 $outputfile = strftime("%Y%m%d-%H%M", localtime(time + 60));
62 chomp($outputfile);
63
64 if ($tid == 0){
65         if ($usedigital == 1){
66                 $outputfilename = "0--".$outputfile."-".$digitalch.$extension;
67                 $mp4newstylefilename = "-0--".$outputfile."-".$digitalch;
68         }else{
69                 $outputfilename = "0--".$outputfile."-".$recch.$extension;
70                 $mp4newstylefilename = "-0--".$outputfile."-".$recch;
71         }
72 }else{
73         if ($countno == 0){
74                 $outputfilename = $tid ."--".$outputfile.$extension;
75                 $mp4newstylefilename = "-" . $tid ."--".$outputfile;
76         }else{
77                 $outputfilename = $tid ."-".$countno."-".$outputfile.$extension;
78                 $mp4newstylefilename = "-" . $tid ."-".$countno."-".$outputfile;
79         }
80 }
81
82 if ($recch == -2 ){ #ラジオ局
83 # stationIDからradiko識別子を取得
84 $sth = $dbh->prepare($stmt{'recwrap.8'});
85 $sth->execute($stationid);
86  @stationline= $sth->fetchrow_array;
87 $radikostationname = $stationline[3];
88 my $starttime = time();
89 my $endepochtime = time() + $reclength;
90 #録音
91 $oserr = system("$toolpath/perl/digitalradiorecording.pl $radikostationname $reclength $outputfilename");
92 $oserr = $oserr / 256;
93 &writelog("recwrap DEBUG radiko rec finished. $oserr");
94 #サーバビジーで即死してないか検出
95 $now = time();
96 if ($now < $endepochtime){ #終了予定より前に録音プロセスが戻ってきたなら
97 &writelog("recwrap radiko rec failed,will be retry. NOW:$now PlanedEnd:$endepochtime");
98
99 my $retrycounter = 0;
100 my $waitsecsbase = 10;
101 my $waitsec ;
102 my $waitsecsrand ;
103 my $recfilepath;
104         while($now < $endepochtime){
105                 if($retrycounter >= 15){
106                         &writelog("recwrap radiko rec failed,Giving up.Max retry counter over.");
107                         last;
108                 }
109         $waitsecsrand = int(rand($waitsecsbase/2));
110         $waitsec = $waitsecsbase + $waitsecsrand ;
111         &writelog("recwrap DEBUG radiko rec retry waiting. $waitsec ($waitsecsbase + $waitsecsrand)");
112         sleep($waitsec);
113         &writelog("recwrap DEBUG retry start.");
114         $recfilepath = "$recfolderpath"."/"."$outputfilename";
115         if (-e $recfilepath ){
116                 unlink("$recfilepath");
117                 &writelog("recwrap DEBUG delete $recfilepath");
118         }
119         #録音
120         $oserr = system("$toolpath/perl/digitalradiorecording.pl $radikostationname $reclength $outputfilename N");#起動waitなしで
121         $oserr = $oserr / 256;
122         &writelog("recwrap DEBUG radiko rec retry finished. $oserr");
123
124         $retrycounter++;
125         if ($waitsecsbase < 600 ){
126                 $waitsecsbase = $waitsecsbase * 2;
127         }
128         $now = time();
129         }# while
130 } # if
131
132
133 # aacファイル名をfoltia_subtitlePIDレコードに書き込み
134 $sth = $dbh->prepare($stmt{'recwrap.1'});
135 $sth->execute($outputfilename, $pid);
136 &writelog("recwrap DEBUG UPDATEDB $stmt{'recwrap.1'}");
137 &changefilestatus($pid,$FILESTATUSTRANSCODEMP4BOX);
138
139 # aacファイル名をfoltia_m2pfilesPIDレコードに書き込み
140 $sth = $dbh->prepare($stmt{'recwrap.2'});
141 $sth->execute($outputfilename);
142 &writelog("recwrap DEBUG UPDATEDB $stmt{'recwrap.2'}");
143
144
145 }else{#非ラジオ局なら
146
147 if ($usedigital == 1){
148 #デジタルなら
149 &writelog("recwrap RECSTART DIGITAL $digitalstationband $digitalch $reclength $stationid 0 $outputfilename $tid $countno friio");
150 #録画
151     $starttime = time();
152 $oserr = system("$toolpath/perl/digitaltvrecording.pl $digitalstationband $digitalch $reclength $stationid 0 $outputfilename $tid $countno friio");
153 $oserr = $oserr / 256;
154
155 if ($oserr == 1){
156         &writelog("recwrap ABORT recfile exist. [$outputfilename] $digitalstationband $digitalch $reclength $stationid 0  $outputfilename $tid $countno");
157         exit;
158 }elsif ($oserr == 2){
159         &writelog("recwrap ERR 2:Device busy;retry.");
160         &continuousrecordingcheck;#もうすぐ終わる番組をkill
161         sleep(2);
162         $oserr = system("$toolpath/perl/digitaltvrecording.pl $digitalstationband $digitalch $reclength $stationid N $outputfilename $tid $countno friio");
163         $oserr = $oserr / 256;
164         if ($oserr == 2){
165         &writelog("recwrap ERR 2:Device busy;Giving up digital recording.");
166                 if ($recunits > 0 ){
167                 }else{
168                         exit;
169                 }
170         }
171 }elsif ($oserr == 3){
172 &writelog("recwrap ABORT:ERR 3");
173 exit ;
174 }
175 }else{ # NOT $usedigital == 1
176         if ($recunits > 0 ){
177         #リモコン操作
178         # $haveirdaunit = 1;リモコンつないでるかどうか確認
179         if ($haveirdaunit == 1){
180         # 録画チャンネルが0なら
181                 if ($recch == 0){
182         # &つけて非同期でchangestbch.pl呼び出し
183                 &writelog("recwrap Call Change STB CH :$pid");
184                 system ("$toolpath/perl/changestbch.pl $pid &");
185                 }#end if
186         }#end if
187         
188         if($recch == -10){
189         #非受信局なら
190                 &writelog("recwrap Not recordable channel;exit:PID $pid");
191                 exit;
192                 }#end if
193         # アナログ録画
194         &writelog("recwrap RECSTART $recch $reclength 0 $outputfilename $bitrate $tid $countno $pid $usedigital $digitalstationband $digitalch");
195        
196         #録画
197         #system("$toolpath/perl/tvrecording.pl $recch $reclength 0 $outputfile $bitrate $tid $countno");
198                 $starttime = time();
199        
200         $oserr = system("$toolpath/perl/tvrecording.pl $recch $reclength 0 $outputfilename $bitrate $tid $countno");
201         $oserr = $oserr / 256;
202         if ($oserr == 1){
203                 &writelog("recwrap ABORT recfile exist. [$outputfilename] $recch $reclength 0 0 $bitrate $tid $countno $pid");
204                 exit;
205         }
206 #デバイスビジーで即死してないか検出
207 $now = time();
208         if ($now < $starttime + 100){ #録画プロセス起動してから100秒以内に戻ってきてたら
209     $retrycounter = 0;
210                 while($now < $starttime + 100){
211                         if($retrycounter >= 5){
212                                 &writelog("recwrap WARNING  Giving up recording.");
213                                 last;
214                         }
215                 &writelog("recwrap retry recording $now $starttime");
216                 #アナログ録画
217         $starttime = time();
218 if($outputfilename =~ /.m2t$/){
219         $outputfilename =~ s/.m2t$/.m2p/;
220 }
221 $oserr = system("$toolpath/perl/tvrecording.pl $recch $reclength N $outputfilename $bitrate $tid $countno");
222         $now = time();
223 $oserr = $oserr / 256;
224                         if ($oserr == 1){
225                                 &writelog("recwrap ABORT recfile exist. in resume process.[$outputfilename] $recch $reclength 0 0 $bitrate $tid $countno $pid");
226                                 exit;
227                         }# if
228                 $retrycounter++;
229                 }# while
230         } # if
231
232         &writelog("recwrap RECEND [$outputfilename] $recch $reclength 0 0 $bitrate $tid $countno $pid");
233
234         }#end if $recunits > 0
235 }#endif #デジタル優先フラグ
236
237
238 # m2pファイル名をPIDレコードに書き込み
239 $sth = $dbh->prepare($stmt{'recwrap.1'});
240 $sth->execute($outputfilename, $pid);
241 &writelog("recwrap DEBUG UPDATEDB $stmt{'recwrap.1'}");
242 &changefilestatus($pid,$FILESTATUSRECEND);
243
244 # m2pファイル名をPIDレコードに書き込み
245 $sth = $dbh->prepare($stmt{'recwrap.2'});
246 $sth->execute($outputfilename);
247 &writelog("recwrap DEBUG UPDATEDB $stmt{'recwrap.2'}");
248
249 # Starlight breaker向けキャプチャ画像作成
250 if (-e "$toolpath/perl/captureimagemaker.pl"){
251         &writelog("recwrap Call captureimagemaker $outputfilename");
252 &changefilestatus($pid,$FILESTATUSCAPTURE);
253         system ("$toolpath/perl/captureimagemaker.pl $outputfilename");
254 &changefilestatus($pid,$FILESTATUSCAPEND);
255 }
256 }#非ラジオ局
257
258 # MPEG4 ------------------------------------------------------
259 #MPEG4トラコン必要かどうか
260 $sth = $dbh->prepare($stmt{'recwrap.3'});
261 $sth->execute($tid);
262  @psptrcn= $sth->fetchrow_array;
263 if ($psptrcn[0]  == 1 ){#トラコン番組
264         &writelog("recwrap Launch ipodtranscode.pl");
265         exec ("$toolpath/perl/ipodtranscode.pl");
266         exit;
267 }#PSPトラコンあり
268
269 sub continuousrecordingcheck(){
270     my $now = time() + 60 * 2;
271 &writelog("recwrap DEBUG continuousrecordingcheck() now $now");
272 my @processes =`ps ax | grep -e recpt1 -e recfriio`; #foltiaBBS もうすぐ終了する番組のプロセスをkill 投稿日 2010年08月05日03時19分33秒 投稿者 Nis
273
274 my $psline = "";
275 my @processline = "";
276 my $pid = "";
277 my @pid;
278 my $sth;
279 foreach (@processes){
280         if (/recpt1|friiodetect/) {
281                 if (/^.[0-9]*\s/){
282                         push(@pid, $&);
283                 }#if
284         }#if
285 }#foreach
286
287 if (@pid > 0){
288 my @filenameparts;
289 my $tid = "";
290 my $startdate = "";
291 my $starttime = "";
292 my $startdatetime = "";
293 my @recfile;
294 my $endtime = "";
295 my $endtimeepoch = "";
296 foreach $pid (@pid){
297 #print "DEBUG  PID $pid\n";
298 &writelog("recwrap DEBUG continuousrecordingcheck() PID $pid");
299
300         my @lsofoutput = `/usr/sbin/lsof -p $pid`;
301         my $filename = "";
302         #print "recfolferpath $recfolderpath\n";
303         foreach (@lsofoutput){
304                 if (/m2t/){
305                 @processline = split(/\s+/,$_);
306                 $filename = $processline[8];
307                 $filename =~ s/$recfolderpath\///;
308                 &writelog("recwrap DEBUG continuousrecordingcheck()  FILENAME $filename");
309                 # 1520-9-20081201-0230.m2t
310                 @filenameparts = split(/-/,$filename);
311                 $tid = $filenameparts[0];
312                 $startdate = $filenameparts[2];
313                 $starttime = $filenameparts[3];
314                 @filenameparts = split(/\./,$starttime);
315                 $startdatetime = $startdate.$filenameparts[0];
316                 #DBから録画中番組のデータ探す
317                     &writelog("recwrap DEBUG continuousrecordingcheck() $stmt{'recwrap.7'}");
318                     $sth = $dbh->prepare($stmt{'recwrap.7'});
319         &writelog("recwrap DEBUG continuousrecordingcheck() prepare");
320                     $sth->execute($tid, $startdatetime);
321         &writelog("recwrap DEBUG continuousrecordingcheck() execute");
322         @recfile = $sth->fetchrow_array;
323         &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] ");
324         #終了時刻
325         $endtime = $recfile[4];
326         $endtimeepoch = &foldate2epoch($endtime);
327         &writelog("recwrap DEBUG continuousrecordingcheck() $recfile[0] $recfile[1] $recfile[2] $recfile[3] $recfile[4] $recfile[5] endtimeepoch $endtimeepoch");
328         if ($endtimeepoch < $now){#まもなく終わる番組なら
329                 #kill
330                 system("kill $pid");
331                 &writelog("recwrap recording process killed $pid/$endtimeepoch/$now");
332         }else{
333                 &writelog("recwrap No processes killed: $endtimeepoch/$now");
334         }
335                 }#endif m2t
336         }#foreach lsofoutput
337 }#foreach
338 }else{
339 #print "DEBUG fecfriio NO PID\n";
340 &writelog("recwrap No recording process killed.");
341 }
342 }#endsub
343
344
345
Note: リポジトリブラウザについてのヘルプは TracBrowser を参照してください。
track feed