}\r
\r
/*******************************************************************************\r
+ * ログ系\r
+ ******************************************************************************/\r
+ \r
+ protected void ShowReserves(ArrayList<ReserveList> ress) {\r
+ \r
+ System.out.println("---Reserved List Start---");\r
+ int i=0;\r
+ for ( ReserveList e : ress ) {\r
+ // 詳細情報の取得\r
+ 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
+ ++i, e.getId(), e.getRec_pattern(), e.getRec_nextdate(), e.getAhh(), e.getAmm(), e.getZhh(), e.getZmm(), e.getRec_min(), e.getContentId(), e.getRec_audio(), e.getTitle(), e.getTitlePop(), e.getChannel(), e.getCh_name(), e.getRecorded()));\r
+ }\r
+ System.out.println("---Reserved List End---");\r
+ \r
+ }\r
+ \r
+ protected void ShowRecorded(ArrayList<RecordedInfo> recs) {\r
+ \r
+ System.out.println("---Recorded List Start---");\r
+ int i=0;\r
+ for ( RecordedInfo e : recs ) {\r
+ // 詳細情報の取得\r
+ System.out.println(String.format("[%s] %s %s\t%s:%s-%s:%s\t%s(%s)\t%s",\r
+ ++i, e.getId(), e.getDate(), e.getAhh(), e.getAmm(), e.getZhh(), e.getZmm(), e.getTitle(), e.getCh_name(), e.getResult()));\r
+ }\r
+ System.out.println("---Recorded List End---");\r
+ \r
+ }\r
+\r
+ /*******************************************************************************\r
* 通信系\r
******************************************************************************/\r
\r
import java.net.URLEncoder;\r
import java.security.MessageDigest;\r
import java.util.ArrayList;\r
+import java.util.Calendar;\r
import java.util.GregorianCalendar;\r
import java.util.Hashtable;\r
import java.util.HashMap;\r
private static final int DIGAEVID_NONE = 0;\r
private static final int DIGAEVID_CANNOTFOLLOW = 0xFFFE;\r
private static final int DIGAEVID_PROGRSV = 0xFFFF;\r
- \r
+\r
+ // 録画結果一覧関連\r
+ private static final int RECITEMPERPAGE = 20; // 予約結果の1ページあたりの件数\r
+ private static final int RECLENGTHDEFAULT = 60; // デフォルトの番組長\r
+\r
+ public void setRecPageMax(int n) { recPageMax = n; }\r
+ private static int recPageMax = 3; // 予約結果を最大何ページ取得するか\r
+\r
// ログ関連\r
\r
private final String MSGID = "["+getRecorderId()+"] ";\r
return true;\r
}\r
\r
+ /*******************************************************************************\r
+ * レコーダーから録画結果一覧を取得する\r
+ ******************************************************************************/\r
+ \r
+ /**\r
+ * @see #GetRdSettings(boolean)\r
+ */\r
+ @Override\r
+ public boolean GetRdRecorded(boolean force) {\r
+ \r
+ System.out.println("レコーダから録画結果一覧を取得します("+force+"): "+getRecorderId()+"("+getIPAddr()+":"+getPortNo()+")");\r
+ \r
+ String recedFile = String.format("%s%s%s.%s_%s_%s.xml", "env", File.separator, "recorded", getIPAddr(), getPortNo(), getRecorderId());\r
+ \r
+ // 既存のログをチェック\r
+ ArrayList<RecordedInfo> newRecordedList = RecordedFromFile(recedFile);\r
+ \r
+ File f = new File(recedFile);\r
+ if ( ! force && f.exists() ) {\r
+ \r
+ // キャッシュから読み出し(録画結果一覧)\r
+ setRecorded(newRecordedList);\r
+ if (getDebug()) ShowRecorded(getRecorded());\r
+ \r
+ // 録画済みフラグを立てる(録画結果一覧→予約一覧)\r
+ setRecordedFlag();\r
+ \r
+ return true;\r
+ }\r
+ \r
+ if ( getDigaRecordedList(newRecordedList) != RETCODE_SUCCESS ) {\r
+ return false;\r
+ }\r
+ setRecorded(newRecordedList); // 置き換え\r
+ RecordedToFile(getRecorded(), recedFile); // キャッシュに保存\r
+ \r
+ // 録画済みフラグを立てる(録画結果一覧→予約一覧)\r
+ setRecordedFlag();\r
+ \r
+ ShowRecorded(getRecorded());\r
+ \r
+ return true;\r
+ }\r
\r
/*******************************************************************************\r
* 新規予約\r
\r
System.out.println("Run: getDigaReserveList");\r
\r
+ reportProgress("予約一覧(詳細を除く)を取得します.");\r
+ \r
// リクエスト発行\r
String[] d = reqDigaPOST("http://"+this.getIPAddr()+":"+this.getPortNo()+"/cgi-bin/dvdr/dvdr_ctrl.cgi", "cCMD_RSVLST.x=39&cCMD_RSVLST.y=16", null);\r
String response = d[1];\r
******************************************************************************/\r
private boolean getDigaReserveDetails(ArrayList<ReserveList> newReserveList, ArrayList<ReserveList> oldReserveList) {\r
\r
+ reportProgress(String.format("予約一覧(詳細)を取得します(%d)",oldReserveList.size()));\r
+ \r
// 詳細情報の取得\r
System.out.println("========");\r
for (int i=0; i<oldReserveList.size(); i++) {\r
}\r
\r
/*******************************************************************************\r
+ * 予約のタイトル一覧を取得する。詳細は{@link #getDigaReserveDetail}で。\r
+ ******************************************************************************/\r
+ \r
+ private int getDigaRecordedList(ArrayList<RecordedInfo> newRecordedList) {\r
+ \r
+ System.out.println("Run: getDigaRecordedList");\r
+\r
+ String baseurl = "http://"+this.getIPAddr()+":"+this.getPortNo()+"/cgi-bin/vttl_list.cgi?VT_TITLEID=&cCMD_VT_SELECT=";\r
+ \r
+ // リクエスト発行\r
+ int pagecnt = 0;\r
+ String topResult = null;\r
+ {\r
+ reportProgress("録画結果一覧を取得します.(1/-)");\r
+ \r
+ String url = baseurl+String.valueOf(0);;\r
+ String[] d = reqDigaGET(url, null);\r
+ if (d[1] == null) {\r
+ // エラーになった場合\r
+ errmsg = "録画結果一覧を取得できませんでした.";\r
+ return(RETCODE_FATAL);\r
+ }\r
+ \r
+ topResult = d[1];\r
+ \r
+ int reccnt = 0;\r
+ Matcher ma = Pattern.compile("番組数:.*?(\\d+)",Pattern.DOTALL).matcher(d[1]);\r
+ if ( ma.find() ) {\r
+ reccnt = Integer.valueOf(ma.group(1));\r
+ int n = reccnt % RECITEMPERPAGE;\r
+ pagecnt = (reccnt-n)/RECITEMPERPAGE + (n==0?0:1);\r
+ }\r
+ }\r
+ \r
+ for ( int p=0; p<pagecnt && p<recPageMax; p++ ) {\r
+ \r
+ int curpage = pagecnt-p-1;\r
+ \r
+ String result = null;\r
+ if ( curpage == 0 ) {\r
+ reportProgress(String.format("取得済みの録画結果一覧を利用します.(%d/%d)",pagecnt-p,pagecnt));\r
+ result = topResult;\r
+ }\r
+ else {\r
+ reportProgress(String.format("録画結果一覧を取得します.(%d/%d)",pagecnt-p,pagecnt));\r
+ \r
+ String url = baseurl+String.valueOf(curpage*RECITEMPERPAGE);\r
+ String[] d = reqDigaGET(url, null);\r
+ if (d[1] == null) {\r
+ // エラーになった場合\r
+ errmsg = "録画結果一覧を取得できませんでした.";\r
+ return(RETCODE_FATAL);\r
+ }\r
+ \r
+ result = d[1];\r
+ }\r
+ \r
+ if ( _getDigaRecordedList(newRecordedList,result) == 0 ) {\r
+ // 追加が0件なら終わってもいいかな\r
+ break;\r
+ }\r
+ }\r
+ \r
+ return RETCODE_SUCCESS;\r
+ }\r
+ \r
+ private int _getDigaRecordedList(ArrayList<RecordedInfo> newRecordedList, String response) {\r
+ \r
+ ArrayList<RecordedInfo> tmpRecordedList = new ArrayList<RecordedInfo>();\r
+ \r
+ Matcher ma = Pattern.compile("<input type=\"checkbox\" name=\"chk(.+?)</tr>",Pattern.DOTALL).matcher(response);\r
+ while ( ma.find() ) {\r
+ String date = null;\r
+ String start = null;\r
+ String recChName = null;\r
+ String title = null;\r
+ Matcher mb = Pattern.compile("<td [^>]*?>(<div [^>]*?>)?<font style=\".*?\">\\s*(.*?)\\s*</font>",Pattern.DOTALL).matcher(ma.group(1));\r
+ for ( int i=1; mb.find(); i++ ) {\r
+ String val = CommonUtils.unEscape(mb.group(2));\r
+ switch ( i ) {\r
+ case 1:\r
+ date = "20"+val;\r
+ break;\r
+ case 3:\r
+ recChName = val;\r
+ break;\r
+ case 4:\r
+ start = val;\r
+ break;\r
+ case 5:\r
+ title = val;\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ }\r
+ \r
+ RecordedInfo entry = new RecordedInfo();\r
+ \r
+ GregorianCalendar ca = CommonUtils.getCalendar(date+" "+start);\r
+ if ( ca == null ) {\r
+ // もうエントリがないっぽい\r
+ break;\r
+ }\r
+ \r
+ entry.setDate(CommonUtils.getDate(ca));\r
+ entry.setAhh(String.format("%02d",ca.get(Calendar.HOUR_OF_DAY)));\r
+ entry.setAmm(String.format("%02d",ca.get(Calendar.MINUTE)));\r
+ entry.setLength(RECLENGTHDEFAULT);\r
+ ca.add(Calendar.MINUTE, entry.getLength());\r
+ entry.setZhh(String.format("%02d",ca.get(Calendar.HOUR_OF_DAY)));\r
+ entry.setZmm(String.format("%02d",ca.get(Calendar.MINUTE)));\r
+ \r
+ String chid = cc.getCH_REC2CODE(recChName);\r
+ if ( chid == null ) {\r
+ // CHコードにできなければ、HTMLから取得した放送局名をそのまま使う\r
+ entry.setChannel(null);\r
+ entry.setCh_name(recChName);\r
+ }\r
+ else {\r
+ entry.setChannel(chid);\r
+ String webChName = cc.getCH_CODE2WEB(chid);\r
+ if ( webChName == null ) {\r
+ // CHコード設定がうまくないようですよ?\r
+ entry.setCh_name(recChName);\r
+ }\r
+ else {\r
+ entry.setCh_name(webChName);\r
+ }\r
+ }\r
+ entry.setCh_orig(recChName);\r
+ \r
+ entry.setTitle(title);\r
+ \r
+ entry.setResult("DIGAでは終了~MPEGの値が取得できません");\r
+ \r
+ entry.setSucceeded(true);\r
+ \r
+ tmpRecordedList.add(0,entry); // テンポラリは日時昇順に構築\r
+ }\r
+ \r
+ int addcnt = 0;\r
+ for ( RecordedInfo e : tmpRecordedList ) {\r
+ boolean isExists = false;\r
+ for ( RecordedInfo d : newRecordedList ) {\r
+ // 既存エントリか?\r
+ if ( d.getDate().equals(e.getDate()) &&\r
+ d.getAhh().equals(e.getAhh()) &&\r
+ d.getAmm().equals(e.getAmm()) &&\r
+ d.getTitle().equals(e.getTitle()) ) {\r
+ isExists = true;\r
+ break;\r
+ }\r
+ }\r
+ if ( ! isExists ) {\r
+ // 既存でなければ挿入(日時降順)\r
+ newRecordedList.add(e);\r
+ ++addcnt;\r
+ }\r
+ }\r
+ \r
+ return addcnt; // 追加0件なら即終了してほしい\r
+ }\r
+ \r
+ /*******************************************************************************\r
* 番組の画質設定を取得する(番組追従なし)\r
******************************************************************************/\r
\r
// キャッシュから読み出し(予約一覧)\r
setReserves(ReservesFromFile(rsvedFile));\r
replaceChNames(cc);\r
- if (getDebug()) ShowReserves();\r
+ if (getDebug()) ShowReserves(getReserves());\r
\r
return true;\r
}\r
// 録画済みフラグを立てる(録画結果一覧→予約一覧)\r
setRecordedFlag();\r
\r
- ShowReserves();\r
+ ShowReserves(getReserves());\r
\r
return true;\r
}\r
\r
// キャッシュから読み出し(録画結果一覧)\r
setRecorded(newRecordedList);\r
- if (getDebug()) ShowRecorded();\r
+ if (getDebug()) ShowRecorded(getRecorded());\r
\r
// 録画済みフラグを立てる(録画結果一覧→予約一覧)\r
setRecordedFlag();\r
// 録画済みフラグを立てる(録画結果一覧→予約一覧)\r
setRecordedFlag();\r
\r
- ShowRecorded();\r
+ ShowRecorded(getRecorded());\r
\r
return true;\r
}\r
\r
- private void ShowReserves() {\r
- System.out.println("---Reserved List Start---");\r
- for ( int i = 0; i<getReserves().size(); i++ ) {\r
- // 詳細情報の取得\r
- ReserveList e = getReserves().get(i);\r
- 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
- (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
- }\r
- System.out.println("---Reserved List End---");\r
- }\r
- private void ShowRecorded() {\r
- System.out.println("---Recorded List Start---");\r
- for ( int i = 0; i<getRecorded().size(); i++ ) {\r
- // 詳細情報の取得\r
- RecordedInfo e = getRecorded().get(i);\r
- System.out.println(String.format("[%s] %s %s\t%s:%s-%s:%s\t%s(%s)\t%s",\r
- (i+1), e.getId(), e.getDate(), e.getAhh(), e.getAmm(), e.getZhh(), e.getZmm(), e.getTitle(), e.getCh_name(), e.getResult()));\r
- }\r
- System.out.println("---Recorded List End---");\r
- }\r
- \r
private boolean GetRdReservedList(ArrayList<ReserveList> newReserveList) {\r
\r
// RDから予約一覧を取り出す\r