• R/O
  • HTTP
  • SSH
  • HTTPS

TinyBannavi: Commit

タイニー番組ナビゲータ本体


Commit MetaInfo

Revisión4ddc4c369f664e50430942eb08b8a564a71f4689 (tree)
Tiempo2014-01-27 18:05:37
Autorpeeweedee <peeweedee@user...>
Commiterpeeweedee

Log Message

しょぼかるデータに対して番組追跡が実行できない場合があった

Cambiar Resumen

Diferencia incremental

--- a/TinyBannavi/05_history.txt
+++ b/TinyBannavi/05_history.txt
@@ -10,10 +10,17 @@
1010 2chの番ナビスレ:http://toro.2ch.net/test/read.cgi/av/1352223253/
1111 ★☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆★
1212
13-3.22.12β+1.5.12(2014-01-XX)
13+3.22.13β+1.5.12(2014-01-XX)
1414 ■変更点
15- ・(レコーダ対応[DIGA BWT650]) 追加(>>673.)
1615  ・(レコーダ対応[TvRock]) 録画/視聴のモード設定の追加
16+ ・(その他) 設定タブの群れをルートからサブにまとめて移動
17+■バグ修正
18+ ・(Web番組表[しょぼかる]) 「タイトル中のサブタイトルを番組追跡に使わない」を有効にしていると、しょぼかるデータに対して番組追跡が行われない問題を修正
19+ ・(レコーダ対応[DIGA BWT2100/BZT710/720]) ログイン時にネットワークできないとNullぽしてたのを修正
20+
21+3.22.12β+1.5.12(2014-01-20)
22+■変更点
23+ ・(レコーダ対応[DIGA BWT650]) 追加(>>673.)
1724  ・(新聞形式) 番組枠内テキストの描画を、LineBreakMeasurerからdrawGlyphVectorに変更。それに伴い番組詳細の描画行数制限を廃止
1825  ・(その他) プラグインの格納場所を変えた
1926 ■バグ修正
--- a/TinyBannavi/env/tracekey.xml
+++ b/TinyBannavi/env/tracekey.xml
@@ -4,55 +4,7 @@
44 <void method="add">
55 <object class="tainavi.TraceKey">
66 <void property="center">
7- <string>TOKYO MX</string>
8- </void>
9- <void property="fazzyThreshold">
10- <int>35</int>
11- </void>
12- <void property="okiniiri">
13- <string>★★★★★</string>
14- </void>
15- <void property="title">
16- <string>&lt;物語&gt;シリーズ セカンドシーズン</string>
17- </void>
18- </object>
19- </void>
20- <void method="add">
21- <object class="tainavi.TraceKey">
22- <void property="center">
23- <string>BSイレブン</string>
24- </void>
25- <void property="fazzyThreshold">
26- <int>35</int>
27- </void>
28- <void property="okiniiri">
29- <string>★★★★★</string>
30- </void>
31- <void property="title">
32- <string>&lt;物語&gt;シリーズセカンドシーズン</string>
33- </void>
34- </object>
35- </void>
36- <void method="add">
37- <object class="tainavi.TraceKey">
38- <void property="center">
39- <string>BSイレブン</string>
40- </void>
41- <void property="fazzyThreshold">
42- <int>35</int>
43- </void>
44- <void property="okiniiri">
45- <string>★★★★★</string>
46- </void>
47- <void property="title">
48- <string>Fate/kaleid liner プリズマ☆イリヤ</string>
49- </void>
50- </object>
51- </void>
52- <void method="add">
53- <object class="tainavi.TraceKey">
54- <void property="center">
55- <string>TOKYO MX</string>
7+ <string>日本テレビ</string>
568 </void>
579 <void property="fazzyThreshold">
5810 <int>35</int>
@@ -61,14 +13,14 @@
6113 <string>★★★★★</string>
6214 </void>
6315 <void property="title">
64- <string>Fate kaleid liner プリズマ☆イリヤ</string>
16+ <string>HUNTER×HUNTER</string>
6517 </void>
6618 </object>
6719 </void>
6820 <void method="add">
6921 <object class="tainavi.TraceKey">
7022 <void property="center">
71- <string>BSイレブン</string>
23+ <string>テレビ東京</string>
7224 </void>
7325 <void property="fazzyThreshold">
7426 <int>80</int>
@@ -77,14 +29,14 @@
7729 <string>★★★★★</string>
7830 </void>
7931 <void property="title">
80- <string>Free!</string>
32+ <string>アイカツ!</string>
8133 </void>
8234 </object>
8335 </void>
8436 <void method="add">
8537 <object class="tainavi.TraceKey">
8638 <void property="center">
87- <string>TOKYO MX</string>
39+ <string>BSジャパン</string>
8840 </void>
8941 <void property="fazzyThreshold">
9042 <int>80</int>
@@ -93,14 +45,14 @@
9345 <string>★★★★★</string>
9446 </void>
9547 <void property="title">
96- <string>Free!</string>
48+ <string>アイカツ!</string>
9749 </void>
9850 </object>
9951 </void>
10052 <void method="add">
10153 <object class="tainavi.TraceKey">
10254 <void property="center">
103- <string>日本テレビ</string>
55+ <string>BSジャパン</string>
10456 </void>
10557 <void property="fazzyThreshold">
10658 <int>35</int>
@@ -109,14 +61,14 @@
10961 <string>★★★★★</string>
11062 </void>
11163 <void property="title">
112- <string>HUNTER×HUNTER</string>
64+ <string>カードファイト!!ヴァンガード リンクジョーカー編</string>
11365 </void>
11466 </object>
11567 </void>
11668 <void method="add">
11769 <object class="tainavi.TraceKey">
11870 <void property="center">
119- <string>BSイレブン</string>
71+ <string>テレビ東京</string>
12072 </void>
12173 <void property="fazzyThreshold">
12274 <int>35</int>
@@ -125,46 +77,46 @@
12577 <string>★★★★★</string>
12678 </void>
12779 <void property="title">
128- <string>きんいろモザイク</string>
80+ <string>カードファイト!!ヴァンガード リンクジョーカー編</string>
12981 </void>
13082 </object>
13183 </void>
13284 <void method="add">
13385 <object class="tainavi.TraceKey">
13486 <void property="center">
135- <string>TOKYO MX</string>
87+ <string>フジテレビ</string>
13688 </void>
13789 <void property="fazzyThreshold">
138- <int>35</int>
90+ <int>90</int>
13991 </void>
14092 <void property="okiniiri">
14193 <string>★★★★★</string>
14294 </void>
14395 <void property="title">
144- <string>きんいろモザイク</string>
96+ <string>トリコ</string>
14597 </void>
14698 </object>
14799 </void>
148100 <void method="add">
149101 <object class="tainavi.TraceKey">
150102 <void property="center">
151- <string>TOKYO MX</string>
103+ <string>テレビ東京</string>
152104 </void>
153105 <void property="fazzyThreshold">
154- <int>35</int>
106+ <int>60</int>
155107 </void>
156108 <void property="okiniiri">
157109 <string>★★★★★</string>
158110 </void>
159111 <void property="title">
160- <string>げんしけん二代目</string>
112+ <string>プリティーリズム・レインボーライブ</string>
161113 </void>
162114 </object>
163115 </void>
164116 <void method="add">
165117 <object class="tainavi.TraceKey">
166118 <void property="center">
167- <string>TOKYO MX</string>
119+ <string>テレビ東京</string>
168120 </void>
169121 <void property="fazzyThreshold">
170122 <int>35</int>
@@ -173,23 +125,23 @@
173125 <string>★★★★★</string>
174126 </void>
175127 <void property="title">
176- <string>たまゆら~もあぐれっしぶ~</string>
128+ <string>マイリトルポニー ~トモダチは魔法~</string>
177129 </void>
178130 </object>
179131 </void>
180132 <void method="add">
181133 <object class="tainavi.TraceKey">
182134 <void property="center">
183- <string>BSイレブン</string>
135+ <string>日本テレビ</string>
184136 </void>
185137 <void property="fazzyThreshold">
186- <int>35</int>
138+ <int>60</int>
187139 </void>
188140 <void property="okiniiri">
189141 <string>★★★★★</string>
190142 </void>
191143 <void property="title">
192- <string>とある科学の超電磁砲S</string>
144+ <string>宇宙兄弟</string>
193145 </void>
194146 </object>
195147 </void>
@@ -205,14 +157,14 @@
205157 <string>★★★★★</string>
206158 </void>
207159 <void property="title">
208- <string>とある科学の超電磁砲S</string>
160+ <string>機動戦士ガンダムSEED DESTINY HDリマスター</string>
209161 </void>
210162 </object>
211163 </void>
212164 <void method="add">
213165 <object class="tainavi.TraceKey">
214166 <void property="center">
215- <string>BS日テレ</string>
167+ <string>NHK Eテレ</string>
216168 </void>
217169 <void property="fazzyThreshold">
218170 <int>35</int>
@@ -221,46 +173,14 @@
221173 <string>★★★★★</string>
222174 </void>
223175 <void property="title">
224- <string>ふたりはミルキィホームズ</string>
225- </void>
226- </object>
227- </void>
228- <void method="add">
229- <object class="tainavi.TraceKey">
230- <void property="center">
231- <string>テレビ東京</string>
232- </void>
233- <void property="fazzyThreshold">
234- <int>80</int>
235- </void>
236- <void property="okiniiri">
237- <string>★★★★★</string>
238- </void>
239- <void property="title">
240- <string>アイカツ!</string>
241- </void>
242- </object>
243- </void>
244- <void method="add">
245- <object class="tainavi.TraceKey">
246- <void property="center">
247- <string>BSジャパン</string>
248- </void>
249- <void property="fazzyThreshold">
250- <int>80</int>
251- </void>
252- <void property="okiniiri">
253- <string>★★★★★</string>
254- </void>
255- <void property="title">
256- <string>アイカツ!</string>
176+ <string>黒魔女</string>
257177 </void>
258178 </object>
259179 </void>
260180 <void method="add">
261181 <object class="tainavi.TraceKey">
262182 <void property="center">
263- <string>BSジャパン</string>
183+ <string>BS日テレ</string>
264184 </void>
265185 <void property="fazzyThreshold">
266186 <int>35</int>
@@ -269,14 +189,14 @@
269189 <string>★★★★★</string>
270190 </void>
271191 <void property="title">
272- <string>カードファイト!!ヴァンガード リンクジョーカー編</string>
192+ <string>とある飛空士への恋歌</string>
273193 </void>
274194 </object>
275195 </void>
276196 <void method="add">
277197 <object class="tainavi.TraceKey">
278198 <void property="center">
279- <string>テレビ東京</string>
199+ <string>BS日テレ</string>
280200 </void>
281201 <void property="fazzyThreshold">
282202 <int>35</int>
@@ -285,14 +205,14 @@
285205 <string>★★★★★</string>
286206 </void>
287207 <void property="title">
288- <string>カードファイト!!ヴァンガード リンクジョーカー編</string>
208+ <string>GJ部</string>
289209 </void>
290210 </object>
291211 </void>
292212 <void method="add">
293213 <object class="tainavi.TraceKey">
294214 <void property="center">
295- <string>日本テレビ</string>
215+ <string>BS-TBS</string>
296216 </void>
297217 <void property="fazzyThreshold">
298218 <int>35</int>
@@ -301,14 +221,14 @@
301221 <string>★★★★★</string>
302222 </void>
303223 <void property="title">
304- <string>ガッチャマン クラウズ</string>
224+ <string>鬼灯の冷徹</string>
305225 </void>
306226 </object>
307227 </void>
308228 <void method="add">
309229 <object class="tainavi.TraceKey">
310230 <void property="center">
311- <string>NHK BSプレミアム</string>
231+ <string>BS-TBS</string>
312232 </void>
313233 <void property="fazzyThreshold">
314234 <int>35</int>
@@ -317,14 +237,14 @@
317237 <string>★★★★★</string>
318238 </void>
319239 <void property="title">
320- <string>キングダム2</string>
240+ <string>キルラキル</string>
321241 </void>
322242 </object>
323243 </void>
324244 <void method="add">
325245 <object class="tainavi.TraceKey">
326246 <void property="center">
327- <string>BSイレブン</string>
247+ <string>BS-TBS</string>
328248 </void>
329249 <void property="fazzyThreshold">
330250 <int>35</int>
@@ -333,14 +253,14 @@
333253 <string>★★★★★</string>
334254 </void>
335255 <void property="title">
336- <string>サーバント×サービス</string>
256+ <string>魔法戦争</string>
337257 </void>
338258 </object>
339259 </void>
340260 <void method="add">
341261 <object class="tainavi.TraceKey">
342262 <void property="center">
343- <string>TOKYO MX</string>
263+ <string>BS-TBS</string>
344264 </void>
345265 <void property="fazzyThreshold">
346266 <int>35</int>
@@ -349,7 +269,7 @@
349269 <string>★★★★★</string>
350270 </void>
351271 <void property="title">
352- <string>サーバント×サービス</string>
272+ <string>桜Trick</string>
353273 </void>
354274 </object>
355275 </void>
@@ -359,36 +279,20 @@
359279 <string>BSフジ</string>
360280 </void>
361281 <void property="fazzyThreshold">
362- <int>80</int>
363- </void>
364- <void property="okiniiri">
365- <string>★★★★★</string>
366- </void>
367- <void property="title">
368- <string>ジャパコン</string>
369- </void>
370- </object>
371- </void>
372- <void method="add">
373- <object class="tainavi.TraceKey">
374- <void property="center">
375- <string>TBSテレビ</string>
376- </void>
377- <void property="fazzyThreshold">
378282 <int>35</int>
379283 </void>
380284 <void property="okiniiri">
381285 <string>★★★★★</string>
382286 </void>
383287 <void property="title">
384- <string>ステラ女学院高等科C3部</string>
288+ <string>スペース☆ダンディ</string>
385289 </void>
386290 </object>
387291 </void>
388292 <void method="add">
389293 <object class="tainavi.TraceKey">
390294 <void property="center">
391- <string>BS-TBS</string>
295+ <string>BSイレブン</string>
392296 </void>
393297 <void property="fazzyThreshold">
394298 <int>35</int>
@@ -397,14 +301,14 @@
397301 <string>★★★★★</string>
398302 </void>
399303 <void property="title">
400- <string>ステラ女学院高等科C3部</string>
304+ <string>のうりん</string>
401305 </void>
402306 </object>
403307 </void>
404308 <void method="add">
405309 <object class="tainavi.TraceKey">
406310 <void property="center">
407- <string>BS-TBS</string>
311+ <string>BSイレブン</string>
408312 </void>
409313 <void property="fazzyThreshold">
410314 <int>35</int>
@@ -413,14 +317,14 @@
413317 <string>★★★★★</string>
414318 </void>
415319 <void property="title">
416- <string>ダンガンロンパ 希望の学園と絶望の高校生 The Animaition</string>
320+ <string>バディ・コンプレックス</string>
417321 </void>
418322 </object>
419323 </void>
420324 <void method="add">
421325 <object class="tainavi.TraceKey">
422326 <void property="center">
423- <string>TBSテレビ</string>
327+ <string>BSイレブン</string>
424328 </void>
425329 <void property="fazzyThreshold">
426330 <int>35</int>
@@ -429,30 +333,14 @@
429333 <string>★★★★★</string>
430334 </void>
431335 <void property="title">
432- <string>ダンガンロンパ 希望の学園と絶望の高校生 The Animation</string>
336+ <string>東京レイヴンズ</string>
433337 </void>
434338 </object>
435339 </void>
436340 <void method="add">
437341 <object class="tainavi.TraceKey">
438342 <void property="center">
439- <string>フジテレビ</string>
440- </void>
441- <void property="fazzyThreshold">
442- <int>90</int>
443- </void>
444- <void property="okiniiri">
445- <string>★★★★★</string>
446- </void>
447- <void property="title">
448- <string>トリコ</string>
449- </void>
450- </object>
451- </void>
452- <void method="add">
453- <object class="tainavi.TraceKey">
454- <void property="center">
455- <string>テレビ朝日</string>
343+ <string>BSイレブン</string>
456344 </void>
457345 <void property="fazzyThreshold">
458346 <int>35</int>
@@ -461,7 +349,7 @@
461349 <string>★★★★★</string>
462350 </void>
463351 <void property="title">
464- <string>ドキドキ!プリキュア</string>
352+ <string>ウィッチクラフトワークス</string>
465353 </void>
466354 </object>
467355 </void>
@@ -477,23 +365,7 @@
477365 <string>★★★★★</string>
478366 </void>
479367 <void property="title">
480- <string>ハイスクールD×D NEW 月光校庭のエクスカリバー</string>
481- </void>
482- </object>
483- </void>
484- <void method="add">
485- <object class="tainavi.TraceKey">
486- <void property="center">
487- <string>BS朝日</string>
488- </void>
489- <void property="fazzyThreshold">
490- <int>80</int>
491- </void>
492- <void property="okiniiri">
493- <string>★★★★★</string>
494- </void>
495- <void property="title">
496- <string>バビル2世</string>
368+ <string>ガールズ&amp;パンツァー</string>
497369 </void>
498370 </object>
499371 </void>
@@ -509,14 +381,14 @@
509381 <string>★★★★★</string>
510382 </void>
511383 <void property="title">
512- <string>ファンタジスタドール</string>
384+ <string>ノブナガン</string>
513385 </void>
514386 </object>
515387 </void>
516388 <void method="add">
517389 <object class="tainavi.TraceKey">
518390 <void property="center">
519- <string>TOKYO MX</string>
391+ <string>BSイレブン</string>
520392 </void>
521393 <void property="fazzyThreshold">
522394 <int>35</int>
@@ -525,7 +397,7 @@
525397 <string>★★★★★</string>
526398 </void>
527399 <void property="title">
528- <string>ファンタジスタドール</string>
400+ <string>ウィザード・バリスターズ~弁魔士セシル</string>
529401 </void>
530402 </object>
531403 </void>
@@ -535,68 +407,20 @@
535407 <string>BSイレブン</string>
536408 </void>
537409 <void property="fazzyThreshold">
538- <int>70</int>
539- </void>
540- <void property="okiniiri">
541- <string>★★★★★</string>
542- </void>
543- <void property="title">
544- <string>ブラッドラッド </string>
545- </void>
546- </object>
547- </void>
548- <void method="add">
549- <object class="tainavi.TraceKey">
550- <void property="center">
551- <string>TOKYO MX</string>
552- </void>
553- <void property="fazzyThreshold">
554- <int>80</int>
555- </void>
556- <void property="okiniiri">
557- <string>★★★★★</string>
558- </void>
559- <void property="title">
560- <string>ブラッドラッド </string>
561- </void>
562- </object>
563- </void>
564- <void method="add">
565- <object class="tainavi.TraceKey">
566- <void property="center">
567- <string>テレビ東京</string>
568- </void>
569- <void property="fazzyThreshold">
570- <int>60</int>
571- </void>
572- <void property="okiniiri">
573- <string>★★★★★</string>
574- </void>
575- <void property="title">
576- <string>プリティーリズム・レインボーライブ</string>
577- </void>
578- </object>
579- </void>
580- <void method="add">
581- <object class="tainavi.TraceKey">
582- <void property="center">
583- <string>テレビ東京</string>
584- </void>
585- <void property="fazzyThreshold">
586410 <int>35</int>
587411 </void>
588412 <void property="okiniiri">
589413 <string>★★★★★</string>
590414 </void>
591415 <void property="title">
592- <string>マイリトルポニー ~トモダチは魔法~</string>
416+ <string>最近、妹のようすがちょっとおかしいんだが。</string>
593417 </void>
594418 </object>
595419 </void>
596420 <void method="add">
597421 <object class="tainavi.TraceKey">
598422 <void property="center">
599- <string>テレビ東京</string>
423+ <string>BSイレブン</string>
600424 </void>
601425 <void property="fazzyThreshold">
602426 <int>35</int>
@@ -605,7 +429,7 @@
605429 <string>★★★★★</string>
606430 </void>
607431 <void property="title">
608- <string>ムシブギョー</string>
432+ <string>そにアニ -SUPER SONICO THE ANIMATION-</string>
609433 </void>
610434 </object>
611435 </void>
@@ -621,14 +445,14 @@
621445 <string>★★★★★</string>
622446 </void>
623447 <void property="title">
624- <string>ロウきゅーぶ!SS</string>
448+ <string>ゴールデンタイム</string>
625449 </void>
626450 </object>
627451 </void>
628452 <void method="add">
629453 <object class="tainavi.TraceKey">
630454 <void property="center">
631- <string>BS-TBS</string>
455+ <string>BSイレブン</string>
632456 </void>
633457 <void property="fazzyThreshold">
634458 <int>35</int>
@@ -637,14 +461,14 @@
637461 <string>★★★★★</string>
638462 </void>
639463 <void property="title">
640- <string>ローゼンメイデン</string>
464+ <string>生徒会役員共*</string>
641465 </void>
642466 </object>
643467 </void>
644468 <void method="add">
645469 <object class="tainavi.TraceKey">
646470 <void property="center">
647- <string>TBSテレビ</string>
471+ <string>BSイレブン</string>
648472 </void>
649473 <void property="fazzyThreshold">
650474 <int>35</int>
@@ -653,30 +477,14 @@
653477 <string>★★★★★</string>
654478 </void>
655479 <void property="title">
656- <string>ローゼンメイデン</string>
480+ <string>ストライク・ザ・ブラッド</string>
657481 </void>
658482 </object>
659483 </void>
660484 <void method="add">
661485 <object class="tainavi.TraceKey">
662486 <void property="center">
663- <string>日本テレビ</string>
664- </void>
665- <void property="fazzyThreshold">
666- <int>60</int>
667- </void>
668- <void property="okiniiri">
669- <string>★★★★★</string>
670- </void>
671- <void property="title">
672- <string>宇宙兄弟</string>
673- </void>
674- </object>
675- </void>
676- <void method="add">
677- <object class="tainavi.TraceKey">
678- <void property="center">
679- <string>TBSテレビ</string>
487+ <string>BSイレブン</string>
680488 </void>
681489 <void property="fazzyThreshold">
682490 <int>35</int>
@@ -685,14 +493,14 @@
685493 <string>★★★★★</string>
686494 </void>
687495 <void property="title">
688- <string>宇宙戦艦ヤマト2199</string>
496+ <string>マケン姫っ!通</string>
689497 </void>
690498 </object>
691499 </void>
692500 <void method="add">
693501 <object class="tainavi.TraceKey">
694502 <void property="center">
695- <string>日本テレビ</string>
503+ <string>BSイレブン</string>
696504 </void>
697505 <void property="fazzyThreshold">
698506 <int>35</int>
@@ -701,7 +509,7 @@
701509 <string>★★★★★</string>
702510 </void>
703511 <void property="title">
704- <string>帰宅部活動記録</string>
512+ <string>ノラガミ</string>
705513 </void>
706514 </object>
707515 </void>
@@ -717,14 +525,14 @@
717525 <string>★★★★★</string>
718526 </void>
719527 <void property="title">
720- <string>幻影ヲ駆ケル太陽</string>
528+ <string>ニセコイ</string>
721529 </void>
722530 </object>
723531 </void>
724532 <void method="add">
725533 <object class="tainavi.TraceKey">
726534 <void property="center">
727- <string>TOKYO MX</string>
535+ <string>BSイレブン</string>
728536 </void>
729537 <void property="fazzyThreshold">
730538 <int>35</int>
@@ -733,14 +541,14 @@
733541 <string>★★★★★</string>
734542 </void>
735543 <void property="title">
736- <string>幻影ヲ駆ケル太陽</string>
544+ <string>世界征服~謀略のズヴィズダー~</string>
737545 </void>
738546 </object>
739547 </void>
740548 <void method="add">
741549 <object class="tainavi.TraceKey">
742550 <void property="center">
743- <string>BS-TBS</string>
551+ <string>BSイレブン</string>
744552 </void>
745553 <void property="fazzyThreshold">
746554 <int>35</int>
@@ -749,14 +557,14 @@
749557 <string>★★★★★</string>
750558 </void>
751559 <void property="title">
752- <string>恋愛ラボ</string>
560+ <string>いなり、こんこん、恋いろは。</string>
753561 </void>
754562 </object>
755563 </void>
756564 <void method="add">
757565 <object class="tainavi.TraceKey">
758566 <void property="center">
759- <string>TBSテレビ</string>
567+ <string>BSイレブン</string>
760568 </void>
761569 <void property="fazzyThreshold">
762570 <int>35</int>
@@ -765,23 +573,7 @@
765573 <string>★★★★★</string>
766574 </void>
767575 <void property="title">
768- <string>恋愛ラボ</string>
769- </void>
770- </object>
771- </void>
772- <void method="add">
773- <object class="tainavi.TraceKey">
774- <void property="center">
775- <string>テレビ東京</string>
776- </void>
777- <void property="fazzyThreshold">
778- <int>80</int>
779- </void>
780- <void property="okiniiri">
781- <string>★★★★★</string>
782- </void>
783- <void property="title">
784- <string>戦勇。</string>
576+ <string>中二病でも恋がしたい!戀</string>
785577 </void>
786578 </object>
787579 </void>
@@ -797,14 +589,14 @@
797589 <string>★★★★★</string>
798590 </void>
799591 <void property="title">
800- <string>戦姫絶唱シンフォギアG</string>
592+ <string>未確認で進行形</string>
801593 </void>
802594 </object>
803595 </void>
804596 <void method="add">
805597 <object class="tainavi.TraceKey">
806598 <void property="center">
807- <string>TOKYO MX</string>
599+ <string>日本テレビ</string>
808600 </void>
809601 <void property="fazzyThreshold">
810602 <int>35</int>
@@ -813,14 +605,14 @@
813605 <string>★★★★★</string>
814606 </void>
815607 <void property="title">
816- <string>戦姫絶唱シンフォギアG</string>
608+ <string>はじめの一歩 Rising</string>
817609 </void>
818610 </object>
819611 </void>
820612 <void method="add">
821613 <object class="tainavi.TraceKey">
822614 <void property="center">
823- <string>BSイレブン</string>
615+ <string>日本テレビ</string>
824616 </void>
825617 <void property="fazzyThreshold">
826618 <int>35</int>
@@ -829,14 +621,14 @@
829621 <string>★★★★★</string>
830622 </void>
831623 <void property="title">
832- <string>有頂天家族</string>
624+ <string>てさぐれ!部活もの あんこーる</string>
833625 </void>
834626 </object>
835627 </void>
836628 <void method="add">
837629 <object class="tainavi.TraceKey">
838630 <void property="center">
839- <string>TOKYO MX</string>
631+ <string>TBSテレビ</string>
840632 </void>
841633 <void property="fazzyThreshold">
842634 <int>35</int>
@@ -845,14 +637,14 @@
845637 <string>★★★★★</string>
846638 </void>
847639 <void property="title">
848- <string>有頂天家族</string>
640+ <string>魔法戦争</string>
849641 </void>
850642 </object>
851643 </void>
852644 <void method="add">
853645 <object class="tainavi.TraceKey">
854646 <void property="center">
855- <string>TOKYO MX</string>
647+ <string>TBSテレビ</string>
856648 </void>
857649 <void property="fazzyThreshold">
858650 <int>35</int>
@@ -861,14 +653,14 @@
861653 <string>★★★★★</string>
862654 </void>
863655 <void property="title">
864- <string>機動戦士ガンダムSEED DESTINY HDリマスター</string>
656+ <string>桜Trick</string>
865657 </void>
866658 </object>
867659 </void>
868660 <void method="add">
869- <object id="TraceKey0" class="tainavi.TraceKey">
661+ <object class="tainavi.TraceKey">
870662 <void property="center">
871- <string>BS日テレ</string>
663+ <string>TBSテレビ</string>
872664 </void>
873665 <void property="fazzyThreshold">
874666 <int>35</int>
@@ -877,17 +669,14 @@
877669 <string>★★★★★</string>
878670 </void>
879671 <void property="title">
880- <string>犬とハサミは使いよう</string>
672+ <string>鬼灯の冷徹</string>
881673 </void>
882674 </object>
883675 </void>
884676 <void method="add">
885- <object idref="TraceKey0"/>
886- </void>
887- <void method="add">
888677 <object class="tainavi.TraceKey">
889678 <void property="center">
890- <string>テレビ東京</string>
679+ <string>TBSテレビ</string>
891680 </void>
892681 <void property="fazzyThreshold">
893682 <int>35</int>
@@ -896,14 +685,14 @@
896685 <string>★★★★★</string>
897686 </void>
898687 <void property="title">
899- <string>獣旋バトル モンスーノ</string>
688+ <string>キルラキル</string>
900689 </void>
901690 </object>
902691 </void>
903692 <void method="add">
904693 <object class="tainavi.TraceKey">
905694 <void property="center">
906- <string>BSイレブン</string>
695+ <string>テレビ東京</string>
907696 </void>
908697 <void property="fazzyThreshold">
909698 <int>35</int>
@@ -912,14 +701,14 @@
912701 <string>★★★★★</string>
913702 </void>
914703 <void property="title">
915- <string>神さまのいない日曜日</string>
704+ <string>弱虫ペダル</string>
916705 </void>
917706 </object>
918707 </void>
919708 <void method="add">
920709 <object class="tainavi.TraceKey">
921710 <void property="center">
922- <string>TOKYO MX</string>
711+ <string>テレビ東京</string>
923712 </void>
924713 <void property="fazzyThreshold">
925714 <int>35</int>
@@ -928,7 +717,7 @@
928717 <string>★★★★★</string>
929718 </void>
930719 <void property="title">
931- <string>神さまのいない日曜日</string>
720+ <string>ディーふらぐ!</string>
932721 </void>
933722 </object>
934723 </void>
@@ -944,7 +733,7 @@
944733 <string>★★★★★</string>
945734 </void>
946735 <void property="title">
947- <string>私がモテないのはどう考えてもお前らが悪い!</string>
736+ <string>うーさーのその日暮らし 覚醒編</string>
948737 </void>
949738 </object>
950739 </void>
@@ -960,14 +749,14 @@
960749 <string>★★★★★</string>
961750 </void>
962751 <void property="title">
963- <string>義風堂々!!兼続と慶次</string>
752+ <string>ハマトラ</string>
964753 </void>
965754 </object>
966755 </void>
967756 <void method="add">
968757 <object class="tainavi.TraceKey">
969758 <void property="center">
970- <string>BSイレブン</string>
759+ <string>テレビ東京</string>
971760 </void>
972761 <void property="fazzyThreshold">
973762 <int>35</int>
@@ -976,14 +765,14 @@
976765 <string>★★★★★</string>
977766 </void>
978767 <void property="title">
979- <string>超次元ゲイム ネプテュ-ヌ</string>
768+ <string>Z/X IGNITION</string>
980769 </void>
981770 </object>
982771 </void>
983772 <void method="add">
984773 <object class="tainavi.TraceKey">
985774 <void property="center">
986- <string>TOKYO MX</string>
775+ <string>テレビ東京</string>
987776 </void>
988777 <void property="fazzyThreshold">
989778 <int>35</int>
@@ -992,7 +781,7 @@
992781 <string>★★★★★</string>
993782 </void>
994783 <void property="title">
995- <string>超次元ゲイム ネプテューヌ</string>
784+ <string>Wake Up  Girls!</string>
996785 </void>
997786 </object>
998787 </void>
@@ -1001,9 +790,6 @@
1001790 <void property="center">
1002791 <string>テレビ東京</string>
1003792 </void>
1004- <void property="disableRepeat">
1005- <boolean>true</boolean>
1006- </void>
1007793 <void property="fazzyThreshold">
1008794 <int>35</int>
1009795 </void>
@@ -1011,14 +797,14 @@
1011797 <string>★★★★★</string>
1012798 </void>
1013799 <void property="title">
1014- <string>超速変形ジャイロゼッター</string>
800+ <string>プピポー!</string>
1015801 </void>
1016802 </object>
1017803 </void>
1018804 <void method="add">
1019805 <object class="tainavi.TraceKey">
1020806 <void property="center">
1021- <string>BSイレブン</string>
807+ <string>テレビ東京</string>
1022808 </void>
1023809 <void property="fazzyThreshold">
1024810 <int>35</int>
@@ -1027,14 +813,14 @@
1027813 <string>★★★★★</string>
1028814 </void>
1029815 <void property="title">
1030- <string>進撃の巨人</string>
816+ <string>ノブナガ・ザ・フール</string>
1031817 </void>
1032818 </object>
1033819 </void>
1034820 <void method="add">
1035821 <object class="tainavi.TraceKey">
1036822 <void property="center">
1037- <string>TOKYO MX</string>
823+ <string>テレビ東京</string>
1038824 </void>
1039825 <void property="fazzyThreshold">
1040826 <int>35</int>
@@ -1043,14 +829,14 @@
1043829 <string>★★★★★</string>
1044830 </void>
1045831 <void property="title">
1046- <string>進撃の巨人</string>
832+ <string>咲-Saki-全国編</string>
1047833 </void>
1048834 </object>
1049835 </void>
1050836 <void method="add">
1051837 <object class="tainavi.TraceKey">
1052838 <void property="center">
1053- <string>フジテレビ</string>
839+ <string>テレビ東京</string>
1054840 </void>
1055841 <void property="fazzyThreshold">
1056842 <int>35</int>
@@ -1059,14 +845,14 @@
1059845 <string>★★★★★</string>
1060846 </void>
1061847 <void property="title">
1062- <string>銀の匙</string>
848+ <string>となりの関くん</string>
1063849 </void>
1064850 </object>
1065851 </void>
1066852 <void method="add">
1067853 <object class="tainavi.TraceKey">
1068854 <void property="center">
1069- <string>TOKYO MX</string>
855+ <string>フジテレビ</string>
1070856 </void>
1071857 <void property="fazzyThreshold">
1072858 <int>35</int>
@@ -1075,14 +861,14 @@
1075861 <string>★★★★★</string>
1076862 </void>
1077863 <void property="title">
1078- <string>銀河機攻隊 マジェスティックプリンス</string>
864+ <string>銀の匙 Silver Spoon &lt;ノイタミナ&gt;</string>
1079865 </void>
1080866 </object>
1081867 </void>
1082868 <void method="add">
1083869 <object class="tainavi.TraceKey">
1084870 <void property="center">
1085- <string>NHK Eテレ</string>
871+ <string>フジテレビ</string>
1086872 </void>
1087873 <void property="fazzyThreshold">
1088874 <int>35</int>
@@ -1091,7 +877,7 @@
1091877 <string>★★★★★</string>
1092878 </void>
1093879 <void property="title">
1094- <string>黒魔女</string>
880+ <string>サムライフラメンコ&lt;ノイタミナ&gt;</string>
1095881 </void>
1096882 </object>
1097883 </void>
--- a/TinyBannavi/src/tainavi/AbsChannelConvertView.java
+++ b/TinyBannavi/src/tainavi/AbsChannelConvertView.java
@@ -29,6 +29,7 @@ import javax.swing.table.TableColumn;
2929
3030 import tainavi.TVProgram.ProgSubtype;
3131 import tainavi.TVProgram.ProgType;
32+import tainavi.plugintv.Syobocal;
3233
3334 /**
3435 * ChannelConver.datを編集するView
--- a/TinyBannavi/src/tainavi/AbsToolBar.java
+++ b/TinyBannavi/src/tainavi/AbsToolBar.java
@@ -90,15 +90,12 @@ public abstract class AbsToolBar extends JToolBar implements HDDRecorderSelectab
9090 // メインウィンドウ
9191 /**
9292 * 親から呼ばないでくださいね!
93- * @see #setToggleShowStatusButton(boolean)
9493 */
9594 protected abstract void setStatusVisible(boolean b);
9695 /**
9796 * 親から呼ばないでくださいね!
98- * @see #setToggleFullScreenButton(boolean)
9997 */
10098 protected abstract void setFullScreen(boolean b);
101- protected abstract void toggleSettingTabVisible();
10299 protected abstract boolean isTabSelected(MWinTab tab);
103100 // 部品
104101 protected abstract boolean addKeywordSearch(SearchKey search);
@@ -216,7 +213,6 @@ public abstract class AbsToolBar extends JToolBar implements HDDRecorderSelectab
216213 private JSlider jSlider_paperZoom = null;
217214 private JToggleButton jToggleButton_timer = null;
218215 private JButton jButton_logviewer = null;
219- private JToggleButton jToggleButton_showsetting = null;
220216 private JToggleButton jToggleButton_showstatus = null;
221217 private JToggleButton jToggleButton_fullScreen = null;
222218 private JButton jButton_update = null;
@@ -268,7 +264,6 @@ public abstract class AbsToolBar extends JToolBar implements HDDRecorderSelectab
268264 this.add(getJSlider_paperZoom("番組枠表示拡大"));
269265 this.add(getJButton_logviewer("ログビューア"));
270266 this.add(getJToggleButton_timer("タイマー"));
271- this.add(getJToggleButton_showsetting("設定タブを開く"));
272267 this.addSeparator(new Dimension(4,0));
273268 this.add(getJToggleButton_showstatus("ステータス領域"));
274269 this.add(getJToggleButton_fullScreen("全"));
@@ -996,13 +991,6 @@ public abstract class AbsToolBar extends JToolBar implements HDDRecorderSelectab
996991 }
997992 };
998993
999- // 設定タブを出したりしまったり
1000- private final ActionListener al_showsetting = new ActionListener(){
1001- public void actionPerformed(ActionEvent e){
1002- toggleSettingTabVisible();
1003- }
1004- };
1005-
1006994 // ステータスエリアを出したりしまったり
1007995 private final ActionListener al_toggleShowStatus = new ActionListener() {
1008996
@@ -1339,20 +1327,6 @@ public abstract class AbsToolBar extends JToolBar implements HDDRecorderSelectab
13391327 return jButton_shutdown;
13401328 }
13411329
1342- // 「設定タブを表示」
1343- private JToggleButton getJToggleButton_showsetting(String s) {
1344- if (jToggleButton_showsetting == null) {
1345- final ImageIcon icon = new ImageIcon(ICONFILE_SHOWSETTING);
1346- jToggleButton_showsetting = new JToggleButton(icon);
1347- jToggleButton_showsetting.setToolTipText(TIPS_SHOWSETTING);
1348-
1349- jToggleButton_showsetting.setSelected(bounds.getShowSettingTabs());
1350-
1351- jToggleButton_showsetting.addActionListener(al_showsetting);
1352- }
1353- return jToggleButton_showsetting;
1354- }
1355-
13561330 // 「ステータス領域」
13571331 private JToggleButton getJToggleButton_showstatus(String s) {
13581332 if (jToggleButton_showstatus == null) {
--- a/TinyBannavi/src/tainavi/TVProgramList.java
+++ b/TinyBannavi/src/tainavi/TVProgramList.java
@@ -3,6 +3,7 @@ package tainavi;
33 import java.util.ArrayList;
44
55 import tainavi.TVProgram.ProgType;
6+import tainavi.plugintv.Syobocal;
67
78 /**
89 * <P>{@link TVProgram} のリストを実現するクラスです.
--- a/TinyBannavi/src/tainavi/VWMainWindow.java
+++ b/TinyBannavi/src/tainavi/VWMainWindow.java
@@ -60,6 +60,7 @@ public class VWMainWindow extends JPanel {
6060 */
6161
6262 private JTabbedPane jTabbedPane = null;
63+ private JTabbedPane jTabbedPane_settings = null;
6364
6465
6566 /*
@@ -69,9 +70,13 @@ public class VWMainWindow extends JPanel {
6970 public VWMainWindow() {
7071 this.setLayout(new BorderLayout());
7172 this.add(getJTabbedPane(), BorderLayout.CENTER);
72-
73+ getJTabbedPane_settings();
74+
7375 // タブを全部準備する
7476 for ( MWinTab tab : MWinTab.values() ) {
77+ if ( tab == MWinTab.SETTING ) {
78+ jTabbedPane.add(jTabbedPane_settings, "設定");
79+ }
7580 addTab(null, tab);
7681 }
7782 }
@@ -93,14 +98,21 @@ public class VWMainWindow extends JPanel {
9398
9499 // タブを追加する
95100 public boolean addTab(Component comp, MWinTab tab) {
96- if ( jTabbedPane.getTabCount() < tab.getIndex() ) {
97- System.err.println(String.format("[DEBUG][メインウィンドウ] タブの数があわない: %d/%d",jTabbedPane.getTabCount(),tab.getIndex()));
101+ if ( jTabbedPane.getTabCount() + jTabbedPane_settings.getTabCount() < tab.getIndex() ) {
102+ System.err.println(String.format("[DEBUG][メインウィンドウ] タブの数があわない: %d/%d", jTabbedPane.getTabCount(), tab.getIndex()));
98103 return false;
99104 }
100- if ( jTabbedPane.getTabCount() > tab.getIndex() ) {
101- jTabbedPane.remove(tab.getIndex());
105+
106+ int tabIndex = tab.getIndex();
107+ JTabbedPane tabPane = jTabbedPane;
108+ if ( tabIndex >= MWinTab.SETTING.getIndex() ) {
109+ tabIndex -= MWinTab.SETTING.getIndex();
110+ tabPane = jTabbedPane_settings;
111+ }
112+ if ( tabPane.getTabCount() > tabIndex ) {
113+ tabPane.remove(tabIndex);
102114 }
103- jTabbedPane.add(comp, tab.getName(), tab.getIndex());
115+ tabPane.add(comp, tab.getName(), tabIndex);
104116 return true;
105117 }
106118
@@ -108,24 +120,39 @@ public class VWMainWindow extends JPanel {
108120 public void setSelectedTab(MWinTab tab) {
109121 if ( tab == null ) {
110122 jTabbedPane.setSelectedIndex(-1);
123+ return;
111124 }
112- else if (jTabbedPane.getTabCount() > tab.getIndex()) {
113- jTabbedPane.setSelectedIndex(tab.getIndex());
125+ if ( tab.getIndex() >= MWinTab.SETTING.getIndex() ) {
126+ jTabbedPane_settings.setSelectedIndex(tab.getIndex()-MWinTab.SETTING.getIndex());
127+ jTabbedPane.setSelectedIndex(MWinTab.SETTING.getIndex());
128+ return;
114129 }
130+ jTabbedPane.setSelectedIndex(tab.getIndex());
115131 }
116132
117133 //
118134 public Component getTab(MWinTab tab) {
119- return this.getComponent(tab.getIndex());
135+ if ( tab.getIndex() >= MWinTab.SETTING.getIndex() ) {
136+ return jTabbedPane_settings.getComponent(tab.getIndex() - MWinTab.SETTING.getIndex());
137+ }
138+ return jTabbedPane.getComponent(tab.getIndex());
120139 }
121140
122141 // タブが選択されているか確認する
123142 public boolean isTabSelected(MWinTab tab) {
143+ if ( tab.getIndex() >= MWinTab.SETTING.getIndex() ) {
144+ return (jTabbedPane.getSelectedIndex() == MWinTab.SETTING.getIndex() && jTabbedPane_settings.getSelectedIndex() == tab.getIndex()-MWinTab.SETTING.getIndex());
145+ }
124146 return (jTabbedPane.getSelectedIndex() == tab.getIndex());
125147 }
126148
127149 // どのタブが選択されているのやら
128- public MWinTab getSelectedTab() { return MWinTab.getAt(jTabbedPane.getSelectedIndex()); }
150+ public MWinTab getSelectedTab() {
151+ if ( jTabbedPane.getSelectedIndex() == MWinTab.SETTING.getIndex() ) {
152+ return MWinTab.getAt(jTabbedPane.getSelectedIndex());
153+ }
154+ return MWinTab.getAt(jTabbedPane.getSelectedIndex());
155+ }
129156
130157 // 設定タブをトグル切り替え
131158 private final int firstSettingTab = MWinTab.SETTING.ordinal();
@@ -133,33 +160,13 @@ public class VWMainWindow extends JPanel {
133160 private Component[] st_comp = new Component[countSettingTab];
134161 private String[] st_title = new String[countSettingTab];
135162 public boolean toggleShowSettingTabs() {
136- if (st_comp[0] == null) {
137- for (int i=countSettingTab-1; i>=0; i--) {
138- st_comp[i] = this.jTabbedPane.getComponentAt(firstSettingTab+i);
139- st_title[i] = this.jTabbedPane.getTitleAt(firstSettingTab+i);
140- this.jTabbedPane.remove(firstSettingTab+i);
141- }
142- return false;
143- }
144- else {
145- for (int i=0; i<countSettingTab; i++) {
146- this.jTabbedPane.add(st_comp[i]);
147- this.jTabbedPane.setTitleAt(firstSettingTab+i, st_title[i]);
148- st_comp[i] = null;
149- }
150- this.jTabbedPane.setSelectedIndex(firstSettingTab);
151- return true;
152- }
163+ return true;
153164 }
154165
155166 public boolean getShowSettingTabs() {
156- return (jTabbedPane.getTabCount() > firstSettingTab);
167+ return true;
157168 }
158169 public void setShowSettingTabs(boolean b) {
159- if ((b && jTabbedPane.getTabCount() <= firstSettingTab) ||
160- ( ! b && jTabbedPane.getTabCount() > firstSettingTab)) {
161- toggleShowSettingTabs();
162- }
163170 }
164171
165172
@@ -173,6 +180,13 @@ public class VWMainWindow extends JPanel {
173180 }
174181 return jTabbedPane;
175182 }
183+
184+ private JTabbedPane getJTabbedPane_settings() {
185+ if (jTabbedPane_settings == null) {
186+ jTabbedPane_settings = new JTabbedPane();
187+ }
188+ return jTabbedPane_settings;
189+ }
176190
177191 /**
178192 * @deprecated
--- a/TinyBannavi/src/tainavi/VersionInfo.java
+++ b/TinyBannavi/src/tainavi/VersionInfo.java
@@ -5,7 +5,7 @@ import java.util.regex.Pattern;
55
66
77 public class VersionInfo {
8- private static final String Version = "タイニー番組ナビゲータ 3.22.12β";
8+ private static final String Version = "タイニー番組ナビゲータ 3.22.13β";
99
1010 private static final String OSname = System.getProperty("os.name");
1111 private static final String OSvers = System.getProperty("os.version");
--- a/TinyBannavi/src/tainavi/Viewer.java
+++ b/TinyBannavi/src/tainavi/Viewer.java
@@ -64,7 +64,6 @@ import javax.swing.event.ChangeEvent;
6464 import javax.swing.event.ChangeListener;
6565
6666 import tainavi.HDDRecorder.RecType;
67-import tainavi.SearchKey.TargetId;
6867 import tainavi.TVProgram.ProgFlags;
6968 import tainavi.TVProgram.ProgGenre;
7069 import tainavi.TVProgram.ProgOption;
@@ -73,6 +72,7 @@ import tainavi.TVProgram.ProgSubtype;
7372 import tainavi.TVProgram.ProgType;
7473 import tainavi.VWMainWindow.MWinTab;
7574 import tainavi.VWUpdate.UpdateResult;
75+import tainavi.plugintv.Syobocal;
7676
7777
7878 /**
@@ -1386,11 +1386,6 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener,H
13861386 }
13871387
13881388 @Override
1389- protected void toggleSettingTabVisible() {
1390- mainWindow.toggleShowSettingTabs();
1391- }
1392-
1393- @Override
13941389 protected boolean isTabSelected(MWinTab tab) {
13951390 return mainWindow.isTabSelected(tab);
13961391 }
@@ -3124,7 +3119,7 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener,H
31243119
31253120 /**
31263121 * Web番組表をDLする
3127- * <P>単体実行の場合はこちらを呼び出す:{@link #doLoadTVProgram(LoadFor)}
3122+ * <P>単体実行の場合はこちらを呼び出す:{@link #doLoadTVProgram(boolean, tainavi.Viewer.LoadFor)}
31283123 * <P>部品実行の場合はこちらを呼び出す
31293124 */
31303125 private boolean loadTVProgram(final boolean force, final LoadFor lf) {
--- a/TinyBannavi/src/tainavi/pluginrec/PlugIn_RecDIGA_DMR_BWT2100.java
+++ b/TinyBannavi/src/tainavi/pluginrec/PlugIn_RecDIGA_DMR_BWT2100.java
@@ -2275,7 +2275,7 @@ public class PlugIn_RecDIGA_DMR_BWT2100 extends HDDRecorderUtils implements HDDR
22752275 r = d[1];
22762276 }
22772277
2278- if ( r.contains(DIGAMSG_PLEASELOGIN) ) {
2278+ if ( r == null || r.contains(DIGAMSG_PLEASELOGIN) ) {
22792279 // ログイン失敗だからもうだめぽ
22802280 break;
22812281 }
--- a/TinyBannavi/src/tainavi/Syobocal.java
+++ b/TinyBannavi/src/tainavi/plugintv/Syobocal.java
@@ -1,517 +1,520 @@
1-package tainavi;
2-
3-import java.io.File;
4-import java.util.ArrayList;
5-import java.util.Calendar;
6-import java.util.GregorianCalendar;
7-import java.util.regex.Matcher;
8-import java.util.regex.Pattern;
9-
10-/**
11- * しょぼかるから番組表と放送局リストを取得する。プラグインではないよ。
12- */
13-public class Syobocal extends TVProgramUtils implements TVProgram,Cloneable {
14-
15- private final String thisEncoding = "UTF-8";
16-
17- public void setDebug(boolean b) { debug = b; }
18-
19- private boolean debug = false;
20-
21- private boolean rss2 = false;
22-
23- /* 必須コード - ここから */
24-
25- // 種族の特性
26- private static final String tvProgId = "Syobocal";
27-
28- //private final String progCacheFile = getProgDir()+File.separator+"syobocal.xml";
29- private final String centerFile = "env"+File.separator+"center."+getTVProgramId()+".xml";
30-
31- private final String MSGID = "[しょぼかる] ";
32- private final String ERRID = "[ERROR]"+MSGID;
33- private final String DBGID = "[DEBUG]"+MSGID;
34-
35- @Override
36- public String getTVProgramId() { return tvProgId; }
37-
38- @Override
39- public boolean isAreaSelectSupported() { return false; }
40-
41- @Override
42- public ProgType getType() { return ProgType.SYOBO; }
43- public ProgSubtype getSubtype() { return ProgSubtype.NONE; }
44-
45- @Override
46- public Syobocal clone() {
47- return (Syobocal) super.clone();
48- }
49-
50- // 個体の特性
51-
52- //
53- @Override
54- public int getTimeBarStart() {return 5;}
55-
56- private int getDogDays() { return ((getExpandTo8())?(8):(7)); }
57-
58- //
59- @Override
60- public void loadProgram(String areaCode, boolean force) {
61-
62- String progCacheFile = null;
63- if ( rss2 ) {
64- progCacheFile = getProgDir()+File.separator+"syobocal.xml";
65- }
66- else {
67- progCacheFile = getProgDir()+File.separator+"syobocal.rss";
68- }
69-
70- // 新しい番組データの入れ物を作る
71- ArrayList<ProgList> newplist = new ArrayList<ProgList>();
72-
73- int cnt = 0;
74-
75- try {
76- String response = null;
77-
78- String cirtDateTimeYMD = CommonUtils.getCritDateTime().replaceAll("[/: ]", "");
79-
80- File f = new File(progCacheFile);
81- if (force == true ||
82- (f.exists() == true && isCacheOld(progCacheFile) == true) ||
83- (f.exists() == false && isCacheOld(null) == true)) {
84-
85- String url = null;
86- if ( rss2 ) {
87- url = "http://cal.syoboi.jp/rss2.php?start="+cirtDateTimeYMD+"&days="+getDogDays()+"&titlefmt=$(Flag)^^^$(FlagW)^^^$(Cat)^^^$(ChName)^^^$(EdTime)^^^$(Title)^^^$(SubTitleB)";
88- }
89- else {
90- url = "http://cal.syoboi.jp/rss.php?start=today&count=1500&days=8&days="+getDogDays()+"&titlefmt=$(Flag)^^^$(FlagW)^^^$(Cat)^^^$(ChName)^^^$(EdTime)^^^$(Title)^^^$(SubTitleB)";
91- }
92- response = webToBuffer(url, thisEncoding, true);
93- if ( response == null ) {
94- reportProgress(ERRID+"RSS2.0(オンライン)の取得に失敗しました: "+url);
95- return;
96- }
97-
98- reportProgress(MSGID+"RSS2.0(オンライン)を取得しました: "+url);
99- CommonUtils.write2file(progCacheFile, response);
100- }
101- else if (f.exists()) {
102- //
103- response = CommonUtils.read4file(progCacheFile, true);
104- if ( response == null ) {
105- reportProgress(ERRID+"RSS2.0(キャッシュ)の取得に失敗しました: "+progCacheFile);
106- return;
107- }
108- reportProgress(MSGID+"RSS2.0(キャッシュ)を取得しました: "+progCacheFile);
109- }
110- else {
111- reportProgress(ERRID+"RSS2.0(キャッシュ)がみつかりません: "+progCacheFile);
112- return;
113- }
114-
115- // 情報解析
116-
117- Matcher ma = Pattern.compile("<item(.+?)</item>",Pattern.DOTALL).matcher(response);
118- while (ma.find()) {
119-
120- // 入れ物
121- ProgDetailList pDetail = new ProgDetailList();
122-
123- // <title>金曜ロードショー ヱヴァンゲリヲン新劇場版:破 TV版</title>
124- Matcher mb = Pattern.compile("<title>(.+?)</title>",Pattern.DOTALL).matcher(ma.group(1));
125- if ( ! mb.find()) {
126- continue;
127- }
128-
129- String[] t = mb.group(1).split("\\^\\^\\^",7);
130-
131- if (t.length < 7) {
132- System.err.println(ERRID+"書式が不正: "+mb.group(1));
133- }
134-
135- pDetail.title = CommonUtils.unEscape(t[5]);
136-
137- pDetail.detail = CommonUtils.unEscape(t[6]);
138- if ( pDetail.detail.matches("^#1$|^#1[^0-9].*$") ) {
139- // まあなにもしなくていいか
140- }
141-
142- if (t[0] != null && t[0].length() > 0) {
143- int flag = Integer.valueOf(t[0]);
144- if (flag != 0) {
145- if ((flag & 0x01) != 0x00) {
146- pDetail.addOption(ProgOption.SPECIAL);
147- flag ^= 0x01;
148- }
149- if ((flag & 0x02) != 0x00) {
150- pDetail.flag = ProgFlags.NEW;
151- flag ^= 0x02;
152- }
153- if ((flag & 0x04) != 0x00) {
154- pDetail.flag = ProgFlags.LAST;
155- flag ^= 0x04;
156- }
157- if ((flag & 0x08) != 0x00) {
158- pDetail.addOption(ProgOption.REPEAT);
159- flag ^= 0x08;
160- }
161- if (flag != 0) {
162- System.out.println(DBGID+"未対応のマーク: "+flag);
163- }
164- }
165- }
166- if (t[1] != null && t[1].length() > 0) {
167- int flagw = Integer.valueOf(t[1]);
168- if (flagw != 0) {
169- if ((flagw & 0x01) != 0x00) {
170- if (pDetail.flag != ProgFlags.NEW && ! pDetail.isOptionEnabled(ProgOption.SPECIAL)) {
171- pDetail.addOption(ProgOption.MOVED); // 新番組や特番なら(移)はいらんやろ
172- }
173- flagw ^= 0x01;
174- }
175- if (flagw != 0) {
176- System.out.println(DBGID+"未対応の警告フラグ: "+flagw);
177- }
178- }
179- }
180- // <tv:genre>アニメ(終了/再放送)</tv:genre>
181- pDetail.genre = null;
182- pDetail.subgenre = null;
183- pDetail.genrelist = new ArrayList<TVProgram.ProgGenre>();
184- pDetail.subgenrelist = new ArrayList<TVProgram.ProgSubgenre>();
185- boolean anime_etc = true;
186-
187- if (t[2] != null && t[2].length() > 0) {
188- // ジャンル
189- if (t[2].equals("1") || t[2].equals("10") || t[2].equals("5")) {
190- // 1:アニメ 10:アニメ(終了/再放送) 5:アニメ関連
191- }
192- else if (t[2].equals("7")) {
193- // 7:OVA
194- pDetail.genre = ProgGenre.ANIME;
195- pDetail.subgenre = ProgSubgenre.ANIME_KOKUNAI;
196- pDetail.genrelist.add(ProgGenre.ANIME);
197- pDetail.subgenrelist.add(ProgSubgenre.ANIME_KOKUNAI);
198- anime_etc = false;
199- }
200- else if (t[2].equals("4")) {
201- // 4:特撮
202- pDetail.genre = ProgGenre.ANIME;
203- pDetail.subgenre = ProgSubgenre.ANIME_TOKUSATSU;
204- pDetail.genrelist.add(ProgGenre.ANIME);
205- pDetail.subgenrelist.add(ProgSubgenre.ANIME_TOKUSATSU);
206- anime_etc = false;
207- }
208- else if (t[2].equals("8")) {
209- // 8:映画
210- pDetail.genre = ProgGenre.MOVIE;
211- pDetail.subgenre = ProgSubgenre.MOVIE_ETC;
212- pDetail.genrelist.add(ProgGenre.MOVIE);
213- pDetail.subgenrelist.add(ProgSubgenre.MOVIE_ETC);
214- pDetail.removeOption(ProgOption.MOVED); // 映画なら(移)はいらんやろ
215- }
216- else if (t[2].equals("0")) {
217- // 0:その他
218- pDetail.genrelist.add(ProgGenre.NOGENRE);
219- pDetail.subgenrelist.add(ProgSubgenre.NOGENRE_ETC);
220- }
221- else if (t[2].equals("3") || t[2].equals("2") || t[2].equals("6")) {
222- // 3:テレビ 2:ラジオ 6:メモ
223- }
224- else {
225- System.out.println(DBGID+"未対応のジャンル: "+t[2]);
226- }
227-
228- // 最後に
229- if (pDetail.genre == null) {
230- pDetail.genre = ProgGenre.ANIME;
231- pDetail.subgenre = ProgSubgenre.ANIME_ETC;
232- }
233- if (pDetail.genrelist.size() == 0 || anime_etc) {
234- pDetail.genrelist.add(ProgGenre.ANIME);
235- pDetail.subgenrelist.add(ProgSubgenre.ANIME_ETC);
236- }
237- }
238-
239- // <dc:publisher>日本テレビ</dc:publisher>
240- if ( t[3] == null || t[3].length() == 0) {
241- System.err.println(ERRID+"放送局名がない: "+mb.group(1));
242- continue;
243- }
244-
245- // ベアな放送局名と、ChannelConvert.datを適用した結果の放送局名
246- String location = CommonUtils.unEscape(t[3]);
247- String modifiedloc = getChName(location);
248-
249- // <tv:startDatetime>2011-08-29T00:00:00+09:00</tv:startDatetime>
250- if ( rss2 ) {
251- mb = Pattern.compile("<pubDate>(.+?)\\+09:00</pubDate>",Pattern.DOTALL).matcher(ma.group(1));
252- }
253- else {
254- mb = Pattern.compile("<tv:startDatetime>(.+?)\\+09:00</tv:startDatetime>",Pattern.DOTALL).matcher(ma.group(1));
255- }
256- if ( ! mb.find()) {
257- System.err.println(ERRID+"開始日時がない");
258- continue;
259- }
260- GregorianCalendar ca = CommonUtils.getCalendar(mb.group(1));
261- if ( ca == null ) {
262- System.err.println(ERRID+"開始日時が不正: "+mb.group(1));
263- continue;
264- }
265-
266- pDetail.startDateTime = CommonUtils.getDateTime(ca);
267- pDetail.start = pDetail.startDateTime.substring(11, 16);
268- pDetail.accurateDate = CommonUtils.getDate(ca);
269-
270- if ( t[4] == null || t[4].length() == 0) {
271- System.err.println(ERRID+"終了時刻がない: "+mb.group(1));
272- continue;
273- }
274-
275- GregorianCalendar cz = CommonUtils.getCalendar(CommonUtils.getDate(ca)+" "+t[4]);
276- if (ca.compareTo(cz) > 0) {
277- cz.add(Calendar.DAY_OF_MONTH, 1);
278- }
279-
280- pDetail.endDateTime = CommonUtils.getDateTime(cz);
281- pDetail.end = pDetail.endDateTime.substring(11, 16);
282-
283- // 24:00~28:59までは前日なんだニャー
284- if (CommonUtils.isLateNight(ca.get(Calendar.HOUR_OF_DAY))) {
285- ca.add(Calendar.DAY_OF_MONTH, -1);
286- }
287-
288- // 番組情報を入れるべき日付
289- String progdate = CommonUtils.getDate(ca);
290-
291- // <description>HD放送</description>
292- mb = Pattern.compile("<description>(.+?)</description>").matcher(ma.group(1));
293- if (mb.find()) {
294- pDetail.detail += " <" + CommonUtils.unEscape(mb.group(1)) + ">";
295- if (pDetail.detail.contains("無料放送")) {
296- pDetail.noscrumble = ProgScrumble.NOSCRUMBLE;
297- }
298- if (pDetail.detail.contains("先行放送")) {
299- pDetail.addOption(ProgOption.PRECEDING);
300- }
301- if (pDetail.detail.contains("変更の可能性")) {
302- pDetail.extension = true;
303- }
304- if ( pDetail.detail.contains("繰り下げ") ) {
305- pDetail.extension = true;
306- }
307- if (pDetail.detail.contains("副音声")) {
308- pDetail.addOption(ProgOption.MULTIVOICE);
309- }
310- }
311-
312- // <link>http://cal.syoboi.jp/tid/44#198593</link>
313- mb = Pattern.compile("<link>(.+?)</link>",Pattern.DOTALL).matcher(ma.group(1));
314- if (mb.find()) {
315- pDetail.link = mb.group(1);
316- if ( ! ContentIdSyobo.isValid(pDetail.link)) {
317- System.out.println(DBGID+"TIDとPIDが取得できない: "+pDetail.link);
318- }
319- }
320-
321- // 追加詳細
322- pDetail.setGenreStr();
323-
324- // 統合
325- {
326- // 放送局が存在するか
327- ProgList prog = null;
328- for (ProgList pl : newplist) {
329- if (pl.Center.equals(modifiedloc)) {
330- prog = pl;
331- break;
332- }
333- }
334- if (prog == null) {
335- // 番組表
336- prog = new ProgList();
337- prog.Center = modifiedloc;
338- prog.enabled = true;
339- prog.pdate = new ArrayList<ProgDateList>();
340-
341- newplist.add(prog);
342- }
343-
344- // 日付が存在するか
345- ProgDateList pCenter = null;
346- for (ProgDateList pcl : prog.pdate) {
347- if (pcl.Date.equals(progdate)) {
348- pCenter = pcl;
349- break;
350- }
351- }
352- if (pCenter == null) {
353- pCenter = new ProgDateList();
354- pCenter.Date = progdate;
355- pCenter.pdetail = new ArrayList<ProgDetailList>();
356- prog.pdate.add(pCenter);
357- }
358-
359- // 連結
360- pCenter.pdetail.add(pDetail);
361-
362- cnt++;
363- }
364-
365- //
366- pDetail.splitted_title = pDetail.title;
367- pDetail.splitted_detail = pDetail.detail;
368-
369- // 詳細を登録する
370- pDetail.titlePop = TraceProgram.replacePop(pDetail.title);
371- pDetail.detailPop = TraceProgram.replacePop(pDetail.detail);
372- pDetail.length = Integer.valueOf(CommonUtils.getRecMin(pDetail.start.substring(0,2),pDetail.start.substring(3,5),pDetail.end.substring(0,2),pDetail.end.substring(3,5)));
373- }
374- }
375- catch (Exception e) {
376- e.printStackTrace();
377- return;
378- }
379-
380- pcenter = newplist;
381- System.out.println(DBGID+"番組の数: "+cnt);
382- }
383-
384- /* ここまで */
385-
386- /*
387- * ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
388- * ★★★★★ 放送地域を取得する(TVAreaから降格)-ここから ★★★★★
389- * ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
390- */
391-
392- @Override
393- public void loadAreaCode() {
394- }
395-
396- @Override
397- public void saveAreaCode() {
398- }
399-
400- @Override
401- public String getCode(String area) {
402- return "1";
403- }
404-
405- @Override
406- public String getDefaultArea() {
407- return "しょぼかる";
408- }
409-
410- @Override
411- public String getSelectedArea() {
412- return "しょぼかる";
413- }
414-
415- @Override
416- public String getSelectedCode() {
417- return "1";
418- }
419-
420- /*
421- * ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
422- * ★★★★★ 放送地域を取得する(TVAreaから降格)-ここまで ★★★★★
423- * ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
424- */
425-
426- /*
427- * ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
428- * ★★★★★ 放送局を選択する(TVCenterから降格)-ここから ★★★★★
429- * ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
430- */
431-
432- @Override
433- public void loadCenter(String code, boolean force) {
434-
435- if ( code == null ) {
436- System.out.println(ERRID+"地域コードがnullです.");
437- return;
438- }
439-
440- if ( ! force && new File(centerFile).exists() ) {
441- // NOT FORFCEならキャッシュからどうぞ
442- @SuppressWarnings("unchecked")
443- ArrayList<Center> tmp = (ArrayList<Center>) CommonUtils.readXML(centerFile);
444- if ( tmp != null ) {
445- crlist = tmp;
446- return;
447- }
448- }
449-
450- String uri = "http://cal.syoboi.jp/mng?Action=ShowChList";
451- String response = webToBuffer(uri,thisEncoding,true);
452- if ( response == null ) {
453- System.err.println(ERRID+"放送局リストの取得に失敗: "+uri);
454- return;
455- }
456- System.out.println(MSGID+"放送局リストを取得: "+uri);
457-
458- Matcher ma = Pattern.compile("<table class=\"tframe output\".*?>(.+?)</table>",Pattern.DOTALL).matcher(response);
459- if ( ! ma.find() ) {
460- System.err.println(ERRID+"放送局情報がない: "+uri);
461- return;
462- }
463-
464- // 新しい放送局リストの入れ物を作る
465- ArrayList<Center> newcrlist = new ArrayList<Center>();
466-
467- int cnt = 1;
468- Matcher mb = Pattern.compile("<tr>(.+?)</tr>",Pattern.DOTALL).matcher(ma.group(1));
469- while ( mb.find() ) {
470- String[] d = mb.group(1).split("<.*?>",9);
471- if ( d.length != 9 ) {
472- System.err.println(ERRID+"書式不正(カラム数が足りない): "+d.length);
473- continue;
474- }
475- if ( ! d[1].matches("^\\d+$") ) {
476- continue;
477- }
478-
479- // 放送局リスト
480- Center cr = new Center();
481- cr.setLink(d[5]);
482- cr.setAreaCode("1");
483- cr.setCenterOrig(CommonUtils.unEscape(d[7]));
484- //cr.setCenter(this.chconv.get(cr.getCenterOrig())); // ChannelConvert.datで入れ替えたもの
485- cr.setType("");
486- cr.setEnabled(true);
487- cr.setOrder(cnt++);
488-
489- newcrlist.add(cr);
490-
491- if (debug) System.out.println(MSGID+"放送局を追加: "+cr.getCenterOrig()+" -> "+cr.getCenter());
492- }
493-
494- if ( newcrlist.size() == 0 ) {
495- System.err.println(ERRID+"放送局情報の取得結果が0件だったため情報を更新しません");
496- return;
497- }
498-
499- System.out.println(DBGID+"放送局の数: "+newcrlist.size());
500-
501- crlist = newcrlist;
502- attachChFilters();
503- setSortedCRlist();
504- CommonUtils.writeXML(centerFile, crlist);
505- }
506-
507- @Override
508- public boolean saveCenter() {
509- return false;
510- }
511-
512- /*
513- * ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
514- * ★★★★★ 放送局を選択する(TVCenterから降格)-ここまで ★★★★★
515- * ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
516- */
517-}
1+package tainavi.plugintv;
2+
3+import tainavi.*;
4+
5+import java.io.File;
6+import java.util.ArrayList;
7+import java.util.Calendar;
8+import java.util.GregorianCalendar;
9+import java.util.regex.Matcher;
10+import java.util.regex.Pattern;
11+
12+/**
13+ * しょぼかるから番組表と放送局リストを取得する。プラグインではないよ。
14+ */
15+public class Syobocal extends TVProgramUtils implements TVProgram,Cloneable {
16+
17+ private final String thisEncoding = "UTF-8";
18+
19+ public void setDebug(boolean b) { debug = b; }
20+
21+ private boolean debug = false;
22+
23+ private boolean rss2 = false;
24+
25+ /* 必須コード - ここから */
26+
27+ // 種族の特性
28+ private static final String tvProgId = "Syobocal";
29+
30+ //private final String progCacheFile = getProgDir()+File.separator+"syobocal.xml";
31+ private final String centerFile = "env"+File.separator+"center."+getTVProgramId()+".xml";
32+
33+ private final String MSGID = "[しょぼかる] ";
34+ private final String ERRID = "[ERROR]"+MSGID;
35+ private final String DBGID = "[DEBUG]"+MSGID;
36+
37+ @Override
38+ public String getTVProgramId() { return tvProgId; }
39+
40+ @Override
41+ public boolean isAreaSelectSupported() { return false; }
42+
43+ @Override
44+ public ProgType getType() { return ProgType.SYOBO; }
45+ public ProgSubtype getSubtype() { return ProgSubtype.NONE; }
46+
47+ @Override
48+ public Syobocal clone() {
49+ return (Syobocal) super.clone();
50+ }
51+
52+ // 個体の特性
53+
54+ //
55+ @Override
56+ public int getTimeBarStart() {return 5;}
57+
58+ private int getDogDays() { return ((getExpandTo8())?(8):(7)); }
59+
60+ //
61+ @Override
62+ public void loadProgram(String areaCode, boolean force) {
63+
64+ String progCacheFile = null;
65+ if ( rss2 ) {
66+ progCacheFile = getProgDir()+File.separator+"syobocal.xml";
67+ }
68+ else {
69+ progCacheFile = getProgDir()+File.separator+"syobocal.rss";
70+ }
71+
72+ // 新しい番組データの入れ物を作る
73+ ArrayList<ProgList> newplist = new ArrayList<ProgList>();
74+
75+ int cnt = 0;
76+
77+ try {
78+ String response = null;
79+
80+ String cirtDateTimeYMD = CommonUtils.getCritDateTime().replaceAll("[/: ]", "");
81+
82+ File f = new File(progCacheFile);
83+ if (force == true ||
84+ (f.exists() == true && isCacheOld(progCacheFile) == true) ||
85+ (f.exists() == false && isCacheOld(null) == true)) {
86+
87+ String url = null;
88+ if ( rss2 ) {
89+ url = "http://cal.syoboi.jp/rss2.php?start="+cirtDateTimeYMD+"&days="+getDogDays()+"&titlefmt=$(Flag)^^^$(FlagW)^^^$(Cat)^^^$(ChName)^^^$(EdTime)^^^$(Title)^^^$(SubTitleB)";
90+ }
91+ else {
92+ url = "http://cal.syoboi.jp/rss.php?start=today&count=1500&days=8&days="+getDogDays()+"&titlefmt=$(Flag)^^^$(FlagW)^^^$(Cat)^^^$(ChName)^^^$(EdTime)^^^$(Title)^^^$(SubTitleB)";
93+ }
94+ response = webToBuffer(url, thisEncoding, true);
95+ if ( response == null ) {
96+ reportProgress(ERRID+"RSS2.0(オンライン)の取得に失敗しました: "+url);
97+ return;
98+ }
99+
100+ reportProgress(MSGID+"RSS2.0(オンライン)を取得しました: "+url);
101+ CommonUtils.write2file(progCacheFile, response);
102+ }
103+ else if (f.exists()) {
104+ //
105+ response = CommonUtils.read4file(progCacheFile, true);
106+ if ( response == null ) {
107+ reportProgress(ERRID+"RSS2.0(キャッシュ)の取得に失敗しました: "+progCacheFile);
108+ return;
109+ }
110+ reportProgress(MSGID+"RSS2.0(キャッシュ)を取得しました: "+progCacheFile);
111+ }
112+ else {
113+ reportProgress(ERRID+"RSS2.0(キャッシュ)がみつかりません: "+progCacheFile);
114+ return;
115+ }
116+
117+ // 情報解析
118+
119+ Matcher ma = Pattern.compile("<item(.+?)</item>",Pattern.DOTALL).matcher(response);
120+ while (ma.find()) {
121+
122+ // 入れ物
123+ ProgDetailList pDetail = new ProgDetailList();
124+
125+ // <title>金曜ロードショー ヱヴァンゲリヲン新劇場版:破 TV版</title>
126+ Matcher mb = Pattern.compile("<title>(.+?)</title>",Pattern.DOTALL).matcher(ma.group(1));
127+ if ( ! mb.find()) {
128+ continue;
129+ }
130+
131+ String[] t = mb.group(1).split("\\^\\^\\^",7);
132+
133+ if (t.length < 7) {
134+ System.err.println(ERRID+"書式が不正: "+mb.group(1));
135+ }
136+
137+ pDetail.title = CommonUtils.unEscape(t[5]);
138+
139+ pDetail.detail = CommonUtils.unEscape(t[6]);
140+ if ( pDetail.detail.matches("^#1$|^#1[^0-9].*$") ) {
141+ // まあなにもしなくていいか
142+ }
143+
144+ if (t[0] != null && t[0].length() > 0) {
145+ int flag = Integer.valueOf(t[0]);
146+ if (flag != 0) {
147+ if ((flag & 0x01) != 0x00) {
148+ pDetail.addOption(ProgOption.SPECIAL);
149+ flag ^= 0x01;
150+ }
151+ if ((flag & 0x02) != 0x00) {
152+ pDetail.flag = ProgFlags.NEW;
153+ flag ^= 0x02;
154+ }
155+ if ((flag & 0x04) != 0x00) {
156+ pDetail.flag = ProgFlags.LAST;
157+ flag ^= 0x04;
158+ }
159+ if ((flag & 0x08) != 0x00) {
160+ pDetail.addOption(ProgOption.REPEAT);
161+ flag ^= 0x08;
162+ }
163+ if (flag != 0) {
164+ System.out.println(DBGID+"未対応のマーク: "+flag);
165+ }
166+ }
167+ }
168+ if (t[1] != null && t[1].length() > 0) {
169+ int flagw = Integer.valueOf(t[1]);
170+ if (flagw != 0) {
171+ if ((flagw & 0x01) != 0x00) {
172+ if (pDetail.flag != ProgFlags.NEW && ! pDetail.isOptionEnabled(ProgOption.SPECIAL)) {
173+ pDetail.addOption(ProgOption.MOVED); // 新番組や特番なら(移)はいらんやろ
174+ }
175+ flagw ^= 0x01;
176+ }
177+ if (flagw != 0) {
178+ System.out.println(DBGID+"未対応の警告フラグ: "+flagw);
179+ }
180+ }
181+ }
182+ // <tv:genre>アニメ(終了/再放送)</tv:genre>
183+ pDetail.genre = null;
184+ pDetail.subgenre = null;
185+ pDetail.genrelist = new ArrayList<TVProgram.ProgGenre>();
186+ pDetail.subgenrelist = new ArrayList<TVProgram.ProgSubgenre>();
187+ boolean anime_etc = true;
188+
189+ if (t[2] != null && t[2].length() > 0) {
190+ // ジャンル
191+ if (t[2].equals("1") || t[2].equals("10") || t[2].equals("5")) {
192+ // 1:アニメ 10:アニメ(終了/再放送) 5:アニメ関連
193+ }
194+ else if (t[2].equals("7")) {
195+ // 7:OVA
196+ pDetail.genre = ProgGenre.ANIME;
197+ pDetail.subgenre = ProgSubgenre.ANIME_KOKUNAI;
198+ pDetail.genrelist.add(ProgGenre.ANIME);
199+ pDetail.subgenrelist.add(ProgSubgenre.ANIME_KOKUNAI);
200+ anime_etc = false;
201+ }
202+ else if (t[2].equals("4")) {
203+ // 4:特撮
204+ pDetail.genre = ProgGenre.ANIME;
205+ pDetail.subgenre = ProgSubgenre.ANIME_TOKUSATSU;
206+ pDetail.genrelist.add(ProgGenre.ANIME);
207+ pDetail.subgenrelist.add(ProgSubgenre.ANIME_TOKUSATSU);
208+ anime_etc = false;
209+ }
210+ else if (t[2].equals("8")) {
211+ // 8:映画
212+ pDetail.genre = ProgGenre.MOVIE;
213+ pDetail.subgenre = ProgSubgenre.MOVIE_ETC;
214+ pDetail.genrelist.add(ProgGenre.MOVIE);
215+ pDetail.subgenrelist.add(ProgSubgenre.MOVIE_ETC);
216+ pDetail.removeOption(ProgOption.MOVED); // 映画なら(移)はいらんやろ
217+ }
218+ else if (t[2].equals("0")) {
219+ // 0:その他
220+ pDetail.genrelist.add(ProgGenre.NOGENRE);
221+ pDetail.subgenrelist.add(ProgSubgenre.NOGENRE_ETC);
222+ }
223+ else if (t[2].equals("3") || t[2].equals("2") || t[2].equals("6")) {
224+ // 3:テレビ 2:ラジオ 6:メモ
225+ }
226+ else {
227+ System.out.println(DBGID+"未対応のジャンル: "+t[2]);
228+ }
229+
230+ // 最後に
231+ if (pDetail.genre == null) {
232+ pDetail.genre = ProgGenre.ANIME;
233+ pDetail.subgenre = ProgSubgenre.ANIME_ETC;
234+ }
235+ if (pDetail.genrelist.size() == 0 || anime_etc) {
236+ pDetail.genrelist.add(ProgGenre.ANIME);
237+ pDetail.subgenrelist.add(ProgSubgenre.ANIME_ETC);
238+ }
239+ }
240+
241+ // <dc:publisher>日本テレビ</dc:publisher>
242+ if ( t[3] == null || t[3].length() == 0) {
243+ System.err.println(ERRID+"放送局名がない: "+mb.group(1));
244+ continue;
245+ }
246+
247+ // ベアな放送局名と、ChannelConvert.datを適用した結果の放送局名
248+ String location = CommonUtils.unEscape(t[3]);
249+ String modifiedloc = getChName(location);
250+
251+ // <tv:startDatetime>2011-08-29T00:00:00+09:00</tv:startDatetime>
252+ if ( rss2 ) {
253+ mb = Pattern.compile("<pubDate>(.+?)\\+09:00</pubDate>",Pattern.DOTALL).matcher(ma.group(1));
254+ }
255+ else {
256+ mb = Pattern.compile("<tv:startDatetime>(.+?)\\+09:00</tv:startDatetime>",Pattern.DOTALL).matcher(ma.group(1));
257+ }
258+ if ( ! mb.find()) {
259+ System.err.println(ERRID+"開始日時がない");
260+ continue;
261+ }
262+ GregorianCalendar ca = CommonUtils.getCalendar(mb.group(1));
263+ if ( ca == null ) {
264+ System.err.println(ERRID+"開始日時が不正: "+mb.group(1));
265+ continue;
266+ }
267+
268+ pDetail.startDateTime = CommonUtils.getDateTime(ca);
269+ pDetail.start = pDetail.startDateTime.substring(11, 16);
270+ pDetail.accurateDate = CommonUtils.getDate(ca);
271+
272+ if ( t[4] == null || t[4].length() == 0) {
273+ System.err.println(ERRID+"終了時刻がない: "+mb.group(1));
274+ continue;
275+ }
276+
277+ GregorianCalendar cz = CommonUtils.getCalendar(CommonUtils.getDate(ca)+" "+t[4]);
278+ if (ca.compareTo(cz) > 0) {
279+ cz.add(Calendar.DAY_OF_MONTH, 1);
280+ }
281+
282+ pDetail.endDateTime = CommonUtils.getDateTime(cz);
283+ pDetail.end = pDetail.endDateTime.substring(11, 16);
284+
285+ // 24:00~28:59までは前日なんだニャー
286+ if (CommonUtils.isLateNight(ca.get(Calendar.HOUR_OF_DAY))) {
287+ ca.add(Calendar.DAY_OF_MONTH, -1);
288+ }
289+
290+ // 番組情報を入れるべき日付
291+ String progdate = CommonUtils.getDate(ca);
292+
293+ // <description>HD放送</description>
294+ mb = Pattern.compile("<description>(.+?)</description>").matcher(ma.group(1));
295+ if (mb.find()) {
296+ pDetail.detail += " <" + CommonUtils.unEscape(mb.group(1)) + ">";
297+ if (pDetail.detail.contains("無料放送")) {
298+ pDetail.noscrumble = ProgScrumble.NOSCRUMBLE;
299+ }
300+ if (pDetail.detail.contains("先行放送")) {
301+ pDetail.addOption(ProgOption.PRECEDING);
302+ }
303+ if (pDetail.detail.contains("変更の可能性")) {
304+ pDetail.extension = true;
305+ }
306+ if ( pDetail.detail.contains("繰り下げ") ) {
307+ pDetail.extension = true;
308+ }
309+ if (pDetail.detail.contains("副音声")) {
310+ pDetail.addOption(ProgOption.MULTIVOICE);
311+ }
312+ }
313+
314+ // <link>http://cal.syoboi.jp/tid/44#198593</link>
315+ mb = Pattern.compile("<link>(.+?)</link>",Pattern.DOTALL).matcher(ma.group(1));
316+ if (mb.find()) {
317+ pDetail.link = mb.group(1);
318+ if ( ! ContentIdSyobo.isValid(pDetail.link)) {
319+ System.out.println(DBGID+"TIDとPIDが取得できない: "+pDetail.link);
320+ }
321+ }
322+
323+ // 追加詳細
324+ pDetail.setGenreStr();
325+
326+ // 統合
327+ {
328+ // 放送局が存在するか
329+ ProgList prog = null;
330+ for (ProgList pl : newplist) {
331+ if (pl.Center.equals(modifiedloc)) {
332+ prog = pl;
333+ break;
334+ }
335+ }
336+ if (prog == null) {
337+ // 番組表
338+ prog = new ProgList();
339+ prog.Center = modifiedloc;
340+ prog.enabled = true;
341+ prog.pdate = new ArrayList<ProgDateList>();
342+
343+ newplist.add(prog);
344+ }
345+
346+ // 日付が存在するか
347+ ProgDateList pCenter = null;
348+ for (ProgDateList pcl : prog.pdate) {
349+ if (pcl.Date.equals(progdate)) {
350+ pCenter = pcl;
351+ break;
352+ }
353+ }
354+ if (pCenter == null) {
355+ pCenter = new ProgDateList();
356+ pCenter.Date = progdate;
357+ pCenter.pdetail = new ArrayList<ProgDetailList>();
358+ prog.pdate.add(pCenter);
359+ }
360+
361+ // 連結
362+ pCenter.pdetail.add(pDetail);
363+
364+ cnt++;
365+ }
366+
367+ //
368+ pDetail.splitted_title = pDetail.title;
369+ pDetail.splitted_detail = pDetail.detail;
370+
371+ // 詳細を登録する
372+ pDetail.titlePop = TraceProgram.replacePop(pDetail.title);
373+ pDetail.splitted_titlePop = pDetail.titlePop;
374+ pDetail.detailPop = TraceProgram.replacePop(pDetail.detail);
375+ pDetail.length = Integer.valueOf(CommonUtils.getRecMin(pDetail.start.substring(0,2),pDetail.start.substring(3,5),pDetail.end.substring(0,2),pDetail.end.substring(3,5)));
376+ }
377+ }
378+ catch (Exception e) {
379+ e.printStackTrace();
380+ return;
381+ }
382+
383+ pcenter = newplist;
384+ System.out.println(DBGID+"番組の数: "+cnt);
385+ }
386+
387+ /* ここまで */
388+
389+ /*
390+ * ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
391+ * ★★★★★ 放送地域を取得する(TVAreaから降格)-ここから ★★★★★
392+ * ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
393+ */
394+
395+ @Override
396+ public void loadAreaCode() {
397+ }
398+
399+ @Override
400+ public void saveAreaCode() {
401+ }
402+
403+ @Override
404+ public String getCode(String area) {
405+ return "1";
406+ }
407+
408+ @Override
409+ public String getDefaultArea() {
410+ return "しょぼかる";
411+ }
412+
413+ @Override
414+ public String getSelectedArea() {
415+ return "しょぼかる";
416+ }
417+
418+ @Override
419+ public String getSelectedCode() {
420+ return "1";
421+ }
422+
423+ /*
424+ * ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
425+ * ★★★★★ 放送地域を取得する(TVAreaから降格)-ここまで ★★★★★
426+ * ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
427+ */
428+
429+ /*
430+ * ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
431+ * ★★★★★ 放送局を選択する(TVCenterから降格)-ここから ★★★★★
432+ * ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
433+ */
434+
435+ @Override
436+ public void loadCenter(String code, boolean force) {
437+
438+ if ( code == null ) {
439+ System.out.println(ERRID+"地域コードがnullです.");
440+ return;
441+ }
442+
443+ if ( ! force && new File(centerFile).exists() ) {
444+ // NOT FORFCEならキャッシュからどうぞ
445+ @SuppressWarnings("unchecked")
446+ ArrayList<Center> tmp = (ArrayList<Center>) CommonUtils.readXML(centerFile);
447+ if ( tmp != null ) {
448+ crlist = tmp;
449+ return;
450+ }
451+ }
452+
453+ String uri = "http://cal.syoboi.jp/mng?Action=ShowChList";
454+ String response = webToBuffer(uri,thisEncoding,true);
455+ if ( response == null ) {
456+ System.err.println(ERRID+"放送局リストの取得に失敗: "+uri);
457+ return;
458+ }
459+ System.out.println(MSGID+"放送局リストを取得: "+uri);
460+
461+ Matcher ma = Pattern.compile("<table class=\"tframe output\".*?>(.+?)</table>",Pattern.DOTALL).matcher(response);
462+ if ( ! ma.find() ) {
463+ System.err.println(ERRID+"放送局情報がない: "+uri);
464+ return;
465+ }
466+
467+ // 新しい放送局リストの入れ物を作る
468+ ArrayList<Center> newcrlist = new ArrayList<Center>();
469+
470+ int cnt = 1;
471+ Matcher mb = Pattern.compile("<tr>(.+?)</tr>",Pattern.DOTALL).matcher(ma.group(1));
472+ while ( mb.find() ) {
473+ String[] d = mb.group(1).split("<.*?>",9);
474+ if ( d.length != 9 ) {
475+ System.err.println(ERRID+"書式不正(カラム数が足りない): "+d.length);
476+ continue;
477+ }
478+ if ( ! d[1].matches("^\\d+$") ) {
479+ continue;
480+ }
481+
482+ // 放送局リスト
483+ Center cr = new Center();
484+ cr.setLink(d[5]);
485+ cr.setAreaCode("1");
486+ cr.setCenterOrig(CommonUtils.unEscape(d[7]));
487+ //cr.setCenter(this.chconv.get(cr.getCenterOrig())); // ChannelConvert.datで入れ替えたもの
488+ cr.setType("");
489+ cr.setEnabled(true);
490+ cr.setOrder(cnt++);
491+
492+ newcrlist.add(cr);
493+
494+ if (debug) System.out.println(MSGID+"放送局を追加: "+cr.getCenterOrig()+" -> "+cr.getCenter());
495+ }
496+
497+ if ( newcrlist.size() == 0 ) {
498+ System.err.println(ERRID+"放送局情報の取得結果が0件だったため情報を更新しません");
499+ return;
500+ }
501+
502+ System.out.println(DBGID+"放送局の数: "+newcrlist.size());
503+
504+ crlist = newcrlist;
505+ attachChFilters();
506+ setSortedCRlist();
507+ CommonUtils.writeXML(centerFile, crlist);
508+ }
509+
510+ @Override
511+ public boolean saveCenter() {
512+ return false;
513+ }
514+
515+ /*
516+ * ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
517+ * ★★★★★ 放送局を選択する(TVCenterから降格)-ここまで ★★★★★
518+ * ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
519+ */
520+}
Show on old repository browser