OSDN Git Service

しょぼかるデータに対して番組追跡が実行できない場合があった
authorpeeweedee <peeweedee@users.sourceforge.jp>
Mon, 27 Jan 2014 09:05:37 +0000 (18:05 +0900)
committerpeeweedee <peeweedee@users.sourceforge.jp>
Mon, 27 Jan 2014 09:05:37 +0000 (18:05 +0900)
TinyBannavi/05_history.txt
TinyBannavi/env/tracekey.xml
TinyBannavi/src/tainavi/AbsChannelConvertView.java
TinyBannavi/src/tainavi/AbsToolBar.java
TinyBannavi/src/tainavi/TVProgramList.java
TinyBannavi/src/tainavi/VWMainWindow.java
TinyBannavi/src/tainavi/VersionInfo.java
TinyBannavi/src/tainavi/Viewer.java
TinyBannavi/src/tainavi/pluginrec/PlugIn_RecDIGA_DMR_BWT2100.java
TinyBannavi/src/tainavi/plugintv/Syobocal.java [moved from TinyBannavi/src/tainavi/Syobocal.java with 96% similarity]

index 20ed6a0..8757170 100644 (file)
 2chの番ナビスレ:http://toro.2ch.net/test/read.cgi/av/1352223253/\r
 ★☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆★\r
 \r
-3.22.12β+1.5.12(2014-01-XX)\r
+3.22.13β+1.5.12(2014-01-XX)\r
 ■変更点\r
- ・(レコーダ対応[DIGA BWT650]) 追加(>>673.)\r
  ・(レコーダ対応[TvRock]) 録画/視聴のモード設定の追加\r
+ ・(その他) 設定タブの群れをルートからサブにまとめて移動\r
+■バグ修正\r
+ ・(Web番組表[しょぼかる]) 「タイトル中のサブタイトルを番組追跡に使わない」を有効にしていると、しょぼかるデータに対して番組追跡が行われない問題を修正\r
+ ・(レコーダ対応[DIGA BWT2100/BZT710/720]) ログイン時にネットワークできないとNullぽしてたのを修正\r
+\r
+3.22.12β+1.5.12(2014-01-20)\r
+■変更点\r
+ ・(レコーダ対応[DIGA BWT650]) 追加(>>673.)\r
  ・(新聞形式) 番組枠内テキストの描画を、LineBreakMeasurerからdrawGlyphVectorに変更。それに伴い番組詳細の描画行数制限を廃止\r
  ・(その他) プラグインの格納場所を変えた\r
 ■バグ修正\r
index 0401749..4443b07 100644 (file)
@@ -4,55 +4,7 @@
   <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>&lt;物語&gt;シリーズ セカンドシーズン</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>&lt;物語&gt;シリーズセカンドシーズン</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\80MX</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\80MX</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>ガールズ&amp;パンツァー</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\80MX</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\80MX</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 &lt;ノイタミナ&gt;</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>サムライフラメンコ&lt;ノイタミナ&gt;</string> 
     </void> 
    </object> 
   </void> 
index da432cf..d417019 100644 (file)
@@ -29,6 +29,7 @@ import javax.swing.table.TableColumn;
 \r
 import tainavi.TVProgram.ProgSubtype;\r
 import tainavi.TVProgram.ProgType;\r
+import tainavi.plugintv.Syobocal;\r
 \r
 /**\r
  * ChannelConver.datを編集するView\r
index 5671960..30639d3 100644 (file)
@@ -90,15 +90,12 @@ public abstract class AbsToolBar extends JToolBar implements HDDRecorderSelectab
        // メインウィンドウ\r
        /**\r
         * 親から呼ばないでくださいね!\r
-        * @see #setToggleShowStatusButton(boolean)\r
         */\r
        protected abstract void setStatusVisible(boolean b);\r
        /**\r
         * 親から呼ばないでくださいね!\r
-        * @see #setToggleFullScreenButton(boolean)\r
         */\r
        protected abstract void setFullScreen(boolean b);\r
-       protected abstract void toggleSettingTabVisible();\r
        protected abstract boolean isTabSelected(MWinTab tab);\r
        // 部品\r
        protected abstract boolean addKeywordSearch(SearchKey search);\r
@@ -216,7 +213,6 @@ public abstract class AbsToolBar extends JToolBar implements HDDRecorderSelectab
        private JSlider jSlider_paperZoom = null;\r
        private JToggleButton jToggleButton_timer = null;\r
        private JButton jButton_logviewer = null;\r
-       private JToggleButton jToggleButton_showsetting = null;\r
        private JToggleButton jToggleButton_showstatus = null;\r
        private JToggleButton jToggleButton_fullScreen = null;\r
        private JButton jButton_update = null;\r
@@ -268,7 +264,6 @@ public abstract class AbsToolBar extends JToolBar implements HDDRecorderSelectab
                this.add(getJSlider_paperZoom("番組枠表示拡大"));\r
                this.add(getJButton_logviewer("ログビューア"));\r
                this.add(getJToggleButton_timer("タイマー"));\r
-               this.add(getJToggleButton_showsetting("設定タブを開く"));\r
                this.addSeparator(new Dimension(4,0));\r
                this.add(getJToggleButton_showstatus("ステータス領域"));\r
                this.add(getJToggleButton_fullScreen("全"));\r
@@ -996,13 +991,6 @@ public abstract class AbsToolBar extends JToolBar implements HDDRecorderSelectab
                }\r
        };\r
        \r
-       // 設定タブを出したりしまったり\r
-       private final ActionListener al_showsetting = new ActionListener(){\r
-               public void actionPerformed(ActionEvent e){\r
-                       toggleSettingTabVisible();\r
-               }\r
-       };\r
-\r
        // ステータスエリアを出したりしまったり\r
        private final ActionListener al_toggleShowStatus = new ActionListener() {\r
                \r
@@ -1339,20 +1327,6 @@ public abstract class AbsToolBar extends JToolBar implements HDDRecorderSelectab
                return jButton_shutdown;\r
        }\r
        \r
-       // 「設定タブを表示」\r
-       private JToggleButton getJToggleButton_showsetting(String s) {\r
-               if (jToggleButton_showsetting == null) {\r
-                       final ImageIcon icon = new ImageIcon(ICONFILE_SHOWSETTING);\r
-                       jToggleButton_showsetting = new JToggleButton(icon);\r
-                       jToggleButton_showsetting.setToolTipText(TIPS_SHOWSETTING);\r
-                       \r
-                       jToggleButton_showsetting.setSelected(bounds.getShowSettingTabs());\r
-                       \r
-                       jToggleButton_showsetting.addActionListener(al_showsetting);\r
-               }\r
-               return jToggleButton_showsetting;\r
-       }\r
-       \r
        // 「ステータス領域」\r
        private JToggleButton getJToggleButton_showstatus(String s) {\r
                if (jToggleButton_showstatus == null) {\r
index 901733a..f966be6 100644 (file)
@@ -3,6 +3,7 @@ package tainavi;
 import java.util.ArrayList;\r
 \r
 import tainavi.TVProgram.ProgType;\r
+import tainavi.plugintv.Syobocal;\r
 \r
 /**\r
  * <P>{@link TVProgram} のリストを実現するクラスです.\r
index 78712ae..3508c94 100644 (file)
@@ -60,6 +60,7 @@ public class VWMainWindow extends JPanel {
         */\r
        \r
        private JTabbedPane jTabbedPane = null;\r
+       private JTabbedPane jTabbedPane_settings = null;\r
 \r
        \r
        /*\r
@@ -69,9 +70,13 @@ public class VWMainWindow extends JPanel {
        public VWMainWindow() {\r
                this.setLayout(new BorderLayout());\r
                this.add(getJTabbedPane(), BorderLayout.CENTER);\r
-               \r
+               getJTabbedPane_settings();\r
+\r
                // タブを全部準備する\r
                for ( MWinTab tab : MWinTab.values() ) {\r
+                       if ( tab == MWinTab.SETTING ) {\r
+                               jTabbedPane.add(jTabbedPane_settings, "設定");\r
+                       }\r
                        addTab(null, tab);\r
                }\r
        }\r
@@ -93,14 +98,21 @@ public class VWMainWindow extends JPanel {
        \r
        // タブを追加する\r
        public boolean addTab(Component comp, MWinTab tab) {\r
-               if ( jTabbedPane.getTabCount() < tab.getIndex() ) {\r
-                       System.err.println(String.format("[DEBUG][メインウィンドウ] タブの数があわない: %d/%d",jTabbedPane.getTabCount(),tab.getIndex()));\r
+               if ( jTabbedPane.getTabCount() + jTabbedPane_settings.getTabCount() < tab.getIndex() ) {\r
+                       System.err.println(String.format("[DEBUG][メインウィンドウ] タブの数があわない: %d/%d", jTabbedPane.getTabCount(), tab.getIndex()));\r
                        return false;\r
                }\r
-               if ( jTabbedPane.getTabCount() > tab.getIndex() ) {\r
-                       jTabbedPane.remove(tab.getIndex());\r
+\r
+               int tabIndex = tab.getIndex();\r
+               JTabbedPane tabPane = jTabbedPane;\r
+               if ( tabIndex >= MWinTab.SETTING.getIndex() ) {\r
+                       tabIndex -= MWinTab.SETTING.getIndex();\r
+                       tabPane = jTabbedPane_settings;\r
+               }\r
+               if ( tabPane.getTabCount() > tabIndex ) {\r
+                       tabPane.remove(tabIndex);\r
                }\r
-               jTabbedPane.add(comp, tab.getName(), tab.getIndex());\r
+               tabPane.add(comp, tab.getName(), tabIndex);\r
                return true;\r
        }\r
 \r
@@ -108,24 +120,39 @@ public class VWMainWindow extends JPanel {
        public void setSelectedTab(MWinTab tab) {\r
                if ( tab == null ) {\r
                        jTabbedPane.setSelectedIndex(-1);\r
+                       return;\r
                }\r
-               else if (jTabbedPane.getTabCount() > tab.getIndex()) {\r
-                       jTabbedPane.setSelectedIndex(tab.getIndex());\r
+               if ( tab.getIndex() >= MWinTab.SETTING.getIndex() ) {\r
+                       jTabbedPane_settings.setSelectedIndex(tab.getIndex()-MWinTab.SETTING.getIndex());\r
+                       jTabbedPane.setSelectedIndex(MWinTab.SETTING.getIndex());\r
+                       return;\r
                }\r
+               jTabbedPane.setSelectedIndex(tab.getIndex());\r
        }\r
        \r
        //\r
        public Component getTab(MWinTab tab) {\r
-               return this.getComponent(tab.getIndex());\r
+               if ( tab.getIndex() >= MWinTab.SETTING.getIndex() ) {\r
+                       return jTabbedPane_settings.getComponent(tab.getIndex() - MWinTab.SETTING.getIndex());\r
+               }\r
+               return jTabbedPane.getComponent(tab.getIndex());\r
        }\r
        \r
        // タブが選択されているか確認する\r
        public boolean isTabSelected(MWinTab tab) {\r
+               if ( tab.getIndex() >= MWinTab.SETTING.getIndex() ) {\r
+                       return (jTabbedPane.getSelectedIndex() == MWinTab.SETTING.getIndex() && jTabbedPane_settings.getSelectedIndex() == tab.getIndex()-MWinTab.SETTING.getIndex());\r
+               }\r
                return (jTabbedPane.getSelectedIndex() == tab.getIndex());\r
        }\r
        \r
        // どのタブが選択されているのやら\r
-       public MWinTab getSelectedTab() { return MWinTab.getAt(jTabbedPane.getSelectedIndex()); }\r
+       public MWinTab getSelectedTab() {\r
+               if ( jTabbedPane.getSelectedIndex() == MWinTab.SETTING.getIndex() ) {\r
+                       return MWinTab.getAt(jTabbedPane.getSelectedIndex());\r
+               }\r
+               return MWinTab.getAt(jTabbedPane.getSelectedIndex());\r
+       }\r
        \r
        // 設定タブをトグル切り替え\r
        private final int firstSettingTab = MWinTab.SETTING.ordinal();\r
@@ -133,33 +160,13 @@ public class VWMainWindow extends JPanel {
        private Component[] st_comp = new Component[countSettingTab];\r
        private String[] st_title = new String[countSettingTab];\r
        public boolean toggleShowSettingTabs() {\r
-               if (st_comp[0] == null) {\r
-                       for (int i=countSettingTab-1; i>=0; i--) {\r
-                               st_comp[i] = this.jTabbedPane.getComponentAt(firstSettingTab+i);\r
-                               st_title[i] = this.jTabbedPane.getTitleAt(firstSettingTab+i);\r
-                               this.jTabbedPane.remove(firstSettingTab+i);\r
-                       }\r
-                       return false;\r
-               }\r
-               else {\r
-                       for (int i=0; i<countSettingTab; i++) {\r
-                               this.jTabbedPane.add(st_comp[i]);\r
-                               this.jTabbedPane.setTitleAt(firstSettingTab+i, st_title[i]);\r
-                               st_comp[i] = null;\r
-                       }\r
-                       this.jTabbedPane.setSelectedIndex(firstSettingTab);\r
-                       return true;\r
-               }\r
+               return true;\r
        }\r
        \r
        public boolean getShowSettingTabs() {\r
-               return (jTabbedPane.getTabCount() > firstSettingTab);\r
+               return true;\r
        }\r
        public void setShowSettingTabs(boolean b) {\r
-               if ((b && jTabbedPane.getTabCount() <= firstSettingTab) ||\r
-                               ( ! b && jTabbedPane.getTabCount() > firstSettingTab)) {\r
-                       toggleShowSettingTabs();\r
-               }\r
        }\r
        \r
        \r
@@ -173,6 +180,13 @@ public class VWMainWindow extends JPanel {
                }\r
                return jTabbedPane;\r
        }\r
+\r
+       private JTabbedPane getJTabbedPane_settings() {\r
+               if (jTabbedPane_settings == null) {\r
+                       jTabbedPane_settings = new JTabbedPane();\r
+               }\r
+               return jTabbedPane_settings;\r
+       }\r
        \r
        /**\r
         * @deprecated\r
index 762ecbd..3341f67 100644 (file)
@@ -5,7 +5,7 @@ import java.util.regex.Pattern;
 \r
 \r
 public class VersionInfo {\r
-       private static final String Version = "タイニー番組ナビゲータ 3.22.12β";\r
+       private static final String Version = "タイニー番組ナビゲータ 3.22.13β";\r
        \r
        private static final String OSname = System.getProperty("os.name");\r
        private static final String OSvers = System.getProperty("os.version");\r
index 51dd3aa..dc8d907 100644 (file)
@@ -64,7 +64,6 @@ import javax.swing.event.ChangeEvent;
 import javax.swing.event.ChangeListener;\r
 \r
 import tainavi.HDDRecorder.RecType;\r
-import tainavi.SearchKey.TargetId;\r
 import tainavi.TVProgram.ProgFlags;\r
 import tainavi.TVProgram.ProgGenre;\r
 import tainavi.TVProgram.ProgOption;\r
@@ -73,6 +72,7 @@ import tainavi.TVProgram.ProgSubtype;
 import tainavi.TVProgram.ProgType;\r
 import tainavi.VWMainWindow.MWinTab;\r
 import tainavi.VWUpdate.UpdateResult;\r
+import tainavi.plugintv.Syobocal;\r
 \r
 \r
 /**\r
@@ -1386,11 +1386,6 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener,H
                }\r
 \r
                @Override\r
-               protected void toggleSettingTabVisible() {\r
-                       mainWindow.toggleShowSettingTabs();\r
-               }\r
-\r
-               @Override\r
                protected boolean isTabSelected(MWinTab tab) {\r
                        return mainWindow.isTabSelected(tab);\r
                }\r
@@ -3124,7 +3119,7 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener,H
        \r
        /**\r
         * Web番組表をDLする\r
-        * <P>単体実行の場合はこちらを呼び出す:{@link #doLoadTVProgram(LoadFor)}\r
+        * <P>単体実行の場合はこちらを呼び出す:{@link #doLoadTVProgram(boolean, tainavi.Viewer.LoadFor)}\r
         * <P>部品実行の場合はこちらを呼び出す\r
         */\r
        private boolean loadTVProgram(final boolean force, final LoadFor lf) {\r
index f37477a..8142d9e 100644 (file)
@@ -2275,7 +2275,7 @@ public class PlugIn_RecDIGA_DMR_BWT2100 extends HDDRecorderUtils implements HDDR
                                r = d[1];\r
                        }\r
 \r
-                       if ( r.contains(DIGAMSG_PLEASELOGIN) ) {\r
+                       if ( r == null || r.contains(DIGAMSG_PLEASELOGIN) ) {\r
                                // ログイン失敗だからもうだめぽ\r
                                break;\r
                        }\r
similarity index 96%
rename from TinyBannavi/src/tainavi/Syobocal.java
rename to TinyBannavi/src/tainavi/plugintv/Syobocal.java
index dd68858..1584561 100644 (file)
-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から降格)-ここまで ★★★★★
+        * ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
+        */
+}