4 import java.io.UnsupportedEncodingException;
\r
5 import java.net.Authenticator;
\r
6 import java.net.URLEncoder;
\r
7 import java.util.ArrayList;
\r
8 import java.util.Hashtable;
\r
9 import java.util.regex.Matcher;
\r
10 import java.util.regex.Pattern;
\r
17 public class PlugIn_RecRD_S600 extends HDDRecorderUtils implements HDDRecorder,Cloneable {
\r
20 public PlugIn_RecRD_S600 clone() {
\r
21 return (PlugIn_RecRD_S600) super.clone();
\r
24 private static final String thisEncoding = "MS932";
\r
30 public String getRecorderId() { return "VARDIA RD-S600"; }
\r
32 public RecType getType() { return RecType.RECORDER; }
\r
35 private GetRDStatus gs = new GetRDStatus();
\r
36 private ChannelCode cc = new ChannelCode(getRecorderId());
\r
37 private String rsvedFile = "";
\r
39 private String errmsg = "";
\r
47 public ChannelCode getChCode() {
\r
55 public boolean ChangeChannel(String Channel) {
\r
57 if (Channel == null) {
\r
73 for (int i=0; i<3 && (ch = gs.getCurChannel(getIPAddr())) == null; i++) {
\r
74 CommonUtils.milSleep(500);
\r
77 errmsg = "レコーダへのアクセスに失敗しました(チャンネルリモコン)。";
\r
78 System.err.println(errmsg);
\r
82 byte[] ba = ch.getBytes();
\r
84 ch = ch.substring(1,5);
\r
86 if (ch.matches("^\\d.+")) {
\r
89 else if (ch.startsWith("BS")) {
\r
92 else if (ch.startsWith("CS")) {
\r
96 errmsg = "現在のチャンネルが認識できません("+ch+")。";
\r
97 System.err.println(errmsg);
\r
107 String cd = cc.getCH_WEB2CODE(Channel);
\r
108 String ch = cc.getCH_CODE2REC(cd);
\r
109 String typ = text2value(chtype, cd);
\r
111 errmsg = "鯛ナビに情報が同期されていないチャンネルです("+Channel+", "+ch+")。";
\r
112 System.err.println(errmsg);
\r
115 else if (typ.matches("^l[123]$")) {
\r
116 errmsg = "外部入力にアサインされているチャンネルには変更できません("+Channel+", "+ch+", "+typ+")。";
\r
117 System.err.println(errmsg);
\r
120 else if (typ.equals("uvd")) {
\r
123 else if (typ.equals("bsd")) {
\r
126 else if (typ.equals("csd")) {
\r
130 errmsg = "放送種別が識別できません。プログラム異常です("+Channel+", "+ch+")。";
\r
131 System.err.println(errmsg);
\r
136 Matcher ma = Pattern.compile("(\\d\\d\\d)").matcher(ch);
\r
138 chNo = ma.group(1);
\r
141 errmsg = "CH番号が取得できません("+Channel+", "+ch+")。";
\r
142 System.err.println(errmsg);
\r
152 Authenticator.setDefault(new MyAuthenticator(getUser(), getPasswd()));
\r
155 for (int i=0; i<4 && newBC != (cBC = (curBC+i)%4); i++) {
\r
156 // 地上アナログ(3)が選択できるのはRE(0x06)だけ
\r
157 if (enc != 0x06 && cBC == 3) {
\r
162 reqGET("http://"+getIPAddr()+":"+getPortNo()+"/remote/remote.htm?key=21", null);
\r
164 // 地上波→BS・BS→CSは切り替え完了までに時間がかかる
\r
165 CommonUtils.milSleep((cBC == 0 || cBC == 1)?(3000):(1000));
\r
168 reqGET("http://"+getIPAddr()+":"+getPortNo()+"/remote/remote.htm?key=25", null);
\r
169 CommonUtils.milSleep(1000);
\r
170 for (int i=0; i<3; i++) {
\r
171 reqGET("http://"+getIPAddr()+":"+getPortNo()+"/remote/remote.htm?key=0"+chNo.substring(i,i+1), null);
\r
172 CommonUtils.milSleep(200);
\r
174 reqGET("http://"+getIPAddr()+":"+getPortNo()+"/remote/remote.htm?key=44", null);
\r
180 * レコーダーから予約一覧を取得する
\r
183 public boolean GetRdReserve(boolean force)
\r
185 System.out.println("Run: GetRdReserve("+force+")");
\r
190 rsvedFile = "env/reserved."+getIPAddr()+"_"+getPortNo()+"_"+getRecorderId()+".xml";
\r
191 String vrateTFile = "env/videorate."+getIPAddr()+"_"+getPortNo()+"_"+getRecorderId()+".xml";
\r
192 String arateTFile = "env/audiorate."+getIPAddr()+"_"+getPortNo()+"_"+getRecorderId()+".xml";
\r
193 String folderTFile = "env/folders."+getIPAddr()+"_"+getPortNo()+"_"+getRecorderId()+".xml";
\r
194 String encoderTFile = "env/encoders."+getIPAddr()+"_"+getPortNo()+"_"+getRecorderId()+".xml";
\r
195 String dvdcompatTFile = "env/dvdcompat."+getIPAddr()+"_"+getPortNo()+"_"+getRecorderId()+".xml";
\r
196 String deviceTFile = "env/device."+getIPAddr()+"_"+getPortNo()+"_"+getRecorderId()+".xml";
\r
197 String xChapterTFile = "env/xchapter."+getIPAddr()+"_"+getPortNo()+"_"+getRecorderId()+".xml";
\r
198 String msChapterTFile = "env/mschapter."+getIPAddr()+"_"+getPortNo()+"_"+getRecorderId()+".xml";
\r
199 String mvChapterTFile = "env/mvchapter."+getIPAddr()+"_"+getPortNo()+"_"+getRecorderId()+".xml";
\r
200 String chValueTFile = "env/chvalue."+getIPAddr()+"_"+getPortNo()+"_"+getRecorderId()+".xml";
\r
201 String chTypeTFile = "env/chtype."+getIPAddr()+"_"+getPortNo()+"_"+getRecorderId()+".xml";
\r
203 File f = new File(rsvedFile);
\r
204 if ( force == false && f.exists()) {
\r
205 // キャッシュから読み出し(録画設定ほか)
\r
206 vrate = TVSload(vrateTFile);
\r
207 if ( vrate.size() > 0 ) {
\r
208 System.out.println("+video rate="+vrateTFile);
\r
210 arate = TVSload(arateTFile);
\r
211 if ( arate.size() > 0 ) {
\r
212 System.out.println("+audio rate="+arateTFile);
\r
214 folder = TVSload(folderTFile);
\r
215 if ( folder.size() > 0 ) {
\r
216 System.out.println("+folder="+folderTFile);
\r
218 encoder = TVSload(encoderTFile);
\r
219 if ( encoder.size() > 0 ) {
\r
220 System.out.println("+encoder="+encoderTFile);
\r
222 dvdcompat = TVSload(dvdcompatTFile);
\r
223 if ( dvdcompat.size() > 0 ) {
\r
224 System.out.println("+dvdcompat="+dvdcompatTFile);
\r
226 device = TVSload(deviceTFile);
\r
227 if ( device.size() > 0 ) {
\r
228 System.out.println("+device="+deviceTFile);
\r
231 xchapter = TVSload(xChapterTFile);
\r
232 if ( xchapter.size() > 0 ) {
\r
233 System.out.println("+xchapter="+xChapterTFile);
\r
235 mschapter = TVSload(msChapterTFile);
\r
236 if ( mschapter.size() > 0 ) {
\r
237 System.out.println("+mschapter="+msChapterTFile);
\r
239 mvchapter = TVSload(mvChapterTFile);
\r
240 if ( mvchapter.size() > 0 ) {
\r
241 System.out.println("+mvchapter="+mvChapterTFile);
\r
244 chvalue = TVSload(chValueTFile);
\r
245 if ( chvalue.size() > 0 ) {
\r
246 System.out.println("+chvalue="+chValueTFile);
\r
248 chtype = TVSload(chTypeTFile);
\r
249 if ( chtype.size() > 0 ) {
\r
250 System.out.println("+chtype="+chTypeTFile);
\r
253 // キャッシュから読み出し(予約一覧)
\r
254 setReserves(ReservesFromFile(rsvedFile));
\r
255 if (getReserves().size() > 0) {
\r
256 System.out.println("+read from="+rsvedFile);
\r
259 // なぜか設定ファイルが空になっている場合があるので、その際は再取得する
\r
260 if (vrate.size()>0 && arate.size()>0 &&
\r
261 folder.size()>0 && encoder.size()>0 && device.size()>0 &&
\r
262 xchapter.size()>0 && mschapter.size()>0 && mvchapter.size()>0) {
\r
266 //getReserves().removeAll(getReserves());
\r
270 Authenticator.setDefault(new MyAuthenticator(getUser(), getPasswd()));
\r
276 String response="";
\r
278 reportProgress("get reserved list(1/4).");
\r
279 String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/reserve/b_rsv.htm",null);
\r
283 if (response == null) {
\r
284 errmsg = "レコーダーが反応しません";
\r
288 ma = Pattern.compile("/reserve/(\\d+?)/reserve.htm").matcher(response);
\r
291 reportProgress("get reserved list(2/4).");
\r
292 String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/reserve/"+idx+"/reserve.htm",null);
\r
296 if (response == null) {
\r
297 errmsg = "レコーダーが反応しません";
\r
304 ma = Pattern.compile("RsvCnt\\s*=\\s*(\\d+?);").matcher(response);
\r
305 if ( ! ma.find()) {
\r
306 errmsg = "レコーダーからの情報取得に失敗しました(予約一覧)";
\r
309 RsvCnt = Integer.valueOf(ma.group(1));
\r
314 reportProgress("get reserved list(3/4).");
\r
315 reqGET("http://"+getIPAddr()+":"+getPortNo()+"/reserve/"+idx+"/b_rsvinfo.htm?0&"+(RsvCnt+1),null);
\r
318 reportProgress("get reserved list(4/4).");
\r
319 String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/reserve/"+idx+"/rsvinfo.htm",null);
\r
325 if ( ! res.matches("[\\s\\S]*var hdd_folder_text[\\s\\S]*")) {
\r
326 errmsg = "レコーダーからの情報取得に失敗しました(録画設定)";
\r
331 setSettingEtc(vrate,"vrate",1,res);
\r
332 TVSsave(vrate, vrateTFile);
\r
335 setSettingEtc(arate,"amode",0,res);
\r
336 TVSsave(arate, arateTFile);
\r
339 setSettingEtc(folder,"hdd_folder",1,res);
\r
340 TVSsave(folder, folderTFile);
\r
345 mb = Pattern.compile("var double_encode_flg = (\\d+?);").matcher(res);
\r
346 while (mb.find()) {
\r
347 Matcher mc = Pattern.compile("\\n\\s*?switch \\( double_encode_flg \\) \\{([\\s\\S]+?default:)").matcher(res);
\r
349 Matcher md = Pattern.compile("(case "+mb.group(1)+":[\\s\\S]+?break;)").matcher(mc.group(1));
\r
351 Matcher me = Pattern.compile("name=enc_type value=.\"(\\d+?).\"[\\s\\S]+?toru_(.+?)\\.gif").matcher(md.group(1));
\r
352 while (me.find()) {
\r
353 TextValueSet t = new TextValueSet();
\r
354 t.setText(me.group(2));
\r
355 t.setValue(me.group(1));
\r
362 TVSsave(encoder, encoderTFile);
\r
365 setSettingEtc(dvdcompat,"dvdr",0,res);
\r
366 TVSsave(dvdcompat, dvdcompatTFile);
\r
369 setSettingEtc(device,"media",0,res);
\r
370 TVSsave(device, deviceTFile);
\r
373 setSettingEtc(xchapter,"mutechapter",0,res);
\r
374 TVSsave(xchapter, xChapterTFile);
\r
376 setSettingEtc(mschapter,"magicchapter",0,res);
\r
377 TVSsave(mschapter, msChapterTFile);
\r
379 setSettingEtc(mvchapter,"cmchapter",0,res);
\r
380 TVSsave(mvchapter, mvChapterTFile);
\r
382 // (1-8)チャンネルコードバリュー
\r
385 for ( String typ : new String[] { "uvd","bsd","csd","uva","bsa","l1","l2","l3" } ) {
\r
386 String txtkey = typ+"_ch_text";
\r
387 String valkey = typ+"_ch_value";
\r
388 Matcher mc = Pattern.compile("var "+txtkey+"\\s*= new Array\\(([\\s\\S]+?)\\);").matcher(res);
\r
389 Matcher md = Pattern.compile("var "+valkey+"\\s*= new Array\\(([\\s\\S]+?)\\);").matcher(res);
\r
390 if ( mc.find() && md.find() ) {
\r
391 Matcher me = Pattern.compile("\"(.+?)\",?").matcher(mc.group(1));
\r
393 if ( typ.equals("uva") ) {
\r
394 mf = Pattern.compile("(\\d+),").matcher(md.group(1));
\r
397 mf = Pattern.compile("\"([^\"]+?)\",").matcher(md.group(1));
\r
399 while ( me.find() && mf.find() ) {
\r
400 TextValueSet t = new TextValueSet();
\r
401 t.setText(me.group(1));
\r
402 t.setValue(mf.group(1));
\r
405 TextValueSet x = new TextValueSet();
\r
406 x.setText(mf.group(1));
\r
412 TVSsave(chvalue, chValueTFile);
\r
413 TVSsave(chtype, chTypeTFile);
\r
420 ArrayList<ReserveList> newReserveList = new ArrayList<ReserveList>();
\r
422 ma = Pattern.compile("(c1\\[\\d+?\\]=[\\s\\S]+?\";)\\n").matcher(response);
\r
423 while ( ma.find() ) {
\r
425 ReserveList entry = new ReserveList();
\r
429 String[] d = new String[17];
\r
430 mb = Pattern.compile("c\\d+?\\[\\d+?\\]=\"(.*?)\";").matcher(ma.group(1));
\r
431 for (int i=0; i<d.length; i++) {
\r
433 d[i] = mb.group(1);
\r
435 //System.out.println(i+") "+d[i]);
\r
439 if ( ! d[1].equals("1")) {
\r
440 entry.setExec(false);
\r
444 String title = d[2];
\r
445 mb = Pattern.compile("<BR>").matcher(title); // 余計な改行の削除
\r
446 if (mb.find()) title = mb.replaceAll("");
\r
447 mb = Pattern.compile(""").matcher(title);
\r
448 if (mb.find()) title = mb.replaceAll("\"");
\r
449 mb = Pattern.compile("<").matcher(title);
\r
450 if (mb.find()) title = mb.replaceAll("<");
\r
451 mb = Pattern.compile(">").matcher(title);
\r
452 if (mb.find()) title = mb.replaceAll(">");
\r
453 mb = Pattern.compile(" ").matcher(title);
\r
454 if (mb.find()) title = mb.replaceAll(" ");
\r
457 entry.setRec_pattern(d[5]);
\r
458 entry.setRec_pattern_id(getRec_pattern_Id(entry.getRec_pattern()));
\r
459 mb = Pattern.compile("(\\d\\d):(\\d\\d).*?(\\d\\d):(\\d\\d)").matcher(d[6]+"-"+d[7]);
\r
461 entry.setAhh(mb.group(1));
\r
462 entry.setAmm(mb.group(2));
\r
463 entry.setZhh(mb.group(3));
\r
464 entry.setZmm(mb.group(4));
\r
466 entry.setRec_nextdate(CommonUtils.getNextDate(entry));
\r
467 //entry.setRec_nextdate(getNextDate(entry.getRec_pattern(), entry.getZhh()+":"+entry.getZmm()));
\r
468 entry.setRec_min(CommonUtils.getRecMin(entry.getAhh(), entry.getAmm(), entry.getZhh(), entry.getZmm()));
\r
469 getStartEndDateTime(entry);
\r
471 if (d[3].equals("18") || d[3].equals("10") || d[3].equals("9")) {
\r
472 entry.setTuner("TS2");
\r
474 else if (d[3].equals("17") || d[3].equals("12") || d[3].equals("11")) {
\r
475 entry.setTuner("TS1");
\r
477 else if (d[3].equals("16") || d[3].equals("7")) {
\r
478 entry.setTuner("RE");
\r
481 entry.setTuner("--");
\r
484 entry.setRec_mode(d[9]);
\r
485 entry.setTitle(title);
\r
486 entry.setTitlePop(TraceProgram.replacePop(title));
\r
487 entry.setCh_name(cc.getCH_REC2WEB(d[4]));
\r
488 entry.setChannel(d[4]);
\r
490 //entry.setRec_audio(_recstr2audio(d[10]));
\r
491 entry.setRec_audio(d[10]);
\r
493 //entry.rec_folder = data.get(); // 予約一覧からはとれない
\r
494 //entry.rec_genre = data.get(); // 予約一覧からはとれない
\r
496 // タイトル自動補完フラグなど本体からは取得できない情報を引き継ぐ
\r
497 copyAttributes(entry, getReserves());
\r
500 newReserveList.add(entry.clone());
\r
502 setReserves(newReserveList);
\r
506 System.out.println("---Reserved List Start---");
\r
507 for ( int i = 0; i<getReserves().size(); i++ ) {
\r
509 ReserveList e = getReserves().get(i);
\r
510 System.out.println(String.format("[%s] %s\t%s\t%s\t%s:%s\t%s:%s\t%sm\t%s\t%s\t%s\t%s",
\r
511 (i+1), e.getId(), e.getRec_pattern(), e.getRec_nextdate(), e.getAhh(), e.getAmm(), e.getZhh(), e.getZmm(), e.getRec_min(), e.getRec_mode(), e.getTitle(), e.getChannel(), e.getCh_name()));
\r
513 System.out.println("---Reserved List End---");
\r
516 ReservesToFile(getReserves(), rsvedFile);
\r
525 public boolean PostRdEntry(ReserveList r)
\r
528 if (cc.getCH_WEB2CODE(r.getCh_name()) == null) {
\r
529 errmsg = "【警告】Web番組表の放送局名「"+r.getCh_name()+"」をCHコードに変換できません。CHコード設定を修正してください。" ;
\r
530 System.out.println(errmsg);
\r
534 System.out.println("Run: PostRdEntry("+r.getTitle()+")");
\r
539 Authenticator.setDefault(new MyAuthenticator(getUser(), getPasswd()));
\r
547 reportProgress("get reserved list(1/7).");
\r
548 String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/reserve/b_rsv.htm",null);
\r
552 if ( response == null ) {
\r
553 errmsg = "レコーダーが反応しません。";
\r
557 ma = Pattern.compile("/reserve/(\\d+?)/reserve.htm").matcher(response);
\r
559 reportProgress("get reserved list(2/7).");
\r
561 String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/reserve/"+idx+"/reserve.htm",null);
\r
565 if ( response == null ) {
\r
566 errmsg = "レコーダーが反応しません。";
\r
573 ma = Pattern.compile("RsvCnt\\s*=\\s*(\\d+?);").matcher(response);
\r
575 RsvCnt = Integer.valueOf(ma.group(1));
\r
581 reportProgress("get program(3/7).");
\r
582 reqGET("http://"+getIPAddr()+":"+getPortNo()+"/reserve/"+idx+"/b_rsvinfo.htm?0&"+(RsvCnt+1),null);
\r
584 reportProgress("get program(4/7).");
\r
585 reqGET("http://"+getIPAddr()+":"+getPortNo()+"/reserve/"+idx+"/rsvinfo.htm",null);
\r
589 Hashtable<String, String> pdat = modPostdata(r);
\r
592 String pstr = joinPoststr(pdat);
\r
596 reportProgress("send request.(5/7)");
\r
597 String[] d = reqPOST("http://"+getIPAddr()+":"+getPortNo()+"/reserve/"+idx+"/entry.htm", pstr, null);
\r
603 ma = Pattern.compile("alert\\(msg\\)").matcher(response);
\r
605 Matcher mb = Pattern.compile("\\bmsg=\"([\\s\\S]+?)\";").matcher(response);
\r
607 errmsg = mb.group(1);
\r
608 System.out.printf("\n<<< Message from RD >>> \"%s\"\n\n", errmsg);
\r
609 Matcher mc = Pattern.compile("(予約時間が重複しています。|修正しました。)").matcher(errmsg);
\r
610 if ( ! mc.find() ) {
\r
622 // 予約ID番号を取得(キャッシュに存在しない番号が新番号)
\r
624 reportProgress("get identifier(6/7).");
\r
625 String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/reserve/b_rsv.htm",null);
\r
629 ma = Pattern.compile("/reserve/(\\d+?)/reserve.htm").matcher(response);
\r
632 reportProgress("get identifier(7/7).");
\r
633 String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/reserve/"+idx+"/reserve.htm",null);
\r
637 r.setId(getNewId(response));
\r
640 r.setRec_pattern_id(getRec_pattern_Id(r.getRec_pattern()));
\r
643 r.setRec_nextdate(CommonUtils.getNextDate(r));
\r
644 //r.setRec_nextdate(getNextDate(r.getRec_pattern(), r.getZhh()+":"+r.getZmm()));
\r
647 r.setRec_min(CommonUtils.getRecMin(r.getAhh(),r.getAmm(),r.getZhh(),r.getZmm()));
\r
650 getStartEndDateTime(r);
\r
653 getReserves().add(r);
\r
656 ReservesToFile(getReserves(), rsvedFile);
\r
658 System.out.printf("\n<<< Message from RD >>> \"%s\"\n\n", "正常に登録できました。");
\r
667 public boolean UpdateRdEntry(ReserveList o, ReserveList r) {
\r
669 if (cc.getCH_WEB2CODE(r.getCh_name()) == null) {
\r
670 errmsg = "【警告】Web番組表の放送局名「"+r.getCh_name()+"」をCHコードに変換できません。CHコード設定を修正してください。" ;
\r
671 System.out.println(errmsg);
\r
675 System.out.println("Run: UpdateRdEntry()");
\r
680 Authenticator.setDefault(new MyAuthenticator(getUser(), getPasswd()));
\r
689 reportProgress("get identifier(1/5).");
\r
690 String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/reserve/b_rsv.htm",null);
\r
694 ma = Pattern.compile("/reserve/(\\d+?)/reserve.htm").matcher(response);
\r
697 reportProgress("get identifier(2/5).");
\r
698 String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/reserve/"+idx+"/reserve.htm",null);
\r
702 ma = Pattern.compile("c1\\[(\\d+?)\\]=\""+r.getId()+"\";").matcher(response);
\r
704 lineno = Integer.valueOf(ma.group(1))+1;
\r
710 reportProgress("get program(3/5).");
\r
711 reqGET("http://"+getIPAddr()+":"+getPortNo()+"/reserve/"+idx+"/b_rsvinfo.htm?"+r.getId()+"&"+lineno,null);
\r
713 reportProgress("get program(4/5).");
\r
714 reqGET("http://"+getIPAddr()+":"+getPortNo()+"/reserve/"+idx+"/rsvinfo.htm",null);
\r
718 Hashtable<String, String> pdat = modPostdata(r);
\r
721 String pstr = joinPoststr(pdat);
\r
725 reportProgress("send request.(5/5)");
\r
726 String[] d = reqPOST("http://"+getIPAddr()+":"+getPortNo()+"/reserve/"+idx+"/entry.htm", pstr, null);
\r
732 ma = Pattern.compile("alert\\(msg\\)").matcher(response);
\r
734 Matcher mb = Pattern.compile("\\bmsg=\"([\\s\\S]+?)\";").matcher(response);
\r
736 errmsg = mb.group(1);
\r
737 System.out.printf("\n<<< Message from RD >>> \"%s\"\n\n", errmsg);
\r
738 Matcher mc = Pattern.compile("(予約時間が重複しています。|修正しました。)").matcher(errmsg);
\r
739 if ( ! mc.find() ) {
\r
745 System.out.printf("\n<<< Message from RD >>> \"%s\"\n\n", "正常に更新できました。");
\r
752 r.setRec_pattern_id(getRec_pattern_Id(r.getRec_pattern()));
\r
755 r.setRec_nextdate(CommonUtils.getNextDate(r));
\r
756 //r.setRec_nextdate(getNextDate(r.getRec_pattern(), r.getZhh()+":"+r.getZmm()));
\r
759 r.setRec_min(CommonUtils.getRecMin(r.getAhh(),r.getAmm(),r.getZhh(),r.getZmm()));
\r
762 getStartEndDateTime(r);
\r
765 getReserves().remove(o);
\r
766 getReserves().add(r);
\r
769 ReservesToFile(getReserves(), rsvedFile);
\r
778 public ReserveList RemoveRdEntry(String delid) {
\r
779 System.out.println("Run: RemoveRdEntry()");
\r
784 Authenticator.setDefault(new MyAuthenticator(getUser(), getPasswd()));
\r
787 ReserveList rx = null;
\r
788 for ( ReserveList reserve : getReserves() ) {
\r
789 if (reserve.getId().equals(delid)) {
\r
805 reportProgress("get identifier(1/5).");
\r
806 String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/reserve/b_rsv.htm",null);
\r
810 ma = Pattern.compile("/reserve/(\\d+?)/reserve.htm").matcher(response);
\r
813 reportProgress("get identifier(2/5).");
\r
814 String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/reserve/"+idx+"/reserve.htm",null);
\r
818 ma = Pattern.compile("c1\\[(\\d+?)\\]=\""+rx.getId()+"\";").matcher(response);
\r
820 lineno = Integer.valueOf(ma.group(1))+1;
\r
826 reportProgress("get program(3/5).");
\r
827 reqGET("http://"+getIPAddr()+":"+getPortNo()+"/reserve/"+idx+"/b_rsvinfo.htm?"+rx.getId()+"&"+lineno,null);
\r
829 reportProgress("get program(4/5).");
\r
830 reqGET("http://"+getIPAddr()+":"+getPortNo()+"/reserve/"+idx+"/rsvinfo.htm",null);
\r
833 reportProgress("send request.(5/5)");
\r
834 String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/reserve/"+idx+"/delete.htm", null);
\r
840 ma = Pattern.compile("alert\\(msg\\)").matcher(response);
\r
842 Matcher mb = Pattern.compile("\\bmsg=\"([\\s\\S]+?)\";").matcher(response);
\r
844 errmsg = mb.group(1);
\r
845 System.out.printf("\n<<< Message from RD >>> \"%s\"\n\n", errmsg);
\r
851 getReserves().remove(rx);
\r
854 ReservesToFile(getReserves(), rsvedFile);
\r
856 System.out.printf("\n<<< Message from RD >>> \"%s\"\n\n", "正常に削除できました。");
\r
864 public String getErrmsg() {
\r
865 return(errmsg.replaceAll("\\\\r\\\\n", ""));
\r
877 /* 個別コード-ここから最後まで */
\r
883 private String joinPoststr(Hashtable<String, String> pdat)
\r
921 "sport_ext_submit",
\r
922 "title_link_submit",
\r
927 for ( String key : pkeys ) {
\r
928 //$pdat{"$key"} =~ s/(\W)/'%'.unpack("H2", $1)/ego;
\r
929 if (pdat.get(key) == null) {
\r
933 pstr += key+"="+pdat.get(key)+"&";
\r
936 pstr = pstr.substring(0, pstr.length()-1);
\r
941 private Hashtable<String, String> modPostdata(ReserveList r) {
\r
943 Hashtable<String, String> newdat = new Hashtable<String, String>();
\r
948 newdat.put("bExec", (r.getExec())?("ON"):("OFF"));
\r
950 if (getDebug()) System.err.println("[DEBUG] Exec="+newdat.get("bExec"));
\r
954 if ( r.getAutocomplete() ) {
\r
955 newdat.put("title_name", "");
\r
956 newdat.put("detail", "");
\r
960 newdat.put("title_name", URLEncoder.encode(r.getTitle(),thisEncoding));
\r
961 } catch (UnsupportedEncodingException e1) {
\r
962 e1.printStackTrace();
\r
966 newdat.put("detail", URLEncoder.encode(r.getDetail().replaceAll("\n", Matcher.quoteReplacement("\r\n")), thisEncoding));
\r
967 } catch (UnsupportedEncodingException e1) {
\r
968 e1.printStackTrace();
\r
972 if (getDebug()) System.err.println("[DEBUG] title_name="+newdat.get("title_name"));
\r
976 newdat.put("folder", URLEncoder.encode(text2value(folder, r.getRec_folder()),thisEncoding));
\r
977 } catch (UnsupportedEncodingException e1) {
\r
978 e1.printStackTrace();
\r
981 if (getDebug()) System.err.println("[DEBUG] folder="+newdat.get("folder"));
\r
984 newdat.put("genre", _recstr2genre(r.getRec_genre()));
\r
986 if (getDebug()) System.err.println("[DEBUG] genre="+newdat.get("genre"));
\r
989 newdat.put("dvdr", text2value(dvdcompat, r.getRec_dvdcompat()));
\r
991 if (getDebug()) System.err.println("[DEBUG] dvdr="+newdat.get("dvdr"));
\r
994 String channel = cc.getCH_WEB2CODE(r.getCh_name());
\r
995 String ch_no = cc.getCH_CODE2REC(channel);
\r
996 if (chtype.size() > 0) {
\r
997 String typ = text2value(chtype, channel);
\r
998 if (typ.equals("uva")) {
\r
999 newdat.put("broadcast","0"); // 地上アナログ
\r
1001 else if (typ.equals("bsa")) {
\r
1002 newdat.put("broadcast","1"); // BSアナログ
\r
1004 else if (typ.equals("l1")) {
\r
1005 newdat.put("broadcast","2"); // 外部入力(L1)
\r
1007 else if (typ.equals("l2")) {
\r
1008 newdat.put("broadcast","3"); // 外部入力(L2)
\r
1010 else if (typ.equals("l3")) {
\r
1011 newdat.put("broadcast","4"); // 外部入力(L3)
\r
1013 else if (typ.equals("bsd")) {
\r
1014 newdat.put("broadcast","10"); // BSデジタル
\r
1016 else if (typ.equals("csd")) {
\r
1017 newdat.put("broadcast","11"); // 110度CSデジタル
\r
1019 else if (typ.equals("uvd")) {
\r
1020 newdat.put("broadcast","12"); // 地上デジタル
\r
1024 if (ch_no.startsWith("C")) {
\r
1025 newdat.put("broadcast","2"); // "C***"は外部入力(L1)
\r
1027 else if (ch_no.startsWith("SP")) {
\r
1028 newdat.put("broadcast","4"); // "SP***"は外部入力(L3)
\r
1031 newdat.put("broadcast","3"); // 未定義は全部外部入力(L2)
\r
1035 newdat.put("channel_list", channel);
\r
1036 newdat.put("channel_no", channel);
\r
1040 Matcher ma = Pattern.compile("^(.)(.)").matcher(ch_no);
\r
1042 if ((ma.group(1)+ma.group(2)).equals("CH")) {
\r
1043 newdat.put("broadcast","0"); // 地上アナログ
\r
1045 else if ((ma.group(1)+ma.group(2)).equals("BS")) {
\r
1046 newdat.put("broadcast","10"); // BSデジタル
\r
1048 else if ((ma.group(1)+ma.group(2)).equals("CS")) {
\r
1049 newdat.put("broadcast","11"); // 110度CSデジタル
\r
1051 else if (ma.group(1).equals("L")) {
\r
1052 newdat.put("broadcast", String.valueOf(Integer.valueOf(ma.group(2))+1)); // ライン入力ABC
\r
1055 newdat.put("broadcast","12"); // 地上デジタル
\r
1058 newdat.put("channel_list", channel);
\r
1059 newdat.put("channel_no", channel);
\r
1063 if (getDebug()) System.err.println("[DEBUG] channel_no="+newdat.get("channel_no"));
\r
1066 newdat.put("enc_type", text2value(encoder, r.getTuner()));
\r
1067 newdat.put("vrate", text2value(vrate, r.getRec_mode()));
\r
1069 if (getDebug()) System.err.println("[DEBUG] vrate="+newdat.get("vrate"));
\r
1072 newdat.put("amode", text2value(arate, r.getRec_audio()));
\r
1074 if (getDebug()) System.err.println("[DEBUG] arate="+newdat.get("arate"));
\r
1077 Matcher ma = Pattern.compile("^\\d").matcher(r.getRec_pattern());
\r
1079 newdat.put("maiyoubi_type","0");
\r
1080 newdat.put("date", r.getRec_pattern());
\r
1083 newdat.put("maiyoubi_type", "1");
\r
1085 for ( String s : RPTPTN ) {
\r
1086 if ( s.equals(r.getRec_pattern()) == true ) {
\r
1087 newdat.put("date", String.valueOf(i));
\r
1093 if (getDebug()) System.err.println("[DEBUG] date="+newdat.get("date"));
\r
1095 newdat.put("start_hour", r.getAhh());
\r
1096 newdat.put("start_minute", r.getAmm());
\r
1097 newdat.put("end_hour", r.getZhh());
\r
1098 newdat.put("end_minute", r.getZmm());
\r
1101 newdat.put("disc", text2value(device, r.getRec_device()));
\r
1104 newdat.put("bAutoChapter" , text2value(xchapter, r.getRec_xchapter()));
\r
1105 newdat.put("MagicChapter" , text2value(mschapter, r.getRec_mschapter()));
\r
1106 newdat.put("CM_Chapter" , text2value(mvchapter, r.getRec_mvchapter()));
\r
1109 newdat.put("start_form" , "");
\r
1110 newdat.put("rec_priority" , "150");
\r
1111 newdat.put("title_link" , "0");
\r
1112 newdat.put("auto_delete" , "0");
\r
1113 newdat.put("video_es" , "00");
\r
1114 newdat.put("audio_es" , "10");
\r
1115 newdat.put("edge_left" , "0"); // 録画のりしろ
\r
1116 //newdat.put("bAutoChapter" , "0");
\r
1117 //newdat.put("MagicChapter" , "0");
\r
1118 //newdat.put("CM_Chapter" , "0");
\r
1119 newdat.put("add_ch_text" , "");
\r
1120 newdat.put("add_ch_value" , "");
\r
1121 newdat.put("sport_ext_submit" , "undefined");
\r
1122 newdat.put("title_link_submit" , "undefined");
\r
1123 newdat.put("end_form" , "0");
\r
1125 catch ( Exception e ) {
\r
1126 e.printStackTrace();
\r
1132 private String _recstr2genre(String genre)
\r
1134 if (genre.equals(TVProgram.ProgGenre.MOVIE.toString())) {
\r
1137 else if (genre.equals(TVProgram.ProgGenre.MUSIC.toString())) {
\r
1140 else if (genre.equals(TVProgram.ProgGenre.DORAMA.toString())) {
\r
1143 else if (genre.equals(TVProgram.ProgGenre.ANIME.toString())) {
\r
1146 else if (genre.equals(TVProgram.ProgGenre.SPORTS.toString())) {
\r
1149 else if (genre.equals(TVProgram.ProgGenre.DOCUMENTARY.toString())) {
\r
1152 else if (genre.equals(TVProgram.ProgGenre.THEATER.toString())) {
\r
1155 else if (genre.equals(TVProgram.ProgGenre.HOBBY.toString())) {
\r
1158 else if (genre.equals(TVProgram.ProgGenre.VARIETY.toString())) {
\r
1166 private void setSettingEtc(ArrayList<TextValueSet> tvs, String key, int typ, String res) {
\r
1168 String valExpr = "(\\d+),?";
\r
1170 valExpr = "\"(.+?)\",?";
\r
1172 Matcher mc = Pattern.compile("var "+key+"_text\\s*= new Array\\(([\\s\\S]+?)\\);").matcher(res);
\r
1173 Matcher md = Pattern.compile("var "+key+"_value\\s*= new Array\\(([\\s\\S]+?)\\);").matcher(res);
\r
1174 if (mc.find() && md.find()) {
\r
1175 Matcher me = Pattern.compile("\"(.+?)\",?").matcher(mc.group(1));
\r
1176 Matcher mf = Pattern.compile(valExpr).matcher(md.group(1));
\r
1177 while (me.find() && mf.find()) {
\r
1178 TextValueSet t = new TextValueSet();
\r
1179 if (key.equals("vrate")) {
\r
1180 t.setText(me.group(1).replaceAll(" ", ""));
\r
1183 t.setText(me.group(1));
\r
1185 //t.setText(me.group(1));
\r
1186 t.setValue(mf.group(1));
\r