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
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
\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
}\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
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
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
\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
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
\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