OSDN Git Service

[DIGA2100]録画結果一覧取得対応
authorpeeweedee <peeweedee@users.sourceforge.jp>
Fri, 31 May 2013 16:43:21 +0000 (01:43 +0900)
committerpeeweedee <peeweedee@users.sourceforge.jp>
Fri, 31 May 2013 16:43:21 +0000 (01:43 +0900)
TinyBannavi/05_history.txt
TinyBannavi/_lock_ [deleted file]
TinyBannavi/src/.gitignore [deleted file]
TinyBannavi/src/tainavi/AbsPaperView.java
TinyBannavi/src/tainavi/CommonUtils.java
TinyBannavi/src/tainavi/HDDRecorderUtils.java
TinyBannavi/src/tainavi/PlugIn_RecDIGA_DMR_BWT2100.java
TinyBannavi/src/tainavi/PlugIn_RecRD_EDCB.java

index 3b3cf5a..b8036b4 100644 (file)
 2chの番ナビスレ:http://toro.2ch.net/test/read.cgi/av/1352223253/\r
 ★☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆★\r
 \r
+3.22.2β+1.5.12(2013-06-XX)\r
+■変更点\r
+ ・(レコーダ対応[DIGA BWT2100/BZT710/720]) 録画結果一覧の取得に仮対応(最大3ページ60タイトルまでなので、仮)\r
+\r
 3.22.1β+1.5.12(2013-05-23)\r
 ■変更点\r
  ・(web番組表対応) タイトル/番組詳細に"R-15""R-18""R指定"を含む番組に【R】マーク\r
diff --git a/TinyBannavi/_lock_ b/TinyBannavi/_lock_
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/TinyBannavi/src/.gitignore b/TinyBannavi/src/.gitignore
deleted file mode 100644 (file)
index 7c397f6..0000000
+++ /dev/null
@@ -1 +0,0 @@
-/testfield
index 75bdcbb..8df0839 100644 (file)
@@ -1380,6 +1380,10 @@ public abstract class AbsPaperView extends JPanel implements VWTimerRiseListener
                                        }\r
                                        // 局が一致して\r
                                        if (r.getCh_name() == null) {\r
+                                               if ( r.getChannel() == null ) {\r
+                                                       System.err.println(ERRID+"予約情報にCHコードが設定されていません。バグの可能性があります。 recid="+recorder.Myself()+" chname="+r.getCh_name());\r
+                                                       continue;\r
+                                               }\r
                                                if (r.getChannel().length() > 0) {\r
                                                        misCN.put(r.getChannel(),true);\r
                                                }\r
index 80a7262..b856833 100644 (file)
@@ -464,7 +464,7 @@ public class CommonUtils {
         *  @param date YYYY/MM/DD[(.)][ hh:mm[:ss]] or YYYY-MM-DD[Thh:mm[:ss]] or YYYYMMDD[hhmm[ss]]\r
         */\r
        public static GregorianCalendar getCalendar(String date) {\r
-               Matcher ma = Pattern.compile("^(\\d\\d\\d\\d)[/-](\\d\\d)[/-](\\d\\d)(\\(.\\))?([ T](\\d\\d):(\\d\\d)(:\\d\\d)?)?$").matcher(date);\r
+               Matcher ma = Pattern.compile("^(\\d\\d\\d\\d)[/-](\\d{1,2})[/-](\\d{1,2})(\\(.\\))?([ T](\\d{1,2}):(\\d{1,2})(:\\d{1,2})?)?$").matcher(date);\r
                if ( ! ma.find()) {\r
                        ma = Pattern.compile("^(\\d\\d\\d\\d)(\\d\\d)(\\d\\d)()?((\\d\\d)(\\d\\d)(\\d\\d)?)?$").matcher(date);\r
                        if ( ! ma.find()) {\r
index ca2197e..c0fa333 100644 (file)
@@ -1013,6 +1013,36 @@ public class HDDRecorderUtils implements HDDRecorder,Cloneable {
        }\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
index 119b81e..8700f95 100644 (file)
@@ -5,6 +5,7 @@ import java.io.UnsupportedEncodingException;
 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
@@ -113,7 +114,14 @@ public class PlugIn_RecDIGA_DMR_BWT2100 extends HDDRecorderUtils implements HDDR
        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
@@ -286,6 +294,49 @@ public class PlugIn_RecDIGA_DMR_BWT2100 extends HDDRecorderUtils implements HDDR
                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
@@ -1208,6 +1259,8 @@ public class PlugIn_RecDIGA_DMR_BWT2100 extends HDDRecorderUtils implements HDDR
                \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
@@ -1425,6 +1478,8 @@ public class PlugIn_RecDIGA_DMR_BWT2100 extends HDDRecorderUtils implements HDDR
         ******************************************************************************/\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
@@ -1711,6 +1766,171 @@ public class PlugIn_RecDIGA_DMR_BWT2100 extends HDDRecorderUtils implements HDDR
        }\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
index b5b0191..7079bd8 100644 (file)
@@ -436,7 +436,7 @@ public class PlugIn_RecRD_EDCB extends HDDRecorderUtils implements HDDRecorder,C
                        // キャッシュから読み出し(予約一覧)\r
                        setReserves(ReservesFromFile(rsvedFile));\r
                        replaceChNames(cc);\r
-                       if (getDebug()) ShowReserves();\r
+                       if (getDebug()) ShowReserves(getReserves());\r
 \r
                        return true;\r
                }\r
@@ -457,7 +457,7 @@ public class PlugIn_RecRD_EDCB extends HDDRecorderUtils implements HDDRecorder,C
                // 録画済みフラグを立てる(録画結果一覧→予約一覧)\r
                setRecordedFlag();\r
                \r
-               ShowReserves();\r
+               ShowReserves(getReserves());\r
                \r
                return true;\r
        }\r
@@ -492,7 +492,7 @@ public class PlugIn_RecRD_EDCB extends HDDRecorderUtils implements HDDRecorder,C
                        \r
                        // キャッシュから読み出し(録画結果一覧)\r
                        setRecorded(newRecordedList);\r
-                       if (getDebug()) ShowRecorded();\r
+                       if (getDebug()) ShowRecorded(getRecorded());\r
        \r
                        // 録画済みフラグを立てる(録画結果一覧→予約一覧)\r
                        setRecordedFlag();\r
@@ -512,32 +512,11 @@ public class PlugIn_RecRD_EDCB extends HDDRecorderUtils implements HDDRecorder,C
                // 録画済みフラグを立てる(録画結果一覧→予約一覧)\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