OSDN Git Service

TvRockの録画結果一覧取得のバグ修正と機能追加
authorpeeweedee <peeweedee@users.sourceforge.jp>
Fri, 12 Jul 2013 10:36:33 +0000 (19:36 +0900)
committerpeeweedee <peeweedee@users.sourceforge.jp>
Fri, 12 Jul 2013 10:36:33 +0000 (19:36 +0900)
TinyBannavi/05_history.txt
TinyBannavi/src/tainavi/PlugIn_RecRD_TvRock.java

index 9bcbd25..68eb7f1 100644 (file)
  ・(レコーダ対応[DIGA BWT2100/BZT710/720]) 録画結果一覧の取得に仮対応(最大3ページ60タイトルまでなので、仮)\r
  ・(予約ダイアログ) レイアウト変更 ※番組情報ブロックと録画設定ブロックを設定して、各コンポーネントを再配置\r
  ・(リスト形式/新聞形式) 右クリックメニュー最上段に「隣接予約の編集」を追加 ※改変期に同時間帯で番組名が変わった場合などに利用 \r
\80\80ã\83»(ã\81\9dã\81®ä»\96) å\8f³ã\82¯ã\83ªã\83\83ã\82¯ã\83¡ã\83\8bã\83¥ã\83¼ã\81«ã\81®äº\88ç´\84å®\9fè¡\8cã\80\81äº\88ç´\84ONã\83»OFFã\80\81äº\88ç´\84å\89\8aé\99¤ã\80\81å\85\88é\80±ã\81¸ã\82¸ã\83£ã\83³ã\83\97ã\81ªã\81©ã\81«é\96\8bå§\8bæ\97¥æ\99\82ã\81®è¡¨ç¤ºã\82\92追å\8a  \r
+ ・(その他) 右クリックメニューの予約実行、予約ON・OFF、予約削除、先週へジャンプなどに開始日時の表示を追加 \r
  ・(レコーダ対応) 予約一覧取得時の、番組詳細/自動予約一覧/録画結果一覧の同時取得有効無効の取扱いを変更 ※既存の設定は破棄、初回実行時に確認ダイアログが出るので設定しなおす \r
  ・(Web番組表対応) タイトル/番組詳細に「コメンタリ」の文字があったら副音声フラグ([多])を立てるようにした →きんいろモザイク(AT-X)対応\r
  ・(キーワード検索) 検索条件に「副音声/コメンタリ」を追加 \r
  ・(予約ダイアログ) EPG予約を選択した際、マージンが0秒以下なら赤字で警告するようにした\r
+ ・(レコーダ対応[TvRock]) 録画結果一覧の取得で、開始・終了時刻と番組名の変更のログを、その他扱いでなくマッチしそうな番組のエントリに追加するようにした ※番組名一致で処理するので漏れる場合もあるはず\r
 ■バグ修正\r
  ・(その他) SwingWorkerで生成したサブスレッド内で想定外のruntime exceptionが発生するとサブスレッドがログも出さずに死んでしまってエラー原因を調査できなかったが、ログが出るように仕掛けをしたのでその仕掛けがうまく動くようなら今後改善が進んでいくはず\r
  ・(予約ダイアログ) 類似予約テーブルで「類似予約を選択しない」を選んでも、番組ID取得ボタンがリセットされない場合がある問題を修正\r
@@ -30,6 +31,9 @@
  ・(新聞形式) 改変期などで同一時間帯の番組名が変わった時、旧番組用の予約が右クリックメニューオープン時の類似予約にも近接予約にもひっからず表示されてなかったぽいようなそうでもないようなところを修正\r
  ・(その他) 予約ダイアログを開いたとき、類似予約があると裏番組チェックが走らない問題を修正\r
  ・(キーワード検索) 条件設定詳細の記入コンボボックスのEnabled/Editableが正しく設定されていなかった問題を修正 \r
+ ・(レコーダ対応[TvRock]) 録画結果一覧の取得で「予約は実行されませんでした」「ターゲットアプリケーションの異常終了コードを検出しました」が最新のログだと、取得のたびにそのエントリが重複して記録されてしまう問題を修正\r
+ ・(レコーダ対応[TvRock]) 録画結果一覧の取得で保存期間の上限を無視してログをため続ける問題を修正\r
+ ・(レコーダ対応[TvRock]) 録画結果一覧の取得でその他のログが2行発生する問題を修正 ※ただし、次にその他ログが発生するまでは修正されない\r
 \r
 3.22.1β+1.5.12(2013-05-23)\r
 ■変更点\r
index 8bef9e6..cbae688 100644 (file)
@@ -8,6 +8,7 @@ import java.util.ArrayList;
 import java.util.Calendar;\r
 import java.util.GregorianCalendar;\r
 import java.util.HashMap;\r
+import java.util.Map.Entry;\r
 import java.util.regex.Matcher;\r
 import java.util.regex.Pattern;\r
 \r
@@ -91,6 +92,9 @@ public class PlugIn_RecRD_TvRock extends HDDRecorderUtils implements HDDRecorder
        private final String ERRID = "[ERROR]"+MSGID;\r
        private final String DBGID = "[DEBUG]"+MSGID;\r
 \r
+       // 録画結果一覧の特殊日付\r
+       private static final String RECORDED_SPDATE = CommonUtils.getDate(CommonUtils.getCalendar("1970/01/01"));\r
+       \r
        // 定数ではない\r
        private int retryMax = 3;\r
 \r
@@ -957,16 +961,30 @@ public class PlugIn_RecRD_TvRock extends HDDRecorderUtils implements HDDRecorder
        \r
        private boolean GetRdRecordedList(ArrayList<RecordedInfo> newRecordedList) {\r
                \r
+               String cutDate = CommonUtils.getDate(CommonUtils.getCalendar(-86400*getRecordedSaveScope()));\r
                String critDate = null;\r
                if ( newRecordedList.size() > 0 ) {\r
                        // 最新の情報の前日分までチェックする\r
                        GregorianCalendar cal = CommonUtils.getCalendar(newRecordedList.get(0).getDate());\r
                        cal.add(Calendar.DATE, -1);\r
                        critDate = CommonUtils.getDate(cal);\r
+                       \r
+                       // 期限切れの情報のカット\r
+                       ArrayList<RecordedInfo> removeList = new ArrayList<RecordedInfo>();\r
+                       int index=0;\r
+                       for ( ; index < newRecordedList.size(); index++ ) {\r
+                               RecordedInfo entry = newRecordedList.get(index);\r
+                               if ( ! entry.getDate().equals(RECORDED_SPDATE) && entry.getDate().compareTo(cutDate) < 0 ) {\r
+                                       removeList.add(entry);\r
+                               }\r
+                       }\r
+                       for ( RecordedInfo entry : removeList ) {\r
+                               newRecordedList.remove(entry);\r
+                       }\r
                }\r
                else {\r
                        // 既存情報が無ければ上限まで\r
-                       critDate = CommonUtils.getDate(CommonUtils.getCalendar(-86400*getRecordedSaveScope()));\r
+                       critDate = cutDate;\r
                }\r
                \r
                // RDから予約一覧を取り出す\r
@@ -983,9 +1001,9 @@ public class PlugIn_RecRD_TvRock extends HDDRecorderUtils implements HDDRecorder
                }\r
                \r
                String[] list = response.split("\n");\r
-               String other_messages = "";\r
                \r
                HashMap<String,RecordedInfo> results = new HashMap<String,RecordedInfo>();\r
+               ArrayList<RecordedInfo> other_messages_buf = new ArrayList<RecordedInfo>();\r
                \r
                for ( int n=list.length-1; n>=0; n--) {\r
                        if ( list[n].matches(".*(TvRockの(起動|終了)|システム休止|(休止|スタンバイ)[のを]キャンセル|番組情報の取得).*") ) {\r
@@ -1070,9 +1088,9 @@ public class PlugIn_RecRD_TvRock extends HDDRecorderUtils implements HDDRecorder
                                        Matcher mb = Pattern.compile("Sig=(\\d+\\.\\d+),.*, Drop=(\\d+),.*, DiskFree=(\\d+\\.\\d+)\\%",Pattern.DOTALL).matcher(message);\r
                                        if ( mb.find() ) {\r
                                                entry.setSig_z(Float.valueOf(mb.group(1)));\r
-                                               entry.setDrop(Integer.valueOf(mb.group(2)));    // リストに追加するときに調整してください\r
+                                               entry.setDrop(Integer.valueOf(mb.group(2)));                    // リストに追加するときに調整してください\r
                                                entry.setResult(String.format("DiskFree=%s%% Sig=%.2f-%.2fdb",mb.group(3),entry.getSig_a(),entry.getSig_z()));\r
-                                               entry.setSucceeded(Float.valueOf(mb.group(3))>0.1F);\r
+                                               entry.setSucceeded(Float.valueOf(mb.group(3))>0.1F);    // 録画終了時にディスクの空き容量が0.1%(3000GBで3GB)を切っていたら録画失敗じゃないかと\r
                                        }\r
                                        \r
                                        entry.setDetail(entry.getDetail().replaceFirst("#録画終了#", list[n]));\r
@@ -1115,25 +1133,54 @@ public class PlugIn_RecRD_TvRock extends HDDRecorderUtils implements HDDRecorder
                        ma = Pattern.compile("\\[(\\d\\d/\\d\\d/\\d\\d) (\\d\\d):(\\d\\d):.+?\\]:(.*)$",Pattern.DOTALL).matcher(list[n]);\r
                        if ( ma.find() ) {\r
                                \r
+                               // 日付時刻\r
+                               String date = "20"+ma.group(1);\r
+                               String hh = ma.group(2);\r
+                               String mm = ma.group(3);\r
+                               \r
                                String title = "";\r
                                String message = "";\r
-                               Matcher mb = Pattern.compile("番組「(.*?)」の(予約は実行されませんでした)",Pattern.DOTALL).matcher(ma.group(4));\r
-                               if ( mb.find() ) {\r
-                                       title = mb.group(1);\r
-                                       message = mb.group(2);\r
-                               }\r
-                               else if ( (mb = Pattern.compile("ターゲットアプリケーションの異常終了コードを検出しました",Pattern.DOTALL).matcher(ma.group(4))) != null && mb.find() ) {\r
+                               Matcher mb; \r
+                               if ( (mb = Pattern.compile("ターゲットアプリケーションの異常終了コードを検出しました",Pattern.DOTALL).matcher(ma.group(4))) != null && mb.find() ) {\r
                                        title = "<<<エラーメッセージ>>>";\r
                                        message = ma.group(4);\r
                                }\r
+                               else if ( (mb = Pattern.compile("番組「(.*?)」の(予約は実行されませんでした)",Pattern.DOTALL).matcher(ma.group(4))) != null && mb.find() ) {\r
+                                       title = mb.group(1);\r
+                                       message = mb.group(2);\r
+                               }\r
                                else {\r
-                                       other_messages += list[n]+"\n";\r
-                                       continue;\r
+                                       RecordedInfo e = new RecordedInfo();\r
+                                       e.setDate(date);\r
+                                       e.setAhh(hh);\r
+                                       e.setAmm(mm);\r
+                                       if ( (mb = Pattern.compile("番組「(.*?)」の(?:開始|終了)時間を(?:\\d+?)分(?:\\d+?)秒調整しました",Pattern.DOTALL).matcher(ma.group(4))) != null && mb.find() ) {\r
+                                               e.setSucceeded(true);\r
+                                               e.setTitle(mb.group(1));        // 変更された番組のタイトル\r
+                                               e.setDetail(null);\r
+                                               e.setResult(list[n]);\r
+                                               other_messages_buf.add(e);\r
+                                               continue;\r
+                                       }\r
+                                       else if ( (mb = Pattern.compile("番組「(.*?)」のタイトルを「(.*?)」へ調整しました",Pattern.DOTALL).matcher(ma.group(4))) != null && mb.find() ) {\r
+                                               e.setSucceeded(true);\r
+                                               e.setTitle(mb.group(1));        // 変更前のタイトル\r
+                                               e.setDetail(mb.group(2));       // 変更後のタイトル\r
+                                               e.setResult(list[n]);\r
+                                               other_messages_buf.add(e);\r
+                                               continue;\r
+                                       }\r
+                                       else {\r
+                                               e.setSucceeded(false);\r
+                                               e.setTitle(null);\r
+                                               e.setDetail(null);\r
+                                               e.setResult(list[n]);\r
+                                               other_messages_buf.add(e);\r
+                                               continue;\r
+                                       }\r
                                }\r
                                \r
-                               String date = "20"+ma.group(1);\r
-                               String hh = ma.group(2);\r
-                               String mm = ma.group(3);\r
+                               // 新規のエントリを追加する\r
                                \r
                                RecordedInfo entry = new RecordedInfo();\r
                                        \r
@@ -1152,16 +1199,15 @@ public class PlugIn_RecRD_TvRock extends HDDRecorderUtils implements HDDRecorder
                                \r
                                entry.setChannel(null);\r
                                entry.setCh_name("TvRockでは取得できません");\r
+                               entry.setCh_orig(entry.getCh_name());\r
                                \r
                                entry.setResult(message);\r
                                \r
                                entry.setSucceeded(false);\r
                                \r
                                if (entry.getDate().compareTo(critDate) >= 0) addRecorded(newRecordedList, entry);\r
-                       \r
                                continue;\r
                        }\r
-               \r
                }\r
                \r
                for ( RecordedInfo entry : results.values() ) {\r
@@ -1169,12 +1215,68 @@ public class PlugIn_RecRD_TvRock extends HDDRecorderUtils implements HDDRecorder
                                if (entry.getDate().compareTo(critDate) >= 0) addRecorded(newRecordedList,entry);\r
                        }\r
                }\r
+               \r
+               // その他のメッセージの整理\r
+               String other_messages = "";\r
+               for ( RecordedInfo e : other_messages_buf ) {\r
+                       if ( ! e.getSucceeded() ) {\r
+                               other_messages += e.getResult()+"\n";\r
+                               continue;\r
+                       }\r
+                       \r
+                       GregorianCalendar cea = CommonUtils.getCalendar(e.getDate()+" "+e.getAhh()+":"+e.getAmm());\r
+                       for ( RecordedInfo f : newRecordedList ) {\r
+                               GregorianCalendar cfz = CommonUtils.getCalendar(f.getDate()+" "+f.getAhh()+":"+f.getAmm());\r
+                               cfz.add(Calendar.MINUTE, f.getLength());\r
+                               Long dz = CommonUtils.getCompareDateTime(cea, cfz);\r
+                               if ( (dz<=0L && dz>-86400000L*7L) &&\r
+                                               (f.getTitle().equals(e.getTitle()) || (e.getDetail()!=null && f.getTitle().equals(e.getDetail()))) ) {\r
+                                       f.setDetail(f.getDetail()+e.getResult()+"\n");\r
+                                       cea = null;\r
+                                       break;\r
+                               }\r
+                       }\r
+                       if ( cea != null ) {\r
+                               other_messages += e.getResult()+"\n";\r
+                       }\r
+               }\r
 \r
                // その他のログ\r
                if ( other_messages.length() > 0 ) {\r
+                       // 古いその他ログの削除\r
+                       for ( int index=newRecordedList.size()-1; index>=0; index-- ) {\r
+                               if ( ! RECORDED_SPDATE.equals(newRecordedList.get(index).getDate()) ) {\r
+                                       break;\r
+                               }\r
+                               \r
+                               newRecordedList.remove(index);\r
+                       }\r
+                       /* - 新旧ログの重複チェックをしなくてはいけないので保留\r
+                       String old_other_messages = "";\r
+                       String messages_tmp = null;\r
+                       for ( int index=newRecordedList.size()-1; index>=0; index-- ) {\r
+                               if ( ! RECORDED_SPDATE.equals(newRecordedList.get(index).getDate()) ) {\r
+                                       break;\r
+                               }\r
+                               \r
+                               messages_tmp = newRecordedList.remove(index).getDetail();\r
+                       }\r
+                       if ( messages_tmp != null ) {\r
+                               String dt = critDate.substring(2,9);\r
+                               String[] a = messages_tmp.split("\n");\r
+                               \r
+                               for ( String m : a ) {\r
+                                       String mdt = m.substring(1,8);\r
+                                       if ( mdt.compareTo(dt) >= 0 ) {\r
+                                               old_other_messages += m+"\n";\r
+                                       }\r
+                               }\r
+                       }\r
+                       */\r
+                       \r
                        RecordedInfo entry = new RecordedInfo();\r
                        \r
-                       entry.setDate(CommonUtils.getDate(CommonUtils.getCalendar("1970/01/01")));\r
+                       entry.setDate(RECORDED_SPDATE);\r
                        entry.setAhh("00");\r
                        entry.setAmm("00");\r
                        entry.setZhh("00");\r
@@ -1187,14 +1289,12 @@ public class PlugIn_RecRD_TvRock extends HDDRecorderUtils implements HDDRecorder
                        \r
                        entry.setChannel(null);\r
                        entry.setCh_name("TvRockでは取得できません");\r
+                       entry.setCh_orig(entry.getCh_name());\r
                        \r
                        entry.setResult("その他のメッセージ");\r
                        \r
                        entry.setSucceeded(false);\r
 \r
-                       if ( newRecordedList.get(newRecordedList.size()-1).getTitle().equals("<<<その他のメッセージ>>>") ) {\r
-                               newRecordedList.remove(newRecordedList.size()-1);\r
-                       }\r
                        newRecordedList.add(entry);\r
                }\r
 \r