OSDN Git Service

56ae305d9708f616ef8eaf5b52ab964d0eff5f38
[tainavi/TinyBannavi.git] / TinyBannavi / src / tainavi / PlugIn_RecRD_S600.java
1 package tainavi;\r
2 \r
3 import java.io.File;\r
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.Hashtable;\r
9 import java.util.regex.Matcher;\r
10 import java.util.regex.Pattern;\r
11 \r
12 \r
13 /*\r
14  * \r
15  */\r
16 \r
17 public class PlugIn_RecRD_S600 extends HDDRecorderUtils implements HDDRecorder,Cloneable {\r
18 \r
19         @Override\r
20         public PlugIn_RecRD_S600 clone() {\r
21                 return (PlugIn_RecRD_S600) super.clone();\r
22         }\r
23         \r
24         private static final String thisEncoding = "MS932";\r
25 \r
26         /* 必須コード  - ここから */\r
27         \r
28         // 種族の特性\r
29         @Override\r
30         public String getRecorderId() { return "VARDIA RD-S600"; }\r
31         @Override\r
32         public RecType getType() { return RecType.RECORDER; }\r
33         \r
34         // 個体の特性\r
35         private GetRDStatus gs = new GetRDStatus();\r
36         private ChannelCode cc = new ChannelCode(getRecorderId());\r
37         private String rsvedFile = "";\r
38         \r
39         private String errmsg = "";\r
40 \r
41         // 公開メソッド\r
42         \r
43         /*\r
44          * \r
45          */\r
46         @Override\r
47         public ChannelCode getChCode() {\r
48                 return cc;\r
49         }\r
50         \r
51         /*\r
52          * チャンネルリモコン機能\r
53          */\r
54         @Override\r
55         public boolean ChangeChannel(String Channel) {\r
56                 \r
57                 if (Channel == null) {\r
58                         return true;\r
59                 }\r
60                 \r
61                 int curBC;\r
62                 int newBC;\r
63                 String chNo;\r
64                 byte enc;\r
65                 \r
66                 errmsg = "";\r
67                 \r
68                 /*\r
69                  * 変更前の放送(地上波/BS/CS)\r
70                  */\r
71                 {\r
72                         String ch = null;\r
73                         for (int i=0; i<3 && (ch = gs.getCurChannel(getIPAddr())) == null; i++) {\r
74                                 CommonUtils.milSleep(500);\r
75                         }\r
76                         if (ch == null) {\r
77                                 errmsg = "レコーダへのアクセスに失敗しました(チャンネルリモコン)。";\r
78                                 System.err.println(errmsg);\r
79                                 return false;\r
80                         }\r
81                         \r
82                         byte[] ba = ch.getBytes();\r
83                         enc = ba[0];\r
84                         ch = ch.substring(1,5);\r
85                         \r
86                         if (ch.matches("^\\d.+")) {\r
87                                 curBC = 0;\r
88                         }\r
89                         else if (ch.startsWith("BS")) {\r
90                                 curBC = 1;\r
91                         }\r
92                         else if (ch.startsWith("CS")) {\r
93                                 curBC = 2;\r
94                         }\r
95                         else {\r
96                                 errmsg = "現在のチャンネルが認識できません("+ch+")。";\r
97                                 System.err.println(errmsg);\r
98                                 return false;\r
99                         }\r
100                 }\r
101                 \r
102                 /*\r
103                  * 変更後のCH\r
104                  */\r
105                 {\r
106                         // 放送(地上波/BS/CS)\r
107                         String cd = cc.getCH_WEB2CODE(Channel);\r
108                         String ch = cc.getCH_CODE2REC(cd);\r
109                         String typ = text2value(chtype, cd);\r
110                         if (typ == null) {\r
111                                 errmsg = "鯛ナビに情報が同期されていないチャンネルです("+Channel+", "+ch+")。";\r
112                                 System.err.println(errmsg);\r
113                                 return false;\r
114                         }\r
115                         else if (typ.matches("^l[123]$")) {\r
116                                 errmsg = "外部入力にアサインされているチャンネルには変更できません("+Channel+", "+ch+", "+typ+")。";\r
117                                 System.err.println(errmsg);\r
118                                 return false;\r
119                         }\r
120                         else if (typ.equals("uvd")) {\r
121                                 newBC = 0;\r
122                         }\r
123                         else if (typ.equals("bsd")) {\r
124                                 newBC = 1;\r
125                         }\r
126                         else if (typ.equals("csd")) {\r
127                                 newBC = 2;\r
128                         }\r
129                         else {\r
130                                 errmsg = "放送種別が識別できません。プログラム異常です("+Channel+", "+ch+")。";\r
131                                 System.err.println(errmsg);\r
132                                 return false;\r
133                         }\r
134                         \r
135                         // CH番号\r
136                         Matcher ma = Pattern.compile("(\\d\\d\\d)").matcher(ch);\r
137                         if (ma.find()) {\r
138                                 chNo = ma.group(1);\r
139                         }\r
140                         else {\r
141                                 errmsg = "CH番号が取得できません("+Channel+", "+ch+")。";\r
142                                 System.err.println(errmsg);\r
143                                 return false;\r
144                         }\r
145                 }\r
146                 \r
147                 /*\r
148                  * CH変更実行\r
149                  */\r
150                 \r
151                 // おまじない\r
152                 Authenticator.setDefault(new MyAuthenticator(getUser(), getPasswd()));\r
153                 \r
154                 int cBC;\r
155                 for (int i=0; i<4 && newBC != (cBC = (curBC+i)%4); i++) {\r
156                         // 地上アナログ(3)が選択できるのはRE(0x06)だけ\r
157                         if (enc != 0x06 && cBC == 3) {\r
158                                 continue;\r
159                         }\r
160                         \r
161                         // 切り替え実行\r
162                         reqGET("http://"+getIPAddr()+":"+getPortNo()+"/remote/remote.htm?key=21", null);\r
163                         \r
164                         // 地上波→BS・BS→CSは切り替え完了までに時間がかかる\r
165                         CommonUtils.milSleep((cBC == 0 || cBC == 1)?(3000):(1000));\r
166                 }\r
167                 \r
168                 reqGET("http://"+getIPAddr()+":"+getPortNo()+"/remote/remote.htm?key=25", null);\r
169                 CommonUtils.milSleep(1000);\r
170                 for (int i=0; i<3; i++) {\r
171                         reqGET("http://"+getIPAddr()+":"+getPortNo()+"/remote/remote.htm?key=0"+chNo.substring(i,i+1), null);\r
172                         CommonUtils.milSleep(200);\r
173                 }\r
174                 reqGET("http://"+getIPAddr()+":"+getPortNo()+"/remote/remote.htm?key=44", null);\r
175                 \r
176                 return true;\r
177         }\r
178 \r
179         /*\r
180          *      レコーダーから予約一覧を取得する \r
181          */\r
182         @Override\r
183         public boolean GetRdReserve(boolean force)\r
184         {\r
185                 System.out.println("Run: GetRdReserve("+force+")");\r
186                 \r
187                 errmsg = "";\r
188                 \r
189                 //\r
190                 rsvedFile = "env/reserved."+getIPAddr()+"_"+getPortNo()+"_"+getRecorderId()+".xml";\r
191                 String vrateTFile = "env/videorate."+getIPAddr()+"_"+getPortNo()+"_"+getRecorderId()+".xml";\r
192                 String arateTFile = "env/audiorate."+getIPAddr()+"_"+getPortNo()+"_"+getRecorderId()+".xml";\r
193                 String folderTFile = "env/folders."+getIPAddr()+"_"+getPortNo()+"_"+getRecorderId()+".xml";\r
194                 String encoderTFile = "env/encoders."+getIPAddr()+"_"+getPortNo()+"_"+getRecorderId()+".xml";\r
195                 String dvdcompatTFile = "env/dvdcompat."+getIPAddr()+"_"+getPortNo()+"_"+getRecorderId()+".xml";\r
196                 String deviceTFile = "env/device."+getIPAddr()+"_"+getPortNo()+"_"+getRecorderId()+".xml";\r
197                 String xChapterTFile = "env/xchapter."+getIPAddr()+"_"+getPortNo()+"_"+getRecorderId()+".xml";\r
198                 String msChapterTFile = "env/mschapter."+getIPAddr()+"_"+getPortNo()+"_"+getRecorderId()+".xml";\r
199                 String mvChapterTFile = "env/mvchapter."+getIPAddr()+"_"+getPortNo()+"_"+getRecorderId()+".xml";\r
200                 String chValueTFile = "env/chvalue."+getIPAddr()+"_"+getPortNo()+"_"+getRecorderId()+".xml";\r
201                 String chTypeTFile = "env/chtype."+getIPAddr()+"_"+getPortNo()+"_"+getRecorderId()+".xml";\r
202 \r
203                 File f = new File(rsvedFile);\r
204                 if ( force == false && f.exists()) {\r
205                         // キャッシュから読み出し(録画設定ほか)\r
206                         vrate = TVSload(vrateTFile);\r
207                         if ( vrate.size() > 0 ) {\r
208                                 System.out.println("+video rate="+vrateTFile);\r
209                         }\r
210                         arate = TVSload(arateTFile);\r
211                         if ( arate.size() > 0 ) {\r
212                                 System.out.println("+audio rate="+arateTFile);\r
213                         }\r
214                         folder = TVSload(folderTFile);\r
215                         if ( folder.size() > 0 ) {\r
216                                 System.out.println("+folder="+folderTFile);\r
217                         }\r
218                         encoder = TVSload(encoderTFile);\r
219                         if ( encoder.size() > 0 ) {\r
220                                 System.out.println("+encoder="+encoderTFile);\r
221                         }\r
222                         dvdcompat = TVSload(dvdcompatTFile);\r
223                         if ( dvdcompat.size() > 0 ) {\r
224                                 System.out.println("+dvdcompat="+dvdcompatTFile);\r
225                         }\r
226                         device = TVSload(deviceTFile);\r
227                         if ( device.size() > 0 ) {\r
228                                 System.out.println("+device="+deviceTFile);\r
229                         }\r
230                         // 自動チャプタ関連\r
231                         xchapter = TVSload(xChapterTFile);\r
232                         if ( xchapter.size() > 0 ) {\r
233                                 System.out.println("+xchapter="+xChapterTFile);\r
234                         }\r
235                         mschapter = TVSload(msChapterTFile);\r
236                         if ( mschapter.size() > 0 ) {\r
237                                 System.out.println("+mschapter="+msChapterTFile);\r
238                         }\r
239                         mvchapter = TVSload(mvChapterTFile);\r
240                         if ( mvchapter.size() > 0 ) {\r
241                                 System.out.println("+mvchapter="+mvChapterTFile);\r
242                         }\r
243                         // チャンネルコードバリュー\r
244                         chvalue = TVSload(chValueTFile);\r
245                         if ( chvalue.size() > 0 ) {\r
246                                 System.out.println("+chvalue="+chValueTFile);\r
247                         }\r
248                         chtype = TVSload(chTypeTFile);\r
249                         if ( chtype.size() > 0 ) {\r
250                                 System.out.println("+chtype="+chTypeTFile);\r
251                         }\r
252                         \r
253                         // キャッシュから読み出し(予約一覧)\r
254                         setReserves(ReservesFromFile(rsvedFile));\r
255                         if (getReserves().size() > 0) {\r
256                                 System.out.println("+read from="+rsvedFile);\r
257                         }\r
258                         \r
259                         // なぜか設定ファイルが空になっている場合があるので、その際は再取得する\r
260                         if (vrate.size()>0 && arate.size()>0 &&\r
261                                         folder.size()>0 && encoder.size()>0 && device.size()>0 &&\r
262                                         xchapter.size()>0 && mschapter.size()>0 && mvchapter.size()>0) {\r
263                                 return(true);\r
264                         }\r
265                         \r
266                         //getReserves().removeAll(getReserves());\r
267                 }\r
268                 \r
269                 // おまじない\r
270                 Authenticator.setDefault(new MyAuthenticator(getUser(), getPasswd()));\r
271 \r
272                 // RDから予約一覧を取り出す\r
273                 Matcher ma = null;\r
274                 String idx = "";\r
275                 String header="";\r
276                 String response="";\r
277                 {\r
278                         reportProgress("get reserved list(1/4).");\r
279                         String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/reserve/b_rsv.htm",null);\r
280                         header = d[0];\r
281                         response = d[1];\r
282                         \r
283                         if (response == null) {\r
284                                 errmsg = "レコーダーが反応しません";\r
285                                 return(false);\r
286                         }\r
287                 }\r
288                 ma = Pattern.compile("/reserve/(\\d+?)/reserve.htm").matcher(response);\r
289                 if (ma.find()) {\r
290                         idx = ma.group(1);\r
291                         reportProgress("get reserved list(2/4).");\r
292                         String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/reserve/"+idx+"/reserve.htm",null);\r
293                         header = d[0];\r
294                         response = d[1];\r
295                         \r
296                         if (response == null) {\r
297                                 errmsg = "レコーダーが反応しません";\r
298                                 return(false);\r
299                         }\r
300                 }\r
301                 \r
302                 // 予約エントリー数を取得する\r
303                 int RsvCnt = 0;\r
304                 ma = Pattern.compile("RsvCnt\\s*=\\s*(\\d+?);").matcher(response);\r
305                 if ( ! ma.find()) {\r
306                         errmsg = "レコーダーからの情報取得に失敗しました(予約一覧)";\r
307                         return false;\r
308                 }\r
309                 RsvCnt = Integer.valueOf(ma.group(1));\r
310                 \r
311                 // (1)録画設定の取得\r
312                 {\r
313                         // ハング防止のおまじない\r
314                         reportProgress("get reserved list(3/4).");\r
315                         reqGET("http://"+getIPAddr()+":"+getPortNo()+"/reserve/"+idx+"/b_rsvinfo.htm?0&"+(RsvCnt+1),null);\r
316                 }\r
317                 {\r
318                         reportProgress("get reserved list(4/4).");\r
319                         String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/reserve/"+idx+"/rsvinfo.htm",null);\r
320                         String hdr = d[0];\r
321                         String res = d[1];\r
322                         Matcher mb = null;\r
323                         \r
324                         // 正常取得チェック\r
325                         if ( ! res.matches("[\\s\\S]*var hdd_folder_text[\\s\\S]*")) {\r
326                                 errmsg = "レコーダーからの情報取得に失敗しました(録画設定)";\r
327                                 return false;\r
328                         }\r
329                         \r
330                         // (1-1)画質設定\r
331                         setSettingEtc(vrate,"vrate",1,res);\r
332                         TVSsave(vrate, vrateTFile);\r
333                         \r
334                         // (1-2)音質設定\r
335                         setSettingEtc(arate,"amode",0,res);\r
336                         TVSsave(arate, arateTFile);\r
337                         \r
338                         // (1-3)フォルダ一覧\r
339                         setSettingEtc(folder,"hdd_folder",1,res);\r
340                         TVSsave(folder, folderTFile);\r
341                         \r
342                         // (1-4)エンコーダ\r
343                         encoder.clear();\r
344                         \r
345                         mb = Pattern.compile("var double_encode_flg = (\\d+?);").matcher(res);\r
346                         while (mb.find()) {\r
347                                 Matcher mc = Pattern.compile("\\n\\s*?switch \\( double_encode_flg \\) \\{([\\s\\S]+?default:)").matcher(res);\r
348                                 if (mc.find()) {\r
349                                         Matcher md = Pattern.compile("(case "+mb.group(1)+":[\\s\\S]+?break;)").matcher(mc.group(1));\r
350                                         if (md.find()) {\r
351                                                 Matcher me = Pattern.compile("name=enc_type value=.\"(\\d+?).\"[\\s\\S]+?toru_(.+?)\\.gif").matcher(md.group(1));\r
352                                                 while (me.find()) {\r
353                                                         TextValueSet t = new TextValueSet();\r
354                                                         t.setText(me.group(2));\r
355                                                         t.setValue(me.group(1));\r
356                                                         encoder.add(t);\r
357                                                 }\r
358                                         }\r
359                                 }\r
360                         }\r
361                         \r
362                         TVSsave(encoder, encoderTFile);\r
363                         \r
364                         // (1-5)DVD互換モード\r
365                         setSettingEtc(dvdcompat,"dvdr",0,res);\r
366                         TVSsave(dvdcompat, dvdcompatTFile);\r
367                         \r
368                         // (1-6)記録先デバイス\r
369                         setSettingEtc(device,"media",0,res);\r
370                         TVSsave(device, deviceTFile);\r
371                         \r
372                         // (1-7)自動チャプター関連\r
373                         setSettingEtc(xchapter,"mutechapter",0,res);\r
374                         TVSsave(xchapter, xChapterTFile);\r
375                         \r
376                         setSettingEtc(mschapter,"magicchapter",0,res);\r
377                         TVSsave(mschapter, msChapterTFile);\r
378 \r
379                         setSettingEtc(mvchapter,"cmchapter",0,res);\r
380                         TVSsave(mvchapter, mvChapterTFile);\r
381                         \r
382                         // (1-8)チャンネルコードバリュー\r
383                         chvalue.clear();\r
384                         chtype.clear();\r
385                         for ( String typ : new String[] { "uvd","bsd","csd","uva","bsa","l1","l2","l3" } ) {\r
386                                 String txtkey = typ+"_ch_text";\r
387                                 String valkey = typ+"_ch_value";\r
388                                 Matcher mc = Pattern.compile("var "+txtkey+"\\s*= new Array\\(([\\s\\S]+?)\\);").matcher(res);\r
389                                 Matcher md = Pattern.compile("var "+valkey+"\\s*= new Array\\(([\\s\\S]+?)\\);").matcher(res);\r
390                                 if ( mc.find() && md.find() ) {\r
391                                         Matcher me = Pattern.compile("\"(.+?)\",?").matcher(mc.group(1));\r
392                                         Matcher mf = null;\r
393                                         if ( typ.equals("uva") ) {\r
394                                                 mf = Pattern.compile("(\\d+),").matcher(md.group(1));\r
395                                         }\r
396                                         else {\r
397                                                 mf = Pattern.compile("\"([^\"]+?)\",").matcher(md.group(1));\r
398                                         }\r
399                                         while ( me.find() && mf.find() ) {\r
400                                                 TextValueSet t = new TextValueSet();\r
401                                                 t.setText(me.group(1));\r
402                                                 t.setValue(mf.group(1));\r
403                                                 chvalue.add(t);\r
404                                                 \r
405                                                 TextValueSet x = new TextValueSet();\r
406                                                 x.setText(mf.group(1));\r
407                                                 x.setValue(typ);\r
408                                                 chtype.add(x);\r
409                                         }\r
410                                 }\r
411                         }\r
412                         TVSsave(chvalue, chValueTFile);\r
413                         TVSsave(chtype, chTypeTFile);\r
414                 }\r
415                 \r
416                 // 予約一覧データの分析\r
417                 // 情報ブロックをとりだし…\r
418                 {\r
419                         //int cnt = 0;\r
420                         ArrayList<ReserveList> newReserveList = new ArrayList<ReserveList>();\r
421                         \r
422                         ma = Pattern.compile("(c1\\[\\d+?\\]=[\\s\\S]+?\";)\\n").matcher(response);\r
423                         while ( ma.find() ) {\r
424                                 // 個々のデータを取り出す\r
425                                 ReserveList entry = new ReserveList();\r
426                                 \r
427                                 Matcher mb = null;\r
428                                         \r
429                                 String[] d = new String[17];\r
430                                 mb = Pattern.compile("c\\d+?\\[\\d+?\\]=\"(.*?)\";").matcher(ma.group(1));\r
431                                 for (int i=0; i<d.length; i++) {\r
432                                         if ( mb.find()) {\r
433                                                 d[i] = mb.group(1);\r
434                                         }\r
435                                         //System.out.println(i+") "+d[i]);\r
436                                 }\r
437                                 \r
438                                 // 実行ON/OFF\r
439                                 if ( ! d[1].equals("1")) {\r
440                                         entry.setExec(false);\r
441                                 }\r
442                                 \r
443                                 // 予約名のエスケープを解除する\r
444                                 String title = d[2];\r
445                                 mb = Pattern.compile("<BR>").matcher(title);    // 余計な改行の削除\r
446                                 if (mb.find()) title = mb.replaceAll("");\r
447                                 mb = Pattern.compile("&quot;").matcher(title);\r
448                                 if (mb.find()) title = mb.replaceAll("\"");\r
449                                 mb = Pattern.compile("&lt;").matcher(title);\r
450                                 if (mb.find()) title = mb.replaceAll("<");\r
451                                 mb = Pattern.compile("&gt;").matcher(title);\r
452                                 if (mb.find()) title = mb.replaceAll(">");\r
453                                 mb = Pattern.compile("&nbsp;").matcher(title);\r
454                                 if (mb.find()) title = mb.replaceAll(" ");\r
455                                 \r
456                                 entry.setId(d[0]);\r
457                                 entry.setRec_pattern(d[5]);\r
458                                 entry.setRec_pattern_id(getRec_pattern_Id(entry.getRec_pattern()));\r
459                                 mb = Pattern.compile("(\\d\\d):(\\d\\d).*?(\\d\\d):(\\d\\d)").matcher(d[6]+"-"+d[7]);\r
460                                 if (mb.find()) {\r
461                                         entry.setAhh(mb.group(1));\r
462                                         entry.setAmm(mb.group(2));\r
463                                         entry.setZhh(mb.group(3));\r
464                                         entry.setZmm(mb.group(4));\r
465                                 }\r
466                                 entry.setRec_nextdate(CommonUtils.getNextDate(entry));\r
467                                 //entry.setRec_nextdate(getNextDate(entry.getRec_pattern(), entry.getZhh()+":"+entry.getZmm()));\r
468                                 entry.setRec_min(CommonUtils.getRecMin(entry.getAhh(), entry.getAmm(), entry.getZhh(), entry.getZmm()));\r
469                                 getStartEndDateTime(entry);\r
470                                 \r
471                                 if (d[3].equals("18") || d[3].equals("10")  || d[3].equals("9")) {\r
472                                         entry.setTuner("TS2");\r
473                                 }\r
474                                 else if (d[3].equals("17") || d[3].equals("12")  || d[3].equals("11")) {\r
475                                         entry.setTuner("TS1");\r
476                                 }\r
477                                 else if (d[3].equals("16") || d[3].equals("7")) {\r
478                                         entry.setTuner("RE");\r
479                                 }\r
480                                 else {\r
481                                         entry.setTuner("--");\r
482                                 }\r
483                                 \r
484                                 entry.setRec_mode(d[9]);\r
485                                 entry.setTitle(title);\r
486                                 entry.setTitlePop(TraceProgram.replacePop(title));\r
487                                 entry.setCh_name(cc.getCH_REC2WEB(d[4]));\r
488                                 entry.setChannel(d[4]);\r
489         \r
490                                 //entry.setRec_audio(_recstr2audio(d[10]));\r
491                                 entry.setRec_audio(d[10]);\r
492 \r
493                                 //entry.rec_folder = data.get();        // 予約一覧からはとれない\r
494                                 //entry.rec_genre = data.get();         // 予約一覧からはとれない\r
495 \r
496                                 // タイトル自動補完フラグなど本体からは取得できない情報を引き継ぐ\r
497                                 copyAttributes(entry, getReserves());\r
498                                 \r
499                                 // 予約情報を保存\r
500                                 newReserveList.add(entry.clone());\r
501                         }\r
502                         setReserves(newReserveList);\r
503                 }\r
504                 \r
505                 // 取得した情報の表示\r
506                 System.out.println("---Reserved List Start---");\r
507                 for ( int i = 0; i<getReserves().size(); i++ ) {\r
508                         // 詳細情報の取得\r
509                         ReserveList e = getReserves().get(i);\r
510                         System.out.println(String.format("[%s] %s\t%s\t%s\t%s:%s\t%s:%s\t%sm\t%s\t%s\t%s\t%s",\r
511                                         (i+1), e.getId(), e.getRec_pattern(), e.getRec_nextdate(), e.getAhh(), e.getAmm(), e.getZhh(),  e.getZmm(),     e.getRec_min(), e.getRec_mode(), e.getTitle(), e.getChannel(), e.getCh_name()));\r
512                 }\r
513                 System.out.println("---Reserved List End---");\r
514                 \r
515                 // キャッシュに保存\r
516                 ReservesToFile(getReserves(), rsvedFile);\r
517                 \r
518                 return(true);\r
519         }\r
520         \r
521         /*\r
522          *      予約を実行する\r
523          */\r
524         @Override\r
525         public boolean PostRdEntry(ReserveList r)\r
526         {\r
527                 //\r
528                 if (cc.getCH_WEB2CODE(r.getCh_name()) == null) {\r
529                         errmsg = "【警告】Web番組表の放送局名「"+r.getCh_name()+"」をCHコードに変換できません。CHコード設定を修正してください。" ;\r
530                         System.out.println(errmsg);\r
531                         return(false);\r
532                 }\r
533                 \r
534                 System.out.println("Run: PostRdEntry("+r.getTitle()+")");\r
535                 \r
536                 errmsg = "";\r
537 \r
538                 // おまじない\r
539                 Authenticator.setDefault(new MyAuthenticator(getUser(), getPasswd()));\r
540                 \r
541                 // RDから予約一覧を取り出す\r
542                 Matcher ma = null;\r
543                 String idx = "";\r
544                 String header;\r
545                 String response;\r
546                 {\r
547                         reportProgress("get reserved list(1/7).");\r
548                         String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/reserve/b_rsv.htm",null);\r
549                         header = d[0];\r
550                         response = d[1];\r
551                         \r
552                         if ( response == null ) {\r
553                                 errmsg = "レコーダーが反応しません。";\r
554                                 return(false);\r
555                         }\r
556                 }\r
557                 ma = Pattern.compile("/reserve/(\\d+?)/reserve.htm").matcher(response);\r
558                 if (ma.find()) {\r
559                         reportProgress("get reserved list(2/7).");\r
560                         idx = ma.group(1);\r
561                         String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/reserve/"+idx+"/reserve.htm",null);\r
562                         header = d[0];\r
563                         response = d[1];\r
564                         \r
565                         if ( response == null ) {\r
566                                 errmsg = "レコーダーが反応しません。";\r
567                                 return(false);\r
568                         }\r
569                 }\r
570                 \r
571                 // 予約エントリー数を取得する\r
572                 int RsvCnt = 0;\r
573                 ma = Pattern.compile("RsvCnt\\s*=\\s*(\\d+?);").matcher(response);\r
574                 if (ma.find()) {\r
575                         RsvCnt = Integer.valueOf(ma.group(1));\r
576                 }\r
577         \r
578                 // RDに新規登録要請\r
579                 {\r
580                         // ハング防止のおまじない\r
581                         reportProgress("get program(3/7).");\r
582                         reqGET("http://"+getIPAddr()+":"+getPortNo()+"/reserve/"+idx+"/b_rsvinfo.htm?0&"+(RsvCnt+1),null);\r
583                         \r
584                         reportProgress("get program(4/7).");\r
585                         reqGET("http://"+getIPAddr()+":"+getPortNo()+"/reserve/"+idx+"/rsvinfo.htm",null);\r
586                 }\r
587                 \r
588                 // POSTデータを変換する\r
589                 Hashtable<String, String> pdat = modPostdata(r);\r
590                 \r
591                 // RDへの情報作成\r
592                 String pstr = joinPoststr(pdat);\r
593 \r
594                 // RDへ情報送信\r
595                 {               \r
596                         reportProgress("send request.(5/7)");\r
597                         String[] d = reqPOST("http://"+getIPAddr()+":"+getPortNo()+"/reserve/"+idx+"/entry.htm", pstr, null);\r
598                         header = d[0];\r
599                         response = d[1];\r
600                 }\r
601                 \r
602                 // 登録結果の確認\r
603                 ma = Pattern.compile("alert\\(msg\\)").matcher(response);\r
604                 if ( ma.find() ) {\r
605                         Matcher mb = Pattern.compile("\\bmsg=\"([\\s\\S]+?)\";").matcher(response);\r
606                         if (mb.find()) {\r
607                                 errmsg = mb.group(1);\r
608                                 System.out.printf("\n<<< Message from RD >>> \"%s\"\n\n", errmsg);\r
609                                 Matcher mc = Pattern.compile("(予約時間が重複しています。|修正しました。)").matcher(errmsg);\r
610                                 if ( ! mc.find() ) {\r
611                                         return(false);\r
612                                 }\r
613                         }                       \r
614                 }\r
615 \r
616 \r
617                 \r
618                 /*\r
619                  * 予約情報の調整 \r
620                  */\r
621                 \r
622                 // 予約ID番号を取得(キャッシュに存在しない番号が新番号)\r
623                 {\r
624                         reportProgress("get identifier(6/7).");\r
625                         String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/reserve/b_rsv.htm",null);\r
626                         header = d[0];\r
627                         response = d[1];\r
628                 }\r
629                 ma = Pattern.compile("/reserve/(\\d+?)/reserve.htm").matcher(response);\r
630                 if (ma.find()) {\r
631                         idx = ma.group(1);\r
632                         reportProgress("get identifier(7/7).");\r
633                         String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/reserve/"+idx+"/reserve.htm",null);\r
634                         header = d[0];\r
635                         response = d[1];\r
636                 }\r
637                 r.setId(getNewId(response));\r
638 \r
639                 // 予約パターンID\r
640                 r.setRec_pattern_id(getRec_pattern_Id(r.getRec_pattern()));\r
641 \r
642                 // 次回予定日\r
643                 r.setRec_nextdate(CommonUtils.getNextDate(r));\r
644                 //r.setRec_nextdate(getNextDate(r.getRec_pattern(), r.getZhh()+":"+r.getZmm()));\r
645                 \r
646                 // 録画長\r
647                 r.setRec_min(CommonUtils.getRecMin(r.getAhh(),r.getAmm(),r.getZhh(),r.getZmm()));\r
648                 \r
649                 // 開始日時・終了日時\r
650                 getStartEndDateTime(r);\r
651                 \r
652                 // 予約リストを更新\r
653                 getReserves().add(r);\r
654                 \r
655                 // キャッシュに保存\r
656                 ReservesToFile(getReserves(), rsvedFile);\r
657                 \r
658                 System.out.printf("\n<<< Message from RD >>> \"%s\"\n\n", "正常に登録できました。");\r
659                 return(true);\r
660         }\r
661 \r
662         \r
663         /*\r
664          *      予約を更新する\r
665          */\r
666         @Override\r
667         public boolean UpdateRdEntry(ReserveList o, ReserveList r) {\r
668                 //\r
669                 if (cc.getCH_WEB2CODE(r.getCh_name()) == null) {\r
670                         errmsg = "【警告】Web番組表の放送局名「"+r.getCh_name()+"」をCHコードに変換できません。CHコード設定を修正してください。" ;\r
671                         System.out.println(errmsg);\r
672                         return(false);\r
673                 }\r
674                 \r
675                 System.out.println("Run: UpdateRdEntry()");\r
676                 \r
677                 errmsg = "";\r
678 \r
679                 // おまじない\r
680                 Authenticator.setDefault(new MyAuthenticator(getUser(), getPasswd()));\r
681                 \r
682                 // 更新準備\r
683                 Matcher ma = null;\r
684                 String idx = "";\r
685                 int lineno = 0;\r
686                 String header;\r
687                 String response;\r
688                 {\r
689                         reportProgress("get identifier(1/5).");\r
690                         String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/reserve/b_rsv.htm",null);\r
691                         header = d[0];\r
692                         response = d[1];\r
693                 }\r
694                 ma = Pattern.compile("/reserve/(\\d+?)/reserve.htm").matcher(response);\r
695                 if (ma.find()) {\r
696                         idx = ma.group(1);\r
697                         reportProgress("get identifier(2/5).");\r
698                         String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/reserve/"+idx+"/reserve.htm",null);\r
699                         header = d[0];\r
700                         response = d[1];\r
701                 }\r
702                 ma = Pattern.compile("c1\\[(\\d+?)\\]=\""+r.getId()+"\";").matcher(response);\r
703                 if ( ma.find() ) {\r
704                         lineno = Integer.valueOf(ma.group(1))+1;\r
705                 }\r
706                 \r
707                 // RDに更新要請\r
708                 {\r
709                         // ハング防止のおまじない\r
710                         reportProgress("get program(3/5).");\r
711                         reqGET("http://"+getIPAddr()+":"+getPortNo()+"/reserve/"+idx+"/b_rsvinfo.htm?"+r.getId()+"&"+lineno,null);\r
712                         \r
713                         reportProgress("get program(4/5).");\r
714                         reqGET("http://"+getIPAddr()+":"+getPortNo()+"/reserve/"+idx+"/rsvinfo.htm",null);\r
715                 }\r
716 \r
717                 // POSTデータを変換する\r
718                 Hashtable<String, String> pdat = modPostdata(r);\r
719                 \r
720                 // RDへの情報作成\r
721                 String pstr = joinPoststr(pdat);\r
722 \r
723                 // RDへ情報送信\r
724                 {               \r
725                         reportProgress("send request.(5/5)");\r
726                         String[] d = reqPOST("http://"+getIPAddr()+":"+getPortNo()+"/reserve/"+idx+"/entry.htm", pstr, null);\r
727                         header = d[0];\r
728                         response = d[1];\r
729                 }\r
730 \r
731                 // 更新結果の確認\r
732                 ma = Pattern.compile("alert\\(msg\\)").matcher(response);\r
733                 if ( ma.find() ) {\r
734                         Matcher mb = Pattern.compile("\\bmsg=\"([\\s\\S]+?)\";").matcher(response);\r
735                         if (mb.find()) {\r
736                                 errmsg = mb.group(1);\r
737                                 System.out.printf("\n<<< Message from RD >>> \"%s\"\n\n", errmsg);\r
738                                 Matcher mc = Pattern.compile("(予約時間が重複しています。|修正しました。)").matcher(errmsg);\r
739                                 if ( ! mc.find() ) {\r
740                                         return(false);\r
741                                 }\r
742                         }                       \r
743                 }\r
744 \r
745                 System.out.printf("\n<<< Message from RD >>> \"%s\"\n\n", "正常に更新できました。");\r
746 \r
747                 /*\r
748                  * 予約情報の調整 \r
749                  */\r
750 \r
751                 // 予約パターンID\r
752                 r.setRec_pattern_id(getRec_pattern_Id(r.getRec_pattern()));\r
753                 \r
754                 // 次回予定日\r
755                 r.setRec_nextdate(CommonUtils.getNextDate(r));\r
756                 //r.setRec_nextdate(getNextDate(r.getRec_pattern(), r.getZhh()+":"+r.getZmm()));\r
757                 \r
758                 // 録画長\r
759                 r.setRec_min(CommonUtils.getRecMin(r.getAhh(),r.getAmm(),r.getZhh(),r.getZmm()));\r
760                 \r
761                 // 開始日時・終了日時\r
762                 getStartEndDateTime(r);\r
763                 \r
764                 // 情報置き換え\r
765                 getReserves().remove(o);\r
766                 getReserves().add(r);\r
767 \r
768                 // キャッシュに保存\r
769                 ReservesToFile(getReserves(), rsvedFile);\r
770                 \r
771                 return(true);\r
772         }\r
773 \r
774         /*\r
775          *      予約を削除する\r
776          */\r
777         @Override\r
778         public ReserveList RemoveRdEntry(String delid) {\r
779                 System.out.println("Run: RemoveRdEntry()");\r
780                 \r
781                 errmsg = "";\r
782 \r
783                 // おまじない\r
784                 Authenticator.setDefault(new MyAuthenticator(getUser(), getPasswd()));\r
785 \r
786                 // 削除対象を探す\r
787                 ReserveList rx = null;\r
788                 for (  ReserveList reserve : getReserves() )  {\r
789                         if (reserve.getId().equals(delid)) {\r
790                                 rx = reserve;\r
791                                 break;\r
792                         }\r
793                 }\r
794                 if (rx == null) {\r
795                         return(null);\r
796                 }\r
797 \r
798                 // 予約行番号を取得\r
799                 Matcher ma = null;\r
800                 String idx = "";\r
801                 int lineno = 0;\r
802                 String header;\r
803                 String response;\r
804                 {\r
805                         reportProgress("get identifier(1/5).");\r
806                         String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/reserve/b_rsv.htm",null);\r
807                         header = d[0];\r
808                         response = d[1];\r
809                 }\r
810                 ma = Pattern.compile("/reserve/(\\d+?)/reserve.htm").matcher(response);\r
811                 if (ma.find()) {\r
812                         idx = ma.group(1);\r
813                         reportProgress("get identifier(2/5).");\r
814                         String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/reserve/"+idx+"/reserve.htm",null);\r
815                         header = d[0];\r
816                         response = d[1];\r
817                 }\r
818                 ma = Pattern.compile("c1\\[(\\d+?)\\]=\""+rx.getId()+"\";").matcher(response);\r
819                 if ( ma.find() ) {\r
820                         lineno = Integer.valueOf(ma.group(1))+1;\r
821                 }\r
822 \r
823                 // RDに削除要請\r
824                 {\r
825                         // ハング防止のおまじない\r
826                         reportProgress("get program(3/5).");\r
827                         reqGET("http://"+getIPAddr()+":"+getPortNo()+"/reserve/"+idx+"/b_rsvinfo.htm?"+rx.getId()+"&"+lineno,null);\r
828                         \r
829                         reportProgress("get program(4/5).");\r
830                         reqGET("http://"+getIPAddr()+":"+getPortNo()+"/reserve/"+idx+"/rsvinfo.htm",null);\r
831                 }\r
832                 {               \r
833                         reportProgress("send request.(5/5)");\r
834                         String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/reserve/"+idx+"/delete.htm", null);\r
835                         header = d[0];\r
836                         response = d[1];\r
837                 }\r
838 \r
839                 // 削除結果の確認\r
840                 ma = Pattern.compile("alert\\(msg\\)").matcher(response);\r
841                 if ( ma.find() ) {\r
842                         Matcher mb = Pattern.compile("\\bmsg=\"([\\s\\S]+?)\";").matcher(response);\r
843                         if (mb.find()) {\r
844                                 errmsg = mb.group(1);\r
845                                 System.out.printf("\n<<< Message from RD >>> \"%s\"\n\n", errmsg);\r
846                         }\r
847                         return(null);\r
848                 }\r
849                 \r
850                 // 予約リストを更新\r
851                 getReserves().remove(rx);\r
852                 \r
853                 // キャッシュに保存\r
854                 ReservesToFile(getReserves(), rsvedFile);\r
855                 \r
856                 System.out.printf("\n<<< Message from RD >>> \"%s\"\n\n", "正常に削除できました。");\r
857                 return(rx);\r
858         }\r
859         \r
860         /*\r
861          * \r
862          */\r
863         @Override\r
864         public String getErrmsg() {\r
865                 return(errmsg.replaceAll("\\\\r\\\\n", ""));\r
866         }\r
867 \r
868         \r
869         \r
870         /* ここまで */\r
871         \r
872         \r
873         \r
874 \r
875         \r
876         \r
877         /* 個別コード-ここから最後まで */\r
878 \r
879         /*\r
880          * 非公開メソッド \r
881          */\r
882 \r
883         private String joinPoststr(Hashtable<String, String> pdat)\r
884         {\r
885                 String[] pkeys = {\r
886                         "bExec",\r
887                         "start_form",\r
888                         "title_name",\r
889                         "detail",\r
890                         "genre",\r
891                         "enc_type",\r
892                         "broadcast",\r
893                         "channel_list",\r
894                         "rec_priority",\r
895                         "maiyoubi_type",\r
896                         "date",\r
897                         "start_hour",\r
898                         "start_minute",\r
899                         "end_hour",\r
900                         "end_minute",\r
901                         "disc",\r
902                         "folder",\r
903                         "vrate",\r
904                         "amode",\r
905 //                      "title_link",\r
906                         "auto_delete",\r
907 //                      "video_es",\r
908 //                      "audio_es",\r
909                         "dvdr",\r
910                         "lVoice",\r
911                         "edge_left",\r
912                         "bAutoChapter",\r
913                         "MagicChapter",\r
914                         "CM_Chapter",\r
915                         "channel_no",\r
916                         "dtv_sid",\r
917                         "dtv_nid",\r
918                         "net_link",\r
919                         "add_ch_text",\r
920                         "add_ch_value",\r
921                         "sport_ext_submit",\r
922                         "title_link_submit",\r
923                         "end_form"\r
924                 };\r
925                 \r
926                 String pstr = "";\r
927                 for ( String key : pkeys ) {\r
928                         //$pdat{"$key"} =~ s/(\W)/'%'.unpack("H2", $1)/ego;\r
929                         if (pdat.get(key) == null) {\r
930                                 pstr += key+"=&";\r
931                         }\r
932                         else {\r
933                                 pstr += key+"="+pdat.get(key)+"&";\r
934                         }\r
935                 }\r
936                 pstr = pstr.substring(0, pstr.length()-1);\r
937                 \r
938                 return(pstr);\r
939         }\r
940         \r
941         private Hashtable<String, String> modPostdata(ReserveList r) {\r
942 \r
943                 Hashtable<String, String> newdat = new Hashtable<String, String>();\r
944                 \r
945                 try {\r
946                         \r
947                         // 実行するよ\r
948                         newdat.put("bExec", (r.getExec())?("ON"):("OFF"));\r
949                         \r
950                         if (getDebug()) System.err.println("[DEBUG] Exec="+newdat.get("bExec"));\r
951                         \r
952         \r
953                         // 予約名・予約詳細\r
954                         if ( r.getAutocomplete() ) {\r
955                                 newdat.put("title_name", "");\r
956                                 newdat.put("detail", "");\r
957                         }\r
958                         else {\r
959                                 try {\r
960                                         newdat.put("title_name", URLEncoder.encode(r.getTitle(),thisEncoding));\r
961                                 } catch (UnsupportedEncodingException e1) {\r
962                                         e1.printStackTrace();\r
963                                 }\r
964                 \r
965                                 try {\r
966                                         newdat.put("detail", URLEncoder.encode(r.getDetail().replaceAll("\n", Matcher.quoteReplacement("\r\n")), thisEncoding));\r
967                                 } catch (UnsupportedEncodingException e1) {\r
968                                         e1.printStackTrace();\r
969                                 }\r
970                         }\r
971                         \r
972                         if (getDebug()) System.err.println("[DEBUG] title_name="+newdat.get("title_name"));\r
973                         \r
974                         // 保存先\r
975                         try {\r
976                                 newdat.put("folder", URLEncoder.encode(text2value(folder, r.getRec_folder()),thisEncoding));\r
977                         } catch (UnsupportedEncodingException e1) {\r
978                                 e1.printStackTrace();\r
979                         }\r
980                         \r
981                         if (getDebug()) System.err.println("[DEBUG] folder="+newdat.get("folder"));\r
982                         \r
983                         // ジャンル\r
984                         newdat.put("genre", _recstr2genre(r.getRec_genre()));\r
985                         \r
986                         if (getDebug()) System.err.println("[DEBUG] genre="+newdat.get("genre"));\r
987                         \r
988                         // DVD互換モード\r
989                         newdat.put("dvdr", text2value(dvdcompat, r.getRec_dvdcompat()));\r
990                         \r
991                         if (getDebug()) System.err.println("[DEBUG] dvdr="+newdat.get("dvdr"));\r
992                         \r
993                         // 録画チャンネル\r
994                         String channel = cc.getCH_WEB2CODE(r.getCh_name());\r
995                         String ch_no = cc.getCH_CODE2REC(channel);\r
996                         if (chtype.size() > 0) {\r
997                                 String typ = text2value(chtype, channel);\r
998                                 if (typ.equals("uva")) {\r
999                                         newdat.put("broadcast","0");            // 地上アナログ\r
1000                                 }\r
1001                                 else if (typ.equals("bsa")) {\r
1002                                         newdat.put("broadcast","1");            // BSアナログ\r
1003                                 }\r
1004                                 else if (typ.equals("l1")) {\r
1005                                         newdat.put("broadcast","2");            // 外部入力(L1)\r
1006                                 }\r
1007                                 else if (typ.equals("l2")) {\r
1008                                         newdat.put("broadcast","3");            // 外部入力(L2)\r
1009                                 }\r
1010                                 else if (typ.equals("l3")) {\r
1011                                         newdat.put("broadcast","4");            // 外部入力(L3)\r
1012                                 }\r
1013                                 else if (typ.equals("bsd")) {\r
1014                                         newdat.put("broadcast","10");           // BSデジタル\r
1015                                 }\r
1016                                 else if (typ.equals("csd")) {\r
1017                                         newdat.put("broadcast","11");           // 110度CSデジタル\r
1018                                 }\r
1019                                 else if (typ.equals("uvd")) {\r
1020                                         newdat.put("broadcast","12");           // 地上デジタル\r
1021                                 }\r
1022                                 else {\r
1023                                         // 普通ここには落ちない\r
1024                                         if (ch_no.startsWith("C")) {\r
1025                                                 newdat.put("broadcast","2");            // "C***"は外部入力(L1)\r
1026                                         }\r
1027                                         else if (ch_no.startsWith("SP")) {\r
1028                                                 newdat.put("broadcast","4");            // "SP***"は外部入力(L3)\r
1029                                         }\r
1030                                         else {\r
1031                                                 newdat.put("broadcast","3");            // 未定義は全部外部入力(L2)\r
1032                                         }\r
1033                                 }\r
1034                                 \r
1035                                 newdat.put("channel_list", channel);\r
1036                                 newdat.put("channel_no", channel);\r
1037                         }\r
1038                         else {\r
1039                                 // 後方互換\r
1040                                 Matcher ma = Pattern.compile("^(.)(.)").matcher(ch_no);\r
1041                                 if (ma.find()) {\r
1042                                         if ((ma.group(1)+ma.group(2)).equals("CH")) {\r
1043                                                 newdat.put("broadcast","0");            // 地上アナログ\r
1044                                         }\r
1045                                         else if ((ma.group(1)+ma.group(2)).equals("BS")) {\r
1046                                                 newdat.put("broadcast","10");           // BSデジタル\r
1047                                         }\r
1048                                         else if ((ma.group(1)+ma.group(2)).equals("CS")) {\r
1049                                                 newdat.put("broadcast","11");           // 110度CSデジタル\r
1050                                         }\r
1051                                         else if (ma.group(1).equals("L")) {\r
1052                                                 newdat.put("broadcast", String.valueOf(Integer.valueOf(ma.group(2))+1));        // ライン入力ABC\r
1053                                         }\r
1054                                         else {\r
1055                                                 newdat.put("broadcast","12");           // 地上デジタル\r
1056                                         }\r
1057                                         \r
1058                                         newdat.put("channel_list", channel);\r
1059                                         newdat.put("channel_no", channel);\r
1060                                 }\r
1061                         }\r
1062                         \r
1063                         if (getDebug()) System.err.println("[DEBUG] channel_no="+newdat.get("channel_no"));\r
1064                         \r
1065                         // 録画レート\r
1066                         newdat.put("enc_type", text2value(encoder, r.getTuner()));\r
1067                         newdat.put("vrate", text2value(vrate, r.getRec_mode()));\r
1068                         \r
1069                         if (getDebug()) System.err.println("[DEBUG] vrate="+newdat.get("vrate"));\r
1070                         \r
1071                         // 録音レートの指定がねえな…\r
1072                         newdat.put("amode", text2value(arate, r.getRec_audio()));\r
1073                         \r
1074                         if (getDebug()) System.err.println("[DEBUG] arate="+newdat.get("arate"));\r
1075                         \r
1076                         // 繰り返し\r
1077                         Matcher ma = Pattern.compile("^\\d").matcher(r.getRec_pattern());\r
1078                         if (ma.find()) { \r
1079                                 newdat.put("maiyoubi_type","0");\r
1080                                 newdat.put("date", r.getRec_pattern());\r
1081                         }\r
1082                         else {\r
1083                                 newdat.put("maiyoubi_type", "1");\r
1084                                 int i = 1;\r
1085                                 for ( String s : RPTPTN ) {\r
1086                                         if ( s.equals(r.getRec_pattern()) == true ) {\r
1087                                                 newdat.put("date", String.valueOf(i));\r
1088                                         }\r
1089                                         i++;\r
1090                                 }\r
1091                         }\r
1092         \r
1093                         if (getDebug()) System.err.println("[DEBUG] date="+newdat.get("date"));\r
1094 \r
1095                         newdat.put("start_hour", r.getAhh());\r
1096                         newdat.put("start_minute", r.getAmm());\r
1097                         newdat.put("end_hour", r.getZhh());\r
1098                         newdat.put("end_minute", r.getZmm());\r
1099         \r
1100                         // 記録先\r
1101                         newdat.put("disc", text2value(device, r.getRec_device()));\r
1102         \r
1103                         // 自動チャプター関連\r
1104                         newdat.put("bAutoChapter"               , text2value(xchapter, r.getRec_xchapter()));\r
1105                         newdat.put("MagicChapter"               , text2value(mschapter, r.getRec_mschapter()));\r
1106                         newdat.put("CM_Chapter"                 , text2value(mvchapter, r.getRec_mvchapter()));\r
1107                         \r
1108                         // 追加\r
1109                         newdat.put("start_form"                 , "");\r
1110                         newdat.put("rec_priority"               , "150");\r
1111                         newdat.put("title_link"                 , "0");\r
1112                         newdat.put("auto_delete"                , "0");\r
1113                         newdat.put("video_es"                   , "00");\r
1114                         newdat.put("audio_es"                   , "10");\r
1115                         newdat.put("edge_left"                  , "0");         // 録画のりしろ\r
1116                         //newdat.put("bAutoChapter"             , "0");\r
1117                         //newdat.put("MagicChapter"             , "0");\r
1118                         //newdat.put("CM_Chapter"                       , "0");\r
1119                         newdat.put("add_ch_text"                , "");\r
1120                         newdat.put("add_ch_value"               , "");\r
1121                         newdat.put("sport_ext_submit"   , "undefined");\r
1122                         newdat.put("title_link_submit"  , "undefined");\r
1123                         newdat.put("end_form"                   , "0");\r
1124                 }\r
1125                 catch ( Exception e ) {\r
1126                         e.printStackTrace();\r
1127                 }\r
1128                 \r
1129                 return(newdat);\r
1130         }\r
1131 \r
1132         private String _recstr2genre(String genre)\r
1133         {\r
1134                 if (genre.equals(TVProgram.ProgGenre.MOVIE.toString())) {\r
1135                         return "0";\r
1136                 }\r
1137                 else if (genre.equals(TVProgram.ProgGenre.MUSIC.toString())) {\r
1138                         return "1";\r
1139                 }\r
1140                 else if (genre.equals(TVProgram.ProgGenre.DORAMA.toString())) {\r
1141                         return "2";\r
1142                 }\r
1143                 else if (genre.equals(TVProgram.ProgGenre.ANIME.toString())) {\r
1144                         return "3";\r
1145                 }\r
1146                 else if (genre.equals(TVProgram.ProgGenre.SPORTS.toString())) {\r
1147                         return "4";\r
1148                 }\r
1149                 else if (genre.equals(TVProgram.ProgGenre.DOCUMENTARY.toString())) {\r
1150                         return "5";\r
1151                 }\r
1152                 else if (genre.equals(TVProgram.ProgGenre.THEATER.toString())) {\r
1153                         return "6";\r
1154                 }\r
1155                 else if (genre.equals(TVProgram.ProgGenre.HOBBY.toString())) {\r
1156                         return "7";\r
1157                 }\r
1158                 else if (genre.equals(TVProgram.ProgGenre.VARIETY.toString())) {\r
1159                         return "8";\r
1160                 }\r
1161                 else {\r
1162                         return "10";\r
1163                 }\r
1164         }\r
1165         \r
1166         private void setSettingEtc(ArrayList<TextValueSet> tvs, String key, int typ, String res) {\r
1167                 tvs.clear();\r
1168                 String valExpr = "(\\d+),?";\r
1169                 if (typ == 1) {\r
1170                         valExpr = "\"(.+?)\",?";\r
1171                 }\r
1172                 Matcher mc = Pattern.compile("var "+key+"_text\\s*= new Array\\(([\\s\\S]+?)\\);").matcher(res);\r
1173                 Matcher md = Pattern.compile("var "+key+"_value\\s*= new Array\\(([\\s\\S]+?)\\);").matcher(res);\r
1174                 if (mc.find() && md.find()) {\r
1175                         Matcher me = Pattern.compile("\"(.+?)\",?").matcher(mc.group(1));\r
1176                         Matcher mf = Pattern.compile(valExpr).matcher(md.group(1));\r
1177                         while (me.find() && mf.find()) {\r
1178                                 TextValueSet t = new TextValueSet();\r
1179                                 if (key.equals("vrate")) {\r
1180                                         t.setText(me.group(1).replaceAll(" ", ""));\r
1181                                 }\r
1182                                 else {\r
1183                                         t.setText(me.group(1));\r
1184                                 }\r
1185                                 //t.setText(me.group(1));\r
1186                                 t.setValue(mf.group(1));\r
1187                                 tvs.add(t);\r
1188                         }\r
1189                 }\r
1190         }\r
1191 }\r