OSDN Git Service

[自動予約一覧]検索条件、録画設定の取得とファイルへの保存まで
[tainavi/TinyBannavi.git] / TinyBannavi / src / tainavi / GetRDStatus.java
1 package tainavi;\r
2 \r
3 import java.io.DataInputStream;\r
4 import java.io.DataOutputStream;\r
5 import java.io.IOException;\r
6 import java.net.InetSocketAddress;\r
7 import java.net.Socket;\r
8 import java.net.SocketTimeoutException;\r
9 import java.util.regex.Matcher;\r
10 import java.util.regex.Pattern;\r
11 \r
12 /**\r
13  * \r
14  */\r
15 public class GetRDStatus implements Cloneable {\r
16 \r
17         private byte[] bb = new byte[65536];\r
18         private byte[] bb2 = new byte[231];\r
19         \r
20         public String title = "";\r
21         public String enc = "";\r
22         public String ch = "";\r
23         public String mod = "";\r
24         public String typ = "";\r
25         public String okk = "";\r
26         public String unk = "";\r
27         public String dvd = "";\r
28         public String opn = "";\r
29         public String ply = "";\r
30         public String dig = "";\r
31         public int title_no = 0;\r
32         public int title_len = 0;\r
33         public String title_len_s = "";\r
34         public int chapter = 0;\r
35         public String chapter_name = "";\r
36         public int time_all = 0;\r
37         public String time_all_s = "";\r
38         public int time_chap = 0;\r
39         public String time_chap_s = "";\r
40         public String title_chno = "";\r
41         public String title_chname = "";\r
42         public String title_date = "";\r
43         public String title_time = "";\r
44         public String title_gnr = "";\r
45         public String title_chcode = "";\r
46         \r
47         private final int port = 1048;\r
48 \r
49         //byte[] dummy  = {0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00};\r
50         //byte[] init   = {0x01,0x79,0x00,0x00,(byte) 0xff,(byte) 0xff,(byte) 0xff,(byte) 0xff};\r
51         //byte[] init2  = {0x00,(byte) 0xe9,0x00,0x00,0x00,0x02,(byte) 0xbc,(byte) 0x81};\r
52         //byte[] none   = {0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00};\r
53         //byte[] chgchA = {0x00,0x11,0x00,0x00,0x00,0x02,0x00,(byte) 0x80};\r
54         //byte[] chgchB = {0x00,0x0D,0x00,0x00,0x00,0x02,0x00,0x00};\r
55         //byte[] chgTit = {0x00,(byte) 0xE0,0x00,0x00,0x00,0x00,(byte) 0xBC,0x01};\r
56         \r
57         // 現在どのチャンネルを見ているのか確認する\r
58         public String getCurChannel(String host) {\r
59                 \r
60                 Socket sock = null;\r
61                 DataOutputStream out = null;\r
62                 DataInputStream in = null;\r
63 \r
64                 if (sock == null) {\r
65                         \r
66                         sock = new Socket();\r
67                         \r
68                         try {\r
69                                 sock.setSoTimeout(1*1000);\r
70                                 \r
71                                 sock.connect(new InetSocketAddress(host,port),1000);\r
72                                 \r
73                                 out = new DataOutputStream(sock.getOutputStream());\r
74                                 in = new DataInputStream(sock.getInputStream());\r
75                                 \r
76                         } catch (SocketTimeoutException e) {\r
77                                 System.err.println("ConnectException : Connection timeout");\r
78                                 ply = "";\r
79                                 sock = null;\r
80                                 return null;\r
81                         } catch (IOException e) {\r
82                                 e.printStackTrace();\r
83                                 sock = null;\r
84                                 return null;\r
85                         }\r
86                 }\r
87                 \r
88                 while (true) {\r
89                         try {\r
90                                 \r
91                                 /*\r
92                                 out.writeByte(0x10);\r
93                                 out.writeByte(0x48);\r
94                                 out.flush();\r
95                                 */\r
96                                 \r
97                                 byte[] hdr = new byte[2];\r
98                                 in.read(hdr,0,2);\r
99                                 \r
100                                 int datlen = b2d(new byte[] { 0, 0, hdr[0],hdr[1] });\r
101                                 \r
102                                 // 例外回避\r
103                                 if (datlen <= 1) {\r
104                                         // 終了する\r
105                                         break;\r
106                                 }\r
107 \r
108                                 byte[] b = new byte[datlen-2];\r
109                                 in.read(b,0,datlen-2);\r
110                                 \r
111                                 switch (datlen) {\r
112                                 case 8:         // none\r
113                                         System.out.println(" <-none");\r
114                                         break;\r
115                                         \r
116                                 case 12:        // dummy\r
117                                         System.out.println(" <-dummy");\r
118                                         break;\r
119                                         \r
120                                 case 233:       // init2\r
121                                         System.out.println(" <-init2");\r
122                                         \r
123                                         for ( int x=6; x<231; x++ ) {\r
124                                                 if (bb2[x] != b[x]) {\r
125                                                         System.err.println(x+": "+Integer.valueOf(bb2[x])+" -> "+Integer.valueOf(b[x]));\r
126                                                 }\r
127                                                 \r
128                                                 bb2[x] = b[x];\r
129                                         }\r
130                                         break;\r
131                                         \r
132                                 default:\r
133                                         if (datlen >= 373) {\r
134                                                 // A600以降(共通部)\r
135                                                 {\r
136                                                         System.out.println(" <-init");\r
137                                                         \r
138                                                         int typd = b2d(new byte[] { b[6],b[7],b[8],b[9] });\r
139                                                         if (typd == 0) {\r
140                                                                 typ = "DVD";\r
141                                                         }\r
142                                                         else if (typd == 1) {\r
143                                                                 typ = "HDD";\r
144                                                         }\r
145                                                         else {\r
146                                                                 typ = "UNKNOWN("+typd+")";\r
147                                                         }\r
148                                                         \r
149                                                         int okkd = b2d(new byte[] { b[10],b[11],b[12],b[13] });\r
150                                                         if (okkd == 0) {\r
151                                                                 okk = "なし";\r
152                                                         }\r
153                                                         else if (okkd == 1) {\r
154                                                                 okk = "追っかけ再生";\r
155                                                         }\r
156                                                         else if (okkd == 2) {\r
157                                                                 okk = "TVお好み再生";\r
158                                                         }\r
159                                                         else {\r
160                                                                 okk = "UNKNOWN("+okkd+")";\r
161                                                         }\r
162                                                         \r
163                                                         int unkd = b2d(new byte[] { b[14],b[15],b[16],b[17] });\r
164                                                         if (unkd == 0) {\r
165                                                                 unk = "";\r
166                                                         }\r
167                                                         else if (unkd == 1) {\r
168                                                                 unk = "録画";\r
169                                                         }\r
170                                                         else if (unkd == 2) {\r
171                                                                 unk = "再生";\r
172                                                         }\r
173                                                         else if (unkd == 3) {\r
174                                                                 unk = "録画+再生";\r
175                                                         }\r
176                                                         else {\r
177                                                                 unk = "UNKNOWN("+unkd+")";\r
178                                                         }\r
179                                                         \r
180                                                         int dvdd = b2d(new byte[] { b[18],b[19],b[20],b[21] });\r
181                                                         if (dvdd == 0) {\r
182                                                                 dvd = "";\r
183                                                         }\r
184                                                         else if (dvdd == 1) {\r
185                                                                 dvd = "録画";\r
186                                                         }\r
187                                                         else if (dvdd == 2) {\r
188                                                                 dvd = "再生";\r
189                                                         }\r
190                                                         else if (dvdd == 3) {\r
191                                                                 dvd = "録画+再生";\r
192                                                         }\r
193                                                         else {\r
194                                                                 dvd = "UNKNOWN("+dvdd+")";\r
195                                                         }\r
196                                                         \r
197                                                         int plyd = b2d(new byte[] { b[22],b[23],b[24],b[25] });\r
198                                                         if (plyd == 1) {\r
199                                                                 ply = "録画";\r
200                                                         }\r
201                                                         else if (plyd == 2) {\r
202                                                                 ply = "録画一時停止";\r
203                                                         }\r
204                                                         else if (plyd == 3) {\r
205                                                                 ply = "停止";\r
206                                                         }\r
207                                                         else if (plyd == 4) {\r
208                                                                 ply = "再生";\r
209                                                         }\r
210                                                         else if (plyd == 5) {\r
211                                                                 ply = "一時停止";\r
212                                                         }\r
213                                                         else if (plyd == 6) {\r
214                                                                 ply = "早送り";\r
215                                                         }\r
216                                                         else if (plyd == 7) {\r
217                                                                 ply = "巻戻し";\r
218                                                         }\r
219                                                         else if (plyd == 8) {\r
220                                                                 ply = "スロー送り";\r
221                                                         }\r
222                                                         else if (plyd == 9) {\r
223                                                                 ply = "スロー戻し";\r
224                                                         }\r
225                                                         else if (plyd == 10) {\r
226                                                                 ply = "コマ送り";\r
227                                                         }\r
228                                                         else if (plyd == 11) {\r
229                                                                 ply = "コマ戻し";\r
230                                                         }\r
231                                                         else if (plyd == 12) {\r
232                                                                 ply = "読込み中";\r
233                                                         }\r
234                                                         else if (plyd == 13) {\r
235                                                                 ply = "処理中";\r
236                                                         }\r
237                                                         else if (plyd == 15) {\r
238                                                                 ply = "ダビング";\r
239                                                         }\r
240                                                         else if (plyd == 24) {\r
241                                                                 ply = "ネットdeレック";\r
242                                                         }\r
243                                                         else {\r
244                                                                 ply = "不明("+plyd+")";\r
245                                                         }\r
246                                                         \r
247                                                         int opnd = b2d(new byte[] { b[26],b[27],b[28],b[29] });\r
248                                                         if (opnd == 0) {\r
249                                                                 opn = "OPEN";\r
250                                                         }\r
251                                                         else if (opnd == 1) {\r
252                                                                 opn = "CLOSE";\r
253                                                         }\r
254                                                         else if (opnd == 7) {\r
255                                                                 opn = "LOADED";\r
256                                                         }\r
257                                                         else if (opnd == 15) {\r
258                                                                 opn = "BD-RE(?)";\r
259                                                         }\r
260                                                         else {\r
261                                                                 opn = "UNKNOWN("+opnd+")";\r
262                                                         }\r
263                                                         \r
264                                                         int modd = b2d(new byte[] { b[30],b[31],b[32],b[33] });\r
265                                                         if (modd == 0x00) {\r
266                                                                 mod = "なし";\r
267                                                         }\r
268                                                         else if (modd == 1) {\r
269                                                                 mod = "見るナビ";\r
270                                                         }\r
271                                                         else if (modd == 3) {\r
272                                                                 mod = "編集ナビ";\r
273                                                         }\r
274                                                         else if (modd == 5) {\r
275                                                                 mod = "設定メニュー";\r
276                                                         }\r
277                                                         else if (modd == 6) {\r
278                                                                 mod = "番組ナビ";\r
279                                                         }\r
280                                                         else if (modd == 7) {\r
281                                                                 mod = "スタートメニュー";\r
282                                                         }\r
283                                                         else if (modd == 8) {\r
284                                                                 mod = "見ながら";\r
285                                                         }\r
286                                                         else if (modd == 9) {\r
287                                                                 mod = "簡単ダビング";\r
288                                                         }\r
289                                                         else if (modd == 10) {\r
290                                                                 mod = "はじめての設定";\r
291                                                         }\r
292                                                         else if (modd == 11) {\r
293                                                                 mod = "番組説明";\r
294                                                         }\r
295                                                         else if (modd == 13) {\r
296                                                                 mod = "つぎこれ";\r
297                                                         }\r
298                                                         else {\r
299                                                                 mod = "不明("+modd+")";\r
300                                                         }\r
301                                                         \r
302                                                         time_all = b2d(new byte[] { b[46],b[47],b[48],b[49] });\r
303                                                         \r
304                                                         time_chap = b2d(new byte[] { b[50],b[51],b[52],b[53] });\r
305                                                         \r
306                                                         title_no = b2d(new byte[] { b[54],b[55],b[56],b[57] });\r
307                                                         \r
308                                                         title = new String(b,58,96,"MS932");\r
309                                                         int idx = title.indexOf('\0');\r
310                                                         if (idx != -1) {\r
311                                                                 title = title.substring(0,idx);\r
312                                                         }\r
313                                                         \r
314                                                         chapter = b2d(new byte[] { b[154],b[155],b[156],b[157] });\r
315                                                         \r
316                                                         chapter_name = new String(b,158,96,"MS932");\r
317                                                         idx = chapter_name.indexOf('\0');\r
318                                                         if (idx != -1) {\r
319                                                                 chapter_name = chapter_name.substring(0,idx);\r
320                                                         }\r
321                                                         \r
322                                                         title_len = b2d(new byte[] { b[354],b[355],b[356],b[357] });\r
323                                                         \r
324                                                         title_len_s = getHMS(title_len);\r
325                                                         time_all_s = getHMS(time_all);\r
326                                                         time_chap_s = getHMS(time_chap);\r
327                                                         \r
328                                                         int encd = b2d(new byte[] { b[358],b[359],b[360],b[361] });\r
329                                                         if (encd == 0x04) {\r
330                                                                 enc = "TS1";\r
331                                                         }\r
332                                                         else if (encd == 0x05) {\r
333                                                                 enc = "TS2";\r
334                                                         }\r
335                                                         else if (encd == 0x06) {\r
336                                                                 enc = "RE";\r
337                                                         }\r
338                                                         else {\r
339                                                                 enc = "不明("+encd+")";\r
340                                                         }\r
341                                                         \r
342                                                         int digd = b2d(new byte[] { b[34],b[35],b[36],b[37] });\r
343                                                         if (digd == 0) {\r
344                                                                 // デジタル放送\r
345                                                                 ch = new String(b,362,5);\r
346                                                                 idx = ch.indexOf('\0');\r
347                                                                 if (idx != -1) {\r
348                                                                         ch = ch.substring(0,idx);\r
349                                                                 }\r
350                                                         }\r
351                                                         else if (digd < 200) {\r
352                                                                 ch = String.format("CH %d", digd);\r
353                                                         }\r
354                                                         else {\r
355                                                                 ch = String.format("L %d", digd%200);\r
356                                                         }\r
357                                                 }\r
358                                                 // BZ700世代以降\r
359                                                 if (datlen >= 462) {\r
360                                                         int idx = 0;\r
361                                                         \r
362                                                         title_chno = new String(b,371,5,"MS932");\r
363                                                         idx = title_chno.indexOf('\0');\r
364                                                         if (idx != -1) {\r
365                                                                 title_chno = title_chno.substring(0,idx);\r
366                                                         }\r
367                                                         \r
368                                                         title_chname = new String(b,378,42,"MS932");\r
369                                                         idx = title_chname.indexOf('\0');\r
370                                                         if (idx != -1) {\r
371                                                                 title_chname = title_chname.substring(0,idx);\r
372                                                         }\r
373                                                         \r
374                                                         title_date = new String(b,424,10);\r
375                                                         idx = title_date.indexOf('\0');\r
376                                                         if (idx != -1) {\r
377                                                                 title_date = title_date.substring(0,idx);\r
378                                                         }\r
379                                                         \r
380                                                         title_time = new String(b,436,5);\r
381                                                         idx = title_time.indexOf('\0');\r
382                                                         if (idx != -1) {\r
383                                                                 title_time = title_time.substring(0,idx);\r
384                                                         }\r
385                                                         \r
386                                                         int title_gnrd = b2d(new byte[] { 0,0,0,b[447] });\r
387                                                         if (title_gnrd == 0x00) {\r
388                                                                 title_gnr = "ジャンルなし または ニュース報道";\r
389                                                         }\r
390                                                         else if (title_gnrd == 1) {\r
391                                                                 title_gnr = "スポーツ";\r
392                                                         }\r
393                                                         else if (title_gnrd == 2) {\r
394                                                                 title_gnr = "情報ワイドショー";\r
395                                                         }\r
396                                                         else if (title_gnrd == 3) {\r
397                                                                 title_gnr = "ドラマ";\r
398                                                         }\r
399                                                         else if (title_gnrd == 4) {\r
400                                                                 title_gnr = "音楽";\r
401                                                         }\r
402                                                         else if (title_gnrd == 5) {\r
403                                                                 title_gnr = "バラエティ";\r
404                                                         }\r
405                                                         else if (title_gnrd == 6) {\r
406                                                                 title_gnr = "映画";\r
407                                                         }\r
408                                                         else if (title_gnrd == 7) {\r
409                                                                 title_gnr = "アニメ/特撮";\r
410                                                         }\r
411                                                         else if (title_gnrd == 8) {\r
412                                                                 title_gnr = "ドキュメンタリー教養";\r
413                                                         }\r
414                                                         else if (title_gnrd == 9) {\r
415                                                                 title_gnr = "劇場公演";\r
416                                                         }\r
417                                                         else if (title_gnrd == 10) {\r
418                                                                 title_gnr = "趣味教育";\r
419                                                         }\r
420                                                         else if (title_gnrd == 11) {\r
421                                                                 title_gnr = "福祉";\r
422                                                         }\r
423                                                         else if (title_gnrd == 15) {\r
424                                                                 title_gnr = "その他";\r
425                                                         }\r
426                                                         else {\r
427                                                                 title_gnr = "不明("+title_gnrd+")";\r
428                                                         }\r
429                                                         \r
430                                                         Matcher ma = null;\r
431                                                         ma = Pattern.compile("(\\d+)").matcher(title_chno);\r
432                                                         if (ma.find()) {\r
433                                                                 int code1 = b2d(new byte[] { 0,0,b[452],b[453] });\r
434                                                                 int code2 = b2d(new byte[] { 0,0,b[454],b[455] });\r
435                                                                 Matcher mb = null;\r
436                                                                 mb = Pattern.compile("^L").matcher(title_chno);\r
437                                                                 if (mb.find()) {\r
438                                                                         title_chcode = String.format("%s:%08d:%03d", ma.group(1), code1, code2);\r
439                                                                 } else {\r
440                                                                         if (code1 != 0 || code2 != 0) {\r
441                                                                                 title_chcode = String.format("%s:%d:%d", ma.group(1), code1, code2);\r
442                                                                         } else {\r
443                                                                                 title_chcode = "不明";\r
444                                                                         }\r
445                                                                 }\r
446                                                         } else {\r
447                                                                 title_chcode = "不明";\r
448                                                         }\r
449                                                 }\r
450                                                 \r
451                                                 // 項目の変化を見るための差分出力(デバッグ用)\r
452                                                 for ( int x=6; x<datlen-2; x++ ) {\r
453                                                         if ( x == 9 || x == 25 || x == 29 || x ==  33 || x == 157 || x == 361 ||\r
454                                                                         (x >= 34 && x <= 37) || (x >= 46 && x <= 49) || (x >= 50 && x <= 53) || (x >= 54 && x <= 57) || (x >= 154 && x <= 157) || (x >= 354 && x <= 357) ||\r
455                                                                         (x >= 58 && x <= 58+95) || (x >= 362 && x <= 366)) {\r
456                                                                 continue;\r
457                                                         }\r
458                                                         if (bb[x] != b[x]) {\r
459                                                                 System.err.println(x+": "+Integer.valueOf(bb[x])+" -> "+Integer.valueOf(b[x]));\r
460                                                         }\r
461                                                         \r
462                                                         bb[x] = b[x];\r
463                                                 }\r
464                                                 \r
465                                                 //sock.close();\r
466                                                 //sock = null;\r
467                                                 return(new String(b,361,6));\r
468                                         }\r
469                                         else {\r
470                                                 // 旧default:\r
471                                                 System.out.println(" <-unknown("+datlen+")");\r
472                                                 \r
473                                                 // 永久ループではなく、373バイト未満の未知のサイズのデータはエラーにしてしまうことにした\r
474                                                 //sock.close();\r
475                                                 //sock = null;\r
476                                                 return null;\r
477                                         }\r
478                                 }\r
479                         }\r
480                         catch (SocketTimeoutException e) {\r
481                                 e.printStackTrace();\r
482                                 return null;\r
483                         }\r
484                         catch (IOException e) {\r
485                                 e.printStackTrace();\r
486                                 return null;\r
487                         }\r
488                         finally {\r
489                                 CommonUtils.closing(sock);\r
490                         }\r
491                 }\r
492                 \r
493                 return null;\r
494         }\r
495         \r
496         public String getHMS(int t)     {\r
497                 String flg = "";\r
498                 if ( t < 0 ) {\r
499                         t = -t;\r
500                         flg = "-";\r
501                 }\r
502                 \r
503                 int s = t % 60;\r
504                 int m = (t-s)/60 % 60;\r
505                 int h = (t - m * 60 - s)/3600;\r
506                 \r
507                 return String.format("%s%02d:%02d:%02d", flg,h,m,s);\r
508         }\r
509         \r
510         private int b2d(byte[] data) {\r
511                 return( (((data[0] & 0x80) == 0)?(1):(-1)) * (((data[0] & 0x7f) << 24) | ((data[1] & 0xff) << 16) | ((data[2] & 0xff) << 8) | (data[3] & 0xff)));\r
512         }\r
513         \r
514         //\r
515         public GetRDStatus clone() {\r
516                 return this;\r
517         }\r
518 }\r