<void method="add">
<object class="tainavi.TraceKey">
<void property="center">
- <string>TOKYO MX</string>
- </void>
- <void property="fazzyThreshold">
- <int>35</int>
- </void>
- <void property="okiniiri">
- <string>★★★★★</string>
- </void>
- <void property="title">
- <string><物語>シリーズ セカンドシーズン</string>
- </void>
- </object>
- </void>
- <void method="add">
- <object class="tainavi.TraceKey">
- <void property="center">
- <string>BSイレブン</string>
- </void>
- <void property="fazzyThreshold">
- <int>35</int>
- </void>
- <void property="okiniiri">
- <string>★★★★★</string>
- </void>
- <void property="title">
- <string><物語>シリーズセカンドシーズン</string>
- </void>
- </object>
- </void>
- <void method="add">
- <object class="tainavi.TraceKey">
- <void property="center">
- <string>BSイレブン</string>
- </void>
- <void property="fazzyThreshold">
- <int>35</int>
- </void>
- <void property="okiniiri">
- <string>★★★★★</string>
- </void>
- <void property="title">
- <string>Fate/kaleid liner プリズマ☆イリヤ</string>
- </void>
- </object>
- </void>
- <void method="add">
- <object class="tainavi.TraceKey">
- <void property="center">
- <string>TOKYO MX</string>
+ <string>日本テレビ</string>
</void>
<void property="fazzyThreshold">
<int>35</int>
<string>★★★★★</string>
</void>
<void property="title">
- <string>Fate kaleid liner プリズマ☆イリヤ</string>
+ <string>HUNTER×HUNTER</string>
</void>
</object>
</void>
<void method="add">
<object class="tainavi.TraceKey">
<void property="center">
- <string>BSイレブン</string>
+ <string>テレビ東京</string>
</void>
<void property="fazzyThreshold">
<int>80</int>
<string>★★★★★</string>
</void>
<void property="title">
- <string>Free!</string>
+ <string>アイカツ!</string>
</void>
</object>
</void>
<void method="add">
<object class="tainavi.TraceKey">
<void property="center">
- <string>TOKYOã\80\80ï¼ï¼¸</string>
+ <string>BSã\82¸ã\83£ã\83\91ã\83³</string>
</void>
<void property="fazzyThreshold">
<int>80</int>
<string>★★★★★</string>
</void>
<void property="title">
- <string>Free!</string>
+ <string>アイカツ!</string>
</void>
</object>
</void>
<void method="add">
<object class="tainavi.TraceKey">
<void property="center">
- <string>日本テレビ</string>
+ <string>BSジャパン</string>
</void>
<void property="fazzyThreshold">
<int>35</int>
<string>★★★★★</string>
</void>
<void property="title">
- <string>HUNTER×HUNTER</string>
+ <string>カードファイト!!ヴァンガード リンクジョーカー編</string>
</void>
</object>
</void>
<void method="add">
<object class="tainavi.TraceKey">
<void property="center">
- <string>BSイレブン</string>
+ <string>テレビ東京</string>
</void>
<void property="fazzyThreshold">
<int>35</int>
<string>★★★★★</string>
</void>
<void property="title">
- <string>ã\81\8dã\82\93ã\81\84ã\82\8dã\83¢ã\82¶ã\82¤ã\82¯</string>
+ <string>ã\82«ã\83¼ã\83\89ã\83\95ã\82¡ã\82¤ã\83\88!!ã\83´ã\82¡ã\83³ã\82¬ã\83¼ã\83\89ã\80\80ã\83ªã\83³ã\82¯ã\82¸ã\83§ã\83¼ã\82«ã\83¼ç·¨</string>
</void>
</object>
</void>
<void method="add">
<object class="tainavi.TraceKey">
<void property="center">
- <string>TOKYO MX</string>
+ <string>フジテレビ</string>
</void>
<void property="fazzyThreshold">
- <int>35</int>
+ <int>90</int>
</void>
<void property="okiniiri">
<string>★★★★★</string>
</void>
<void property="title">
- <string>ã\81\8dã\82\93ã\81\84ã\82\8dã\83¢ã\82¶ã\82¤ã\82¯</string>
+ <string>ã\83\88ã\83ªã\82³</string>
</void>
</object>
</void>
<void method="add">
<object class="tainavi.TraceKey">
<void property="center">
- <string>TOKYO MX</string>
+ <string>テレビ東京</string>
</void>
<void property="fazzyThreshold">
- <int>35</int>
+ <int>60</int>
</void>
<void property="okiniiri">
<string>★★★★★</string>
</void>
<void property="title">
- <string>ã\81\92ã\82\93ã\81\97ã\81\91ã\82\93äº\8c代ç\9b®</string>
+ <string>ã\83\97ã\83ªã\83\86ã\82£ã\83¼ã\83ªã\82ºã\83 ã\83»ã\83¬ã\82¤ã\83³ã\83\9cã\83¼ã\83©ã\82¤ã\83\96</string>
</void>
</object>
</void>
<void method="add">
<object class="tainavi.TraceKey">
<void property="center">
- <string>TOKYO MX</string>
+ <string>テレビ東京</string>
</void>
<void property="fazzyThreshold">
<int>35</int>
<string>★★★★★</string>
</void>
<void property="title">
- <string>ã\81\9fã\81¾ã\82\86ã\82\89ï½\9eã\82\82ã\81\82ã\81\90ã\82\8cã\81£ã\81\97ã\81¶~</string>
+ <string>ã\83\9eã\82¤ã\83ªã\83\88ã\83«ã\83\9dã\83\8bã\83¼ã\80\80ï½\9eã\83\88ã\83¢ã\83\80ã\83\81ã\81¯é\94æ³\95~</string>
</void>
</object>
</void>
<void method="add">
<object class="tainavi.TraceKey">
<void property="center">
- <string>BSイレブン</string>
+ <string>日本テレビ</string>
</void>
<void property="fazzyThreshold">
- <int>35</int>
+ <int>60</int>
</void>
<void property="okiniiri">
<string>★★★★★</string>
</void>
<void property="title">
- <string>とある科学の超電磁砲S</string>
+ <string>宇宙兄弟</string>
</void>
</object>
</void>
<string>★★★★★</string>
</void>
<void property="title">
- <string>とある科学の超電磁砲S</string>
+ <string>機動戦士ガンダムSEED DESTINY HDリマスター</string>
</void>
</object>
</void>
<void method="add">
<object class="tainavi.TraceKey">
<void property="center">
- <string>BSæ\97¥ã\83\86ã\83¬</string>
+ <string>NHK ï¼¥ã\83\86ã\83¬</string>
</void>
<void property="fazzyThreshold">
<int>35</int>
<string>★★★★★</string>
</void>
<void property="title">
- <string>ふたりはミルキィホームズ</string>
- </void>
- </object>
- </void>
- <void method="add">
- <object class="tainavi.TraceKey">
- <void property="center">
- <string>テレビ東京</string>
- </void>
- <void property="fazzyThreshold">
- <int>80</int>
- </void>
- <void property="okiniiri">
- <string>★★★★★</string>
- </void>
- <void property="title">
- <string>アイカツ!</string>
- </void>
- </object>
- </void>
- <void method="add">
- <object class="tainavi.TraceKey">
- <void property="center">
- <string>BSジャパン</string>
- </void>
- <void property="fazzyThreshold">
- <int>80</int>
- </void>
- <void property="okiniiri">
- <string>★★★★★</string>
- </void>
- <void property="title">
- <string>アイカツ!</string>
+ <string>黒魔女</string>
</void>
</object>
</void>
<void method="add">
<object class="tainavi.TraceKey">
<void property="center">
- <string>BSジャパン</string>
+ <string>BS日テレ</string>
</void>
<void property="fazzyThreshold">
<int>35</int>
<string>★★★★★</string>
</void>
<void property="title">
- <string>ã\82«ã\83¼ã\83\89ã\83\95ã\82¡ã\82¤ã\83\88!!ã\83´ã\82¡ã\83³ã\82¬ã\83¼ã\83\89ã\80\80ã\83ªã\83³ã\82¯ã\82¸ã\83§ã\83¼ã\82«ã\83¼ç·¨</string>
+ <string>ã\81¨ã\81\82ã\82\8bé£\9b空士ã\81¸ã\81®æ\81\8bæ\8c</string>
</void>
</object>
</void>
<void method="add">
<object class="tainavi.TraceKey">
<void property="center">
- <string>ã\83\86ã\83¬ã\83\93æ\9d±äº¬</string>
+ <string>BSæ\97¥ã\83\86ã\83¬</string>
</void>
<void property="fazzyThreshold">
<int>35</int>
<string>★★★★★</string>
</void>
<void property="title">
- <string>ã\82«ã\83¼ã\83\89ã\83\95ã\82¡ã\82¤ã\83\88!!ã\83´ã\82¡ã\83³ã\82¬ã\83¼ã\83\89ã\80\80ã\83ªã\83³ã\82¯ã\82¸ã\83§ã\83¼ã\82«ã\83¼ç·¨</string>
+ <string>GJé\83¨</string>
</void>
</object>
</void>
<void method="add">
<object class="tainavi.TraceKey">
<void property="center">
- <string>日本テレビ</string>
+ <string>BS-TBS</string>
</void>
<void property="fazzyThreshold">
<int>35</int>
<string>★★★★★</string>
</void>
<void property="title">
- <string>ガッチャマン クラウズ</string>
+ <string>鬼灯の冷徹</string>
</void>
</object>
</void>
<void method="add">
<object class="tainavi.TraceKey">
<void property="center">
- <string>NHK BSプレミアム</string>
+ <string>BS-TBS</string>
</void>
<void property="fazzyThreshold">
<int>35</int>
<string>★★★★★</string>
</void>
<void property="title">
- <string>ã\82ã\83³ã\82°ã\83\80ã\83 2</string>
+ <string>ã\82ã\83«ã\83©ã\82ã\83«</string>
</void>
</object>
</void>
<void method="add">
<object class="tainavi.TraceKey">
<void property="center">
- <string>BSã\82¤ã\83¬ã\83\96ã\83³</string>
+ <string>BS-TBS</string>
</void>
<void property="fazzyThreshold">
<int>35</int>
<string>★★★★★</string>
</void>
<void property="title">
- <string>サーバント×サービス</string>
+ <string>魔法戦争</string>
</void>
</object>
</void>
<void method="add">
<object class="tainavi.TraceKey">
<void property="center">
- <string>TOKYOã\80\80ï¼ï¼¸</string>
+ <string>BS-TBS</string>
</void>
<void property="fazzyThreshold">
<int>35</int>
<string>★★★★★</string>
</void>
<void property="title">
- <string>サーバント×サービス</string>
+ <string>桜Trick</string>
</void>
</object>
</void>
<string>BSフジ</string>
</void>
<void property="fazzyThreshold">
- <int>80</int>
- </void>
- <void property="okiniiri">
- <string>★★★★★</string>
- </void>
- <void property="title">
- <string>ジャパコン</string>
- </void>
- </object>
- </void>
- <void method="add">
- <object class="tainavi.TraceKey">
- <void property="center">
- <string>TBSテレビ</string>
- </void>
- <void property="fazzyThreshold">
<int>35</int>
</void>
<void property="okiniiri">
<string>★★★★★</string>
</void>
<void property="title">
- <string>ã\82¹ã\83\86ã\83©å¥³å¦é\99¢é«\98ç\89ç§\91C3é\83¨</string>
+ <string>ã\82¹ã\83\9aã\83¼ã\82¹â\98\86ã\83\80ã\83³ã\83\87ã\82£</string>
</void>
</object>
</void>
<void method="add">
<object class="tainavi.TraceKey">
<void property="center">
- <string>BS-TBS</string>
+ <string>BSã\82¤ã\83¬ã\83\96ã\83³</string>
</void>
<void property="fazzyThreshold">
<int>35</int>
<string>★★★★★</string>
</void>
<void property="title">
- <string>ã\82¹ã\83\86ã\83©å¥³å¦é\99¢é«\98ç\89ç§\91ï¼£ï¼\93é\83¨</string>
+ <string>ã\81®ã\81\86ã\82\8aã\82\93</string>
</void>
</object>
</void>
<void method="add">
<object class="tainavi.TraceKey">
<void property="center">
- <string>BS-TBS</string>
+ <string>BSã\82¤ã\83¬ã\83\96ã\83³</string>
</void>
<void property="fazzyThreshold">
<int>35</int>
<string>★★★★★</string>
</void>
<void property="title">
- <string>ã\83\80ã\83³ã\82¬ã\83³ã\83ã\83³ã\83\91 å¸\8cæ\9c\9bã\81®å¦å\9c\92ã\81¨çµ¶æ\9c\9bã\81®é«\98æ ¡ç\94\9f The Animaition</string>
+ <string>ã\83\90ã\83\87ã\82£ã\83»ã\82³ã\83³ã\83\97ã\83¬ã\83\83ã\82¯ã\82¹</string>
</void>
</object>
</void>
<void method="add">
<object class="tainavi.TraceKey">
<void property="center">
- <string>TBSテレビ</string>
+ <string>BSイレブン</string>
</void>
<void property="fazzyThreshold">
<int>35</int>
<string>★★★★★</string>
</void>
<void property="title">
- <string>ダンガンロンパ 希望の学園と絶望の高校生 The Animation</string>
+ <string>東京レイヴンズ</string>
</void>
</object>
</void>
<void method="add">
<object class="tainavi.TraceKey">
<void property="center">
- <string>フジテレビ</string>
- </void>
- <void property="fazzyThreshold">
- <int>90</int>
- </void>
- <void property="okiniiri">
- <string>★★★★★</string>
- </void>
- <void property="title">
- <string>トリコ</string>
- </void>
- </object>
- </void>
- <void method="add">
- <object class="tainavi.TraceKey">
- <void property="center">
- <string>テレビ朝日</string>
+ <string>BSイレブン</string>
</void>
<void property="fazzyThreshold">
<int>35</int>
<string>★★★★★</string>
</void>
<void property="title">
- <string>ã\83\89ã\82ã\83\89ã\82!ã\83\97ã\83ªã\82ã\83¥ã\82¢</string>
+ <string>ã\82¦ã\82£ã\83\83ã\83\81ã\82¯ã\83©ã\83\95ã\83\88ã\83¯ã\83¼ã\82¯ã\82¹</string>
</void>
</object>
</void>
<string>★★★★★</string>
</void>
<void property="title">
- <string>ハイスクールD×D NEW 月光校庭のエクスカリバー</string>
- </void>
- </object>
- </void>
- <void method="add">
- <object class="tainavi.TraceKey">
- <void property="center">
- <string>BS朝日</string>
- </void>
- <void property="fazzyThreshold">
- <int>80</int>
- </void>
- <void property="okiniiri">
- <string>★★★★★</string>
- </void>
- <void property="title">
- <string>バビル2世</string>
+ <string>ガールズ&パンツァー</string>
</void>
</object>
</void>
<string>★★★★★</string>
</void>
<void property="title">
- <string>ã\83\95ã\82¡ã\83³ã\82¿ã\82¸ã\82¹ã\82¿ã\83\89ã\83¼ã\83«</string>
+ <string>ã\83\8eã\83\96ã\83\8aã\82¬ã\83³</string>
</void>
</object>
</void>
<void method="add">
<object class="tainavi.TraceKey">
<void property="center">
- <string>TOKYO MX</string>
+ <string>BSイレブン</string>
</void>
<void property="fazzyThreshold">
<int>35</int>
<string>★★★★★</string>
</void>
<void property="title">
- <string>ã\83\95ã\82¡ã\83³ã\82¿ã\82¸ã\82¹ã\82¿ã\83\89ã\83¼ル</string>
+ <string>ã\82¦ã\82£ã\82¶ã\83¼ã\83\89ã\83»ã\83\90ã\83ªã\82¹ã\82¿ã\83¼ã\82ºï½\9eå¼\81é\94士ã\82»ã\82·ル</string>
</void>
</object>
</void>
<string>BSイレブン</string>
</void>
<void property="fazzyThreshold">
- <int>70</int>
- </void>
- <void property="okiniiri">
- <string>★★★★★</string>
- </void>
- <void property="title">
- <string>ブラッドラッド </string>
- </void>
- </object>
- </void>
- <void method="add">
- <object class="tainavi.TraceKey">
- <void property="center">
- <string>TOKYO MX</string>
- </void>
- <void property="fazzyThreshold">
- <int>80</int>
- </void>
- <void property="okiniiri">
- <string>★★★★★</string>
- </void>
- <void property="title">
- <string>ブラッドラッド </string>
- </void>
- </object>
- </void>
- <void method="add">
- <object class="tainavi.TraceKey">
- <void property="center">
- <string>テレビ東京</string>
- </void>
- <void property="fazzyThreshold">
- <int>60</int>
- </void>
- <void property="okiniiri">
- <string>★★★★★</string>
- </void>
- <void property="title">
- <string>プリティーリズム・レインボーライブ</string>
- </void>
- </object>
- </void>
- <void method="add">
- <object class="tainavi.TraceKey">
- <void property="center">
- <string>テレビ東京</string>
- </void>
- <void property="fazzyThreshold">
<int>35</int>
</void>
<void property="okiniiri">
<string>★★★★★</string>
</void>
<void property="title">
- <string>マイリトルポニー ~トモダチは魔法~</string>
+ <string>最近、妹のようすがちょっとおかしいんだが。</string>
</void>
</object>
</void>
<void method="add">
<object class="tainavi.TraceKey">
<void property="center">
- <string>テレビ東京</string>
+ <string>BSイレブン</string>
</void>
<void property="fazzyThreshold">
<int>35</int>
<string>★★★★★</string>
</void>
<void property="title">
- <string>ã\83 ã\82·ã\83\96ã\82®ã\83§ã\83¼</string>
+ <string>ã\81\9dã\81«ã\82¢ã\83\8b -SUPER SONICO THE ANIMATION-</string>
</void>
</object>
</void>
<string>★★★★★</string>
</void>
<void property="title">
- <string>ã\83ã\82¦ã\81\8dã\82\85ã\83¼ã\81¶!SS</string>
+ <string>ã\82´ã\83¼ã\83«ã\83\87ã\83³ã\82¿ã\82¤ã\83 </string>
</void>
</object>
</void>
<void method="add">
<object class="tainavi.TraceKey">
<void property="center">
- <string>BS-TBS</string>
+ <string>BSã\82¤ã\83¬ã\83\96ã\83³</string>
</void>
<void property="fazzyThreshold">
<int>35</int>
<string>★★★★★</string>
</void>
<void property="title">
- <string>ローゼンメイデン</string>
+ <string>生徒会役員共*</string>
</void>
</object>
</void>
<void method="add">
<object class="tainavi.TraceKey">
<void property="center">
- <string>TBSテレビ</string>
+ <string>BSイレブン</string>
</void>
<void property="fazzyThreshold">
<int>35</int>
<string>★★★★★</string>
</void>
<void property="title">
- <string>ã\83ã\83¼ã\82¼ã\83³ã\83¡ã\82¤ã\83\87ã\83³</string>
+ <string>ã\82¹ã\83\88ã\83©ã\82¤ã\82¯ã\83»ã\82¶ã\83»ã\83\96ã\83©ã\83\83ã\83\89</string>
</void>
</object>
</void>
<void method="add">
<object class="tainavi.TraceKey">
<void property="center">
- <string>日本テレビ</string>
- </void>
- <void property="fazzyThreshold">
- <int>60</int>
- </void>
- <void property="okiniiri">
- <string>★★★★★</string>
- </void>
- <void property="title">
- <string>宇宙兄弟</string>
- </void>
- </object>
- </void>
- <void method="add">
- <object class="tainavi.TraceKey">
- <void property="center">
- <string>TBSテレビ</string>
+ <string>BSイレブン</string>
</void>
<void property="fazzyThreshold">
<int>35</int>
<string>★★★★★</string>
</void>
<void property="title">
- <string>宇宙戦艦ヤマト2199</string>
+ <string>マケン姫っ!通</string>
</void>
</object>
</void>
<void method="add">
<object class="tainavi.TraceKey">
<void property="center">
- <string>日本テレビ</string>
+ <string>BSイレブン</string>
</void>
<void property="fazzyThreshold">
<int>35</int>
<string>★★★★★</string>
</void>
<void property="title">
- <string>帰宅部活動記録</string>
+ <string>ノラガミ</string>
</void>
</object>
</void>
<string>★★★★★</string>
</void>
<void property="title">
- <string>幻影ヲ駆ケル太陽</string>
+ <string>ニセコイ</string>
</void>
</object>
</void>
<void method="add">
<object class="tainavi.TraceKey">
<void property="center">
- <string>TOKYO MX</string>
+ <string>BSイレブン</string>
</void>
<void property="fazzyThreshold">
<int>35</int>
<string>★★★★★</string>
</void>
<void property="title">
- <string>幻影ヲ駆ケル太陽</string>
+ <string>世界征服~謀略のズヴィズダー~</string>
</void>
</object>
</void>
<void method="add">
<object class="tainavi.TraceKey">
<void property="center">
- <string>BS-TBS</string>
+ <string>BSã\82¤ã\83¬ã\83\96ã\83³</string>
</void>
<void property="fazzyThreshold">
<int>35</int>
<string>★★★★★</string>
</void>
<void property="title">
- <string>恋愛ラボ</string>
+ <string>いなり、こんこん、恋いろは。</string>
</void>
</object>
</void>
<void method="add">
<object class="tainavi.TraceKey">
<void property="center">
- <string>TBSテレビ</string>
+ <string>BSイレブン</string>
</void>
<void property="fazzyThreshold">
<int>35</int>
<string>★★★★★</string>
</void>
<void property="title">
- <string>恋愛ラボ</string>
- </void>
- </object>
- </void>
- <void method="add">
- <object class="tainavi.TraceKey">
- <void property="center">
- <string>テレビ東京</string>
- </void>
- <void property="fazzyThreshold">
- <int>80</int>
- </void>
- <void property="okiniiri">
- <string>★★★★★</string>
- </void>
- <void property="title">
- <string>戦勇。</string>
+ <string>中二病でも恋がしたい!戀</string>
</void>
</object>
</void>
<string>★★★★★</string>
</void>
<void property="title">
- <string>æ\88¦å§«çµ¶å\94±ã\82·ã\83³ã\83\95ã\82©ã\82®ã\82¢G</string>
+ <string>æ\9cªç¢ºèª\8dã\81§é\80²è¡\8cå½¢</string>
</void>
</object>
</void>
<void method="add">
<object class="tainavi.TraceKey">
<void property="center">
- <string>TOKYO MX</string>
+ <string>日本テレビ</string>
</void>
<void property="fazzyThreshold">
<int>35</int>
<string>★★★★★</string>
</void>
<void property="title">
- <string>戦姫絶唱シンフォギアG</string>
+ <string>はじめの一歩 Rising</string>
</void>
</object>
</void>
<void method="add">
<object class="tainavi.TraceKey">
<void property="center">
- <string>BSイレブン</string>
+ <string>日本テレビ</string>
</void>
<void property="fazzyThreshold">
<int>35</int>
<string>★★★★★</string>
</void>
<void property="title">
- <string>有頂天家族</string>
+ <string>てさぐれ!部活もの あんこーる</string>
</void>
</object>
</void>
<void method="add">
<object class="tainavi.TraceKey">
<void property="center">
- <string>TOKYOã\80\80ï¼ï¼¸</string>
+ <string>TBSã\83\86ã\83¬ã\83\93</string>
</void>
<void property="fazzyThreshold">
<int>35</int>
<string>★★★★★</string>
</void>
<void property="title">
- <string>有頂天家族</string>
+ <string>魔法戦争</string>
</void>
</object>
</void>
<void method="add">
<object class="tainavi.TraceKey">
<void property="center">
- <string>TOKYOã\80\80ï¼ï¼¸</string>
+ <string>TBSã\83\86ã\83¬ã\83\93</string>
</void>
<void property="fazzyThreshold">
<int>35</int>
<string>★★★★★</string>
</void>
<void property="title">
- <string>æ©\9få\8b\95æ\88¦å£«ã\82¬ã\83³ã\83\80ã\83 SEEDã\80\80DESTINYã\80\80HDã\83ªã\83\9eã\82¹ã\82¿ã\83¼</string>
+ <string>æ¡\9cTrick</string>
</void>
</object>
</void>
<void method="add">
- <object id="TraceKey0" class="tainavi.TraceKey">
+ <object class="tainavi.TraceKey">
<void property="center">
- <string>BSæ\97¥ã\83\86ã\83¬</string>
+ <string>TBSã\83\86ã\83¬ã\83\93</string>
</void>
<void property="fazzyThreshold">
<int>35</int>
<string>★★★★★</string>
</void>
<void property="title">
- <string>犬とハサミは使いよう</string>
+ <string>鬼灯の冷徹</string>
</void>
</object>
</void>
<void method="add">
- <object idref="TraceKey0"/>
- </void>
- <void method="add">
<object class="tainavi.TraceKey">
<void property="center">
- <string>テレビ東京</string>
+ <string>TBSテレビ</string>
</void>
<void property="fazzyThreshold">
<int>35</int>
<string>★★★★★</string>
</void>
<void property="title">
- <string>獣旋バトル モンスーノ</string>
+ <string>キルラキル</string>
</void>
</object>
</void>
<void method="add">
<object class="tainavi.TraceKey">
<void property="center">
- <string>BSイレブン</string>
+ <string>テレビ東京</string>
</void>
<void property="fazzyThreshold">
<int>35</int>
<string>★★★★★</string>
</void>
<void property="title">
- <string>神さまのいない日曜日</string>
+ <string>弱虫ペダル</string>
</void>
</object>
</void>
<void method="add">
<object class="tainavi.TraceKey">
<void property="center">
- <string>TOKYO MX</string>
+ <string>テレビ東京</string>
</void>
<void property="fazzyThreshold">
<int>35</int>
<string>★★★★★</string>
</void>
<void property="title">
- <string>神さまのいない日曜日</string>
+ <string>ディーふらぐ!</string>
</void>
</object>
</void>
<string>★★★★★</string>
</void>
<void property="title">
- <string>私がモテないのはどう考えてもお前らが悪い!</string>
+ <string>うーさーのその日暮らし 覚醒編</string>
</void>
</object>
</void>
<string>★★★★★</string>
</void>
<void property="title">
- <string>義風堂々!!兼続と慶次</string>
+ <string>ハマトラ</string>
</void>
</object>
</void>
<void method="add">
<object class="tainavi.TraceKey">
<void property="center">
- <string>BSイレブン</string>
+ <string>テレビ東京</string>
</void>
<void property="fazzyThreshold">
<int>35</int>
<string>★★★★★</string>
</void>
<void property="title">
- <string>超次元ゲイム ネプテュ-ヌ</string>
+ <string>Z/X IGNITION</string>
</void>
</object>
</void>
<void method="add">
<object class="tainavi.TraceKey">
<void property="center">
- <string>TOKYO MX</string>
+ <string>テレビ東京</string>
</void>
<void property="fazzyThreshold">
<int>35</int>
<string>★★★★★</string>
</void>
<void property="title">
- <string>超次元ゲイム ネプテューヌ</string>
+ <string>Wake Up Girls!</string>
</void>
</object>
</void>
<void property="center">
<string>テレビ東京</string>
</void>
- <void property="disableRepeat">
- <boolean>true</boolean>
- </void>
<void property="fazzyThreshold">
<int>35</int>
</void>
<string>★★★★★</string>
</void>
<void property="title">
- <string>超速変形ジャイロゼッター</string>
+ <string>プピポー!</string>
</void>
</object>
</void>
<void method="add">
<object class="tainavi.TraceKey">
<void property="center">
- <string>BSイレブン</string>
+ <string>テレビ東京</string>
</void>
<void property="fazzyThreshold">
<int>35</int>
<string>★★★★★</string>
</void>
<void property="title">
- <string>進撃の巨人</string>
+ <string>ノブナガ・ザ・フール</string>
</void>
</object>
</void>
<void method="add">
<object class="tainavi.TraceKey">
<void property="center">
- <string>TOKYO MX</string>
+ <string>テレビ東京</string>
</void>
<void property="fazzyThreshold">
<int>35</int>
<string>★★★★★</string>
</void>
<void property="title">
- <string>進撃の巨人</string>
+ <string>咲-Saki-全国編</string>
</void>
</object>
</void>
<void method="add">
<object class="tainavi.TraceKey">
<void property="center">
- <string>ã\83\95ã\82¸ã\83\86ã\83¬ã\83\93</string>
+ <string>ã\83\86ã\83¬ã\83\93æ\9d±äº¬</string>
</void>
<void property="fazzyThreshold">
<int>35</int>
<string>★★★★★</string>
</void>
<void property="title">
- <string>銀の匙</string>
+ <string>となりの関くん</string>
</void>
</object>
</void>
<void method="add">
<object class="tainavi.TraceKey">
<void property="center">
- <string>TOKYO MX</string>
+ <string>フジテレビ</string>
</void>
<void property="fazzyThreshold">
<int>35</int>
<string>★★★★★</string>
</void>
<void property="title">
- <string>銀河機攻隊 マジェスティックプリンス</string>
+ <string>銀の匙 Silver Spoon <ノイタミナ></string>
</void>
</object>
</void>
<void method="add">
<object class="tainavi.TraceKey">
<void property="center">
- <string>NHK Eテレ</string>
+ <string>フジテレビ</string>
</void>
<void property="fazzyThreshold">
<int>35</int>
<string>★★★★★</string>
</void>
<void property="title">
- <string>黒魔女</string>
+ <string>サムライフラメンコ<ノイタミナ></string>
</void>
</object>
</void>
-package tainavi;\r
-\r
-import java.io.File;\r
-import java.util.ArrayList;\r
-import java.util.Calendar;\r
-import java.util.GregorianCalendar;\r
-import java.util.regex.Matcher;\r
-import java.util.regex.Pattern;\r
-\r
-/**\r
- * しょぼかるから番組表と放送局リストを取得する。プラグインではないよ。\r
- */\r
-public class Syobocal extends TVProgramUtils implements TVProgram,Cloneable {\r
-\r
- private final String thisEncoding = "UTF-8";\r
- \r
- public void setDebug(boolean b) { debug = b; }\r
- \r
- private boolean debug = false;\r
- \r
- private boolean rss2 = false;\r
-\r
- /* 必須コード - ここから */\r
- \r
- // 種族の特性\r
- private static final String tvProgId = "Syobocal";\r
- \r
- //private final String progCacheFile = getProgDir()+File.separator+"syobocal.xml";\r
- private final String centerFile = "env"+File.separator+"center."+getTVProgramId()+".xml"; \r
- \r
- private final String MSGID = "[しょぼかる] ";\r
- private final String ERRID = "[ERROR]"+MSGID;\r
- private final String DBGID = "[DEBUG]"+MSGID;\r
- \r
- @Override\r
- public String getTVProgramId() { return tvProgId; }\r
- \r
- @Override\r
- public boolean isAreaSelectSupported() { return false; }\r
- \r
- @Override\r
- public ProgType getType() { return ProgType.SYOBO; }\r
- public ProgSubtype getSubtype() { return ProgSubtype.NONE; }\r
-\r
- @Override\r
- public Syobocal clone() {\r
- return (Syobocal) super.clone();\r
- }\r
-\r
- // 個体の特性\r
- \r
- //\r
- @Override\r
- public int getTimeBarStart() {return 5;}\r
-\r
- private int getDogDays() { return ((getExpandTo8())?(8):(7)); }\r
- \r
- //\r
- @Override\r
- public void loadProgram(String areaCode, boolean force) {\r
-\r
- String progCacheFile = null;\r
- if ( rss2 ) {\r
- progCacheFile = getProgDir()+File.separator+"syobocal.xml";\r
- }\r
- else {\r
- progCacheFile = getProgDir()+File.separator+"syobocal.rss";\r
- }\r
- \r
- // 新しい番組データの入れ物を作る\r
- ArrayList<ProgList> newplist = new ArrayList<ProgList>();\r
-\r
- int cnt = 0;\r
- \r
- try {\r
- String response = null;\r
- \r
- String cirtDateTimeYMD = CommonUtils.getCritDateTime().replaceAll("[/: ]", "");\r
- \r
- File f = new File(progCacheFile);\r
- if (force == true ||\r
- (f.exists() == true && isCacheOld(progCacheFile) == true) ||\r
- (f.exists() == false && isCacheOld(null) == true)) {\r
- \r
- String url = null;\r
- if ( rss2 ) {\r
- url = "http://cal.syoboi.jp/rss2.php?start="+cirtDateTimeYMD+"&days="+getDogDays()+"&titlefmt=$(Flag)^^^$(FlagW)^^^$(Cat)^^^$(ChName)^^^$(EdTime)^^^$(Title)^^^$(SubTitleB)";\r
- }\r
- else {\r
- url = "http://cal.syoboi.jp/rss.php?start=today&count=1500&days=8&days="+getDogDays()+"&titlefmt=$(Flag)^^^$(FlagW)^^^$(Cat)^^^$(ChName)^^^$(EdTime)^^^$(Title)^^^$(SubTitleB)";\r
- }\r
- response = webToBuffer(url, thisEncoding, true);\r
- if ( response == null ) {\r
- reportProgress(ERRID+"RSS2.0(オンライン)の取得に失敗しました: "+url);\r
- return;\r
- }\r
- \r
- reportProgress(MSGID+"RSS2.0(オンライン)を取得しました: "+url);\r
- CommonUtils.write2file(progCacheFile, response);\r
- }\r
- else if (f.exists()) {\r
- //\r
- response = CommonUtils.read4file(progCacheFile, true);\r
- if ( response == null ) {\r
- reportProgress(ERRID+"RSS2.0(キャッシュ)の取得に失敗しました: "+progCacheFile);\r
- return;\r
- }\r
- reportProgress(MSGID+"RSS2.0(キャッシュ)を取得しました: "+progCacheFile);\r
- }\r
- else {\r
- reportProgress(ERRID+"RSS2.0(キャッシュ)がみつかりません: "+progCacheFile);\r
- return;\r
- }\r
- \r
- // 情報解析\r
- \r
- Matcher ma = Pattern.compile("<item(.+?)</item>",Pattern.DOTALL).matcher(response);\r
- while (ma.find()) {\r
-\r
- // 入れ物\r
- ProgDetailList pDetail = new ProgDetailList();\r
- \r
- // <title>金曜ロードショー ヱヴァンゲリヲン新劇場版:破 TV版</title> \r
- Matcher mb = Pattern.compile("<title>(.+?)</title>",Pattern.DOTALL).matcher(ma.group(1));\r
- if ( ! mb.find()) {\r
- continue;\r
- }\r
- \r
- String[] t = mb.group(1).split("\\^\\^\\^",7);\r
- \r
- if (t.length < 7) {\r
- System.err.println(ERRID+"書式が不正: "+mb.group(1));\r
- }\r
- \r
- pDetail.title = CommonUtils.unEscape(t[5]);\r
- \r
- pDetail.detail = CommonUtils.unEscape(t[6]);\r
- if ( pDetail.detail.matches("^#1$|^#1[^0-9].*$") ) {\r
- // まあなにもしなくていいか\r
- }\r
- \r
- if (t[0] != null && t[0].length() > 0) {\r
- int flag = Integer.valueOf(t[0]);\r
- if (flag != 0) {\r
- if ((flag & 0x01) != 0x00) {\r
- pDetail.addOption(ProgOption.SPECIAL);\r
- flag ^= 0x01;\r
- }\r
- if ((flag & 0x02) != 0x00) {\r
- pDetail.flag = ProgFlags.NEW;\r
- flag ^= 0x02;\r
- }\r
- if ((flag & 0x04) != 0x00) {\r
- pDetail.flag = ProgFlags.LAST;\r
- flag ^= 0x04;\r
- }\r
- if ((flag & 0x08) != 0x00) {\r
- pDetail.addOption(ProgOption.REPEAT);\r
- flag ^= 0x08;\r
- }\r
- if (flag != 0) {\r
- System.out.println(DBGID+"未対応のマーク: "+flag);\r
- }\r
- }\r
- }\r
- if (t[1] != null && t[1].length() > 0) {\r
- int flagw = Integer.valueOf(t[1]);\r
- if (flagw != 0) {\r
- if ((flagw & 0x01) != 0x00) {\r
- if (pDetail.flag != ProgFlags.NEW && ! pDetail.isOptionEnabled(ProgOption.SPECIAL)) {\r
- pDetail.addOption(ProgOption.MOVED); // 新番組や特番なら(移)はいらんやろ\r
- }\r
- flagw ^= 0x01;\r
- }\r
- if (flagw != 0) {\r
- System.out.println(DBGID+"未対応の警告フラグ: "+flagw);\r
- }\r
- }\r
- }\r
- // <tv:genre>アニメ(終了/再放送)</tv:genre>\r
- pDetail.genre = null;\r
- pDetail.subgenre = null;\r
- pDetail.genrelist = new ArrayList<TVProgram.ProgGenre>();\r
- pDetail.subgenrelist = new ArrayList<TVProgram.ProgSubgenre>();\r
- boolean anime_etc = true;\r
- \r
- if (t[2] != null && t[2].length() > 0) {\r
- // ジャンル\r
- if (t[2].equals("1") || t[2].equals("10") || t[2].equals("5")) {\r
- // 1:アニメ 10:アニメ(終了/再放送) 5:アニメ関連\r
- }\r
- else if (t[2].equals("7")) {\r
- // 7:OVA\r
- pDetail.genre = ProgGenre.ANIME;\r
- pDetail.subgenre = ProgSubgenre.ANIME_KOKUNAI;\r
- pDetail.genrelist.add(ProgGenre.ANIME);\r
- pDetail.subgenrelist.add(ProgSubgenre.ANIME_KOKUNAI);\r
- anime_etc = false;\r
- }\r
- else if (t[2].equals("4")) {\r
- // 4:特撮\r
- pDetail.genre = ProgGenre.ANIME;\r
- pDetail.subgenre = ProgSubgenre.ANIME_TOKUSATSU;\r
- pDetail.genrelist.add(ProgGenre.ANIME);\r
- pDetail.subgenrelist.add(ProgSubgenre.ANIME_TOKUSATSU);\r
- anime_etc = false;\r
- }\r
- else if (t[2].equals("8")) {\r
- // 8:映画\r
- pDetail.genre = ProgGenre.MOVIE;\r
- pDetail.subgenre = ProgSubgenre.MOVIE_ETC;\r
- pDetail.genrelist.add(ProgGenre.MOVIE);\r
- pDetail.subgenrelist.add(ProgSubgenre.MOVIE_ETC);\r
- pDetail.removeOption(ProgOption.MOVED); // 映画なら(移)はいらんやろ\r
- }\r
- else if (t[2].equals("0")) {\r
- // 0:その他\r
- pDetail.genrelist.add(ProgGenre.NOGENRE);\r
- pDetail.subgenrelist.add(ProgSubgenre.NOGENRE_ETC);\r
- }\r
- else if (t[2].equals("3") || t[2].equals("2") || t[2].equals("6")) {\r
- // 3:テレビ 2:ラジオ 6:メモ\r
- }\r
- else {\r
- System.out.println(DBGID+"未対応のジャンル: "+t[2]);\r
- }\r
- \r
- // 最後に\r
- if (pDetail.genre == null) {\r
- pDetail.genre = ProgGenre.ANIME;\r
- pDetail.subgenre = ProgSubgenre.ANIME_ETC;\r
- }\r
- if (pDetail.genrelist.size() == 0 || anime_etc) {\r
- pDetail.genrelist.add(ProgGenre.ANIME);\r
- pDetail.subgenrelist.add(ProgSubgenre.ANIME_ETC);\r
- }\r
- }\r
- \r
- // <dc:publisher>日本テレビ</dc:publisher>\r
- if ( t[3] == null || t[3].length() == 0) {\r
- System.err.println(ERRID+"放送局名がない: "+mb.group(1));\r
- continue;\r
- }\r
- \r
- // ベアな放送局名と、ChannelConvert.datを適用した結果の放送局名\r
- String location = CommonUtils.unEscape(t[3]);\r
- String modifiedloc = getChName(location);\r
-\r
- // <tv:startDatetime>2011-08-29T00:00:00+09:00</tv:startDatetime>\r
- if ( rss2 ) {\r
- mb = Pattern.compile("<pubDate>(.+?)\\+09:00</pubDate>",Pattern.DOTALL).matcher(ma.group(1));\r
- }\r
- else {\r
- mb = Pattern.compile("<tv:startDatetime>(.+?)\\+09:00</tv:startDatetime>",Pattern.DOTALL).matcher(ma.group(1));\r
- }\r
- if ( ! mb.find()) {\r
- System.err.println(ERRID+"開始日時がない");\r
- continue;\r
- }\r
- GregorianCalendar ca = CommonUtils.getCalendar(mb.group(1));\r
- if ( ca == null ) {\r
- System.err.println(ERRID+"開始日時が不正: "+mb.group(1));\r
- continue;\r
- }\r
- \r
- pDetail.startDateTime = CommonUtils.getDateTime(ca);\r
- pDetail.start = pDetail.startDateTime.substring(11, 16);\r
- pDetail.accurateDate = CommonUtils.getDate(ca);\r
- \r
- if ( t[4] == null || t[4].length() == 0) {\r
- System.err.println(ERRID+"終了時刻がない: "+mb.group(1));\r
- continue;\r
- }\r
- \r
- GregorianCalendar cz = CommonUtils.getCalendar(CommonUtils.getDate(ca)+" "+t[4]);\r
- if (ca.compareTo(cz) > 0) {\r
- cz.add(Calendar.DAY_OF_MONTH, 1);\r
- }\r
- \r
- pDetail.endDateTime = CommonUtils.getDateTime(cz);\r
- pDetail.end = pDetail.endDateTime.substring(11, 16);\r
- \r
- // 24:00~28:59までは前日なんだニャー\r
- if (CommonUtils.isLateNight(ca.get(Calendar.HOUR_OF_DAY))) {\r
- ca.add(Calendar.DAY_OF_MONTH, -1);\r
- }\r
- \r
- // 番組情報を入れるべき日付\r
- String progdate = CommonUtils.getDate(ca);\r
- \r
- // <description>HD放送</description>\r
- mb = Pattern.compile("<description>(.+?)</description>").matcher(ma.group(1));\r
- if (mb.find()) {\r
- pDetail.detail += " <" + CommonUtils.unEscape(mb.group(1)) + ">";\r
- if (pDetail.detail.contains("無料放送")) {\r
- pDetail.noscrumble = ProgScrumble.NOSCRUMBLE;\r
- }\r
- if (pDetail.detail.contains("先行放送")) {\r
- pDetail.addOption(ProgOption.PRECEDING);\r
- }\r
- if (pDetail.detail.contains("変更の可能性")) {\r
- pDetail.extension = true;\r
- }\r
- if ( pDetail.detail.contains("繰り下げ") ) {\r
- pDetail.extension = true;\r
- }\r
- if (pDetail.detail.contains("副音声")) {\r
- pDetail.addOption(ProgOption.MULTIVOICE);\r
- }\r
- }\r
- \r
- // <link>http://cal.syoboi.jp/tid/44#198593</link> \r
- mb = Pattern.compile("<link>(.+?)</link>",Pattern.DOTALL).matcher(ma.group(1));\r
- if (mb.find()) {\r
- pDetail.link = mb.group(1);\r
- if ( ! ContentIdSyobo.isValid(pDetail.link)) {\r
- System.out.println(DBGID+"TIDとPIDが取得できない: "+pDetail.link);\r
- }\r
- }\r
- \r
- // 追加詳細\r
- pDetail.setGenreStr();\r
- \r
- // 統合\r
- {\r
- // 放送局が存在するか\r
- ProgList prog = null;\r
- for (ProgList pl : newplist) {\r
- if (pl.Center.equals(modifiedloc)) {\r
- prog = pl;\r
- break;\r
- }\r
- }\r
- if (prog == null) {\r
- // 番組表\r
- prog = new ProgList();\r
- prog.Center = modifiedloc;\r
- prog.enabled = true;\r
- prog.pdate = new ArrayList<ProgDateList>();\r
- \r
- newplist.add(prog);\r
- }\r
- \r
- // 日付が存在するか\r
- ProgDateList pCenter = null;\r
- for (ProgDateList pcl : prog.pdate) {\r
- if (pcl.Date.equals(progdate)) {\r
- pCenter = pcl;\r
- break;\r
- }\r
- }\r
- if (pCenter == null) {\r
- pCenter = new ProgDateList();\r
- pCenter.Date = progdate;\r
- pCenter.pdetail = new ArrayList<ProgDetailList>();\r
- prog.pdate.add(pCenter);\r
- }\r
- \r
- // 連結\r
- pCenter.pdetail.add(pDetail);\r
- \r
- cnt++;\r
- }\r
- \r
- //\r
- pDetail.splitted_title = pDetail.title;\r
- pDetail.splitted_detail = pDetail.detail;\r
- \r
- // 詳細を登録する\r
- pDetail.titlePop = TraceProgram.replacePop(pDetail.title);\r
- pDetail.detailPop = TraceProgram.replacePop(pDetail.detail);\r
- 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)));\r
- }\r
- }\r
- catch (Exception e) {\r
- e.printStackTrace();\r
- return;\r
- }\r
- \r
- pcenter = newplist;\r
- System.out.println(DBGID+"番組の数: "+cnt);\r
- }\r
-\r
- /* ここまで */\r
-\r
- /*\r
- * ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\r
- * ★★★★★ 放送地域を取得する(TVAreaから降格)-ここから ★★★★★\r
- * ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\r
- */\r
-\r
- @Override\r
- public void loadAreaCode() {\r
- }\r
-\r
- @Override\r
- public void saveAreaCode() {\r
- }\r
- \r
- @Override\r
- public String getCode(String area) {\r
- return "1";\r
- }\r
-\r
- @Override\r
- public String getDefaultArea() {\r
- return "しょぼかる";\r
- }\r
-\r
- @Override\r
- public String getSelectedArea() {\r
- return "しょぼかる";\r
- }\r
-\r
- @Override\r
- public String getSelectedCode() {\r
- return "1";\r
- }\r
- \r
- /*\r
- * ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\r
- * ★★★★★ 放送地域を取得する(TVAreaから降格)-ここまで ★★★★★\r
- * ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\r
- */\r
-\r
- /*\r
- * ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\r
- * ★★★★★ 放送局を選択する(TVCenterから降格)-ここから ★★★★★\r
- * ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\r
- */\r
-\r
- @Override\r
- public void loadCenter(String code, boolean force) {\r
- \r
- if ( code == null ) {\r
- System.out.println(ERRID+"地域コードがnullです.");\r
- return;\r
- }\r
- \r
- if ( ! force && new File(centerFile).exists() ) {\r
- // NOT FORFCEならキャッシュからどうぞ\r
- @SuppressWarnings("unchecked")\r
- ArrayList<Center> tmp = (ArrayList<Center>) CommonUtils.readXML(centerFile);\r
- if ( tmp != null ) {\r
- crlist = tmp;\r
- return;\r
- }\r
- }\r
- \r
- String uri = "http://cal.syoboi.jp/mng?Action=ShowChList";\r
- String response = webToBuffer(uri,thisEncoding,true);\r
- if ( response == null ) {\r
- System.err.println(ERRID+"放送局リストの取得に失敗: "+uri);\r
- return;\r
- }\r
- System.out.println(MSGID+"放送局リストを取得: "+uri);\r
- \r
- Matcher ma = Pattern.compile("<table class=\"tframe output\".*?>(.+?)</table>",Pattern.DOTALL).matcher(response);\r
- if ( ! ma.find() ) {\r
- System.err.println(ERRID+"放送局情報がない: "+uri);\r
- return;\r
- }\r
- \r
- // 新しい放送局リストの入れ物を作る\r
- ArrayList<Center> newcrlist = new ArrayList<Center>();\r
- \r
- int cnt = 1;\r
- Matcher mb = Pattern.compile("<tr>(.+?)</tr>",Pattern.DOTALL).matcher(ma.group(1));\r
- while ( mb.find() ) {\r
- String[] d = mb.group(1).split("<.*?>",9);\r
- if ( d.length != 9 ) {\r
- System.err.println(ERRID+"書式不正(カラム数が足りない): "+d.length);\r
- continue;\r
- }\r
- if ( ! d[1].matches("^\\d+$") ) {\r
- continue;\r
- }\r
- \r
- // 放送局リスト\r
- Center cr = new Center();\r
- cr.setLink(d[5]);\r
- cr.setAreaCode("1");\r
- cr.setCenterOrig(CommonUtils.unEscape(d[7]));\r
- //cr.setCenter(this.chconv.get(cr.getCenterOrig())); // ChannelConvert.datで入れ替えたもの\r
- cr.setType("");\r
- cr.setEnabled(true);\r
- cr.setOrder(cnt++);\r
- \r
- newcrlist.add(cr);\r
- \r
- if (debug) System.out.println(MSGID+"放送局を追加: "+cr.getCenterOrig()+" -> "+cr.getCenter());\r
- }\r
- \r
- if ( newcrlist.size() == 0 ) {\r
- System.err.println(ERRID+"放送局情報の取得結果が0件だったため情報を更新しません");\r
- return;\r
- }\r
-\r
- System.out.println(DBGID+"放送局の数: "+newcrlist.size());\r
- \r
- crlist = newcrlist;\r
- attachChFilters();\r
- setSortedCRlist();\r
- CommonUtils.writeXML(centerFile, crlist);\r
- }\r
- \r
- @Override\r
- public boolean saveCenter() {\r
- return false;\r
- }\r
- \r
- /*\r
- * ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\r
- * ★★★★★ 放送局を選択する(TVCenterから降格)-ここまで ★★★★★\r
- * ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\r
- */\r
-}\r
+package tainavi.plugintv;
+
+import tainavi.*;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.GregorianCalendar;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * しょぼかるから番組表と放送局リストを取得する。プラグインではないよ。
+ */
+public class Syobocal extends TVProgramUtils implements TVProgram,Cloneable {
+
+ private final String thisEncoding = "UTF-8";
+
+ public void setDebug(boolean b) { debug = b; }
+
+ private boolean debug = false;
+
+ private boolean rss2 = false;
+
+ /* 必須コード - ここから */
+
+ // 種族の特性
+ private static final String tvProgId = "Syobocal";
+
+ //private final String progCacheFile = getProgDir()+File.separator+"syobocal.xml";
+ private final String centerFile = "env"+File.separator+"center."+getTVProgramId()+".xml";
+
+ private final String MSGID = "[しょぼかる] ";
+ private final String ERRID = "[ERROR]"+MSGID;
+ private final String DBGID = "[DEBUG]"+MSGID;
+
+ @Override
+ public String getTVProgramId() { return tvProgId; }
+
+ @Override
+ public boolean isAreaSelectSupported() { return false; }
+
+ @Override
+ public ProgType getType() { return ProgType.SYOBO; }
+ public ProgSubtype getSubtype() { return ProgSubtype.NONE; }
+
+ @Override
+ public Syobocal clone() {
+ return (Syobocal) super.clone();
+ }
+
+ // 個体の特性
+
+ //
+ @Override
+ public int getTimeBarStart() {return 5;}
+
+ private int getDogDays() { return ((getExpandTo8())?(8):(7)); }
+
+ //
+ @Override
+ public void loadProgram(String areaCode, boolean force) {
+
+ String progCacheFile = null;
+ if ( rss2 ) {
+ progCacheFile = getProgDir()+File.separator+"syobocal.xml";
+ }
+ else {
+ progCacheFile = getProgDir()+File.separator+"syobocal.rss";
+ }
+
+ // 新しい番組データの入れ物を作る
+ ArrayList<ProgList> newplist = new ArrayList<ProgList>();
+
+ int cnt = 0;
+
+ try {
+ String response = null;
+
+ String cirtDateTimeYMD = CommonUtils.getCritDateTime().replaceAll("[/: ]", "");
+
+ File f = new File(progCacheFile);
+ if (force == true ||
+ (f.exists() == true && isCacheOld(progCacheFile) == true) ||
+ (f.exists() == false && isCacheOld(null) == true)) {
+
+ String url = null;
+ if ( rss2 ) {
+ url = "http://cal.syoboi.jp/rss2.php?start="+cirtDateTimeYMD+"&days="+getDogDays()+"&titlefmt=$(Flag)^^^$(FlagW)^^^$(Cat)^^^$(ChName)^^^$(EdTime)^^^$(Title)^^^$(SubTitleB)";
+ }
+ else {
+ url = "http://cal.syoboi.jp/rss.php?start=today&count=1500&days=8&days="+getDogDays()+"&titlefmt=$(Flag)^^^$(FlagW)^^^$(Cat)^^^$(ChName)^^^$(EdTime)^^^$(Title)^^^$(SubTitleB)";
+ }
+ response = webToBuffer(url, thisEncoding, true);
+ if ( response == null ) {
+ reportProgress(ERRID+"RSS2.0(オンライン)の取得に失敗しました: "+url);
+ return;
+ }
+
+ reportProgress(MSGID+"RSS2.0(オンライン)を取得しました: "+url);
+ CommonUtils.write2file(progCacheFile, response);
+ }
+ else if (f.exists()) {
+ //
+ response = CommonUtils.read4file(progCacheFile, true);
+ if ( response == null ) {
+ reportProgress(ERRID+"RSS2.0(キャッシュ)の取得に失敗しました: "+progCacheFile);
+ return;
+ }
+ reportProgress(MSGID+"RSS2.0(キャッシュ)を取得しました: "+progCacheFile);
+ }
+ else {
+ reportProgress(ERRID+"RSS2.0(キャッシュ)がみつかりません: "+progCacheFile);
+ return;
+ }
+
+ // 情報解析
+
+ Matcher ma = Pattern.compile("<item(.+?)</item>",Pattern.DOTALL).matcher(response);
+ while (ma.find()) {
+
+ // 入れ物
+ ProgDetailList pDetail = new ProgDetailList();
+
+ // <title>金曜ロードショー ヱヴァンゲリヲン新劇場版:破 TV版</title>
+ Matcher mb = Pattern.compile("<title>(.+?)</title>",Pattern.DOTALL).matcher(ma.group(1));
+ if ( ! mb.find()) {
+ continue;
+ }
+
+ String[] t = mb.group(1).split("\\^\\^\\^",7);
+
+ if (t.length < 7) {
+ System.err.println(ERRID+"書式が不正: "+mb.group(1));
+ }
+
+ pDetail.title = CommonUtils.unEscape(t[5]);
+
+ pDetail.detail = CommonUtils.unEscape(t[6]);
+ if ( pDetail.detail.matches("^#1$|^#1[^0-9].*$") ) {
+ // まあなにもしなくていいか
+ }
+
+ if (t[0] != null && t[0].length() > 0) {
+ int flag = Integer.valueOf(t[0]);
+ if (flag != 0) {
+ if ((flag & 0x01) != 0x00) {
+ pDetail.addOption(ProgOption.SPECIAL);
+ flag ^= 0x01;
+ }
+ if ((flag & 0x02) != 0x00) {
+ pDetail.flag = ProgFlags.NEW;
+ flag ^= 0x02;
+ }
+ if ((flag & 0x04) != 0x00) {
+ pDetail.flag = ProgFlags.LAST;
+ flag ^= 0x04;
+ }
+ if ((flag & 0x08) != 0x00) {
+ pDetail.addOption(ProgOption.REPEAT);
+ flag ^= 0x08;
+ }
+ if (flag != 0) {
+ System.out.println(DBGID+"未対応のマーク: "+flag);
+ }
+ }
+ }
+ if (t[1] != null && t[1].length() > 0) {
+ int flagw = Integer.valueOf(t[1]);
+ if (flagw != 0) {
+ if ((flagw & 0x01) != 0x00) {
+ if (pDetail.flag != ProgFlags.NEW && ! pDetail.isOptionEnabled(ProgOption.SPECIAL)) {
+ pDetail.addOption(ProgOption.MOVED); // 新番組や特番なら(移)はいらんやろ
+ }
+ flagw ^= 0x01;
+ }
+ if (flagw != 0) {
+ System.out.println(DBGID+"未対応の警告フラグ: "+flagw);
+ }
+ }
+ }
+ // <tv:genre>アニメ(終了/再放送)</tv:genre>
+ pDetail.genre = null;
+ pDetail.subgenre = null;
+ pDetail.genrelist = new ArrayList<TVProgram.ProgGenre>();
+ pDetail.subgenrelist = new ArrayList<TVProgram.ProgSubgenre>();
+ boolean anime_etc = true;
+
+ if (t[2] != null && t[2].length() > 0) {
+ // ジャンル
+ if (t[2].equals("1") || t[2].equals("10") || t[2].equals("5")) {
+ // 1:アニメ 10:アニメ(終了/再放送) 5:アニメ関連
+ }
+ else if (t[2].equals("7")) {
+ // 7:OVA
+ pDetail.genre = ProgGenre.ANIME;
+ pDetail.subgenre = ProgSubgenre.ANIME_KOKUNAI;
+ pDetail.genrelist.add(ProgGenre.ANIME);
+ pDetail.subgenrelist.add(ProgSubgenre.ANIME_KOKUNAI);
+ anime_etc = false;
+ }
+ else if (t[2].equals("4")) {
+ // 4:特撮
+ pDetail.genre = ProgGenre.ANIME;
+ pDetail.subgenre = ProgSubgenre.ANIME_TOKUSATSU;
+ pDetail.genrelist.add(ProgGenre.ANIME);
+ pDetail.subgenrelist.add(ProgSubgenre.ANIME_TOKUSATSU);
+ anime_etc = false;
+ }
+ else if (t[2].equals("8")) {
+ // 8:映画
+ pDetail.genre = ProgGenre.MOVIE;
+ pDetail.subgenre = ProgSubgenre.MOVIE_ETC;
+ pDetail.genrelist.add(ProgGenre.MOVIE);
+ pDetail.subgenrelist.add(ProgSubgenre.MOVIE_ETC);
+ pDetail.removeOption(ProgOption.MOVED); // 映画なら(移)はいらんやろ
+ }
+ else if (t[2].equals("0")) {
+ // 0:その他
+ pDetail.genrelist.add(ProgGenre.NOGENRE);
+ pDetail.subgenrelist.add(ProgSubgenre.NOGENRE_ETC);
+ }
+ else if (t[2].equals("3") || t[2].equals("2") || t[2].equals("6")) {
+ // 3:テレビ 2:ラジオ 6:メモ
+ }
+ else {
+ System.out.println(DBGID+"未対応のジャンル: "+t[2]);
+ }
+
+ // 最後に
+ if (pDetail.genre == null) {
+ pDetail.genre = ProgGenre.ANIME;
+ pDetail.subgenre = ProgSubgenre.ANIME_ETC;
+ }
+ if (pDetail.genrelist.size() == 0 || anime_etc) {
+ pDetail.genrelist.add(ProgGenre.ANIME);
+ pDetail.subgenrelist.add(ProgSubgenre.ANIME_ETC);
+ }
+ }
+
+ // <dc:publisher>日本テレビ</dc:publisher>
+ if ( t[3] == null || t[3].length() == 0) {
+ System.err.println(ERRID+"放送局名がない: "+mb.group(1));
+ continue;
+ }
+
+ // ベアな放送局名と、ChannelConvert.datを適用した結果の放送局名
+ String location = CommonUtils.unEscape(t[3]);
+ String modifiedloc = getChName(location);
+
+ // <tv:startDatetime>2011-08-29T00:00:00+09:00</tv:startDatetime>
+ if ( rss2 ) {
+ mb = Pattern.compile("<pubDate>(.+?)\\+09:00</pubDate>",Pattern.DOTALL).matcher(ma.group(1));
+ }
+ else {
+ mb = Pattern.compile("<tv:startDatetime>(.+?)\\+09:00</tv:startDatetime>",Pattern.DOTALL).matcher(ma.group(1));
+ }
+ if ( ! mb.find()) {
+ System.err.println(ERRID+"開始日時がない");
+ continue;
+ }
+ GregorianCalendar ca = CommonUtils.getCalendar(mb.group(1));
+ if ( ca == null ) {
+ System.err.println(ERRID+"開始日時が不正: "+mb.group(1));
+ continue;
+ }
+
+ pDetail.startDateTime = CommonUtils.getDateTime(ca);
+ pDetail.start = pDetail.startDateTime.substring(11, 16);
+ pDetail.accurateDate = CommonUtils.getDate(ca);
+
+ if ( t[4] == null || t[4].length() == 0) {
+ System.err.println(ERRID+"終了時刻がない: "+mb.group(1));
+ continue;
+ }
+
+ GregorianCalendar cz = CommonUtils.getCalendar(CommonUtils.getDate(ca)+" "+t[4]);
+ if (ca.compareTo(cz) > 0) {
+ cz.add(Calendar.DAY_OF_MONTH, 1);
+ }
+
+ pDetail.endDateTime = CommonUtils.getDateTime(cz);
+ pDetail.end = pDetail.endDateTime.substring(11, 16);
+
+ // 24:00~28:59までは前日なんだニャー
+ if (CommonUtils.isLateNight(ca.get(Calendar.HOUR_OF_DAY))) {
+ ca.add(Calendar.DAY_OF_MONTH, -1);
+ }
+
+ // 番組情報を入れるべき日付
+ String progdate = CommonUtils.getDate(ca);
+
+ // <description>HD放送</description>
+ mb = Pattern.compile("<description>(.+?)</description>").matcher(ma.group(1));
+ if (mb.find()) {
+ pDetail.detail += " <" + CommonUtils.unEscape(mb.group(1)) + ">";
+ if (pDetail.detail.contains("無料放送")) {
+ pDetail.noscrumble = ProgScrumble.NOSCRUMBLE;
+ }
+ if (pDetail.detail.contains("先行放送")) {
+ pDetail.addOption(ProgOption.PRECEDING);
+ }
+ if (pDetail.detail.contains("変更の可能性")) {
+ pDetail.extension = true;
+ }
+ if ( pDetail.detail.contains("繰り下げ") ) {
+ pDetail.extension = true;
+ }
+ if (pDetail.detail.contains("副音声")) {
+ pDetail.addOption(ProgOption.MULTIVOICE);
+ }
+ }
+
+ // <link>http://cal.syoboi.jp/tid/44#198593</link>
+ mb = Pattern.compile("<link>(.+?)</link>",Pattern.DOTALL).matcher(ma.group(1));
+ if (mb.find()) {
+ pDetail.link = mb.group(1);
+ if ( ! ContentIdSyobo.isValid(pDetail.link)) {
+ System.out.println(DBGID+"TIDとPIDが取得できない: "+pDetail.link);
+ }
+ }
+
+ // 追加詳細
+ pDetail.setGenreStr();
+
+ // 統合
+ {
+ // 放送局が存在するか
+ ProgList prog = null;
+ for (ProgList pl : newplist) {
+ if (pl.Center.equals(modifiedloc)) {
+ prog = pl;
+ break;
+ }
+ }
+ if (prog == null) {
+ // 番組表
+ prog = new ProgList();
+ prog.Center = modifiedloc;
+ prog.enabled = true;
+ prog.pdate = new ArrayList<ProgDateList>();
+
+ newplist.add(prog);
+ }
+
+ // 日付が存在するか
+ ProgDateList pCenter = null;
+ for (ProgDateList pcl : prog.pdate) {
+ if (pcl.Date.equals(progdate)) {
+ pCenter = pcl;
+ break;
+ }
+ }
+ if (pCenter == null) {
+ pCenter = new ProgDateList();
+ pCenter.Date = progdate;
+ pCenter.pdetail = new ArrayList<ProgDetailList>();
+ prog.pdate.add(pCenter);
+ }
+
+ // 連結
+ pCenter.pdetail.add(pDetail);
+
+ cnt++;
+ }
+
+ //
+ pDetail.splitted_title = pDetail.title;
+ pDetail.splitted_detail = pDetail.detail;
+
+ // 詳細を登録する
+ pDetail.titlePop = TraceProgram.replacePop(pDetail.title);
+ pDetail.splitted_titlePop = pDetail.titlePop;
+ pDetail.detailPop = TraceProgram.replacePop(pDetail.detail);
+ 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)));
+ }
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ return;
+ }
+
+ pcenter = newplist;
+ System.out.println(DBGID+"番組の数: "+cnt);
+ }
+
+ /* ここまで */
+
+ /*
+ * ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
+ * ★★★★★ 放送地域を取得する(TVAreaから降格)-ここから ★★★★★
+ * ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
+ */
+
+ @Override
+ public void loadAreaCode() {
+ }
+
+ @Override
+ public void saveAreaCode() {
+ }
+
+ @Override
+ public String getCode(String area) {
+ return "1";
+ }
+
+ @Override
+ public String getDefaultArea() {
+ return "しょぼかる";
+ }
+
+ @Override
+ public String getSelectedArea() {
+ return "しょぼかる";
+ }
+
+ @Override
+ public String getSelectedCode() {
+ return "1";
+ }
+
+ /*
+ * ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
+ * ★★★★★ 放送地域を取得する(TVAreaから降格)-ここまで ★★★★★
+ * ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
+ */
+
+ /*
+ * ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
+ * ★★★★★ 放送局を選択する(TVCenterから降格)-ここから ★★★★★
+ * ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
+ */
+
+ @Override
+ public void loadCenter(String code, boolean force) {
+
+ if ( code == null ) {
+ System.out.println(ERRID+"地域コードがnullです.");
+ return;
+ }
+
+ if ( ! force && new File(centerFile).exists() ) {
+ // NOT FORFCEならキャッシュからどうぞ
+ @SuppressWarnings("unchecked")
+ ArrayList<Center> tmp = (ArrayList<Center>) CommonUtils.readXML(centerFile);
+ if ( tmp != null ) {
+ crlist = tmp;
+ return;
+ }
+ }
+
+ String uri = "http://cal.syoboi.jp/mng?Action=ShowChList";
+ String response = webToBuffer(uri,thisEncoding,true);
+ if ( response == null ) {
+ System.err.println(ERRID+"放送局リストの取得に失敗: "+uri);
+ return;
+ }
+ System.out.println(MSGID+"放送局リストを取得: "+uri);
+
+ Matcher ma = Pattern.compile("<table class=\"tframe output\".*?>(.+?)</table>",Pattern.DOTALL).matcher(response);
+ if ( ! ma.find() ) {
+ System.err.println(ERRID+"放送局情報がない: "+uri);
+ return;
+ }
+
+ // 新しい放送局リストの入れ物を作る
+ ArrayList<Center> newcrlist = new ArrayList<Center>();
+
+ int cnt = 1;
+ Matcher mb = Pattern.compile("<tr>(.+?)</tr>",Pattern.DOTALL).matcher(ma.group(1));
+ while ( mb.find() ) {
+ String[] d = mb.group(1).split("<.*?>",9);
+ if ( d.length != 9 ) {
+ System.err.println(ERRID+"書式不正(カラム数が足りない): "+d.length);
+ continue;
+ }
+ if ( ! d[1].matches("^\\d+$") ) {
+ continue;
+ }
+
+ // 放送局リスト
+ Center cr = new Center();
+ cr.setLink(d[5]);
+ cr.setAreaCode("1");
+ cr.setCenterOrig(CommonUtils.unEscape(d[7]));
+ //cr.setCenter(this.chconv.get(cr.getCenterOrig())); // ChannelConvert.datで入れ替えたもの
+ cr.setType("");
+ cr.setEnabled(true);
+ cr.setOrder(cnt++);
+
+ newcrlist.add(cr);
+
+ if (debug) System.out.println(MSGID+"放送局を追加: "+cr.getCenterOrig()+" -> "+cr.getCenter());
+ }
+
+ if ( newcrlist.size() == 0 ) {
+ System.err.println(ERRID+"放送局情報の取得結果が0件だったため情報を更新しません");
+ return;
+ }
+
+ System.out.println(DBGID+"放送局の数: "+newcrlist.size());
+
+ crlist = newcrlist;
+ attachChFilters();
+ setSortedCRlist();
+ CommonUtils.writeXML(centerFile, crlist);
+ }
+
+ @Override
+ public boolean saveCenter() {
+ return false;
+ }
+
+ /*
+ * ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
+ * ★★★★★ 放送局を選択する(TVCenterから降格)-ここまで ★★★★★
+ * ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
+ */
+}