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.Calendar;
\r
9 import java.util.GregorianCalendar;
\r
10 import java.util.HashMap;
\r
11 import java.util.regex.Matcher;
\r
12 import java.util.regex.Pattern;
\r
18 public class PlugIn_RecRD_EDCB extends HDDRecorderUtils implements HDDRecorder,Cloneable {
\r
21 public PlugIn_RecRD_EDCB clone() {
\r
22 return (PlugIn_RecRD_EDCB) super.clone();
\r
25 private static final String thisEncoding = "MS932";
\r
27 /*******************************************************************************
\r
29 ******************************************************************************/
\r
32 public String getRecorderId() { return "EpgDataCap_Bon"; }
\r
34 public RecType getType() { return RecType.RECORDER; }
\r
38 public boolean isAutoEncSelectEnabled() { return false; }
\r
41 public boolean isRepeatReserveSupported() { return false; }
\r
44 public boolean isPursuesEditable() { return true; }
\r
47 public boolean isAutocompleteSupported() { return false; }
\r
50 public boolean isChValueAvailable() { return true; }
\r
53 public boolean isChCodeNeeded() { return false; }
\r
55 /*******************************************************************************
\r
56 * 予約ダイアログなどのテキストのオーバーライド
\r
57 ******************************************************************************/
\r
60 public String getLabel_Audiorate() { return "予約方法"; }
\r
62 public String getLabel_Folder() { return "録画モード"; }
\r
64 public String getLabel_Device() { return "指定サービス対象"; }
\r
66 public String getLabel_XChapter() { return "録画開始(秒前)"; }
\r
68 public String getLabel_MsChapter() { return "録画終了(秒後)"; }
\r
70 public String getLabel_MvChapter() { return "復帰後再起動"; }
\r
72 public String getLabel_DVDCompat() { return "連続録画動作"; }
\r
74 public String getLabel_LVoice() { return "ぴったり録画"; }
\r
76 public String getLabel_Aspect() { return "録画後動作"; }
\r
78 public String getLabel_Videorate() { return "プリセット"; }
\r
80 public String getLabel_Autodel() { return "録画優先度"; }
\r
82 public String getLabel_BVperf() { return "ワンセグを別ファイルに出力"; }
\r
85 public String getChDatHelp() { return
\r
86 "「レコーダの放送局名」は、予約一覧取得が正常に完了していれば設定候補がコンボボックスで選択できるようになります。"+
\r
90 /*******************************************************************************
\r
92 ******************************************************************************/
\r
94 private static final String ITEM_REC_MODE_DISABLE = "無効";
\r
96 private static final String ITEM_JUST_ENABLE = "する";
\r
98 private static final String ITEM_REC_TYPE_EPG = "EPG";
\r
99 private static final String ITEM_REC_TYPE_PROG = "プログラム";
\r
101 private static final String ITEM_PRESETID_REG = "予約時";
\r
103 private static final String ITEM_MARGINE_DEFAULT = "デフォルト";
\r
105 private static final String ITEM_SERVMOCE_DEFAULT = "デフォルト";
\r
106 private static final String ITEM_SERVMOCE_SUBT = "+字幕";
\r
107 private static final String ITEM_SERVMOCE_CARO = "+カルーセル";
\r
108 private static final String ITEM_SERVMOCE_SUBTCARO = "+字幕&カルーセル";
\r
109 private static final String ITEM_SERVMOCE_NONE = "なし";
\r
111 private static final String ITEM_YES = "する";
\r
112 private static final String ITEM_NO = "しない";
\r
114 private static final String VALUE_REC_MODE_DISABLE = "5";
\r
116 private static final String VALUE_YES = "1";
\r
117 private static final String VALUE_NO = "0";
\r
119 private static final String VALUE_TRACE_DISABLE = "0";
\r
120 private static final String VALUE_TRACE_ENABLE = "1";
\r
122 private static final String VALUE_REC_TYPE_EPG = "EPG";
\r
123 private static final String VALUE_REC_TYPE_PROG = "PROGRAM";
\r
125 private static final String VALUE_PRESETID_REG = "65535";
\r
127 private static final String VALUE_MARGINE_DEFAULT = "FF";
\r
129 private static final String VALUE_SERVMOCE_DEFAULT = "FF";
\r
130 private static final String VALUE_SERVMOCE_SUBT = "0-";
\r
131 private static final String VALUE_SERVMOCE_CARO = "-0";
\r
132 private static final String VALUE_SERVMOCE_SUBTCARO = "00";
\r
133 private static final String VALUE_SERVMOCE_NONE = "--";
\r
135 private static final String RETVAL_KEY_RECFOLDERCOUNT = "recFolderCount";
\r
136 private static final String RETVAL_KEY_R_RECFOLDER = "RrecFolder";
\r
137 private static final String RETVAL_KEY_R_WRITEPLUGIN = "RwritePlugIn";
\r
138 private static final String RETVAL_KEY_R_RECNAMEPLUGIN = "RrecNamePlugIn";
\r
140 private static final String RETVAL_KEY_PARTIALFOLDERCOUNT = "partialFolderCount";
\r
141 private static final String RETVAL_KEY_P_RECFOLDER = "PrecFolder";
\r
142 private static final String RETVAL_KEY_P_WRITEPLUGIN = "PwritePlugIn";
\r
143 private static final String RETVAL_KEY_P_RECNAMEPLUGIN = "PrecNamePlugIn";
\r
145 private static final String TEXT_NANSHICHO_HEADER = "臨)";
\r
147 // EPG予約の確認範囲は前後4時間まで
\r
148 private static final long likersvrange = 4L*3600L*1000L;
\r
151 private static final int retryMax = 3;
\r
155 private final String MSGID = "["+getRecorderId()+"] ";
\r
156 private final String ERRID = "[ERROR]"+MSGID;
\r
157 private final String DBGID = "[DEBUG]"+MSGID;
\r
160 /*******************************************************************************
\r
162 ******************************************************************************/
\r
165 public ChannelCode getChCode() {
\r
169 private ChannelCode cc = new ChannelCode(getRecorderId());
\r
172 public String getErrmsg() {
\r
176 private String errmsg = "";
\r
178 /*******************************************************************************
\r
180 ******************************************************************************/
\r
182 private String rsvedFile = null;
\r
184 /*******************************************************************************
\r
185 * 素のTVSではコードが読めなくなるのでラッピングしてみる
\r
186 ******************************************************************************/
\r
188 private ArrayList<TextValueSet> getListPresetID() { return vrate; } // プリセット
\r
189 private String getTextPresetID(ReserveList r) { return r.getRec_mode(); }
\r
190 private void setTextPresetID(ReserveList r, String text) { r.setRec_mode(text); }
\r
192 private ArrayList<TextValueSet> getListRecMode() { return folder; } // 録画モード
\r
193 private String getTextRecMode(ReserveList r) { return r.getRec_folder(); }
\r
194 private void setTextRecMode(ReserveList r, String text) { r.setRec_folder(text); }
\r
196 private ArrayList<TextValueSet> getListPriority() { return autodel; } // 優先度
\r
197 private String getTextPriority(ReserveList r) { return r.getRec_autodel(); }
\r
198 private void setTextPriority(ReserveList r, String text) { r.setRec_autodel(text); }
\r
200 private ArrayList<TextValueSet> getListPittariFlag() { return lvoice; } // ぴったり(?)録画
\r
201 private String getTextPittariFlag(ReserveList r) { return r.getRec_lvoice(); }
\r
202 private void setTextPittariFlag(ReserveList r, String text) { r.setRec_lvoice(text); }
\r
204 private ArrayList<TextValueSet> getListSuspendMode() { return aspect; } // 録画後動作
\r
205 private String getTextSuspendMode(ReserveList r) { return r.getRec_aspect(); }
\r
206 private void setTextSuspendMode(ReserveList r, String text) { r.setRec_aspect(text); }
\r
208 private ArrayList<TextValueSet> getListRebootFlag() { return mvchapter; } // 復帰後再起動する
\r
209 private String getTextRebootFlag(ReserveList r) { return r.getRec_mvchapter(); }
\r
210 private void setTextRebootFlag(ReserveList r, String text) { r.setRec_mvchapter(text); }
\r
212 private ArrayList<TextValueSet> getListStartMargine() { return xchapter; } // 録画マージン(開始)
\r
213 private String getTextStartMargine(ReserveList r) { return r.getRec_xchapter(); }
\r
214 private void setTextStartMargine(ReserveList r, String text){ r.setRec_xchapter(text); }
\r
216 private ArrayList<TextValueSet> getListEndMargine() { return mschapter; } // 録画マージン(終了)
\r
217 private String getTextEndMargine(ReserveList r) { return r.getRec_mschapter(); }
\r
218 private void setTextEndMargine(ReserveList r, String text) { r.setRec_mschapter(text); }
\r
220 private ArrayList<TextValueSet> getListContinueRecFlag() { return dvdcompat; } // 連続録画動作
\r
221 private String getTextContinueRecFlag(ReserveList r) { return r.getRec_dvdcompat(); }
\r
222 private void setTextContinueRecFlag(ReserveList r, String text) { r.setRec_dvdcompat(text); }
\r
224 private ArrayList<TextValueSet> getListServiceMode() { return device; } // 指定サービス対象データ
\r
225 private String getTextServiceMode(ReserveList r) { return r.getRec_device(); }
\r
226 private void setTextServiceMode(ReserveList r, String text) { r.setRec_device(text); }
\r
228 private ArrayList<TextValueSet> getListTunerID() { return encoder; } // 使用チューナー強制指定
\r
229 private String getTextTunerID(ReserveList r) { return r.getTuner(); }
\r
230 private void setTextTunerID(ReserveList r, String text) { r.setTuner(text); }
\r
232 private ArrayList<TextValueSet> getListPartialRecFlag() { return bvperf; } // 別ファイルに同時出力する
\r
233 private String getTextPartialRecFlag(ReserveList r) { return r.getRec_bvperf(); }
\r
234 private void setTextPartialRecFlag(ReserveList r, String text) { r.setRec_bvperf(text); }
\r
236 private ArrayList<TextValueSet> getListRecType() { return arate; } // 予約方式 ★鯛ナビ独自
\r
237 private String getTextRecType(ReserveList r) { return r.getRec_audio(); }
\r
238 private void setTextRecType(ReserveList r, String text) { r.setRec_audio(text); }
\r
240 private ArrayList<TextValueSet> getListChValue() { return chvalue; } // CH番号 ★鯛ナビ独自
\r
241 //private String getTextChValue(ReserveList r) { return null; }
\r
243 private ArrayList<TextValueSet> getListChType() { return chtype; } // CH種別 ★鯛ナビ独自
\r
244 //private String getTextChType(ReserveList r) { return null; }
\r
246 private void setListPresetID(ArrayList<TextValueSet> tvs) { ArrayList<TextValueSet> o = getListPresetID(); o.clear(); o.addAll(tvs); }
\r
247 private void setListRecMode(ArrayList<TextValueSet> tvs) { ArrayList<TextValueSet> o = getListRecMode(); o.clear(); o.addAll(tvs); }
\r
248 private void setListPriority(ArrayList<TextValueSet> tvs) { ArrayList<TextValueSet> o = getListPriority(); o.clear(); o.addAll(tvs); }
\r
249 private void setListPittariFlag(ArrayList<TextValueSet> tvs) { ArrayList<TextValueSet> o = getListPittariFlag(); o.clear(); o.addAll(tvs); }
\r
250 private void setListSuspendMode(ArrayList<TextValueSet> tvs) { ArrayList<TextValueSet> o = getListSuspendMode(); o.clear(); o.addAll(tvs); }
\r
251 //private void setListRebootFlag(ArrayList<TextValueSet> tvs) { ArrayList<TextValueSet> o = getListRebootFlag(); o.clear(); o.addAll(tvs); }
\r
252 //private void setListStartMargine(ArrayList<TextValueSet> tvs) { ArrayList<TextValueSet> o = getListStartMargine(); o.clear(); o.addAll(tvs); }
\r
253 //private void setListEndMargine(ArrayList<TextValueSet> tvs) { ArrayList<TextValueSet> o = getListEndMargine(); o.clear(); o.addAll(tvs); }
\r
254 //private void setListContinueRecFlag(ArrayList<TextValueSet> tvs){ ArrayList<TextValueSet> o = getListContinueRecFlag(); o.clear(); o.addAll(tvs); }
\r
255 private void setListTunerID(ArrayList<TextValueSet> tvs) { ArrayList<TextValueSet> o = getListTunerID(); o.clear(); o.addAll(tvs); }
\r
256 //private void setListPartialRecFlag(ArrayList<TextValueSet> tvs) { ArrayList<TextValueSet> o = getListPartialRecFlag(); o.clear(); o.addAll(tvs); }
\r
257 //private void setListRecType(ArrayList<TextValueSet> tvs) { ArrayList<TextValueSet> o = getListRecType(); o.clear(); o.addAll(tvs); }
\r
258 private void setListChValue(ArrayList<TextValueSet> tvs) { ArrayList<TextValueSet> o = getListChValue(); o.clear(); o.addAll(tvs); }
\r
259 private void setListChType(ArrayList<TextValueSet> tvs) { ArrayList<TextValueSet> o = getListChType(); o.clear(); o.addAll(tvs); }
\r
261 /*******************************************************************************
\r
263 ******************************************************************************/
\r
265 public PlugIn_RecRD_EDCB() {
\r
266 setIPAddr("127.0.0.1(サンプル)");
\r
267 setPortNo("5510(サンプル)");
\r
268 setUser("IDとPASSはダミーで結構です");
\r
269 setPasswd("********");
\r
272 /*******************************************************************************
\r
274 ******************************************************************************/
\r
277 public boolean ChangeChannel(String Channel) {
\r
284 public void wakeup() {
\r
289 public void shutdown() {
\r
293 /*******************************************************************************
\r
295 ******************************************************************************/
\r
298 public boolean GetRdSettings(boolean force) {
\r
300 System.out.println("レコーダの各種設定情報を取得します.");
\r
307 replaceChNames(cc); // これは予約一覧取得からの場合は無駄な処理になるが、GetRdSettings単体呼び出しなら意味がある
\r
313 final String presetIdTFile = String.format("%s%srs_%s.%s.%s_%s.xml", "env", File.separator, getRecorderId(), "presetId", getIPAddr(), getPortNo());
\r
314 final String recModeTFile = String.format("%s%srs_%s.%s.%s_%s.xml", "env", File.separator, getRecorderId(), "recMode", getIPAddr(), getPortNo());
\r
315 final String prioTFile = String.format("%s%srs_%s.%s.%s_%s.xml", "env", File.separator, getRecorderId(), "priority", getIPAddr(), getPortNo());
\r
316 final String pittariTFile = String.format("%s%srs_%s.%s.%s_%s.xml", "env", File.separator, getRecorderId(), "pittari", getIPAddr(), getPortNo());
\r
317 final String suspModeTFile = String.format("%s%srs_%s.%s.%s_%s.xml", "env", File.separator, getRecorderId(), "suspendMode", getIPAddr(), getPortNo());
\r
318 final String tunerIdTFile = String.format("%s%srs_%s.%s.%s_%s.xml", "env", File.separator, getRecorderId(), "tunerId", getIPAddr(), getPortNo());
\r
319 final String chTypeTFile = String.format("%s%srs_%s.%s.%s_%s.xml", "env", File.separator, getRecorderId(), "chType", getIPAddr(), getPortNo());
\r
320 final String chValueTFile = String.format("%s%srs_%s.%s.%s_%s.xml", "env", File.separator, getRecorderId(), "chValue", getIPAddr(), getPortNo());
\r
322 // ハードコーディングな選択肢の面々
\r
323 setSettingNoYes(getListRebootFlag());
\r
324 setSettingRecMargin(getListStartMargine());
\r
325 setSettingRecMargin(getListEndMargine());
\r
326 setSettingServiceMode(getListServiceMode());
\r
327 setSettingNoYes(getListContinueRecFlag());
\r
328 setSettingNoYes(getListPartialRecFlag());
\r
329 setSettingRecType(getListRecType());
\r
331 if ( force == false ) {
\r
335 setListPresetID(TVSload(presetIdTFile));
\r
336 setListRecMode(TVSload(recModeTFile));
\r
337 setListPriority(TVSload(prioTFile));
\r
338 setListPittariFlag(TVSload(pittariTFile));
\r
339 setListSuspendMode(TVSload(suspModeTFile));
\r
340 setListTunerID(TVSload(tunerIdTFile));
\r
341 setListChValue(TVSload(chValueTFile));
\r
342 setListChType(TVSload(chTypeTFile));
\r
350 Authenticator.setDefault(new MyAuthenticator(getUser(), getPasswd()));
\r
354 reportProgress("録画設定を取得します.");
\r
355 String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/addprogres.html",null);
\r
356 //String hdr = d[0];
\r
359 if ( res == null ) {
\r
360 errmsg = "レコーダーが反応しません";
\r
364 ArrayList<TextValueSet> tvs = new ArrayList<TextValueSet>();
\r
365 ArrayList<TextValueSet> tvs2 = new ArrayList<TextValueSet>();
\r
368 setSettingEtc(tvs,"presetID",0,res);
\r
369 add2tvs(tvs, ITEM_PRESETID_REG, VALUE_PRESETID_REG); // なんつーか
\r
370 TVSsave(tvs, presetIdTFile);
\r
371 setListPresetID(tvs);
\r
374 setSettingEtc(tvs,"recMode",0,res);
\r
375 for ( TextValueSet o : tvs ) {
\r
376 if ( o.getText().equals(ITEM_REC_MODE_DISABLE) ) {
\r
381 TVSsave(tvs, recModeTFile);
\r
382 setListRecMode(tvs);
\r
385 setSettingEtc(tvs, "priority", 0, res);
\r
386 TVSsave(tvs, prioTFile);
\r
387 setListPriority(tvs);
\r
390 setSettingEtc(tvs,"pittariFlag",0,res);
\r
391 TVSsave(tvs, pittariTFile);
\r
392 setListPittariFlag(tvs);
\r
395 setSettingEtc(tvs,"suspendMode",0,res);
\r
396 TVSsave(tvs, suspModeTFile);
\r
397 setListSuspendMode(tvs);
\r
400 setSettingEtc(tvs,"tunerID",0,res);
\r
401 TVSsave(tvs, tunerIdTFile);
\r
402 setListTunerID(tvs);
\r
405 setSettingChCodeValue(tvs,tvs2,"serviceID",res);
\r
406 TVSsave(tvs, chValueTFile);
\r
407 TVSsave(tvs2, chTypeTFile);
\r
408 setListChValue(tvs);
\r
409 setListChType(tvs);
\r
413 // ちゃんと設定を取得できているよね?
\r
414 return (getListTunerID().size()>0 && getListChValue().size()>0 && getListPresetID().size()>0);
\r
418 * レコーダーから予約一覧を取得する
\r
422 public boolean GetRdReserve(boolean force)
\r
424 System.out.println("レコーダから予約一覧を取得します("+force+")");
\r
428 // 予約情報キャッシュ保存先ファイル名
\r
429 rsvedFile = String.format("%s%s%s.%s_%s_%s.xml", "env", File.separator, "reserved", getIPAddr(), getPortNo(), getRecorderId());
\r
432 Authenticator.setDefault(new MyAuthenticator(getUser(), getPasswd()));
\r
434 File f = new File(rsvedFile);
\r
435 if ( force == false && f.exists() ) {
\r
436 // キャッシュから読み出し(予約一覧)
\r
437 setReserves(ReservesFromFile(rsvedFile));
\r
438 replaceChNames(cc);
\r
439 if (getDebug()) ShowReserves();
\r
444 // レコーダから読み出し(予約一覧)
\r
445 ArrayList<ReserveList> newReserveList = new ArrayList<ReserveList>();
\r
446 if ( ! GetRdReservedList(newReserveList) ) {
\r
451 copyAttributesAllList(getReserves(), newReserveList);
\r
454 setReserves(newReserveList);
\r
455 ReservesToFile(getReserves(), rsvedFile); // キャッシュに保存
\r
457 // 録画済みフラグを立てる(録画結果一覧→予約一覧)
\r
466 * CHコードを置き換えよう(EDCBの場合はCODE2WEB)
\r
468 private void replaceChNames(ChannelCode cc) {
\r
469 for ( ReserveList r : getReserves() ) {
\r
470 r.setCh_name(cc.getCH_CODE2WEB(r.getChannel()));
\r
475 * @see #GetRdSettings(boolean)
\r
478 public boolean GetRdRecorded(boolean force) {
\r
481 Authenticator.setDefault(new MyAuthenticator(getUser(), getPasswd()));
\r
483 System.out.println("レコーダから録画結果一覧を取得します("+force+"): "+getRecorderId()+"("+getIPAddr()+":"+getPortNo()+")");
\r
485 String recedFile = String.format("%s%s%s.%s_%s_%s.xml", "env", File.separator, "recorded", getIPAddr(), getPortNo(), getRecorderId());
\r
488 ArrayList<RecordedInfo> newRecordedList = RecordedFromFile(recedFile);
\r
490 File f = new File(recedFile);
\r
491 if ( ! force && f.exists() ) {
\r
493 // キャッシュから読み出し(録画結果一覧)
\r
494 setRecorded(newRecordedList);
\r
495 if (getDebug()) ShowRecorded();
\r
497 // 録画済みフラグを立てる(録画結果一覧→予約一覧)
\r
503 if ( ! GetRdRecordedList(newRecordedList) ) {
\r
506 if ( ! GetRdRecordedListDetailAll(newRecordedList) ) {
\r
509 setRecorded(newRecordedList); // 置き換え
\r
510 RecordedToFile(getRecorded(), recedFile); // キャッシュに保存
\r
512 // 録画済みフラグを立てる(録画結果一覧→予約一覧)
\r
520 private void ShowReserves() {
\r
521 System.out.println("---Reserved List Start---");
\r
522 for ( int i = 0; i<getReserves().size(); i++ ) {
\r
524 ReserveList e = getReserves().get(i);
\r
525 System.out.println(String.format("[%s] %s\t%s\t%s %s:%s-%s:%s\t%sm\t%s\t%s\t%s(%s)\t%s\t%s\t%s",
\r
526 (i+1), e.getId(), e.getRec_pattern(), e.getRec_nextdate(), e.getAhh(), e.getAmm(), e.getZhh(), e.getZmm(), e.getRec_min(), e.getContentId(), getTextRecType(e), e.getTitle(), e.getTitlePop(), e.getChannel(), e.getCh_name(), e.getRecorded()));
\r
528 System.out.println("---Reserved List End---");
\r
530 private void ShowRecorded() {
\r
531 System.out.println("---Recorded List Start---");
\r
532 for ( int i = 0; i<getRecorded().size(); i++ ) {
\r
534 RecordedInfo e = getRecorded().get(i);
\r
535 System.out.println(String.format("[%s] %s %s\t%s:%s-%s:%s\t%s(%s)\t%s",
\r
536 (i+1), e.getId(), e.getDate(), e.getAhh(), e.getAmm(), e.getZhh(), e.getZmm(), e.getTitle(), e.getCh_name(), e.getResult()));
\r
538 System.out.println("---Recorded List End---");
\r
541 private boolean GetRdReservedList(ArrayList<ReserveList> newReserveList) {
\r
544 String response="";
\r
546 reportProgress("予約一覧を取得します.");
\r
547 String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/api/EnumReserveInfo",null,"utf8");
\r
550 if (response == null) {
\r
551 errmsg = "レコーダーが反応しません";
\r
556 Matcher ma = Pattern.compile("<reserveinfo>(.+?)</reserveinfo>", Pattern.DOTALL).matcher(response);
\r
557 while ( ma.find() ) {
\r
559 String title = null;
\r
560 GregorianCalendar cal = null;
\r
563 Integer length = null;
\r
564 Integer onid = null;
\r
565 Integer tsid = null;
\r
566 Integer sid = null;
\r
567 Integer evid = null; // 65536:プログラム予約
\r
568 String comment = null;
\r
569 Integer overlapMode = null;
\r
571 Integer recMode = null;
\r
572 Integer priority = null;
\r
573 Integer tuijyuuFlag = null;
\r
574 Integer serviceMode = null;
\r
575 Integer pittariFlag = null;
\r
576 Integer suspendMode = null;
\r
577 Integer rebootFlag = null;
\r
578 Integer useMargineFlag = null;
\r
579 Integer startMargine = null;
\r
580 Integer endMargine = null;
\r
581 Integer continueRecFlag = null;
\r
582 Integer partialRecFlag = null;
\r
583 Integer tunerID = null;
\r
585 String batFilePath = null;
\r
587 int recFolderCount = 0;
\r
588 ArrayList<String> rRecFolder = new ArrayList<String>();
\r
589 ArrayList<String> rWritePlugIn = new ArrayList<String>();
\r
590 ArrayList<String> rRecNamePlugIn = new ArrayList<String>();
\r
592 int partialFolderCount = 0;
\r
593 ArrayList<String> pRecFolder = new ArrayList<String>();
\r
594 ArrayList<String> pWritePlugIn = new ArrayList<String>();
\r
595 ArrayList<String> pRecNamePlugIn = new ArrayList<String>();
\r
597 ArrayList<String> recFileNameList = new ArrayList<String>();
\r
599 Matcher mb = Pattern.compile("<(.+?)>(.+?)</\\1>", Pattern.DOTALL).matcher(ma.group(1));
\r
600 while ( mb.find() ) {
\r
606 if ( mb.group(1).equals("ID") ) {
\r
609 else if ( mb.group(1).equals("title") ) {
\r
610 title = CommonUtils.unEscape(mb.group(2));
\r
612 else if ( mb.group(1).equals("startDate") ) {
\r
613 Matcher mc = Pattern.compile("^(\\d+)/(\\d+)/(\\d+)").matcher(mb.group(2));
\r
615 cal = CommonUtils.getCalendar(String.format("%04d/%02d/%02d",Integer.valueOf(mc.group(1)),Integer.valueOf(mc.group(2)),Integer.valueOf(mc.group(3))));
\r
618 else if ( mb.group(1).equals("startTime") ) {
\r
619 Matcher mc = Pattern.compile("^(\\d+):(\\d+)").matcher(mb.group(2));
\r
621 hh = Integer.valueOf(mc.group(1));
\r
622 mm = Integer.valueOf(mc.group(2));
\r
625 else if ( mb.group(1).equals("duration") ) {
\r
626 length = Integer.valueOf(mb.group(2))/60;
\r
628 else if ( mb.group(1).equals("ONID") ) {
\r
629 onid = Integer.valueOf(mb.group(2));
\r
631 else if ( mb.group(1).equals("TSID") ) {
\r
632 tsid = Integer.valueOf(mb.group(2));
\r
634 else if ( mb.group(1).equals("SID") ) {
\r
635 sid = Integer.valueOf(mb.group(2));
\r
637 else if ( mb.group(1).equals("eventID") ) {
\r
638 evid = Integer.valueOf(mb.group(2));
\r
640 else if ( mb.group(1).equals("comment") ) {
\r
641 comment = CommonUtils.unEscape(mb.group(2));
\r
643 else if ( mb.group(1).equals("overlapMode") ) {
\r
644 overlapMode = Integer.valueOf(mb.group(2));
\r
646 else if ( mb.group(1).equals("recsetting") ) {
\r
648 Matcher mc = Pattern.compile("<(.+?)>(.+?)</\\1>", Pattern.DOTALL).matcher(mb.group(2));
\r
649 while ( mc.find() ) {
\r
650 if ( mc.group(1).equals("recMode") ) {
\r
651 recMode = Integer.valueOf(mc.group(2));
\r
653 else if ( mc.group(1).equals("priority") ) {
\r
654 priority = Integer.valueOf(mc.group(2));
\r
656 else if ( mc.group(1).equals("tuijyuuFlag") ) {
\r
657 tuijyuuFlag = Integer.valueOf(mc.group(2));
\r
659 else if ( mc.group(1).equals("serviceMode") ) {
\r
660 serviceMode = Integer.valueOf(mc.group(2));
\r
662 else if ( mc.group(1).equals("pittariFlag") ) {
\r
663 pittariFlag = Integer.valueOf(mc.group(2));
\r
665 else if ( mc.group(1).equals("batFilePath") ) {
\r
666 batFilePath = mc.group(2);
\r
668 else if ( mc.group(1).equals("suspendMode") ) {
\r
669 suspendMode = Integer.valueOf(mc.group(2));
\r
671 else if ( mc.group(1).equals("rebootFlag") ) {
\r
672 rebootFlag = Integer.valueOf(mc.group(2));
\r
674 else if ( mc.group(1).equals("useMargineFlag") ) {
\r
675 useMargineFlag = Integer.valueOf(mc.group(2));
\r
677 else if ( mc.group(1).equals("startMargine") ) {
\r
678 startMargine = Integer.valueOf(mc.group(2));
\r
680 else if ( mc.group(1).equals("endMargine") ) {
\r
681 endMargine = Integer.valueOf(mc.group(2));
\r
683 else if ( mc.group(1).equals("continueRecFlag") ) {
\r
684 continueRecFlag = Integer.valueOf(mc.group(2));
\r
686 else if ( mc.group(1).equals("partialRecFlag") ) {
\r
687 partialRecFlag = Integer.valueOf(mc.group(2));
\r
689 else if ( mc.group(1).equals("tunerID") ) {
\r
690 tunerID = Integer.valueOf(mc.group(2));
\r
692 else if ( mc.group(1).equals("recFolderList") ) {
\r
693 Matcher md = Pattern.compile("<(.+?)>(.+?)</\\1>", Pattern.DOTALL).matcher(mc.group(2));
\r
694 while ( md.find() ) {
\r
695 if ( md.group(1).equals("recFolderInfo") ) {
\r
697 Matcher me = Pattern.compile("<(.+?)>(.*?)</\\1>", Pattern.DOTALL).matcher(md.group(2));
\r
698 while ( me.find() ) {
\r
699 if ( me.group(1).equals("recFolder") ) {
\r
700 rRecFolder.add(me.group(2));
\r
702 else if ( me.group(1).equals("writePlugIn") ) {
\r
703 rWritePlugIn.add(me.group(2));
\r
705 else if ( me.group(1).equals("recNamePlugIn") ) {
\r
706 rRecNamePlugIn.add(me.group(2));
\r
712 else if ( mc.group(1).equals("partialRecFolder") ) {
\r
713 Matcher md = Pattern.compile("<(.+?)>(.+?)</\\1>", Pattern.DOTALL).matcher(mc.group(2));
\r
714 while ( md.find() ) {
\r
715 if ( md.group(1).equals("recFolderInfo") ) {
\r
716 partialFolderCount++;
\r
717 Matcher me = Pattern.compile("<(.+?)>(.*?)</\\1>", Pattern.DOTALL).matcher(md.group(2));
\r
718 while ( me.find() ) {
\r
719 if ( me.group(1).equals("recFolder") ) {
\r
720 pRecFolder.add(me.group(2));
\r
722 else if ( me.group(1).equals("writePlugIn") ) {
\r
723 pWritePlugIn.add(me.group(2));
\r
725 else if ( me.group(1).equals("recNamePlugIn") ) {
\r
726 pRecNamePlugIn.add(me.group(2));
\r
734 else if ( mb.group(1).equals("recFileNameList") ) {
\r
735 Matcher mc = Pattern.compile("<(.+?)>(.+?)</\\1>", Pattern.DOTALL).matcher(mb.group(2));
\r
736 while ( mc.find() ) {
\r
737 if ( mc.group(1).equals("name") ) {
\r
738 recFileNameList.add(mc.group(2));
\r
748 ReserveList r = new ReserveList();
\r
750 r.setId(getUniqId(id));
\r
752 r.setTitlePop(TraceProgram.replacePop(title));
\r
754 String chid = ContentIdEDCB.getChId(onid, tsid, sid);
\r
755 String edcbid = ContentIdEDCB.getContentId(chid, evid);
\r
756 String contentid = ContentIdEDCB.stripMark(edcbid);
\r
759 StringBuilder dt = new StringBuilder("■予約状況:");
\r
760 if ( evid != 0 && evid != 65535 ) {
\r
762 r.setContentId(edcbid);
\r
763 setTextRecType(r,ITEM_REC_TYPE_EPG);
\r
765 if ( comment != null && comment.contains("EPG自動予約") ) {
\r
766 dt.append(comment);
\r
767 r.setAutoreserved(true);
\r
770 dt.append("EPG手動予約");
\r
771 r.setAutoreserved(false);
\r
776 r.setContentId(null);
\r
777 setTextRecType(r,ITEM_REC_TYPE_PROG);
\r
779 dt.append("プログラム予約");
\r
780 r.setAutoreserved(false);
\r
783 r.setDetail(dt.toString()); // 初期化
\r
786 r.setChannel(String.valueOf(Long.decode("0x"+chid)));
\r
787 r.setCh_name(cc.getCH_CODE2WEB(r.getChannel()));
\r
789 r.setRec_pattern(CommonUtils.getDate(cal));
\r
790 r.setRec_pattern_id(11);
\r
791 cal.set(Calendar.HOUR_OF_DAY, hh);
\r
792 cal.set(Calendar.MINUTE, mm);
\r
793 r.setAhh(String.format("%02d", cal.get(Calendar.HOUR_OF_DAY)));
\r
794 r.setAmm(String.format("%02d", cal.get(Calendar.MINUTE)));
\r
795 cal.add(Calendar.MINUTE,length);
\r
796 r.setZhh(String.format("%02d", cal.get(Calendar.HOUR_OF_DAY)));
\r
797 r.setZmm(String.format("%02d", cal.get(Calendar.MINUTE)));
\r
798 r.setRec_nextdate(CommonUtils.getNextDate(r));
\r
799 r.setRec_min(CommonUtils.getRecMin(r.getAhh(), r.getAmm(), r.getZhh(), r.getZmm()));
\r
800 getStartEndDateTime(r);
\r
804 String text = value2text(getListRecMode(),String.valueOf(recMode));
\r
805 setTextRecMode(r, text);
\r
806 if ( text.equals("") ) {
\r
808 r.setTunershort(false);
\r
812 r.setTunershort(overlapMode!=0);
\r
816 // プリセット(予約一覧からとれる情報は常に「予約時」)
\r
817 setTextPresetID(r, value2text(getListPresetID(),VALUE_PRESETID_REG));
\r
820 setTextTunerID(r, value2text(getListTunerID(),String.valueOf(tunerID)));
\r
823 setTextSuspendMode(r, value2text(getListSuspendMode(),String.valueOf(suspendMode)));
\r
826 r.setPursues(VALUE_YES.equals(String.valueOf(tuijyuuFlag)));
\r
829 setTextPittariFlag(r, value2text(getListPittariFlag(),String.valueOf(pittariFlag)));
\r
832 setTextPriority(r, value2text(getListPriority(),String.valueOf(priority)));
\r
835 if ( VALUE_YES.equals(String.valueOf(continueRecFlag)) ) {
\r
836 setTextContinueRecFlag(r, ITEM_YES);
\r
839 setTextContinueRecFlag(r, ITEM_NO);
\r
843 if ( VALUE_YES.equals(String.valueOf(rebootFlag)) ) {
\r
844 setTextRebootFlag(r, ITEM_YES);
\r
847 setTextRebootFlag(r, ITEM_NO);
\r
851 if ( serviceMode == 0x00 ) {
\r
852 setTextServiceMode(r, ITEM_SERVMOCE_DEFAULT);
\r
854 else if ( serviceMode == 0x01 ) {
\r
855 setTextServiceMode(r, ITEM_SERVMOCE_NONE);
\r
857 else if ( serviceMode == 0x11 ) {
\r
858 setTextServiceMode(r, ITEM_SERVMOCE_SUBT);
\r
860 else if ( serviceMode == 0x21 ) {
\r
861 setTextServiceMode(r, ITEM_SERVMOCE_CARO);
\r
863 else if ( serviceMode == 0x31 ) {
\r
864 setTextServiceMode(r, ITEM_SERVMOCE_SUBTCARO);
\r
868 if ( useMargineFlag == 0 ) {
\r
869 setTextStartMargine(r, ITEM_MARGINE_DEFAULT);
\r
870 setTextEndMargine(r, ITEM_MARGINE_DEFAULT);
\r
873 setTextStartMargine(r, String.valueOf(startMargine));
\r
874 setTextEndMargine(r, String.valueOf(endMargine));
\r
878 if ( VALUE_YES.equals(String.valueOf(partialRecFlag)) ) {
\r
879 setTextPartialRecFlag(r, ITEM_YES);
\r
882 setTextPartialRecFlag(r, ITEM_NO);
\r
886 if ( batFilePath != null ) {
\r
887 StringBuilder dt = new StringBuilder(r.getDetail());
\r
888 dt.append("■録画後実行bat:");
\r
889 dt.append(batFilePath);
\r
891 r.setDetail(dt.toString());
\r
895 r.getHidden_params().put(RETVAL_KEY_RECFOLDERCOUNT, String.valueOf(recFolderCount));
\r
896 if ( recFolderCount > 0 && rRecFolder.size() >= recFolderCount && rWritePlugIn.size() >= recFolderCount && rRecNamePlugIn.size() >= recFolderCount ) {
\r
897 StringBuilder dt = new StringBuilder(r.getDetail());
\r
898 StringBuilder rf = new StringBuilder();
\r
899 StringBuilder wp = new StringBuilder();
\r
900 StringBuilder rp = new StringBuilder();
\r
901 for ( int i=0; i<recFolderCount; i++ ) {
\r
902 dt.append("■録画フォルダ・出力PlugIn・ファイル名PlugIn(");
\r
903 dt.append(String.valueOf(i+1));
\r
905 dt.append(rRecFolder.get(i));
\r
907 dt.append(rWritePlugIn.get(i));
\r
909 dt.append(rRecNamePlugIn.get(i));
\r
912 rf.append(rRecFolder.get(i));
\r
915 wp.append(rWritePlugIn.get(i));
\r
918 rp.append(rRecNamePlugIn.get(i));
\r
921 r.setDetail(dt.toString());
\r
922 r.getHidden_params().put(RETVAL_KEY_R_RECFOLDER, rf.toString());
\r
923 r.getHidden_params().put(RETVAL_KEY_R_WRITEPLUGIN, wp.toString());
\r
924 r.getHidden_params().put(RETVAL_KEY_R_RECNAMEPLUGIN, rp.toString());
\r
927 r.getHidden_params().put(RETVAL_KEY_PARTIALFOLDERCOUNT, String.valueOf(partialFolderCount));
\r
928 if ( partialFolderCount > 0 && pRecFolder.size() >= recFolderCount && pWritePlugIn.size() >= recFolderCount && pRecNamePlugIn.size() >= recFolderCount ) {
\r
929 StringBuilder dt = new StringBuilder(r.getDetail());
\r
930 StringBuilder rf = new StringBuilder();
\r
931 StringBuilder wp = new StringBuilder();
\r
932 StringBuilder rp = new StringBuilder();
\r
933 for ( int i=0; i<recFolderCount; i++ ) {
\r
934 dt.append("■[1SEG] 録画フォルダ・出力PlugIn・ファイル名PlugIn(");
\r
935 dt.append(String.valueOf(i+1));
\r
937 dt.append(pRecFolder.get(i));
\r
939 dt.append(pWritePlugIn.get(i));
\r
941 dt.append(pRecNamePlugIn.get(i));
\r
944 rf.append(pRecFolder.get(i));
\r
947 wp.append(pWritePlugIn.get(i));
\r
950 rp.append(pRecNamePlugIn.get(i));
\r
953 r.setDetail(dt.toString());
\r
954 r.getHidden_params().put(RETVAL_KEY_P_RECFOLDER, rf.toString());
\r
955 r.getHidden_params().put(RETVAL_KEY_P_WRITEPLUGIN, wp.toString());
\r
956 r.getHidden_params().put(RETVAL_KEY_P_RECNAMEPLUGIN, rp.toString());
\r
960 if ( recFileNameList.size() > 0 ) {
\r
961 StringBuilder dt = new StringBuilder(r.getDetail());
\r
962 for ( int i=0; i<recFileNameList.size(); i++ ) {
\r
963 dt.append("■予定ファイル名(");
\r
964 dt.append(String.valueOf(i+1));
\r
966 dt.append(recFileNameList.get(i));
\r
969 r.setDetail(dt.toString());
\r
973 if ( evid != 0 && evid != 65535 ) {
\r
974 StringBuilder dt = new StringBuilder(r.getDetail());
\r
975 dt.append("■番組ID:");
\r
976 dt.append(contentid);
\r
978 r.setDetail(dt.toString());
\r
984 //XcopyAttributes(r, getReserves());
\r
989 newReserveList.add(r);
\r
995 private boolean GetRdReservedDetailByContentId(ReserveList r, int cnt) {
\r
996 String pstr = genPoststrEPGA(r);
\r
997 String url = "http://"+getIPAddr()+":"+getPortNo()+"/epginfo.html?"+pstr;
\r
998 System.out.println("URL: "+url);
\r
999 return _GetRdReservedDetail(r, url, cnt);
\r
1001 private boolean GetRdReservedDetailByReserveId(ReserveList r, int cnt) {
\r
1002 String url = "http://"+getIPAddr()+":"+getPortNo()+"/reserveinfo.html?id="+getRsvId(r.getId());
\r
1003 System.out.println("URL: "+url);
\r
1004 return _GetRdReservedDetail(r, url, cnt);
\r
1006 private boolean _GetRdReservedDetail(ReserveList r, String url, int cnt) {
\r
1008 reportProgress("+予約詳細を取得します("+cnt+")");
\r
1010 String[] d = reqGET(url,null);
\r
1011 //String hdr = d[0];
\r
1012 String res = d[1];
\r
1013 Matcher mb = null;
\r
1015 if (res == null) {
\r
1021 mb = Pattern.compile("<form method=\"POST\" action=\"reservedel\\.html\\?id=(\\d+?)\">").matcher(res);
\r
1022 if ( mb.find() ) {
\r
1023 r.setId(getUniqId(mb.group(1)));
\r
1028 mb = Pattern.compile("EventID:\\d+\\(0x(.+)\\)").matcher(res);
\r
1029 if ( mb.find() ) {
\r
1030 evid = Integer.decode("0X"+mb.group(1));
\r
1031 setTextRecType(r,ITEM_REC_TYPE_EPG);
\r
1034 setTextRecType(r,ITEM_REC_TYPE_PROG);
\r
1038 if ( getTextRecType(r).equals(ITEM_REC_TYPE_EPG) ) {
\r
1041 mb = Pattern.compile("OriginalNetworkID:\\d+\\(0x(.+)\\)").matcher(res);
\r
1042 if ( mb.find() ) {
\r
1043 onid = Integer.decode("0X"+mb.group(1));
\r
1046 mb = Pattern.compile("TransportStreamID:\\d+\\(0x(.+)\\)").matcher(res);
\r
1047 if ( mb.find() ) {
\r
1048 tsid = Integer.decode("0X"+mb.group(1));
\r
1051 mb = Pattern.compile("ServiceID:\\d+\\(0x(.+)\\)").matcher(res);
\r
1052 if ( mb.find() ) {
\r
1053 sid = Integer.decode("0X"+mb.group(1));
\r
1055 if ( onid == -1 || tsid == -1 || sid == -1 ) {
\r
1056 System.err.println("放送局IDが取得できませんでした: "+url);
\r
1059 String chid = String.valueOf(Long.decode("0x"+ContentIdEDCB.getChId(onid,tsid,sid)));
\r
1060 r.setCh_name(cc.getCH_CODE2WEB(chid));
\r
1061 r.setChannel(chid);
\r
1063 r.setContentId(ContentIdEDCB.getContentId(onid,tsid,sid,evid));
\r
1066 // (1-X) 開始・終了日時と、番組詳細、タイトル
\r
1067 // ★一覧の開始・終了日時は、登録した際の開始・終了日時のままなので詳細を参照して修正が必要
\r
1068 mb = Pattern.compile("<HR>番組情報<HR>\\s*(\\d\\d\\d\\d/\\d\\d/\\d\\d\\(.\\)) (\\d\\d):(\\d\\d)~(\\d\\d):(\\d\\d)<BR>.+?<BR>\\s*(.*?)<BR>.*?<BR>\\s*(.+?)\\s*<HR>録画設定<HR>",Pattern.DOTALL).matcher(res);
\r
1069 if ( mb.find() ) {
\r
1070 GregorianCalendar cal = CommonUtils.getCalendar(mb.group(1));
\r
1071 r.setRec_pattern(CommonUtils.getDate(cal));
\r
1072 r.setRec_pattern_id(11);
\r
1074 r.setStartDateTime(CommonUtils.getDateTime(cal));
\r
1075 r.setRec_nextdate(r.getStartDateTime());
\r
1076 r.setAhh(mb.group(2));
\r
1077 r.setAmm(mb.group(3));
\r
1078 r.setZhh(mb.group(4));
\r
1079 r.setZmm(mb.group(5));
\r
1081 r.setRec_nextdate(CommonUtils.getNextDate(r));
\r
1082 r.setRec_min(CommonUtils.getRecMin(r.getAhh(), r.getAmm(), r.getZhh(), r.getZmm()));
\r
1083 getStartEndDateTime(r);
\r
1085 r.setTitle(CommonUtils.unEscape(mb.group(6)));
\r
1086 r.setTitlePop(TraceProgram.replacePop(r.getTitle()));
\r
1088 r.setDetail(CommonUtils.unEscape(mb.group(7)).replaceAll("<BR>", ""));
\r
1092 catch ( Exception e ) {
\r
1093 e.printStackTrace();
\r
1097 setTextPresetID(r, getSelectedSetting("presetID",res));
\r
1101 String rec_mode = getSelectedSetting("recMode",res);
\r
1102 if ( rec_mode.equals(ITEM_REC_MODE_DISABLE) ) {
\r
1103 // "無効"は「予約実行」で扱うので
\r
1105 setTextRecMode(r,getListRecMode().get(0).getText());
\r
1106 // チューナー不足警告(リスト取得時に立ててるので落とす)
\r
1107 r.setTunershort(false);
\r
1110 setTextRecMode(r,rec_mode);
\r
1115 setTextTunerID(r, getSelectedSetting("tunerID",res));
\r
1118 setTextSuspendMode(r, getSelectedSetting("suspendMode",res));
\r
1121 r.setPursues(ITEM_YES.equals(getSelectedSetting("tuijyuuFlag",res)));
\r
1124 setTextPittariFlag(r, getSelectedSetting("pittariFlag",res));
\r
1127 setTextPriority(r, getSelectedSetting("priority",res));
\r
1130 if ( getCheckedSetting("continueRecFlag", res) != null ) {
\r
1131 setTextContinueRecFlag(r, ITEM_YES);
\r
1134 setTextContinueRecFlag(r, ITEM_NO);
\r
1138 if ( getCheckedSetting("rebootFlag", res) != null ) {
\r
1139 setTextRebootFlag(r, ITEM_YES);
\r
1142 setTextRebootFlag(r, ITEM_NO);
\r
1145 // (1-15) 指定サービス対象データ
\r
1146 if ( getCheckedSetting("serviceMode", res) != null ) {
\r
1147 setTextServiceMode(r, ITEM_SERVMOCE_DEFAULT);
\r
1150 boolean b1 = "0".equals(getCheckedSetting("serviceMode_1", res));
\r
1151 boolean b2 = "0".equals(getCheckedSetting("serviceMode_2", res));
\r
1153 setTextServiceMode(r, ITEM_SERVMOCE_SUBTCARO);
\r
1156 setTextServiceMode(r, ITEM_SERVMOCE_SUBT);
\r
1159 setTextServiceMode(r, ITEM_SERVMOCE_CARO);
\r
1162 setTextServiceMode(r, ITEM_SERVMOCE_NONE);
\r
1168 if ( getCheckedSetting("useDefMargineFlag", res) != null ) {
\r
1169 setTextStartMargine(r, ITEM_MARGINE_DEFAULT);
\r
1170 setTextEndMargine(r, ITEM_MARGINE_DEFAULT);
\r
1173 setTextStartMargine(r, getEditedSetting("startMargine", res));
\r
1174 setTextEndMargine(r, getEditedSetting("endMargine", res));
\r
1178 // (1-17) 別ファイルに同時出力する
\r
1179 if ( getCheckedSetting("partialRecFlag", res) != null ) {
\r
1180 setTextPartialRecFlag(r, ITEM_YES);
\r
1183 setTextPartialRecFlag(r, ITEM_NO);
\r
1186 String batFilePath = null;
\r
1187 ArrayList<String> rRecFolder = new ArrayList<String>();
\r
1188 ArrayList<String> rWritePlugIn = new ArrayList<String>();
\r
1189 ArrayList<String> rRecNamePlugIn = new ArrayList<String>();
\r
1190 ArrayList<String> pRecFolder = new ArrayList<String>();
\r
1191 ArrayList<String> pWritePlugIn = new ArrayList<String>();
\r
1192 ArrayList<String> pRecNamePlugIn = new ArrayList<String>();
\r
1195 mb = Pattern.compile("録画後実行bat.*?:\\s*(.*?)<BR>",Pattern.DOTALL).matcher(d[1]);
\r
1196 if ( mb.find() ) {
\r
1197 batFilePath = mb.group(1);
\r
1203 Matcher mc = Pattern.compile("録画フォルダ.*?(<TABLE.*?</TABLE>)\\s*<input type=hidden name=\"recFolderCount\" value=\"(\\d+?)\">",Pattern.DOTALL).matcher(d[1]);
\r
1204 if ( ! mc.find() ) {
\r
1205 errmsg = "情報が見つかりません:"+RETVAL_KEY_RECFOLDERCOUNT;
\r
1208 r.getHidden_params().put(RETVAL_KEY_RECFOLDERCOUNT, mc.group(2));
\r
1210 Matcher md = Pattern.compile("<TR>(.*?)</TR>",Pattern.DOTALL).matcher(mc.group(1));
\r
1212 while ( md.find() ) {
\r
1213 if ( idx++ == 0 ) {
\r
1216 Matcher me = Pattern.compile("<TD>(.*?)</TD>",Pattern.DOTALL).matcher(md.group(1));
\r
1217 for ( int i=0; i<3 && me.find(); i++ ) {
\r
1220 rRecFolder.add(me.group(1));
\r
1223 rWritePlugIn.add(me.group(1));
\r
1226 rRecNamePlugIn.add(me.group(1));
\r
1234 mc = Pattern.compile("partialRecFlag.*?(<TABLE.*?</TABLE>)\\s*<input type=hidden name=\"partialFolderCount\" value=\"(\\d+?)\">",Pattern.DOTALL).matcher(d[1]);
\r
1235 if ( ! mc.find() ) {
\r
1236 errmsg = "情報が見つかりません:"+RETVAL_KEY_PARTIALFOLDERCOUNT;
\r
1239 r.getHidden_params().put(RETVAL_KEY_PARTIALFOLDERCOUNT, mc.group(2));
\r
1242 Matcher md = Pattern.compile("<TR>(.*?)</TR>",Pattern.DOTALL).matcher(mc.group(1));
\r
1244 while ( md.find() ) {
\r
1245 if ( idx++ == 0 ) {
\r
1248 Matcher me = Pattern.compile("<TD>(.*?)</TD>",Pattern.DOTALL).matcher(md.group(1));
\r
1249 for ( int i=0; i<3 && me.find(); i++ ) {
\r
1252 pRecFolder.add(me.group(1));
\r
1255 pWritePlugIn.add(me.group(1));
\r
1258 pRecNamePlugIn.add(me.group(1));
\r
1267 StringBuilder dt = new StringBuilder("■予約状況:");
\r
1268 if ( r.getContentId() != null ) {
\r
1269 dt.append("EPG予約(自動手動不明→予約一覧再取得を行ってください)");
\r
1272 dt.append("プログラム予約");
\r
1275 r.setDetail(dt.toString());
\r
1278 if ( batFilePath != null && batFilePath.length() > 0 ) {
\r
1279 StringBuilder dt = new StringBuilder(r.getDetail());
\r
1280 dt.append("■録画後実行bat:");
\r
1281 dt.append(batFilePath);
\r
1283 r.setDetail(dt.toString());
\r
1286 if ( rRecFolder.size() > 0 ) {
\r
1287 StringBuilder dt = new StringBuilder(r.getDetail());
\r
1288 StringBuilder rf = new StringBuilder();
\r
1289 StringBuilder wp = new StringBuilder();
\r
1290 StringBuilder rp = new StringBuilder();
\r
1291 for ( int i=0; i<rRecFolder.size(); i++ ) {
\r
1292 dt.append("■録画フォルダ・出力PlugIn・ファイル名PlugIn(");
\r
1293 dt.append(String.valueOf(i+1));
\r
1295 dt.append(rRecFolder.get(i));
\r
1297 dt.append(rWritePlugIn.get(i));
\r
1299 dt.append(rRecNamePlugIn.get(i));
\r
1302 rf.append(rRecFolder.get(i));
\r
1305 wp.append(rWritePlugIn.get(i));
\r
1308 rp.append(rRecNamePlugIn.get(i));
\r
1311 r.setDetail(dt.toString());
\r
1312 r.getHidden_params().put(RETVAL_KEY_R_RECFOLDER, rf.toString());
\r
1313 r.getHidden_params().put(RETVAL_KEY_R_WRITEPLUGIN, wp.toString());
\r
1314 r.getHidden_params().put(RETVAL_KEY_R_RECNAMEPLUGIN, rp.toString());
\r
1317 if ( pRecFolder.size() > 0 ) {
\r
1318 StringBuilder dt = new StringBuilder(r.getDetail());
\r
1319 StringBuilder rf = new StringBuilder();
\r
1320 StringBuilder wp = new StringBuilder();
\r
1321 StringBuilder rp = new StringBuilder();
\r
1322 for ( int i=0; i<rRecFolder.size(); i++ ) {
\r
1323 dt.append("■[1SEG] 録画フォルダ・出力PlugIn・ファイル名PlugIn(");
\r
1324 dt.append(String.valueOf(i+1));
\r
1326 dt.append(pRecFolder.get(i));
\r
1328 dt.append(pWritePlugIn.get(i));
\r
1330 dt.append(pRecNamePlugIn.get(i));
\r
1333 rf.append(pRecFolder.get(i));
\r
1336 wp.append(pWritePlugIn.get(i));
\r
1339 rp.append(pRecNamePlugIn.get(i));
\r
1342 r.setDetail(dt.toString());
\r
1343 r.getHidden_params().put(RETVAL_KEY_P_RECFOLDER, rf.toString());
\r
1344 r.getHidden_params().put(RETVAL_KEY_P_WRITEPLUGIN, wp.toString());
\r
1345 r.getHidden_params().put(RETVAL_KEY_P_RECNAMEPLUGIN, rp.toString());
\r
1349 if ( r.getContentId() != null ) {
\r
1350 StringBuilder dt = new StringBuilder(r.getDetail());
\r
1351 dt.append("■番組ID:");
\r
1352 dt.append(ContentIdEDCB.stripMark(r.getContentId()));
\r
1354 r.setDetail(dt.toString());
\r
1359 private String getSelectedSetting(String key, String res) {
\r
1360 Matcher mb = Pattern.compile("<select name=\""+key+"\">[\\s\\S]*?<option value=\"([^\"]+?)\"\\s*selected>(.+?)\n").matcher(res);
\r
1362 return mb.group(2);
\r
1366 private String getEditedSetting(String key, String res) {
\r
1367 Matcher mb = Pattern.compile("<input type=text name=\""+key+"\" value=\"([^\"]+?)\">").matcher(res);
\r
1369 return mb.group(1);
\r
1373 private String getCheckedSetting(String key, String res) {
\r
1374 Matcher mb = Pattern.compile("<input type=checkbox name=\""+key+"\" value=\"([^\"]+?)\" checked>").matcher(res);
\r
1376 return mb.group(1);
\r
1385 private boolean GetRdRecordedList(ArrayList<RecordedInfo> newRecordedList) {
\r
1387 String critDate = null;
\r
1388 if ( newRecordedList.size() > 0 ) {
\r
1389 // 最新の情報の前日分までチェックする
\r
1390 GregorianCalendar cal = CommonUtils.getCalendar(newRecordedList.get(0).getDate());
\r
1391 cal.add(Calendar.DATE, -1);
\r
1392 critDate = CommonUtils.getDate(cal);
\r
1396 critDate = CommonUtils.getDate(CommonUtils.getCalendar(-86400*getRecordedSaveScope()));
\r
1399 if (getDebug()) System.out.println(DBGID+"録画結果の取り込みはここまで: "+critDate);
\r
1402 String response="";
\r
1404 reportProgress("録画結果一覧を取得します.(1)");
\r
1405 String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/recinfo.html",null);
\r
1408 if (response == null) {
\r
1409 errmsg = "レコーダーが反応しません";
\r
1414 // 30件を超えるとページが増える
\r
1416 Matcher ma = Pattern.compile("\"recinfo.html\\?page=(\\d+)\"").matcher(response);
\r
1417 while ( ma.find() ) {
\r
1418 int page = Integer.valueOf(ma.group(1));
\r
1419 if ( maxpage < page ) {
\r
1424 for ( int page = 0; page<=maxpage; page++ ) {
\r
1426 reportProgress(String.format("録画結果一覧を取得します.(%d)",page+1));
\r
1427 String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/recinfo.html?page="+page,null,thisEncoding);
\r
1430 if ( GetRdRecordedListSub(newRecordedList, response, critDate) <= 0) {
\r
1439 private int GetRdRecordedListSub(ArrayList<RecordedInfo> newRecordedList, String response, String critDate) {
\r
1444 Matcher mc = Pattern.compile("<TABLE BORDER=\"1\">(.+?)</TABLE>",Pattern.DOTALL).matcher(response);
\r
1446 Matcher ma = Pattern.compile("<TR( BGCOLOR=#......)?><TD>(\\d\\d\\d\\d/\\d\\d/\\d\\d)\\(.\\) (\\d\\d):(\\d\\d)~(\\d\\d):(\\d\\d)</TD><TD>(.+?)</TD>.*?<A HREF=\"recinfodesc\\.html\\?id=(\\d+?)\">詳細</A></TD></TR>\\s*?<TR( BGCOLOR=#......)?><TD COLSPAN=\"2\">(.*?)</TD></TR>\\s*?<TR( BGCOLOR=#......)?><TD COLSPAN=\"2\">(.*?)</TD></TR>",Pattern.DOTALL).matcher(mc.group(1));
\r
1447 while ( ma.find() ) {
\r
1450 GregorianCalendar cal = CommonUtils.getCalendar(ma.group(2));
\r
1451 String date = CommonUtils.getDate(cal);
\r
1453 // 既存の情報に追いついたので取得終了
\r
1454 if ( date.compareTo(critDate) < 0 ) {
\r
1459 RecordedInfo entry = new RecordedInfo();
\r
1461 entry.setDate(date);
\r
1463 entry.setAhh(ma.group(3));
\r
1464 entry.setAmm(ma.group(4));
\r
1465 entry.setZhh(ma.group(5));
\r
1466 entry.setZmm(ma.group(6));
\r
1468 long lenL = CommonUtils.getCompareDateTime(entry.getDate()+" "+entry.getZhh()+":"+entry.getZmm(), entry.getDate()+" "+entry.getAhh()+":"+entry.getAmm());
\r
1472 int len = (int) (lenL / 60000L);
\r
1473 entry.setLength(len);
\r
1476 String recChName = ma.group(7);
\r
1477 String chid = cc.getCH_REC2CODE(recChName);
\r
1478 if ( chid == null ) {
\r
1480 String nan = TEXT_NANSHICHO_HEADER+recChName;
\r
1481 chid = cc.getCH_REC2CODE(nan);
\r
1482 if ( chid != null ) {
\r
1487 if ( chid == null ) {
\r
1488 // CHコードにできなければ、HTMLから取得した放送局名をそのまま使う
\r
1489 entry.setChannel(null);
\r
1490 entry.setCh_name(recChName);
\r
1493 entry.setChannel(chid);
\r
1494 String ch_name = cc.getCH_CODE2WEB(chid);
\r
1495 if ( ch_name == null ) {
\r
1496 // CHコード設定がうまくないようですよ?
\r
1497 entry.setCh_name(ma.group(7));
\r
1500 entry.setCh_name(ch_name);
\r
1504 entry.setCh_orig(recChName);
\r
1507 entry.setId(ma.group(8));
\r
1510 entry.setTitle(CommonUtils.unEscape(ma.group(10)).replaceAll("<BR>", ""));
\r
1513 entry.setResult(ma.group(12));
\r
1514 entry.setSucceeded(entry.getResult().matches("^(録画終了|開始時間が変更されました)$"));
\r
1518 addRecorded(newRecordedList, entry);
\r
1527 private boolean GetRdRecordedListDetailAll(ArrayList<RecordedInfo> newRecordedList) {
\r
1530 for ( RecordedInfo entry : newRecordedList ) {
\r
1532 if ( entry.getId() == null ) {
\r
1539 reportProgress("+録画結果詳細を取得します("+i+")");
\r
1541 String response="";
\r
1543 String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/recinfodesc.html?id="+entry.getId(),null);
\r
1546 if (response == null) {
\r
1547 errmsg = "レコーダーが反応しません";
\r
1552 Matcher ma = Pattern.compile("ドロップ:(\\d+)", Pattern.DOTALL).matcher(response);
\r
1553 if ( ma.find() ) {
\r
1554 entry.setDrop(Integer.valueOf(ma.group(1)));
\r
1557 ma = Pattern.compile("Drop:\\s*(\\d+)\\s*Scramble:\\s*(\\d+)\\s*MPEG2", Pattern.DOTALL).matcher(response);
\r
1558 while ( ma.find() ) {
\r
1559 entry.setDrop_mpeg(entry.getDrop_mpeg()+Integer.valueOf(ma.group(1)));
\r
1562 ma = Pattern.compile("(<HR>番組情報<HR>.*</PRE>)", Pattern.DOTALL).matcher(response);
\r
1563 if ( ma.find() ) {
\r
1564 entry.setDetail(CommonUtils.unEscape(ma.group(1).replaceAll("<BR>", "").replaceAll("</?PRE>", "").replaceAll("<HR>", "====").replaceAll("\n\n+", "\n\n")/*.replaceFirst("^([\\s\\S]*?)(====エラーログ====[\\s\\S]*?)$","$2\n\n$1")*/));
\r
1568 Matcher md = Pattern.compile("OriginalNetworkID:(\\d+).*?TransportStreamID:(\\d+).*?ServiceID:(\\d+)",Pattern.DOTALL).matcher(response);
\r
1569 if ( md.find() ) {
\r
1570 // 詳細情報からCHコードが取得できるなら
\r
1571 String chid = String.valueOf(Long.decode("0x"+ContentIdEDCB.getChId(Integer.valueOf(md.group(1)),Integer.valueOf(md.group(2)),Integer.valueOf(md.group(3)))));
\r
1572 entry.setChannel(chid);
\r
1573 String ch_name = cc.getCH_CODE2WEB(chid);
\r
1574 if ( ch_name != null ) {
\r
1575 entry.setCh_name(ch_name);
\r
1585 /*******************************************************************************
\r
1587 ******************************************************************************/
\r
1590 public boolean PostRdEntry(ReserveList reqr)
\r
1593 ArrayList<ReserveList> tmprl = getReserves();
\r
1595 boolean b = _PostRdEntry(reqr);
\r
1597 // 予約一覧が更新されていたら、本体から取得できない情報は引き継ぐ
\r
1598 if ( getReserves() != tmprl ) {
\r
1599 copyAttributesAllList(tmprl, getReserves());
\r
1602 // 成功しても失敗してもキャッシュが更新されている可能性があるので保存し直す
\r
1603 ReservesToFile(getReserves(), rsvedFile);
\r
1604 setRecordedFlag();
\r
1608 private boolean _PostRdEntry(ReserveList reqr)
\r
1611 System.out.println("Run: PostRdEntry("+reqr.getTitle()+")");
\r
1616 if ( ! PrePostCheck(reqr) ) {
\r
1621 if ( reqr.getRec_audio().equals(ITEM_PRESETID_REG) ) {
\r
1622 errmsg = "新規予約では次の指定はできません:プリセット="+ITEM_PRESETID_REG;
\r
1627 Authenticator.setDefault(new MyAuthenticator(getUser(), getPasswd()));
\r
1637 boolean rec_type_epg = true;
\r
1638 if ( getTextRecType(reqr) != null && getTextRecType(reqr).equals(ITEM_REC_TYPE_EPG) ) {
\r
1639 if ( ContentIdEDCB.isValid(reqr.getContentId()) ) {
\r
1640 ContentIdEDCB.decodeContentId(reqr.getContentId());
\r
1641 onid = ContentIdEDCB.getOnId();
\r
1642 tsid = ContentIdEDCB.getTSId();
\r
1643 sid = ContentIdEDCB.getSId();
\r
1644 evid = ContentIdEDCB.getEvId();
\r
1646 else if ( ContentIdDIMORA.isValid(reqr.getContentId()) ) {
\r
1647 ContentIdDIMORA.decodeContentId(reqr.getContentId());
\r
1648 evid = ContentIdDIMORA.getEvId();
\r
1651 else if ( ContentIdREGZA.isValid(reqr.getContentId()) ) {
\r
1652 ContentIdREGZA.decodeContentId(reqr.getContentId());
\r
1653 evid = ContentIdREGZA.getEvId();
\r
1657 errmsg = "番組表に予約IDがないためEPG予約は利用できません。EDCB番組表を利用するかプログラム予約を行ってください。";
\r
1661 if ( evid != -1 && onid == -1 ) {
\r
1662 // Dimora、REGZA形式の場合 onid と tsid が取得できないので自前の情報で補完
\r
1663 ContentIdEDCB.decodeChId(ContentIdEDCB.getChId(cc.getCH_WEB2CODE(reqr.getCh_name())));
\r
1664 onid = ContentIdEDCB.getOnId();
\r
1665 tsid = ContentIdEDCB.getTSId();
\r
1666 sid = ContentIdEDCB.getSId();
\r
1668 reqr.setContentId(ContentIdEDCB.getContentId(onid, tsid, sid, evid));
\r
1672 rec_type_epg = false;
\r
1675 ReserveList newr = null;
\r
1683 if ( rec_type_epg ) {
\r
1691 reportProgress(String.format("EPG予約を実行します(%d/%d).",cnt++,cntMax));
\r
1693 ReserveList tmpr = new ReserveList();
\r
1694 tmpr.setContentId(reqr.getContentId());
\r
1695 setTextPresetID(tmpr, getTextPresetID(reqr));
\r
1696 if ( ! GetRdReservedDetailByContentId(tmpr,0) ) {
\r
1697 errmsg = "予約ページが開けません。";
\r
1701 if ( tmpr.getId() != null && tmpr.getId().length() > 0 ) {
\r
1702 System.out.println("重複予約が実行されます.");
\r
1708 reportProgress(String.format("追加を実行します(%d/%d).",cnt++,cntMax));
\r
1710 String pstr = genPoststrEPGB(reqr);
\r
1711 String uri = "http://"+getIPAddr()+":"+getPortNo()+"/"+String.format("reserveadd.html?onid=%d&tsid=%d&sid=%d&evid=%d",onid,tsid,sid,evid);;
\r
1713 System.err.println("URL: "+uri);
\r
1715 header = response = null;
\r
1716 for (int i=0; i<retryMax; i++) {
\r
1717 String[] d = reqPOST(uri, pstr, null);
\r
1720 if ( header != null && response == null ) {
\r
1721 reportProgress("コネクションがリセットされました。リトライします。");
\r
1722 CommonUtils.milSleep(1000);
\r
1728 if ( header == null || response == null ) {
\r
1729 errmsg = "レコーダーが反応しません。";
\r
1734 // EPG予約の場合はすぐわかる(はずだった→重複予約だとわからない)
\r
1736 reportProgress(String.format("新しい予約IDを取得します(%d/%d).",cnt++,cntMax));
\r
1738 newr = getRsvOnEdcbTR(reqr);
\r
1739 if ( newr == null ) {
\r
1743 // 本体から取得できない情報は引き継ぐ
\r
1744 copyAttributesMethod(reqr, newr);
\r
1746 // 一発ヒットしたものはキャッシュ上にないので載せる
\r
1747 if ( ! getReserves().contains(newr) ) {
\r
1748 getReserves().add(newr);
\r
1751 reportProgress("+新しい予約ID: "+newr.getId());
\r
1753 if ( isModified(reqr, newr) ) {
\r
1754 errmsg = "EDCB番組表からの情報で内容が変更されました: "+newr.getStartDateTime()+"~"+newr.getZhh()+":"+newr.getZmm()+" "+newr.getTitle();
\r
1767 // プログラム予約の制限のチェック
\r
1768 if ( ! PreProgResCheck(reqr) ) {
\r
1773 reqr.setContentId(null);
\r
1777 reportProgress(String.format("プログラム予約を実行します(%d/%d).",cnt++,cntMax));
\r
1779 String pstr = genPoststrDTA(reqr);
\r
1780 String uri = "http://"+getIPAddr()+":"+getPortNo()+"/addprogres.html";
\r
1782 System.err.println("URL: "+uri+"?"+pstr);
\r
1784 header = response = null;
\r
1785 for (int i=0; i<retryMax; i++) {
\r
1786 String[] d = reqPOST(uri, pstr, null);
\r
1789 if ( header != null && response == null ) {
\r
1790 reportProgress("コネクションがリセットされました。リトライします。");
\r
1791 CommonUtils.milSleep(1000);
\r
1797 if ( header == null || response == null ) {
\r
1798 errmsg = "レコーダーが反応しません。";
\r
1802 Matcher ma = Pattern.compile("<form method=\"POST\" action=\"reservepgadd.html\">").matcher(response);
\r
1803 if ( ! ma.find() ) {
\r
1804 errmsg = "予約に失敗しました。";
\r
1808 ma = Pattern.compile("<input type=hidden name=\"recFolderCount\" value=\"(\\d+?)\">").matcher(response);
\r
1809 if ( ! ma.find() ) {
\r
1810 errmsg = "予約に失敗しました。";
\r
1813 reqr.getHidden_params().put(RETVAL_KEY_RECFOLDERCOUNT, ma.group(1));
\r
1815 ma = Pattern.compile("<input type=hidden name=\"partialFolderCount\" value=\"(\\d+?)\">").matcher(response);
\r
1816 if ( ! ma.find() ) {
\r
1817 errmsg = "予約に失敗しました。";
\r
1820 reqr.getHidden_params().put(RETVAL_KEY_PARTIALFOLDERCOUNT, ma.group(1));
\r
1825 reportProgress(String.format("追加を実行します(%d/%d).",cnt++,cntMax));
\r
1827 String pstr = genPoststrDTB(reqr);
\r
1828 String uri = "http://"+getIPAddr()+":"+getPortNo()+"/reservepgadd.html";
\r
1830 System.err.println("URL: "+uri+"?"+pstr);
\r
1832 header = response = null;
\r
1833 for (int i=0; i<retryMax; i++) {
\r
1834 String[] d = reqPOST(uri, pstr, null);
\r
1837 if ( header != null && response == null ) {
\r
1838 reportProgress("コネクションがリセットされました。リトライします。");
\r
1839 CommonUtils.milSleep(1000);
\r
1845 if ( header == null || response == null ) {
\r
1846 errmsg = "レコーダーが反応しません。";
\r
1851 // EDCBに追加された予約IDを検索する ★EDCBは再起動すると予約IDが振り直しになるので必要!!
\r
1853 reportProgress(String.format("新しい予約IDを番号を取得します(%d/%d).",cnt++,cntMax));
\r
1855 reqr.setId(""); // 予約番号未定のためダミー
\r
1856 newr = getRsvOnEdcbDT(reqr);
\r
1857 if ( newr == null ) {
\r
1858 errmsg = "予約IDがみつかりません。";
\r
1862 // 本体から取得できない情報は引き継ぐ
\r
1863 copyAttributesMethod(reqr, newr);
\r
1865 // 一発ヒットしたものはキャッシュ上にないので載せる
\r
1866 if ( ! getReserves().contains(newr) ) {
\r
1867 getReserves().add(newr);
\r
1870 reportProgress("+新しい予約ID: "+newr.getId());
\r
1874 System.out.printf("\n<<< Message from RD >>> \"%s\"\n\n", "正常に登録できました。");
\r
1882 /*******************************************************************************
\r
1884 ******************************************************************************/
\r
1890 public boolean UpdateRdEntry(ReserveList cacher, ReserveList reqr)
\r
1892 ArrayList<ReserveList> tmprl = getReserves();
\r
1894 boolean b = _UpdateRdEntry(cacher, reqr);
\r
1896 // 予約一覧が更新されていたら、本体から取得できない情報は引き継ぐ
\r
1897 if ( getReserves() != tmprl ) {
\r
1898 copyAttributesAllList(tmprl, getReserves());
\r
1901 // 成功しても失敗してもキャッシュが更新されている可能性があるので保存し直す
\r
1902 ReservesToFile(getReserves(), rsvedFile);
\r
1903 setRecordedFlag();
\r
1911 private boolean _UpdateRdEntry(ReserveList cacher, ReserveList reqr)
\r
1914 System.out.println("Run: UpdateRdEntry()");
\r
1919 Authenticator.setDefault(new MyAuthenticator(getUser(), getPasswd()));
\r
1922 if ( ! PrePostCheck(reqr) ) {
\r
1926 if ( ! getTextRecType(cacher).equals(getTextRecType(reqr)) ) {
\r
1927 errmsg = String.format("異なる予約方式への更新は行えません(%s->%s)",getTextRecType(cacher),getTextRecType(reqr));
\r
1931 boolean rec_type_epg = true;
\r
1932 if ( getTextRecType(reqr) != null && getTextRecType(reqr).equals(ITEM_REC_TYPE_EPG) ) {
\r
1933 if ( ContentIdEDCB.isValid(reqr.getContentId()) ) {
\r
1937 errmsg = "番組表に予約IDがないためEPG予約は利用できません。EDCB番組表を利用するかプログラム予約を行ってください。";
\r
1942 rec_type_epg = false;
\r
1944 reqr.setContentId(null);
\r
1947 if ( rec_type_epg ) {
\r
1949 if (getDebug()) System.err.println("[DEBUG] Update EPG RSV");
\r
1950 return UpdateRdEntryTR(cacher,reqr);
\r
1954 // プログラム予約の制限のチェック
\r
1955 if ( ! PreProgResCheck(reqr)) {
\r
1960 if ( isEqualsDate(cacher, reqr) && cacher.getTitle().equals(reqr.getTitle()) ) {
\r
1961 // 開始・終了日時とタイトルに変更がない場合は更新
\r
1962 if (getDebug()) System.err.println("[DEBUG] Update PROG RSV");
\r
1963 return UpdateRdEntryDT2(cacher,reqr);
\r
1966 // 開始・終了日時とタイトルに変更がある場合は削除して追加
\r
1967 if (getDebug()) System.err.println("[DEBUG] Refresh PROG RSV");
\r
1968 return UpdateRdEntryDT1(cacher,reqr);
\r
1976 private boolean UpdateRdEntryTR(ReserveList cacher, ReserveList reqr) {
\r
1982 ReserveList oldr = null; // 本体にあった既存の予約情報
\r
1983 ReserveList newr = null; // 更新後に取得しなおした新しい予約情報
\r
1987 reportProgress(String.format("更新するEPG予約の予約IDを取得します(%d/%d).",cnt++,cntMax));
\r
1990 oldr = getRsvOnEdcbTR(cacher);
\r
1991 if ( oldr == null ) {
\r
1995 reportProgress("+更新される予約ID: "+oldr.getId());
\r
2000 reportProgress(String.format("更新を実行します(%d/%d).",cnt++,cntMax));
\r
2002 newr = _UpdateRdEntrySub(oldr, reqr);
\r
2003 if ( newr == null ) {
\r
2007 // 本体から取得できない情報は引き継ぐ
\r
2008 copyAttributesMethod(reqr, newr);
\r
2010 // 一発ヒットした場合は予約リストの更新が必要。再取得している場合は不要
\r
2011 int idx = getReserves().indexOf(cacher);
\r
2013 getReserves().set(idx,newr);
\r
2017 if ( isModified(cacher, newr) ) {
\r
2018 // ピンピンうるさいので実行OFFの予約の場合はだんまりで
\r
2019 errmsg = "EDCB番組表からの情報で内容が変更されました: "+newr.getStartDateTime()+"~"+newr.getZhh()+":"+newr.getZmm()+" "+newr.getTitle();
\r
2026 * プログラム予約を更新する(開始・終了日時とタイトルに変更がない場合は更新)
\r
2028 private boolean UpdateRdEntryDT2(ReserveList cacher, ReserveList reqr) {
\r
2034 ReserveList oldr = null; // 本体にあった既存の予約情報
\r
2035 ReserveList newr = null; // 更新後に取得しなおした新しい予約情報
\r
2037 // EDCBの更新すべき予約IDを検索する ★EDCBは再起動すると予約IDが振り直しになるので必要!!
\r
2039 reportProgress(String.format("更新対象の予約を探します(%d/%d).",cnt++,cntMax));
\r
2041 oldr = getRsvOnEdcbDT(cacher);
\r
2042 if ( oldr == null ) {
\r
2043 errmsg = "予約一覧に更新対象が見つかりません。";
\r
2048 reportProgress("+更新される予約ID: "+oldr.getId());
\r
2053 reportProgress(String.format("プログラム予約を更新します(%d/%d).",cnt++,cntMax));
\r
2055 newr = _UpdateRdEntrySub(oldr, reqr);
\r
2056 if ( newr == null ) {
\r
2060 // 本体から取得できない情報は引き継ぐ
\r
2061 copyAttributesMethod(reqr, newr);
\r
2063 // 一発ヒットした場合は予約リストの更新が必要。再取得している場合は不要
\r
2064 int idx = getReserves().indexOf(cacher);
\r
2066 getReserves().set(idx,newr);
\r
2074 * プログラム予約を更新する(開始・終了日時とタイトルに変更がある場合は削除して追加)
\r
2076 private boolean UpdateRdEntryDT1(ReserveList cacher, ReserveList reqr) {
\r
2078 reportProgress("プログラム予約を登録し直します.");
\r
2081 if ( RemoveRdEntry(cacher.getId()) == null ) {
\r
2086 if ( ! PostRdEntry(reqr) ) {
\r
2087 errmsg += "予約が削除されたので登録しなおしてください。";
\r
2096 private ReserveList _UpdateRdEntrySub(ReserveList oldr, ReserveList reqr) {
\r
2098 String pstr = genPoststrDTB(reqr);
\r
2099 String uri = "http://"+getIPAddr()+":"+getPortNo()+"/reservechg.html?id="+getRsvId(oldr.getId());
\r
2101 System.err.println("URL: "+uri);
\r
2103 String header = null;
\r
2104 String response = null;
\r
2105 for (int i=0; i<retryMax; i++) {
\r
2106 String[] d = reqPOST(uri, pstr, null);
\r
2109 if ( header != null && response == null ) {
\r
2110 reportProgress("コネクションがリセットされました。リトライします。");
\r
2111 CommonUtils.milSleep(1000);
\r
2117 if ( header == null || response == null ) {
\r
2118 errmsg = "レコーダーが反応しません。";
\r
2121 if ( ! response.contains("予約を変更しました") ) {
\r
2122 errmsg = "更新に失敗しました。";
\r
2127 ReserveList newr = reqr.clone();
\r
2128 newr.setId(oldr.getId());
\r
2129 if ( ! GetRdReservedDetailByReserveId(newr,0) ) {
\r
2130 errmsg = "更新後の情報を取得できませんでした。";
\r
2134 System.out.printf("\n<<< Message from RD >>> \"%s\"\n\n", "正常に更新できました。");
\r
2139 /*******************************************************************************
\r
2141 ******************************************************************************/
\r
2144 public ReserveList RemoveRdEntry(String delid) {
\r
2146 System.out.println("Run: RemoveRdEntry()");
\r
2151 Authenticator.setDefault(new MyAuthenticator(getUser(), getPasswd()));
\r
2153 ReserveList delr = null; // キャッシュ上の削除対象
\r
2154 ReserveList oldr = null; // レコーダ上の削除対象
\r
2157 for ( ReserveList reserve : getReserves() ) {
\r
2158 if (reserve.getId().equals(delid)) {
\r
2163 if (delr == null) {
\r
2167 // EDCBから削除対象を探す ★EDCBは再起動すると予約IDが振り直しになるので必要!!
\r
2168 reportProgress(String.format("削除する予約IDを取得します."));
\r
2170 if ( ContentIdEDCB.isValid(delr.getContentId()) ) {
\r
2171 oldr = getRsvOnEdcbTR(delr);
\r
2174 oldr = getRsvOnEdcbDT(delr);
\r
2176 if ( oldr == null ) {
\r
2177 errmsg = "レコーダ上に削除対象が見つかりません。";
\r
2181 reportProgress("+削除される予約ID: "+oldr.getId());
\r
2188 reportProgress("削除を実行します.");
\r
2189 String uri = "http://"+getIPAddr()+":"+getPortNo()+"/reservedel.html?id="+getRsvId(oldr.getId());
\r
2191 System.err.println("URL: "+uri);
\r
2193 header = response = null;
\r
2194 for (int i=0; i<retryMax; i++) {
\r
2195 String[] d = reqPOST(uri, "", null);
\r
2198 if ( header != null && response == null ) {
\r
2199 reportProgress("コネクションがリセットされました。リトライします。");
\r
2200 CommonUtils.milSleep(1000);
\r
2206 if ( header == null || response == null ) {
\r
2207 errmsg = "レコーダーが反応しません。";
\r
2210 if ( ! response.contains("予約を削除しました") ) {
\r
2211 errmsg = "削除に失敗しました。";
\r
2217 getReserves().remove(delr);
\r
2219 // キャッシュに保存(削除なので録画済みフラグは操作しなくてよい)
\r
2220 ReservesToFile(getReserves(), rsvedFile);
\r
2221 //setRecordedFlag();
\r
2223 System.out.printf("\n<<< Message from RD >>> \"%s\"\n\n", "正常に削除できました。");
\r
2229 /*******************************************************************************
\r
2231 ******************************************************************************/
\r
2236 private boolean PrePostCheck(ReserveList r) {
\r
2238 r.setChannel(cc.getCH_WEB2CODE(r.getCh_name()));
\r
2239 if ( r.getChannel() == null) {
\r
2240 errmsg = "【警告】Web番組表の放送局名「"+r.getCh_name()+"」をCHコードに変換できません。CHコード設定を修正してください。" ;
\r
2241 System.out.println(errmsg);
\r
2249 r.setRec_pattern_id(getRec_pattern_Id(r.getRec_pattern()));
\r
2250 r.setRec_nextdate(CommonUtils.getNextDate(r));
\r
2251 r.setRec_min(CommonUtils.getRecMin(r.getAhh(),r.getAmm(),r.getZhh(),r.getZmm()));
\r
2252 getStartEndDateTime(r);
\r
2253 if ( r.getRec_pattern_id() != 11 ) {
\r
2254 errmsg = "日付指定しか利用出来ません。";
\r
2255 System.out.println(errmsg);
\r
2265 private boolean PreProgResCheck(ReserveList r) {
\r
2267 getTextPittariFlag(r).equals(ITEM_JUST_ENABLE)
\r
2269 errmsg = "プログラム予約では次の指定はできません:ぴったり録画="+ITEM_JUST_ENABLE;
\r
2276 errmsg = "プログラム予約では次の指定はできないので規定値に変更しました:番組追従="+ITEM_YES;
\r
2277 r.setPursues(false);
\r
2285 * EDCB予約一覧から操作対象を探すのです(EPG予約版)
\r
2286 * @see #isEqualsTR(ReserveList, ReserveList, int)
\r
2287 * @see #getRsvOnEdcbDT(ReserveList)
\r
2289 private ReserveList getRsvOnEdcbTR(ReserveList origr) {
\r
2291 // 予約IDを試してみる(EDCBがリブートしていなければこれでOKなはず)
\r
2292 if ( origr.getId() != null && origr.getId().length() > 0 ) {
\r
2293 ReserveList newr = origr.clone();
\r
2294 if ( GetRdReservedDetailByReserveId(newr,0) && isEqualsTR(origr, newr, -1) ) {
\r
2295 //System.out.println("+-一致する予約です(予約ID直接): "+newr.getId());
\r
2300 // 番組IDを試してみる(重複予約されていなければこれで大丈夫なはず)
\r
2301 if ( origr.getContentId() != null && ContentIdEDCB.isValid(origr.getContentId()) ) {
\r
2302 ReserveList newr = origr.clone();
\r
2303 if ( GetRdReservedDetailByContentId(newr,0) && isEqualsTR(origr, newr, 0) ) {
\r
2304 //System.out.println("+-一致する予約です(番組ID直接): "+newr.getId());
\r
2309 // 一覧取得しなおし(3.17.5b)
\r
2310 ArrayList<ReserveList> rl = new ArrayList<ReserveList>();
\r
2311 if ( ! GetRdReservedList(rl) ) {
\r
2312 errmsg = "予約一覧の取得に失敗しました。";
\r
2321 for ( ReserveList newr : rl ) {
\r
2322 if ( isEqualsTR(origr, newr, idx++) ) {
\r
2327 errmsg = "予約IDがみつかりません。";
\r
2334 private boolean isEqualsTR(ReserveList origr, ReserveList newr, Integer idx) {
\r
2336 // 放送局が一緒で、開始日時が近いかどうか(旧情報vs一覧)
\r
2337 if ( ! isLikesRsvOnList(origr, newr) ) {
\r
2342 if ( ! ContentIdEDCB.isValid(newr.getContentId()) ) {
\r
2343 if ( idx != null ) System.out.println("+-そっくりですがEPG予約ではありません: "+newr.getId());
\r
2347 // おなじ番組かどうか(旧情報vs一覧)
\r
2348 if ( ! origr.getContentId().equals(newr.getContentId()) ) {
\r
2349 if ( idx != null ) System.out.println("+-そっくりですが別の番組です: "+newr.getId());
\r
2353 // チューナー指定が等しいかどうか(旧情報vs一覧)
\r
2354 if ( ! origr.getTuner().equals(newr.getTuner()) ) {
\r
2355 if ( idx != null ) System.out.println("+-そっくりですが異なる予約です(使用するチューナーが異なります): "+newr.getId());
\r
2360 if ( isEqualsDate(origr, newr) ) {
\r
2361 if ( idx != null ) {
\r
2362 if ( idx == -1 ) {
\r
2363 System.out.println("+-一致する予約です(予約ID直接): "+newr.getId());
\r
2365 else if ( idx == 0 ) {
\r
2366 System.out.println("+-一致する予約です(番組ID直接): "+newr.getId());
\r
2369 System.out.println("+-一致する予約です(間接)["+idx+"]: "+newr.getId());
\r
2374 System.out.println("+-一致する予約のようです(時間が移動しています)["+idx+"]: "+newr.getId());
\r
2381 * EDCB予約一覧から操作対象を探すのです(プログラム予約版)<BR>
\r
2382 * ※一発ヒットしたものはキャッシュに乗らないので注意
\r
2383 * @see #isEqualsDT(ReserveList, ReserveList, int)
\r
2384 * @see #getRsvOnEdcbTR(ReserveList)
\r
2386 private ReserveList getRsvOnEdcbDT(ReserveList origr) {
\r
2388 // 予約IDを試してみる(EDCBがリブートしていなければこれでOKなはず)
\r
2389 if ( origr.getId() != null && origr.getId().length() > 0 ) {
\r
2390 ReserveList newr = origr.clone();
\r
2391 if ( GetRdReservedDetailByReserveId(newr,0) && isEqualsDT(origr, newr, 0) ) {
\r
2392 //System.out.println("+-一致する予約です(番組ID直接): "+newr.getId());
\r
2397 // 予約IDは固定ではないので再度取得しなおさないと(3.17.5b変更)
\r
2398 ArrayList<ReserveList> rl = new ArrayList<ReserveList>();
\r
2399 if ( ! GetRdReservedList(rl) ) {
\r
2400 errmsg = "予約一覧の取得に失敗しました。";
\r
2409 for ( ReserveList newr : rl ) {
\r
2410 if ( isEqualsDT(origr, newr, idx++) ) {
\r
2415 errmsg = "予約IDが見つかりません。";
\r
2420 * 同じプログラム予約かどうかしらべる
\r
2422 private boolean isEqualsDT(ReserveList origr, ReserveList newr, Integer idx) {
\r
2424 // 放送局がいっしょで、開始日時・終了時刻が等しいかどうか(旧情報vs一覧)
\r
2425 if ( ! isEqualsRsvOnList(origr, newr) ) {
\r
2430 if ( ContentIdEDCB.isValid(newr.getContentId()) ) {
\r
2431 if ( idx != null ) System.out.println("+-そっくりですがプログラム予約ではありません: "+newr.getId());
\r
2435 // チューナー指定が等しいかどうか(旧情報vs一覧)
\r
2436 if ( ! origr.getTuner().equals(newr.getTuner()) ) {
\r
2437 if ( idx != null ) System.out.println("+-そっくりですが異なる予約です(使用するチューナーが異なります): "+newr.getId());
\r
2441 if ( idx != null ) {
\r
2443 System.out.println("+-一致する予約です(予約ID直接): "+newr.getId());
\r
2446 System.out.println("+-一致する予約です(間接)["+idx+"]: "+newr.getId());
\r
2456 private void copyAttributesAllList( ArrayList<ReserveList> oldrl, ArrayList<ReserveList> newrl ) {
\r
2459 for ( ReserveList newr : newrl ) {
\r
2460 if ( newr.getContentId() != null ) {
\r
2461 for ( ReserveList oldr : oldrl ) {
\r
2462 if ( oldr.getContentId() != null && isEqualsTR(oldr, newr, null) ) {
\r
2463 copyAttributesMethod(oldr, newr);
\r
2468 for ( ReserveList oldr : oldrl ) {
\r
2469 if ( oldr.getContentId() == null && isEqualsDT(oldr, newr, null) ) {
\r
2470 copyAttributesMethod(oldr, newr);
\r
2477 private void copyAttributesMethod( ReserveList oldr, ReserveList newr ) {
\r
2478 newr.setRec_genre(oldr.getRec_genre());
\r
2479 newr.setRec_subgenre(oldr.getRec_subgenre());
\r
2480 setTextPresetID(newr, getTextPresetID(oldr));
\r
2491 /*******************************************************************************
\r
2493 ******************************************************************************/
\r
2496 private String genPoststrEPGA(ReserveList r) {
\r
2497 StringBuilder sb = new StringBuilder();
\r
2499 sb.append("presetID="+text2value(getListPresetID(),getTextPresetID(r))+"&");
\r
2500 sb.append("onid="+Integer.decode("0x"+r.getContentId().substring(5,9))+"&");
\r
2501 sb.append("tsid="+Integer.decode("0x"+r.getContentId().substring(9,13))+"&");
\r
2502 sb.append("sid="+Integer.decode("0x"+r.getContentId().substring(13,17))+"&");
\r
2503 sb.append("evid="+Integer.decode("0x"+r.getContentId().substring(17,21)));
\r
2505 catch ( Exception e ) {
\r
2506 e.printStackTrace();
\r
2508 return sb.toString();
\r
2510 private String genPoststrEPGB(ReserveList r) {
\r
2511 StringBuilder sb = new StringBuilder();
\r
2512 sb.append(genPoststrEPGA(r)+"&");
\r
2513 sb.append(genPoststrCom(r));
\r
2514 return sb.toString();
\r
2518 private String genPoststrDTCom(ReserveList r) {
\r
2519 StringBuilder sb = new StringBuilder();
\r
2522 GregorianCalendar cal = CommonUtils.getCalendar(r.getRec_nextdate().substring(0,10));
\r
2523 sb.append("sdy="+cal.get(Calendar.YEAR)+"&");
\r
2524 sb.append("sdm="+(cal.get(Calendar.MONTH)+1)+"&");
\r
2525 sb.append("sdd="+cal.get(Calendar.DATE)+"&");
\r
2526 sb.append("sth="+Integer.valueOf(r.getAhh())+"&");
\r
2527 sb.append("stm="+Integer.valueOf(r.getAmm())+"&");
\r
2529 if ( r.getAhh().compareTo(r.getZhh()) > 0 ) {
\r
2530 cal.add(Calendar.DATE, 1);
\r
2532 sb.append("edy="+cal.get(Calendar.YEAR)+"&");
\r
2533 sb.append("edm="+(cal.get(Calendar.MONTH)+1)+"&");
\r
2534 sb.append("edd="+cal.get(Calendar.DATE)+"&");
\r
2535 sb.append("eth="+Integer.valueOf(r.getZhh())+"&");
\r
2536 sb.append("etm="+Integer.valueOf(r.getZmm()));
\r
2538 return sb.toString();
\r
2540 private String genPoststrDTA(ReserveList r) {
\r
2541 StringBuilder sb = new StringBuilder();
\r
2543 //sb.append("presetID="+text2value(getListPresetID(),getTextPresetID(r))+"&");
\r
2544 sb.append("serviceID="+cc.getCH_WEB2CODE(r.getCh_name())+"&");
\r
2545 sb.append("pgname="+URLEncoder.encode(r.getTitle(),thisEncoding)+"&");
\r
2546 sb.append(genPoststrDTCom(r));
\r
2547 } catch (UnsupportedEncodingException e) {
\r
2548 e.printStackTrace();
\r
2551 return sb.toString();
\r
2553 private String genPoststrDTB(ReserveList r) {
\r
2554 StringBuilder sb = new StringBuilder();
\r
2556 sb.append("serviceID="+cc.getCH_WEB2CODE(r.getCh_name())+"&");
\r
2557 sb.append("pgname="+URLEncoder.encode(r.getTitle(),thisEncoding)+"&");
\r
2558 sb.append(genPoststrDTCom(r)+"&");
\r
2559 sb.append(genPoststrCom(r));
\r
2560 } catch (UnsupportedEncodingException e) {
\r
2561 e.printStackTrace();
\r
2564 return sb.toString();
\r
2568 private String genPoststrCom(ReserveList r) {
\r
2570 StringBuilder sb = new StringBuilder();
\r
2572 sb.append("presetID="+text2value(getListPresetID(),getTextPresetID(r))+"&");
\r
2573 if ( r.getExec() ) {
\r
2574 sb.append("recMode="+text2value(getListRecMode(),getTextRecMode(r))+"&");
\r
2577 sb.append("recMode="+VALUE_REC_MODE_DISABLE+"&");
\r
2579 if ( r.getPursues() ) {
\r
2580 sb.append("tuijyuuFlag="+VALUE_TRACE_ENABLE+"&");
\r
2583 sb.append("tuijyuuFlag="+VALUE_TRACE_DISABLE+"&");
\r
2585 sb.append("priority="+text2value(getListPriority(),getTextPriority(r))+"&");
\r
2586 sb.append("pittariFlag="+text2value(getListPittariFlag(),getTextPittariFlag(r))+"&");
\r
2587 sb.append("suspendMode="+text2value(getListSuspendMode(),getTextSuspendMode(r))+"&");
\r
2588 if ( getTextStartMargine(r).equals(ITEM_MARGINE_DEFAULT) || getTextEndMargine(r).equals(ITEM_MARGINE_DEFAULT) ) {
\r
2589 sb.append("useDefMargineFlag=1&");
\r
2590 sb.append("startMargine=0&");
\r
2591 sb.append("endMargine=0&");
\r
2594 sb.append("startMargine="+text2value(getListStartMargine(),getTextStartMargine(r))+"&");
\r
2595 sb.append("endMargine="+text2value(getListEndMargine(),getTextEndMargine(r))+"&");
\r
2598 String s = getTextServiceMode(r);
\r
2599 if ( s.equals(ITEM_SERVMOCE_DEFAULT) ) {
\r
2600 sb.append("serviceMode=0&");
\r
2603 if ( s.equals(ITEM_SERVMOCE_SUBT) || s.equals(ITEM_SERVMOCE_SUBTCARO) ) {
\r
2604 sb.append("serviceMode_1=0&");
\r
2606 if ( s.equals(ITEM_SERVMOCE_CARO) || s.equals(ITEM_SERVMOCE_SUBTCARO) ) {
\r
2607 sb.append("serviceMode_2=0&");
\r
2611 sb.append("tunerID="+text2value(getListTunerID(),getTextTunerID(r))+"&");
\r
2612 if ( getTextContinueRecFlag(r).equals(ITEM_YES) ) {
\r
2613 sb.append("continueRecFlag=1&");
\r
2615 if ( getTextRebootFlag(r).equals(ITEM_YES) ) {
\r
2616 sb.append("rebootFlag=1&");
\r
2618 if ( getTextPartialRecFlag(r).equals(ITEM_YES) ) {
\r
2619 sb.append("partialRecFlag=1&");
\r
2624 String val = r.getHidden_params().get(RETVAL_KEY_RECFOLDERCOUNT);
\r
2625 sb.append("recFolderCount=");
\r
2626 sb.append((val!=null)?(val):("0"));
\r
2629 val = r.getHidden_params().get(RETVAL_KEY_PARTIALFOLDERCOUNT);
\r
2630 sb.append("partialFolderCount=");
\r
2631 sb.append((val!=null)?(val):("0"));
\r
2634 catch ( Exception e ) {
\r
2635 e.printStackTrace();
\r
2638 return sb.toString();
\r
2642 private void setSettingRecMargin(ArrayList<TextValueSet> tvs) {
\r
2644 add2tvs(tvs,ITEM_MARGINE_DEFAULT,VALUE_MARGINE_DEFAULT);
\r
2645 for (int i=0; i<=90; i++) {
\r
2646 add2tvs(tvs,String.valueOf(i),String.valueOf(i));
\r
2649 private void setSettingServiceMode(ArrayList<TextValueSet> tvs) {
\r
2651 add2tvs(tvs,ITEM_SERVMOCE_DEFAULT,VALUE_SERVMOCE_DEFAULT);
\r
2652 add2tvs(tvs,ITEM_SERVMOCE_SUBT,VALUE_SERVMOCE_SUBT);
\r
2653 add2tvs(tvs,ITEM_SERVMOCE_CARO,VALUE_SERVMOCE_CARO);
\r
2654 add2tvs(tvs,ITEM_SERVMOCE_SUBTCARO,VALUE_SERVMOCE_SUBTCARO);
\r
2655 add2tvs(tvs,ITEM_SERVMOCE_NONE,VALUE_SERVMOCE_NONE);
\r
2657 private void setSettingNoYes(ArrayList<TextValueSet> tvs) {
\r
2659 add2tvs(tvs,ITEM_NO,VALUE_NO);
\r
2660 add2tvs(tvs,ITEM_YES,VALUE_YES);
\r
2662 private void setSettingRecType(ArrayList<TextValueSet> tvs) {
\r
2664 add2tvs(tvs,ITEM_REC_TYPE_EPG,VALUE_REC_TYPE_EPG);
\r
2665 add2tvs(tvs,ITEM_REC_TYPE_PROG,VALUE_REC_TYPE_PROG);
\r
2668 private void setSettingChCodeValue(ArrayList<TextValueSet> tvsValue, ArrayList<TextValueSet> tvsType, String key, String res) {
\r
2670 HashMap<String, String> typ = new HashMap<String, String>();
\r
2671 typ.put("地デジ", "uvd");
\r
2672 typ.put("BS", "bsd");
\r
2673 typ.put("","csd");
\r
2677 Matcher mb = Pattern.compile("<select name=\""+key+"\">([\\s\\S]+?)</select>").matcher(res);
\r
2679 Matcher mc = Pattern.compile("<option value=\"([^\"]*?)\"(\\s*selected\\s*)?>(.+?)\\((.+?)\\)\\n").matcher(mb.group(1));
\r
2680 while (mc.find()) {
\r
2682 if (mc.group(4).equals("ワンセグ")) {
\r
2686 String chname = mc.group(3);
\r
2691 chid = Long.valueOf(mc.group(1));
\r
2692 Long tsid = (chid & 0x0000FFFF0000L);
\r
2693 if ( tsid == 0x000043100000L || tsid == 0x000043110000L ) {
\r
2694 chname = TEXT_NANSHICHO_HEADER+chname;
\r
2695 System.out.println("[DEBUG] "+chname);
\r
2698 catch (NumberFormatException e) {
\r
2703 boolean dup = false;
\r
2704 for ( TextValueSet t : tvsValue ) {
\r
2705 if ( t.getText().equals(chname) ) {
\r
2716 for ( ; n<tvsValue.size(); n++ ) {
\r
2717 if ( Long.valueOf(tvsValue.get(n).getValue()) > Long.valueOf(chid) ) {
\r
2721 add2tvs(n,tvsValue,chname,mc.group(1));
\r
2724 // 地デジでもBSでもないものは全部CSあつかい
\r
2726 String val = typ.get(mc.group(4));
\r
2727 if (val == null) {
\r
2728 val = typ.get("");
\r
2730 add2tvs(tvsType,chname,val);
\r
2735 System.err.println("=== CHコード一覧 for EDCB ===");
\r
2736 System.err.println("放送局 : \"レコーダの放送局名\",\"放送局コード\"");
\r
2737 System.err.println("=============================");
\r
2739 for ( TextValueSet tv : tvsValue ) {
\r
2740 System.err.println(String.format("%-20s : \"%s\",\"%s\"",tv.getText(),tv.getValue(),tv.getValue()));
\r
2742 System.err.println("=============================");
\r
2745 protected void setSettingEtc(ArrayList<TextValueSet> tvs, String key, int typ, String res) {
\r
2747 Matcher mb = Pattern.compile("<select name=\""+key+"\">([\\s\\S]+?)</select>").matcher(res);
\r
2749 Matcher mc = Pattern.compile("<option value=\"([^\"]*?)\"(\\s*selected\\s*)?>(.*?)\\n").matcher(mb.group(1));
\r
2750 while (mc.find()) {
\r
2751 TextValueSet t = add2tvs(tvs,mc.group(3),mc.group(1));
\r
2752 if (mc.group(2) != null) {
\r
2753 t.setDefval(true);
\r
2760 private boolean isModified(ReserveList o, ReserveList r) {
\r
2761 return ! (isEqualsDate(o, r) && o.getTitle().equals(r.getTitle()));
\r
2763 private boolean isEqualsRsvOnDetail(ReserveList o, ReserveList r) {
\r
2764 // ここまで一緒なら同じ予約情報だろ
\r
2765 return (isEqualsRsvOnList(o, r) && o.getTuner().equals(r.getTuner()));
\r
2767 private boolean isEqualsRsvOnList(ReserveList o, ReserveList r) {
\r
2768 // ここまで一緒なら同じ予約情報だろ
\r
2769 return (isEqualsDate(o, r) && o.getChannel().equals(r.getChannel()));
\r
2771 private boolean isEqualsDate(ReserveList o, ReserveList r) {
\r
2772 return (o.getStartDateTime().equals(r.getStartDateTime()) && o.getEndDateTime().equals(r.getEndDateTime()));
\r
2774 private boolean isLikesRsvOnList(ReserveList o, ReserveList r) {
\r
2775 // ここまで一緒なら親戚の予約情報だろ
\r
2776 return (isLikesDate(o, r) && o.getChannel().equals(r.getChannel()));
\r
2778 private boolean isLikesDate(ReserveList o, ReserveList r) {
\r
2779 return (CommonUtils.getDiffDateTime(o.getStartDateTime(), r.getStartDateTime()) < likersvrange);
\r