OSDN Git Service

BWT650対応α版
[tainavi/TinyBannavi.git] / TinyBannavi / src / tainavi / pluginrec / PlugIn_RecRD_X5.java
1 package tainavi.pluginrec;\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 import tainavi.ChannelCode;\r
13 import tainavi.CommonUtils;\r
14 import tainavi.HDDRecorder;\r
15 import tainavi.HDDRecorderUtils;\r
16 import tainavi.ReserveList;\r
17 import tainavi.TVProgram;\r
18 import tainavi.TextValueSet;\r
19 import tainavi.TraceProgram;\r
20 import tainavi.HDDRecorder.RecType;\r
21 import tainavi.HDDRecorderUtils.MyAuthenticator;\r
22 import tainavi.TVProgram.ProgGenre;\r
23 \r
24 /**\r
25  * RD-X5だよー\r
26  */\r
27 public class PlugIn_RecRD_X5 extends HDDRecorderUtils implements HDDRecorder,Cloneable {\r
28 \r
29         public PlugIn_RecRD_X5 clone() {\r
30                 return (PlugIn_RecRD_X5) super.clone();\r
31         }\r
32         \r
33         private static final String thisEncoding = "MS932";\r
34 \r
35         /*******************************************************************************\r
36          * 種族の特性\r
37          ******************************************************************************/\r
38         \r
39         @Override\r
40         public String getRecorderId() { return "RD-X5"; }\r
41         @Override\r
42         public RecType getType() { return RecType.RECORDER; }\r
43 \r
44         // chvalueをつかってもいーよ\r
45         @Override\r
46         public boolean isChValueAvailable() { return true; }\r
47         // CHコードは入力しなくていい\r
48         @Override\r
49         public boolean isChCodeNeeded() { return false; }\r
50         \r
51         /*******************************************************************************\r
52          * 予約ダイアログなどのテキストのオーバーライド\r
53          ******************************************************************************/\r
54         \r
55         // 予約ダイアログのラベル\r
56         public String getLabel_XChapter() { return "無音部分チャプタ分割"; }\r
57         public String getLabel_MsChapter() { return "DVD時チャプタ分割"; }\r
58         public String getLabel_MvChapter() { return "音多連動チャプタ分割"; }\r
59         public String getLabel_DVDCompat() { return "DVD互換モード"; }\r
60         public String getLabel_Aspect() { return "DVD記録時画面比"; }\r
61         public String getLabel_BVperf() { return "高レート節約"; }\r
62         public String getLabel_LVoice() { return "ライン音声選択"; }\r
63         \r
64         /*******************************************************************************\r
65          * 定数\r
66          ******************************************************************************/\r
67         \r
68         // ログ関連\r
69         \r
70         private final String MSGID = "["+getRecorderId()+"] ";\r
71         private final String ERRID = "[ERROR]"+MSGID;\r
72         private final String DBGID = "[DEBUG]"+MSGID;\r
73         \r
74         /*******************************************************************************\r
75          * CHコード設定、エラーメッセージ\r
76          ******************************************************************************/\r
77         \r
78         public ChannelCode getChCode() {\r
79                 return cc;\r
80         }\r
81         \r
82         private ChannelCode cc = new ChannelCode(getRecorderId());\r
83         \r
84         public String getErrmsg() {\r
85                 return(errmsg.replaceAll("\\\\r\\\\n", ""));\r
86         }\r
87         \r
88         protected void setErrmsg(String s) { errmsg = s; }\r
89         \r
90         private String errmsg = "";\r
91 \r
92         /*******************************************************************************\r
93          * 部品\r
94          ******************************************************************************/\r
95         \r
96         protected void setRsvedFile(String s) { rsvedFile = s; }\r
97         protected String getRsvedFile() { return rsvedFile; }\r
98 \r
99         private String rsvedFile = "";\r
100         \r
101         /*******************************************************************************\r
102          * コンストラクタ\r
103          ******************************************************************************/\r
104         \r
105         // ないよ\r
106         \r
107         /*******************************************************************************\r
108          * チャンネルリモコン機能\r
109          ******************************************************************************/\r
110         \r
111         public boolean ChangeChannel(String Channel) {\r
112                 return false;\r
113         }\r
114         \r
115 \r
116         /*******************************************************************************\r
117          * レコーダーから予約一覧を取得する\r
118          ******************************************************************************/\r
119 \r
120         public boolean GetRdReserve(boolean force)\r
121         {\r
122                 System.out.println("Run: GetRdReserve("+force+")");\r
123                 \r
124                 errmsg = "";\r
125                 \r
126                 //\r
127                 rsvedFile = "env/reserved."+getIPAddr()+"_"+getPortNo()+"_"+getRecorderId()+".xml";\r
128                 String vrateTFile = "env/videorate."+getIPAddr()+"_"+getPortNo()+"_"+getRecorderId()+".xml";\r
129                 String arateTFile = "env/audiorate."+getIPAddr()+"_"+getPortNo()+"_"+getRecorderId()+".xml";\r
130                 String folderTFile = "env/folders."+getIPAddr()+"_"+getPortNo()+"_"+getRecorderId()+".xml";\r
131                 String encoderTFile = "env/encoders."+getIPAddr()+"_"+getPortNo()+"_"+getRecorderId()+".xml";\r
132                 String dvdcompatTFile = "env/dvdcompat."+getIPAddr()+"_"+getPortNo()+"_"+getRecorderId()+".xml";\r
133                 String deviceTFile = "env/device."+getIPAddr()+"_"+getPortNo()+"_"+getRecorderId()+".xml";\r
134                 String xChapterTFile = "env/xchapter."+getIPAddr()+"_"+getPortNo()+"_"+getRecorderId()+".xml";\r
135                 String msChapterTFile = "env/mschapter."+getIPAddr()+"_"+getPortNo()+"_"+getRecorderId()+".xml";\r
136                 String mvChapterTFile = "env/mvchapter."+getIPAddr()+"_"+getPortNo()+"_"+getRecorderId()+".xml";\r
137                 String chValueTFile = "env/chvalue."+getIPAddr()+"_"+getPortNo()+"_"+getRecorderId()+".xml";\r
138                 String aspectTFile = "env/aspect."+getIPAddr()+"_"+getPortNo()+"_"+getRecorderId()+".xml";\r
139                 String bvperfTFile = "env/bvperf."+getIPAddr()+"_"+getPortNo()+"_"+getRecorderId()+".xml";\r
140                 String lvoiceTFile = "env/lvoice."+getIPAddr()+"_"+getPortNo()+"_"+getRecorderId()+".xml";\r
141                 \r
142 \r
143                 File f = new File(rsvedFile);\r
144                 if ( force == false && f.exists()) {\r
145                         // キャッシュから読み出し(録画設定ほか)\r
146                         vrate = TVSload(vrateTFile);\r
147                         arate = TVSload(arateTFile);\r
148                         folder = TVSload(folderTFile);\r
149                         encoder = TVSload(encoderTFile);\r
150                         dvdcompat = TVSload(dvdcompatTFile);\r
151                         device = TVSload(deviceTFile);\r
152                         \r
153                         // 自動チャプタ関連\r
154                         xchapter = TVSload(xChapterTFile);\r
155                         mschapter = TVSload(msChapterTFile);\r
156                         mvchapter = TVSload(mvChapterTFile);\r
157                         \r
158                         // その他\r
159                         aspect = TVSload(aspectTFile);\r
160                         bvperf = TVSload(bvperfTFile);\r
161                         lvoice = TVSload(lvoiceTFile);\r
162                         \r
163                         // チャンネルコードバリュー\r
164                         chvalue = TVSload(chValueTFile);\r
165                         \r
166                         // キャッシュから読み出し(予約一覧)\r
167                         setReservesV1(ReservesFromFile(rsvedFile));\r
168                         if (getReserves().size() > 0) {\r
169                                 System.out.println("+read from="+rsvedFile);\r
170                         }\r
171                         \r
172                         // なぜか設定ファイルが空になっている場合があるので、その際は再取得する\r
173                         if (vrate.size()>0 && arate.size()>0 &&\r
174                                         folder.size()>0 && encoder.size()>0 &&\r
175                                         xchapter.size()>0 && mschapter.size()>0 && mvchapter.size()>0) {\r
176                                 return(true);\r
177                         }\r
178                 }\r
179 \r
180                 // おまじない\r
181                 Authenticator.setDefault(new MyAuthenticator(getUser(), getPasswd()));\r
182                 \r
183                 // RDから予約一覧を取り出す\r
184                 Matcher ma = null;\r
185                 String idx = "";\r
186                 String response;\r
187                 {\r
188                         reportProgress("get reserved list(1/4).");\r
189                         String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/program/b_prgrm.htm",null);\r
190                         response = d[1];\r
191                 }\r
192                 ma = Pattern.compile("/program/(\\d+?)/program.htm").matcher(response);\r
193                 if (ma.find()) {\r
194                         idx = ma.group(1);\r
195                         reportProgress("get reserved list(2/4).");\r
196                         String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/program/"+idx+"/program.htm",null);\r
197                         response = d[1];\r
198                 }\r
199                 \r
200                 // (1)録画設定の取得\r
201                 {\r
202                         // ハングさせないためのおまじない\r
203                         reportProgress("get reserved list(3/4).");\r
204                         reqGET("http://"+getIPAddr()+":"+getPortNo()+"/program/"+idx+"/b_proginfo.htm?0",null);\r
205                 }\r
206                 {\r
207                         reportProgress("get reserved list(4/4).");\r
208                         String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/program/"+idx+"/proginfo.htm",null);\r
209                         String res = d[1];\r
210                         \r
211                         // (1-1)画質設定\r
212                         setSettingEtc(vrate, "\"vrate\"", 1, res, vrateTFile);\r
213                         \r
214                         // (1-2)音質設定\r
215                         setSettingEtc(arate, "amode", 0, res, arateTFile);\r
216                         \r
217                         // (1-3)フォルダ一覧\r
218                         setSettingFolder(folder, res, folderTFile);\r
219                         \r
220                         // (1-4)エンコーダ\r
221                         setSettingEncoder(encoder, res, encoderTFile);\r
222                         \r
223                         // (1-5)DVD互換モード\r
224                         setSettingEtc(dvdcompat, "dvdr", 1, res, dvdcompatTFile);\r
225 \r
226                         // (1-6)記録先デバイス\r
227                         setSettingEtc(device, "disc", 0, res, deviceTFile);\r
228 \r
229                         // (1-7)自動チャプタ関連\r
230                         setSettingEtc(xchapter, "bAutoChapter", 0, res, xChapterTFile);\r
231                         \r
232                         setSettingEtc(mschapter, "bDvdAutoChapter", 0, res, msChapterTFile);\r
233 \r
234                         setSettingEtc(mvchapter, "bAudioAutoChapter", 0, res, mvChapterTFile);\r
235                         \r
236                         // (1-8)チャンネルコードバリュー\r
237                         setSettingEtc(chvalue, "channel", 1, res, chValueTFile);\r
238                         \r
239                         // (1-11)記録時画面比\r
240                         setSettingEtc(aspect, "aspect", 0, res, aspectTFile);\r
241                         \r
242                         // (1-12)高レート節約\r
243                         setSettingEtc(bvperf, "bVPerform", 0, res, bvperfTFile);\r
244                         \r
245                         // (1-13)ライン音声選択\r
246                         setSettingEtc(lvoice, "lVoice", 0, res, lvoiceTFile);\r
247                 }\r
248                 \r
249                 // (2)予約一覧データの分析\r
250                 setReservesV1(GetRdReservedList(response));\r
251                 \r
252                 // 取得した情報の表示\r
253                 System.out.println("---Reserved List Start---");\r
254                 for ( int i = 0; i<getReserves().size(); i++ ) {\r
255                         // 詳細情報の取得\r
256                         ReserveList e = getReserves().get(i);\r
257                         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
258                                         (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
259                 }\r
260                 System.out.println("---Reserved List End---");\r
261                 \r
262                 // キャッシュに保存\r
263                 ReservesToFile(getReserves(), rsvedFile);\r
264                 \r
265                 return(true);\r
266         }\r
267         \r
268         /*******************************************************************************\r
269          * 新規予約\r
270          ******************************************************************************/\r
271 \r
272         public boolean PostRdEntry(ReserveList r)\r
273         {\r
274                 //\r
275                 if (getChCode().getCH_WEB2CODE(r.getCh_name()) == null) {\r
276                         errmsg = ERRID+"【警告】Web番組表の放送局名「"+r.getCh_name()+"」をCHコードに変換できません。CHコード設定を修正してください。" ;\r
277                         System.out.println(errmsg);\r
278                         return(false);\r
279                 }\r
280                 \r
281                 System.out.println("Run: PostRdEntry("+r.getTitle()+")");\r
282                 \r
283                 errmsg = "";\r
284 \r
285                 // おまじない\r
286                 Authenticator.setDefault(new MyAuthenticator(getUser(), getPasswd()));\r
287 \r
288                 // RDから予約一覧を取り出す\r
289                 Matcher ma = null;\r
290                 String idx = "";\r
291                 String response;\r
292                 {\r
293                         reportProgress("get reserved list(1/5).");\r
294                         String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/program/b_prgrm.htm",null);\r
295                         response = d[1];\r
296                 }\r
297                 ma = Pattern.compile("/program/(\\d+?)/program.htm").matcher(response);\r
298                 if (ma.find()) {\r
299                         idx = ma.group(1);\r
300                         reportProgress("get reserved list(2/5).");\r
301                         String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/program/"+idx+"/program.htm",null);\r
302                         response = d[1];\r
303                 }\r
304                 // 新規予約の行番号を取得する\r
305                 int lineno = 0;\r
306                 ma = Pattern.compile("\"b_proginfo.htm\\?(\\d+?)\"").matcher(response);\r
307                 while (ma.find()) {\r
308                         lineno = Integer.valueOf(ma.group(1));\r
309                 }\r
310                 //r.setNo(no);\r
311                 \r
312                 // RDに新規登録要請\r
313                 {\r
314                         // ハングさせないためのおまじない\r
315                         reportProgress("get program.(3/5)");\r
316                         reqGET("http://"+getIPAddr()+":"+getPortNo()+"/program/"+idx+"/b_proginfo.htm?"+lineno,null);\r
317                         \r
318                         reportProgress("get program.(4/5)");\r
319                         reqGET("http://"+getIPAddr()+":"+getPortNo()+"/program/"+idx+"/proginfo.htm",null);\r
320                 }\r
321 \r
322                 // POSTデータを変換する\r
323                 Hashtable<String, String> pdat = modPostdata(r);\r
324 \r
325                 // RDへの情報作成\r
326                 String pstr = joinPoststr(pdat);\r
327 \r
328                 // RDへ情報送信\r
329                 {               \r
330                         reportProgress("send request.(5/5)");\r
331                         String[] d = reqPOST("http://"+getIPAddr()+":"+getPortNo()+"/program/"+idx+"/entry.htm", pstr, null);\r
332                         response = d[1];\r
333                 }\r
334 \r
335                 //System.out.println("#"+response);\r
336 \r
337                 // 登録結果の確認\r
338                 ma = Pattern.compile("msg=\"(.+?)\"").matcher(response);\r
339                 if ( ma.find() ) {\r
340                         errmsg = ma.group(1);\r
341                         System.out.printf("\n<<< Message from RD >>> \"%s\"\n\n", errmsg);\r
342                         \r
343                         ma = Pattern.compile("(正常に登録できました。|予約時間が一部重複しています。|現在のHDD残量では入りません。|画質を.*に修正しました。)").matcher(errmsg);\r
344                         if ( ! ma.find()) {\r
345                                 return false;\r
346                         }\r
347                 }\r
348                 \r
349                 /*\r
350                  * 予約情報の調整 \r
351                  */\r
352                 \r
353                 // キャッシュ上の予約情報を更新する(ライン入力放送局名引継対応)(2.6β)\r
354                 getReserves().add(r);\r
355                 \r
356                 // 新しい予約一覧を取得する\r
357                 {\r
358                         reportProgress("get identifier(6/7).");\r
359                         String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/program/b_prgrm.htm",null);\r
360                         response = d[1];\r
361                 }\r
362                 ma = Pattern.compile("/program/(\\d+?)/program.htm").matcher(response);\r
363                 if (ma.find()) {\r
364                         idx = ma.group(1);\r
365                         reportProgress("get identifier(7/7).");\r
366                         String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/program/"+idx+"/program.htm",null);\r
367                         response = d[1];\r
368                 }\r
369                 \r
370                 setReservesV1(GetRdReservedList(response));\r
371                 \r
372                 // キャッシュに保存\r
373                 ReservesToFile(getReserves(), rsvedFile);\r
374 \r
375                 System.out.printf("\n<<< Message from RD >>> \"%s\"\n\n", "正常に登録できました。");\r
376                 \r
377                 return(true);\r
378         }\r
379 \r
380         \r
381         /*******************************************************************************\r
382          * 予約更新\r
383          ******************************************************************************/\r
384 \r
385         public boolean UpdateRdEntry(ReserveList o, ReserveList r) {\r
386                 //\r
387                 if (getChCode().getCH_WEB2CODE(r.getCh_name()) == null) {\r
388                         errmsg = ERRID+"【警告】Web番組表の放送局名「"+r.getCh_name()+"」をCHコードに変換できません。CHコード設定を修正してください。" ;\r
389                         System.out.println(errmsg);\r
390                         return(false);\r
391                 }\r
392                 \r
393                 System.out.println("Run: UpdateRdEntry()");\r
394                 \r
395                 errmsg = "";\r
396 \r
397                 // おまじない\r
398                 Authenticator.setDefault(new MyAuthenticator(getUser(), getPasswd()));\r
399 \r
400                 /*\r
401                 // 更新対象を探す(内部)\r
402                 ReserveList rx = null;\r
403                 for ( ReserveList reserve : getReserves() )  {\r
404                         if (reserve.getId().equals(o.getId())) {\r
405                                 rx = reserve;\r
406                                 break;\r
407                         }\r
408                 }\r
409                 if (rx == null) {\r
410                         errmsg = "キャッシュ上に操作対象が見つかりません。";\r
411                         return(false);\r
412                 }\r
413                 */\r
414 \r
415                 // 更新準備\r
416                 Matcher ma = null;\r
417                 String idx = "";\r
418                 String response;\r
419                 {\r
420                         reportProgress("get identifier(1/7).");\r
421                         String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/program/b_prgrm.htm",null);\r
422                         response = d[1];\r
423                 }\r
424                 ma = Pattern.compile("/program/(\\d+?)/program.htm").matcher(response);\r
425                 if (ma.find()) {\r
426                         idx = ma.group(1);\r
427                         reportProgress("get identifier(2/7).");\r
428                         String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/program/"+idx+"/program.htm",null);\r
429                         response = d[1];\r
430                 }\r
431                 \r
432                 // 更新対象を探す(外部)\r
433                 String id = null;\r
434                 for ( ReserveList cr : GetRdReservedList(response) ) {\r
435                         if (matchReserveV1(cr, o)) {\r
436                                 System.out.println("次のエントリを: "+cr.getTitle()+"; "+cr.getChannel()+"; "+cr.getRec_pattern()+"; "+cr.getAhh()+":"+cr.getAmm());\r
437                                 id = cr.getId();\r
438                                 break;\r
439                         }\r
440                 }\r
441                 if (id == null) {\r
442                         errmsg = ERRID+"レコーダ上に操作対象が見つかりません。";\r
443                         return(false);\r
444                 }\r
445                 System.out.println("次の情報に更新します: "+r.getTitle()+"; "+r.getChannel()+"; "+r.getRec_pattern()+"; "+r.getAhh()+":"+r.getAmm());\r
446 \r
447                 // RDに更新要請\r
448                 {\r
449                         // ハングさせないためのおまじない\r
450                         reportProgress("get program.(3/7)");\r
451                         reqGET("http://"+getIPAddr()+":"+getPortNo()+"/program/"+idx+"/b_proginfo.htm?"+id,null);\r
452                         \r
453                         reportProgress("get program.(4/7)");\r
454                         reqGET("http://"+getIPAddr()+":"+getPortNo()+"/program/"+idx+"/proginfo.htm",null);\r
455                 }\r
456 \r
457                 // POSTデータを変換する\r
458                 Hashtable<String, String> pdat = modPostdata(r);\r
459                 \r
460                 // RDへの情報作成\r
461                 String pstr = joinPoststr(pdat);\r
462 \r
463                 // RDへ情報送信\r
464                 {               \r
465                         reportProgress("send request.(5/7)");\r
466                         String[] d = reqPOST("http://"+getIPAddr()+":"+getPortNo()+"/program/"+idx+"/entry.htm", pstr, null);\r
467                         response = d[1];\r
468                 }\r
469 \r
470                 // 更新結果の確認\r
471                 ma = Pattern.compile("msg=\"(.+?)\"").matcher(response);\r
472                 if ( ma.find() ) {\r
473                         errmsg = ma.group(1);\r
474                         System.out.printf("\n<<< Message from RD >>> \"%s\"\n\n", errmsg);\r
475                         \r
476                         ma = Pattern.compile("(正常に登録できました。|予約時間が一部重複しています。|現在のHDD残量では入りません。|画質を.*に修正しました。)").matcher(errmsg);\r
477                         if ( ! ma.find()) {\r
478                                 return false;\r
479                         }\r
480                 }\r
481 \r
482                 System.out.printf("\n<<< Message from RD >>> \"%s\"\n\n", "正常に更新できました。");\r
483 \r
484                 /*\r
485                  * 予約情報の調整 \r
486                  */\r
487                 // キャッシュ上の予約情報を更新する(ライン入力放送局名引継対応)\r
488                 getReserves().remove(o);\r
489                 getReserves().add(r);\r
490                 \r
491                 // 新しい予約一覧を取得する\r
492                 {\r
493                         reportProgress("get identifier(6/7).");\r
494                         String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/program/b_prgrm.htm",null);\r
495                         response = d[1];\r
496                 }\r
497                 ma = Pattern.compile("/program/(\\d+?)/program.htm").matcher(response);\r
498                 if (ma.find()) {\r
499                         idx = ma.group(1);\r
500                         reportProgress("get identifier(7/7).");\r
501                         String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/program/"+idx+"/program.htm",null);\r
502                         response = d[1];\r
503                 }\r
504 \r
505                 setReservesV1(GetRdReservedList(response));\r
506 \r
507                 // キャッシュに保存\r
508                 ReservesToFile(getReserves(), rsvedFile);\r
509                 \r
510                 return(true);\r
511         }\r
512 \r
513 \r
514         /*******************************************************************************\r
515          * 予約削除\r
516          ******************************************************************************/\r
517         \r
518         public ReserveList RemoveRdEntry(String delid) {\r
519                 System.out.println("Run: RemoveRdEntry()");\r
520                 \r
521                 errmsg = "";\r
522 \r
523                 // おまじない\r
524                 Authenticator.setDefault(new MyAuthenticator(getUser(), getPasswd()));\r
525 \r
526                 // 削除対象を探す\r
527                 ReserveList rx = null;\r
528                 for (  ReserveList reserve : getReserves() )  {\r
529                         if (reserve.getId().equals(delid)) {\r
530                                 rx = reserve;\r
531                                 break;\r
532                         }\r
533                 }\r
534                 if (rx == null) {\r
535                         errmsg = ERRID+"キャッシュ上に操作対象が見つかりません。";\r
536                         return(null);\r
537                 }\r
538 \r
539                 // 削除準備\r
540                 Matcher ma = null;\r
541                 String idx = "";\r
542                 String response;\r
543                 {\r
544                         reportProgress("get identifier(1/7).");\r
545                         String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/program/b_prgrm.htm",null);\r
546                         response = d[1];\r
547                 }\r
548                 ma = Pattern.compile("/program/(\\d+?)/program.htm").matcher(response);\r
549                 if (ma.find()) {\r
550                         idx = ma.group(1);\r
551                         reportProgress("get identifier(2/7).");\r
552                         String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/program/"+idx+"/program.htm",null);\r
553                         response = d[1];\r
554                 }\r
555                 \r
556                 // 削除対象を探す(外部)\r
557                 String id = null;\r
558                 for ( ReserveList cr : GetRdReservedList(response) ) {\r
559                         if (matchReserveV1(cr, rx)) {\r
560                                 System.out.println("次のエントリを削除します: "+cr.getTitle()+"; "+cr.getChannel()+"; "+cr.getRec_pattern()+"; "+cr.getAhh()+":"+cr.getAmm());\r
561                                 id = cr.getId();\r
562                                 break;\r
563                         }\r
564                 }\r
565                 if (id == null) {\r
566                         errmsg = ERRID+"レコーダ上に操作対象が見つかりません。";\r
567                         return(null);\r
568                 }\r
569 \r
570                 // RDに削除要請\r
571                 {\r
572                         // ハングさせないためのおまじない\r
573                         reportProgress("get program.(3/7)");\r
574                         reqGET("http://"+getIPAddr()+":"+getPortNo()+"/program/"+idx+"/b_proginfo.htm?"+id,null);\r
575                         \r
576                         reportProgress("get program.(4/7)");\r
577                         reqGET("http://"+getIPAddr()+":"+getPortNo()+"/program/"+idx+"/proginfo.htm",null);\r
578                 }\r
579                 \r
580                 {               \r
581                         reportProgress("send request.(5/7)");\r
582                         String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/program/"+idx+"/delete.htm", null);\r
583                         response = d[1];\r
584                 }\r
585 \r
586                 // 削除結果の確認\r
587                 ma = Pattern.compile("msg=\"(.+?)\"").matcher(response);\r
588                 if ( ma.find() ) {\r
589                         errmsg = ma.group(1);\r
590                         System.out.printf("\n<<< Message from RD >>> \"%s\"\n\n", errmsg);\r
591                         \r
592                         ma = Pattern.compile("(正しく削除できました。)").matcher(errmsg);\r
593                         if ( ! ma.find()) {\r
594                                 return null;\r
595                         }\r
596                 }\r
597                 \r
598                 /*\r
599                  * 予約情報の調整 \r
600                  */\r
601                 // キャッシュ上の予約情報を更新する(ライン入力放送局名引継対応)\r
602                 getReserves().remove(rx);\r
603         \r
604                 // 新しい予約一覧を取得する\r
605                 {\r
606                         reportProgress("get identifier(6/7).");\r
607                         String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/program/b_prgrm.htm",null);\r
608                         response = d[1];\r
609                 }\r
610                 ma = Pattern.compile("/program/(\\d+?)/program.htm").matcher(response);\r
611                 if (ma.find()) {\r
612                         idx = ma.group(1);\r
613                         reportProgress("get identifier(7/7).");\r
614                         String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/program/"+idx+"/program.htm",null);\r
615                         response = d[1];\r
616                 }\r
617 \r
618                 setReservesV1(GetRdReservedList(response));\r
619                 \r
620                 // キャッシュに保存\r
621                 ReservesToFile(getReserves(), rsvedFile);\r
622                 \r
623                 System.out.printf("\n<<< Message from RD >>> \"%s\"\n\n", "正常に削除できました。");\r
624                 \r
625                 return(rx);\r
626         }\r
627 \r
628         \r
629         \r
630         /* ここまで */\r
631         \r
632         \r
633         \r
634 \r
635         \r
636         \r
637         /*******************************************************************************\r
638          * 非公開メソッド\r
639          ******************************************************************************/\r
640 \r
641         protected String joinPoststr(Hashtable<String, String> pdat)\r
642         {\r
643                 String[] pkeys = {\r
644                         "bExec",\r
645                         "title_name",\r
646                         "genre",\r
647                         "channel",\r
648                         "date",\r
649                         "start_hour",\r
650                         "start_minute",\r
651                         "end_hour",\r
652                         "end_minute",\r
653                         "enc_type",                             // for X5\r
654                         "disc",\r
655                         "vrate",\r
656                         "amode",\r
657                         "folder",                               // for X5\r
658                         "dvdr",\r
659                         "lVoice",                               // for X5\r
660                         "bVPerform",\r
661                         "aspect",\r
662                         "bAutoChapter",\r
663                         "bDvdAutoChapter",              // for X5\r
664                         "bAudioAutoChapter",    // for X5\r
665                         "detail",\r
666                         "dtv_sid",\r
667                         "dtv_nid",\r
668                         "net_link",                             // for X5\r
669                         "end_form"\r
670                 };\r
671                 \r
672                 String pstr = "";\r
673                 for ( String key : pkeys ) {\r
674                         if (pdat.get(key) == null) {\r
675                                 pstr += key+"=&";\r
676                         }\r
677                         else {\r
678                                 pstr += key+"="+pdat.get(key)+"&";\r
679                         }\r
680                 }\r
681                 pstr = pstr.substring(0, pstr.length()-1);\r
682                 \r
683                 return(pstr);\r
684         }\r
685         \r
686         private Hashtable<String, String> modPostdata(ReserveList r) {\r
687 \r
688                 Hashtable<String, String> newdat = new Hashtable<String, String>();\r
689                 \r
690                 // 実行するよ\r
691                 newdat.put("bExec", (r.getExec())?("ON"):("OFF"));\r
692 \r
693                 // 予約名\r
694                 try {\r
695                         newdat.put("title_name", URLEncoder.encode(r.getTitle(),thisEncoding));\r
696                 } catch (UnsupportedEncodingException e1) {\r
697                         e1.printStackTrace();\r
698                 }\r
699 \r
700                 // 予約詳細\r
701                 try {\r
702                         newdat.put("detail", URLEncoder.encode(r.getDetail().replaceAll("\n", Matcher.quoteReplacement("\r\n")),thisEncoding));\r
703                 } catch (UnsupportedEncodingException e) {\r
704                         e.printStackTrace();\r
705                 }\r
706                 \r
707                 // ジャンル\r
708                 newdat.put("genre", _recstr2genre(r.getRec_genre()));\r
709                 \r
710                 // DVD互換モード\r
711                 newdat.put("dvdr", text2value(dvdcompat,r.getRec_dvdcompat()));\r
712                 \r
713                 // 録画チャンネル\r
714                 String channel = getChCode().getCH_WEB2CODE(r.getCh_name());\r
715                 newdat.put("channel", channel);\r
716                 String ch_no = getChCode().getCH_CODE2REC(channel);\r
717                 r.setChannel(ch_no);\r
718                 \r
719                 // エンコーダ\r
720                 newdat.put("enc_type", text2value(encoder,r.getTuner()));\r
721                 \r
722                 // 録画レート\r
723                 newdat.put("vrate", text2value(vrate,r.getRec_mode()));\r
724 \r
725                 // 録音レート\r
726                 newdat.put("amode", text2value(arate,r.getRec_audio()));\r
727 \r
728                 // 繰り返し\r
729                 Matcher ma = Pattern.compile("^\\d").matcher(r.getRec_pattern());\r
730                 if (ma.find()) { \r
731                         newdat.put("date", r.getRec_pattern());\r
732                 }\r
733                 else {\r
734                         int i = 1;\r
735                         for ( String s : RPTPTN ) {\r
736                                 if ( s.equals(r.getRec_pattern()) == true ) {\r
737                                         newdat.put("date", String.valueOf(i));\r
738                                 }\r
739                                 i++;\r
740                         }\r
741                 }\r
742                 \r
743                 // 番組詳細\r
744                 //newdat.put("detail", r.getDetail()); // 上書きしてた…('д`)\r
745 \r
746                 // フォルダ\r
747                 try {\r
748                         newdat.put("folder", URLEncoder.encode(text2value(folder,r.getRec_folder()),thisEncoding));\r
749                 } catch (UnsupportedEncodingException e) {\r
750                         e.printStackTrace();\r
751                 }\r
752                 \r
753 \r
754                 newdat.put("start_hour", r.getAhh());\r
755                 newdat.put("start_minute", r.getAmm());\r
756                 newdat.put("end_hour", r.getZhh());\r
757                 newdat.put("end_minute", r.getZmm());\r
758                 \r
759                 newdat.put("bAutoChapter"               , text2value(xchapter, r.getRec_xchapter()));\r
760                 newdat.put("bDvdAutoChapter"    , text2value(mschapter, r.getRec_mschapter()));\r
761                 newdat.put("bAudioAutoChapter"  , text2value(mvchapter, r.getRec_mvchapter()));\r
762 \r
763                 String val;\r
764                 \r
765                 val = text2value(device, r.getRec_device());\r
766                 newdat.put("disc", (val!=null)?(val):("0"));\r
767                 \r
768                 val = text2value(aspect, r.getRec_aspect());\r
769                 newdat.put("aspect", (val!=null)?(val):("1"));\r
770                 \r
771                 val = text2value(lvoice, r.getRec_lvoice());\r
772                 newdat.put("lVoice", (val!=null)?(val):("1"));\r
773                 \r
774                 val = text2value(bvperf, r.getRec_bvperf());\r
775                 newdat.put("bVPerform", (val!=null)?(val):("0"));\r
776                 \r
777                 // 追加\r
778                 //newdat.put("disc"                             , "0");\r
779                 //newdat.put("aspect"                           , "1");\r
780                 //newdat.put("lVoice"                           , "1");\r
781                 //newdat.put("bVPerform"                        , "0");\r
782                 //newdat.put("bAutoChapter"             , "0");\r
783                 //newdat.put("bDvdAutoChapter"  , "0");\r
784                 //newdat.put("bAudioAutoChapter"        , "0");\r
785                 newdat.put("dtv_sid"                    , "0");\r
786                 newdat.put("dtv_nid"                    , "0");\r
787                 newdat.put("net_link"                   , "0");\r
788                 newdat.put("end_form"                   , "0");\r
789                 \r
790                 return(newdat);\r
791         }\r
792 \r
793         private String _recstr2genre(String genre)\r
794         {\r
795                 if (genre.equals(TVProgram.ProgGenre.MOVIE.toString())) {\r
796                         return "0";\r
797                 }\r
798                 else if (genre.equals(TVProgram.ProgGenre.MUSIC.toString())) {\r
799                         return "1";\r
800                 }\r
801                 else if (genre.equals(TVProgram.ProgGenre.DORAMA.toString())) {\r
802                         return "2";\r
803                 }\r
804                 else if (genre.equals(TVProgram.ProgGenre.ANIME.toString())) {\r
805                         return "3";\r
806                 }\r
807                 else if (genre.equals(TVProgram.ProgGenre.SPORTS.toString())) {\r
808                         return "4";\r
809                 }\r
810                 else if (genre.equals(TVProgram.ProgGenre.DOCUMENTARY.toString())) {\r
811                         return "5";\r
812                 }\r
813                 else if (genre.equals(TVProgram.ProgGenre.THEATER.toString())) {\r
814                         return "6";\r
815                 }\r
816                 else if (genre.equals(TVProgram.ProgGenre.HOBBY.toString())) {\r
817                         return "7";\r
818                 }\r
819                 else if (genre.equals(TVProgram.ProgGenre.VARIETY.toString())) {\r
820                         return "8";\r
821                 }\r
822                 else {\r
823                         return "10";\r
824                 }\r
825         }\r
826         \r
827         \r
828         \r
829         //\r
830         protected ArrayList<ReserveList> GetRdReservedList(String response) {\r
831                 \r
832                 System.out.println("X5's GetRdReservedList()");\r
833                 \r
834                 //\r
835                 response = response.replaceAll("\n", "");\r
836         \r
837                 ArrayList<ReserveList> newReserveList = new ArrayList<ReserveList>();\r
838                 \r
839                 String buf = "";\r
840                 Matcher ma = Pattern.compile("<tr [^>]*?>([\\s\\S]*?)</tr>").matcher(response);\r
841                 while (ma.find()) {\r
842 \r
843                         // 個々のデータを取り出す\r
844                         buf = ma.group(1);\r
845 \r
846                         ReserveList entry = new ReserveList();\r
847                         \r
848                         String[] d = new String[10];\r
849                         Matcher mb = Pattern.compile("<td.*?>(.*?)</td>").matcher(buf);\r
850                         for (int i=0; i<d.length; i++) {\r
851                                 if ( mb.find()) {\r
852                                         d[i] = mb.group(1);\r
853                                 }\r
854                                 //System.out.println(i+") "+d[i]);\r
855                         }\r
856                         \r
857                         Matcher mc = Pattern.compile(">新規予約<").matcher(buf);\r
858                         if (mc.find()) {\r
859                                 break;\r
860                         }\r
861                         \r
862                         // 予約ID\r
863                         entry.setId(String.valueOf(Integer.valueOf(d[0])-1));\r
864                         \r
865                         // 予約実行ON/OFF\r
866                         mb = Pattern.compile("check_off\\.gif").matcher(d[1]);\r
867                         if (mb.find()) {\r
868                                 entry.setExec(false);\r
869                         }\r
870                         \r
871                         // 予約名のエスケープを解除する\r
872                         String title = CommonUtils.unEscape(d[2]).replaceAll("<[bB][rR]>","");\r
873                         mb = Pattern.compile("<[aA] .*?>(.+?)</[aA]>").matcher(title);\r
874                         if (mb.find()) title = mb.group(1);\r
875                         entry.setTitle(title);\r
876                         entry.setTitlePop(TraceProgram.replacePop(title));\r
877                         \r
878                         // エンコーダ\r
879                         mb = Pattern.compile("act_(.+?)\\.gif").matcher(d[3]);\r
880                         if (mb.find()) {\r
881                                 entry.setTuner(mb.group(1));\r
882                         }\r
883                         else {\r
884                                 entry.setTuner("R1");\r
885                         }\r
886                         \r
887                         // 日時\r
888                         entry.setRec_pattern(d[5]);\r
889                         entry.setRec_pattern_id(getRec_pattern_Id(entry.getRec_pattern()));\r
890                         mb = Pattern.compile("(\\d\\d):(\\d\\d).*?(\\d\\d):(\\d\\d)").matcher(d[6]);\r
891                         if (mb.find()) {\r
892                                 entry.setAhh(mb.group(1));\r
893                                 entry.setAmm(mb.group(2));\r
894                                 entry.setZhh(mb.group(3));\r
895                                 entry.setZmm(mb.group(4));\r
896                         }\r
897                         entry.setRec_nextdate(CommonUtils.getNextDate(entry));\r
898                         entry.setRec_min(CommonUtils.getRecMin(entry.getAhh(), entry.getAmm(), entry.getZhh(), entry.getZmm()));\r
899                         getStartEndDateTime(entry);\r
900                         \r
901                         entry.setChannel(d[4]);\r
902                         entry.setCh_name(getChCode().getCH_REC2WEB(d[4]));\r
903 \r
904                         entry.setRec_mode(d[8]);\r
905                         entry.setRec_audio(d[9]);\r
906                         \r
907                         //entry.rec_folder = data.get();        // 予約一覧からはとれない\r
908                         //entry.rec_genre = data.get();         // 予約一覧からはとれない\r
909                         \r
910                         // 予約情報を保存\r
911                         newReserveList.add(entry);\r
912                 }\r
913                 \r
914                 return(newReserveList);\r
915         }\r
916         \r
917         \r
918         \r
919         /*\r
920          * X5/H1/H2で共有するぜ\r
921          */\r
922         \r
923         protected boolean setSettingFolder(ArrayList<TextValueSet> tvs, String res, String savefile) {\r
924                 ArrayList<TextValueSet> newtvs = new ArrayList<TextValueSet>();\r
925                 Matcher mb = Pattern.compile("obj\\.folder\\[n\\]\\.text=\"(.+?)\";\\s*?obj\\.folder\\[n\\]\\.value=\"(.+?)\";").matcher(res);\r
926                 while (mb.find()) {\r
927                         boolean dub = false;\r
928                         for ( TextValueSet t : newtvs ) {\r
929                                 if (t.getText().equals(mb.group(1))) {\r
930                                         dub = true;\r
931                                         break;\r
932                                 }\r
933                         }\r
934                         if (dub == false) {\r
935                                 TextValueSet t = new TextValueSet();\r
936                                 t.setText(mb.group(1));\r
937                                 t.setValue(mb.group(2));\r
938                                 newtvs.add(t);\r
939                         }\r
940                 }\r
941                 \r
942                 if ( newtvs.size() == 0 ) {\r
943                         errmsg = ERRID+"レコーダ設定情報が取得できなかった: "+"folder";\r
944                         System.err.println(errmsg);\r
945                         return false;\r
946                 }\r
947                 \r
948                 tvs.clear();\r
949                 for ( TextValueSet t : newtvs ) {\r
950                         tvs.add(t);\r
951                 }\r
952                 TVSsave(tvs,savefile);\r
953                 return true;\r
954         }\r
955         \r
956         private boolean setSettingEncoder(ArrayList<TextValueSet> tvs, String res, String savefile) {\r
957                 ArrayList<TextValueSet> newtvs = new ArrayList<TextValueSet>();\r
958                 Matcher mb = Pattern.compile("<input type=\"radio\" [^>]*? name=enc_type value=\"(.+?)\".*?><img src=\"/img/parts/toru_(.+?)\\.gif\">").matcher(res);\r
959                 while (mb.find()) {\r
960                         TextValueSet t = new TextValueSet();\r
961                         t.setText(mb.group(2));\r
962                         t.setValue(mb.group(1));\r
963                         newtvs.add(t);\r
964                 }\r
965                 \r
966                 if (newtvs.size() == 0) {\r
967                         errmsg = ERRID+"レコーダ設定情報が取得できなかった: "+"enc_type";\r
968                         System.err.println(errmsg);\r
969                         return false;\r
970                 }\r
971 \r
972                 tvs.clear();\r
973                 for ( TextValueSet t : newtvs ) {\r
974                         tvs.add(t);\r
975                 }\r
976                 TVSsave(tvs,savefile);\r
977                 return true;\r
978         }\r
979 \r
980         protected boolean setSettingEtc(ArrayList<TextValueSet> tvs, String key, int typ, String res, String savefile) {\r
981                 ArrayList<TextValueSet> newtvs = new ArrayList<TextValueSet>();\r
982                 String valExpr = "(\\d+)";\r
983                 if (typ == 1) {\r
984                         valExpr = "\"(.+?)\"";\r
985                 }\r
986                 Matcher mb = Pattern.compile("<(SELECT|select)[^>]+?name="+key+"[^.]*?>([\\s\\S]+?)</(SELECT|select)>").matcher(res);\r
987                 if (mb.find()) {\r
988                         Matcher mc = Pattern.compile("<(OPTION|option)\\s+(VALUE|value)\\s*=\\s*"+valExpr+"\\s*( selected)?>\\s*(.+?)\\s*</(OPTION|option)>").matcher(mb.group(2));\r
989                         while (mc.find()) {\r
990                                 TextValueSet t = new TextValueSet();\r
991                                 if (key.equals("\"vrate\"")) {\r
992                                         t.setText(mc.group(5).replaceAll(" ", ""));\r
993                                 }\r
994                                 else if (key.equals("channel")) {\r
995                                         t.setText(mc.group(5).replaceAll("^CH ", "CH"));\r
996                                 }\r
997                                 else {\r
998                                         t.setText(mc.group(5));\r
999                                 }\r
1000                                 t.setValue(mc.group(3));\r
1001                                 if (mc.group(4) != null) {\r
1002                                         t.setDefval(true);\r
1003                                 }\r
1004                                 newtvs.add(t);\r
1005                         }\r
1006                 }\r
1007                 \r
1008                 if ( newtvs.size() == 0 ) {\r
1009                         errmsg = ERRID+"レコーダ設定情報が取得できなかった: "+key;\r
1010                         System.err.println(errmsg);\r
1011                         return false;\r
1012                 }\r
1013                 \r
1014                 tvs.clear();\r
1015                 for ( TextValueSet t : newtvs ) {\r
1016                         tvs.add(t);\r
1017                 }\r
1018                 TVSsave(tvs,savefile);\r
1019                 return true;\r
1020         }\r
1021 }\r