OSDN Git Service

・オンラインバージョンアップの参照先の調整 REL-03.22.15b
authorpeeweedee <peeweedee@users.sourceforge.jp>
Sat, 22 Feb 2014 07:36:33 +0000 (16:36 +0900)
committerpeeweedee <peeweedee@users.sourceforge.jp>
Sat, 22 Feb 2014 07:36:33 +0000 (16:36 +0900)
・Web番組表対応の微修正

TinyBannavi/05_history.txt
TinyBannavi/src/tainavi/CommonUtils.java
TinyBannavi/src/tainavi/ProgDetailList.java
TinyBannavi/src/tainavi/TVProgramUtils.java
TinyBannavi/src/tainavi/VWUpdate.java
TinyBannavi/src/tainavi/VersionInfo.java
TinyBannavi/src/tainavi/plugintv/PlugIn_CSPSkyperfectTV2012.java
TinyBannavi/src/tainavi/plugintv/PlugIn_TVPDimora.java

index 4674cb3..f7ee861 100644 (file)
 2chの番ナビスレ:http://toro.2ch.net/test/read.cgi/av/1352223253/\r
 ★☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆★\r
 \r
+3.22.15β+1.5.12(2014-02-22)\r
+■変更点\r
+ ・(その他) sfのサイト構成変更にオンラインバージョンアップのコードを対応\r
+■バグ修正\r
+ ・(Web番組表対応[Dimora]) 複数地域を同時選択している場合に過去ログデータにゴミデータが残ってしまう問題を修正\r
+ ・(Web番組表対応[スカパー]) 番組情報がない枠が、「番組情報がありません」というタイトルの番組として解析してしまう問題を修正\r
+ ・(新聞形式&Web番組表対応) サブタイトル分離をONにしていると番組情報がない枠に「番組情報がありません」が表示されない場合がある問題を修正\r
+\r
 3.22.14β+1.5.12(2014-02-21)\r
 ■変更点\r
  ・(録画結果一覧) 検索キーワード「@d(rop)」でエラー行のみ絞り込み表示\r
  ・(新聞形式) 不評なデバッグメッセージの一つを抑制\r
 ■バグ修正\r
- ・(Web番組表対応[Dimora]) 02/23のBSアニマックスの情報が正しくひょい表示されない問題を修正\r
+ ・(Web番組表対応[Dimora]) 02/23のBSアニマックスの情報が正しく表示されない問題を修正\r
+\r
+★対応チケット\r
+http://sourceforge.jp/ticket/browse.php?group_id=4315&tid=33239\r
 \r
 3.22.13β+1.5.12(2014-02-01)\r
 ■変更点\r
index 116f566..bc9f695 100644 (file)
@@ -482,13 +482,21 @@ public class CommonUtils {
                return c;\r
        }\r
        /**\r
+        * 指定日時+min分のCalendarを返す\r
+        */\r
+       public static GregorianCalendar getCalendar(String date, int sec) {\r
+               GregorianCalendar c = getCalendar(date);\r
+               c.add(Calendar.SECOND, sec);\r
+               return c;\r
+       }\r
+       /**\r
         *  日付時刻文字列をCalendarに変換\r
         *  @param date YYYY/MM/DD[(.)][ hh:mm[:ss]] or YYYY-MM-DD[Thh:mm[:ss]] or YYYYMMDD[hhmm[ss]]\r
         */\r
        public static GregorianCalendar getCalendar(String date) {\r
                Matcher ma = Pattern.compile("^(\\d\\d\\d\\d)[/-](\\d{1,2})[/-](\\d{1,2})(\\(.\\))?([ T](\\d{1,2}):(\\d{1,2})(:\\d{1,2})?)?$").matcher(date);\r
                if ( ! ma.find()) {\r
-                       ma = Pattern.compile("^(\\d\\d\\d\\d)(\\d\\d)(\\d\\d)()?((\\d\\d)(\\d\\d)(\\d\\d)?)?$").matcher(date);\r
+                       ma = Pattern.compile("^(\\d\\d\\d\\d)(\\d\\d)(\\d\\d)(\\s)?((\\d\\d)(\\d\\d)(\\d\\d)?)?$").matcher(date);\r
                        if ( ! ma.find()) {\r
                                return null;\r
                        }\r
index fa8513d..5852244 100644 (file)
@@ -109,10 +109,12 @@ public class ProgDetailList implements Cloneable {
        /*******************************************************************************\r
         * NGワード処理\r
         ******************************************************************************/\r
-       \r
+\r
+       private static final String NO_PROG_TITLE = "番組情報がありません";\r
+\r
        public void abon() {\r
                start = "";\r
-               title = "番組情報がありません";\r
+               title = splitted_title = NO_PROG_TITLE;\r
                detail = "";\r
                addedDetail = "";\r
                \r
index 4129062..2059b1c 100644 (file)
@@ -935,15 +935,12 @@ public class TVProgramUtils implements Cloneable {
                }\r
        }\r
 \r
-       protected void addEnmptyInfo(ProgDateList pcl, String sdat, String edat) {\r
+       protected void addEmptyInfo(ProgDateList pcl, String sdat, String edat) {\r
                ProgDetailList pdl = new ProgDetailList();\r
-               pdl.title = pdl.splitted_title = "番組情報がありません";\r
-               pdl.detail = "";\r
-               pdl.length = (int)(CommonUtils.getDiffDateTime(sdat, edat)/60000L);\r
-               pdl.genre = ProgGenre.NOGENRE;\r
-               pdl.start = "";\r
+               pdl.abon();\r
                pdl.startDateTime = sdat;\r
-               pdl.endDateTime = edat;\r
+               //pdl.endDateTime = edat;\r
+               pdl.length = (int)(CommonUtils.getDiffDateTime(sdat, edat)/60000L);\r
                pcl.pdetail.add(pdl);\r
                pcl.row += pdl.length;\r
        }\r
index b3fd64e..bb01862 100644 (file)
@@ -323,7 +323,7 @@ public class VWUpdate {
                \r
                // リリースファイルのURLを取得する\r
                String flink = "";\r
-               Matcher ma = Pattern.compile("<meta http-equiv=\"refresh\" content=\"1; url=(.+?)\">").matcher(response);\r
+               Matcher ma = Pattern.compile("<meta http-equiv=\"refresh\" content=\"\\d+; url=(.+?\\.zip)\">").matcher(response);\r
                if ( ! ma.find()) {\r
                        String msg = "リリースファイルの情報が取得できませんでした。プロジェクトサイト(http://sourceforge.jp/projects/tainavi/)を確認してください。";\r
                        StWinAppendError(msg);\r
index a6b9200..4842d9f 100644 (file)
@@ -5,7 +5,7 @@ import java.util.regex.Pattern;
 \r
 \r
 public class VersionInfo {\r
-       private static final String Version = "タイニー番組ナビゲータ 3.22.14β";\r
+       private static final String Version = "タイニー番組ナビゲータ 3.22.15β";\r
        \r
        private static final String OSname = System.getProperty("os.name");\r
        private static final String OSvers = System.getProperty("os.version");\r
index fbd3c63..b4328a0 100644 (file)
@@ -1,6 +1,8 @@
 package tainavi.plugintv;\r
 \r
 import java.io.File;\r
+import java.io.FileInputStream;\r
+import java.io.IOException;\r
 import java.io.UnsupportedEncodingException;\r
 import java.net.URLDecoder;\r
 import java.util.ArrayList;\r
@@ -11,21 +13,16 @@ import java.util.HashMap;
 import java.util.regex.Matcher;\r
 import java.util.regex.Pattern;\r
 \r
-import tainavi.AreaCode;\r
-import tainavi.Center;\r
-import tainavi.CommonUtils;\r
-import tainavi.ContentIdDIMORA;\r
-import tainavi.ProgDateList;\r
-import tainavi.ProgDetailList;\r
-import tainavi.ProgList;\r
-import tainavi.TVProgram;\r
-import tainavi.TVProgramUtils;\r
-import tainavi.TVProgram.ProgGenre;\r
-import tainavi.TVProgram.ProgOption;\r
-import tainavi.TVProgram.ProgSubgenre;\r
-import tainavi.TVProgram.ProgSubtype;\r
-import tainavi.TVProgram.ProgType;\r
+import tainavi.*;\r
 \r
+import javax.xml.parsers.DocumentBuilder;\r
+import javax.xml.parsers.DocumentBuilderFactory;\r
+import javax.xml.parsers.ParserConfigurationException;\r
+import org.w3c.dom.Document;\r
+import org.w3c.dom.NamedNodeMap;\r
+import org.w3c.dom.Node;\r
+import org.w3c.dom.NodeList;\r
+import org.xml.sax.SAXException;\r
 \r
 public class PlugIn_CSPSkyperfectTV2012 extends TVProgramUtils implements TVProgram,Cloneable {\r
 \r
@@ -202,37 +199,45 @@ public class PlugIn_CSPSkyperfectTV2012 extends TVProgramUtils implements TVProg
                        getDate(pl);\r
 \r
                        //\r
+                       String xtype = (pl.CenterId.startsWith(CHID_PREFIX_BS) || pl.CenterId.startsWith(CHID_PREFIX_CS)) ? XTYPE_BASIC : XTYPE_PREMIUM;\r
+                       String chid = xtype == XTYPE_BASIC ? pl.CenterId : pl.CenterId.replaceFirst("^"+CHID_PREFIX_PR, "");\r
+                       //String cacheFileExt = xtype == XTYPE_BASIC ? "xml" : "txt";\r
+                       String cacheFileExt = "txt";\r
+\r
                        for ( int dtidx=0; dtidx<pl.pdate.size(); dtidx++ ) {\r
                                //\r
                                GregorianCalendar cal = CommonUtils.getCalendar(pl.pdate.get(dtidx).Date);\r
-                               \r
+                               String dt = CommonUtils.getDateYMD(cal);\r
+\r
                                boolean isNextpageExist = true;\r
                                for ( int pgidx=1; isNextpageExist; pgidx++ ) {\r
                                        \r
                                        final String progCacheFile = \r
-                                                       pgidx == 1 ? String.format("%s%sSKP2012_%s_%d.txt", getProgDir(), File.separator, pl.CenterId, cal.get(Calendar.DAY_OF_MONTH)) :\r
-                                                                        String.format("%s%sSKP2012_%s_%d_%d.txt", getProgDir(), File.separator, pl.CenterId, cal.get(Calendar.DAY_OF_MONTH),pgidx);\r
+                                                       pgidx == 1 ? String.format("%s%sSKP2012_%s_%d.%s", getProgDir(), File.separator, pl.CenterId, cal.get(Calendar.DAY_OF_MONTH), cacheFileExt) :\r
+                                                                        String.format("%s%sSKP2012_%s_%d_%d.%s", getProgDir(), File.separator, pl.CenterId, cal.get(Calendar.DAY_OF_MONTH),pgidx, cacheFileExt);\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 xtype = (pl.CenterId.startsWith(CHID_PREFIX_BS) || pl.CenterId.startsWith(CHID_PREFIX_CS)) ? XTYPE_BASIC : XTYPE_PREMIUM;\r
-                                               String chid = xtype != XTYPE_PREMIUM ? pl.CenterId : pl.CenterId.replaceFirst("^"+CHID_PREFIX_PR, "");\r
-                                               String dt = CommonUtils.getDateYMD(cal);\r
                                                String url = "http://bangumi.skyperfectv.co.jp/"+xtype+"/channel:"+chid+"/date:"+dt.substring(2)+"/";\r
                                                if ( pgidx > 1 ) {\r
                                                        url += "?p="+pgidx;\r
                                                }\r
+\r
                                                /*\r
-                                               if ( pl.ChId.length() == 0 ) {\r
-                                                       url = "http://bangumi.skyperfectv.co.jp/api/version:3/search/date:"+dt.substring(2)+"/channel:"+pl.CenterId+"/?api_key=336eec3423";\r
+                                               if ( xtype == XTYPE_BASIC ) {\r
+                                                       url = "http://www.skyperfectv.co.jp/xml/"+dt+"_"+chid.replaceFirst("^[^0-9]+","")+".xml?_="+System.currentTimeMillis();\r
                                                }\r
                                                else {\r
-                                                       url = "http://www.skyperfectv.co.jp/xml/"+dt+"_"+pl.ChId.substring(2)+".xml";\r
+                                                       url = "http://bangumi.skyperfectv.co.jp/"+xtype+"/channel:"+chid+"/date:"+dt.substring(2)+"/";\r
+                                                       if ( pgidx > 1 ) {\r
+                                                               url += "?p="+pgidx;\r
+                                                       }\r
                                                }\r
                                                */\r
+\r
                                                webToFile(url, progCacheFile, thisEncoding);\r
                                                \r
                                                printProgress("(オンライン)を取得しました", counter+dtidx, pgidx, counterMax, pl.Center, cal.get(Calendar.DAY_OF_MONTH), url);\r
@@ -244,21 +249,30 @@ public class PlugIn_CSPSkyperfectTV2012 extends TVProgramUtils implements TVProg
                                                printProgress("(キャッシュ)がみつかりません", counter+dtidx, pgidx, counterMax, pl.Center, cal.get(Calendar.DAY_OF_MONTH), progCacheFile);\r
                                                break;\r
                                        }\r
-               \r
+\r
                                        String response = CommonUtils.read4file(progCacheFile, true);\r
                                        if ( response == null || ! response.matches("^.*<a href=\"\\?p=\\d+[^>]+?>次.*$") ) {\r
                                                isNextpageExist = false;\r
                                        }\r
-                                       \r
+\r
                                        // 番組リストの追加\r
                                        try {\r
                                                getPrograms(pl, dtidx, response);\r
                                                /*\r
-                                               if ( pl.ChId.length() == 0 ) {\r
-                                                       getPrograms(pl, i, response);\r
+                                               if ( xtype == XTYPE_BASIC ) {\r
+                                                       getPrograms_basic(pl, dtidx, progCacheFile);\r
+                                                       isNextpageExist = false;\r
                                                }\r
                                                else {\r
-                                                       getPrograms_basic(pl, i, response);\r
+                                                       String response = CommonUtils.read4file(progCacheFile, true);\r
+\r
+                                                       if ( xtype != XTYPE_BASIC ) {\r
+                                                               if ( response == null || ! response.matches("^.*<a href=\"\\?p=\\d+[^>]+?>次.*$") ) {\r
+                                                                       isNextpageExist = false;\r
+                                                               }\r
+                                                       }\r
+\r
+                                                       getPrograms(pl, dtidx, response);\r
                                                }\r
                                                */\r
                                        }\r
@@ -280,6 +294,7 @@ public class PlugIn_CSPSkyperfectTV2012 extends TVProgramUtils implements TVProg
        private void printProgress(String msg, int count, int pgidx, int countMax, String center, int date, String uri) {\r
                reportProgress(String.format("%s %s: (%d/%d) page=%d %s[%d日]    %s", getTVProgramId(), msg, count, countMax, pgidx, center, date, uri));\r
        }\r
+\r
        //\r
        private void getDate(ProgList pl) {\r
                // 日付の処理\r
@@ -334,26 +349,31 @@ public class PlugIn_CSPSkyperfectTV2012 extends TVProgramUtils implements TVProg
                // 隙間を埋めつつ一個にまとめる\r
                ProgDateList all = new ProgDateList();\r
                all.pdetail = new ArrayList<ProgDetailList>();\r
+               String prevStart = null;\r
+               String prevEnd = null;\r
                for ( ProgDateList pcl : pcenter ) {\r
                        for ( ProgDetailList pdl : pcl.pdetail ) {\r
-                               if ( all.row == 0 ) {\r
-                                       String prevend = CommonUtils.getDateTime(CommonUtils.getCalendar(pcenter.get(0).Date+" 05:00"));\r
-                                       if ( prevend.compareTo(pdl.startDateTime) < 0 ) {\r
+                               if ( prevEnd == null ) {\r
+                                       prevEnd = CommonUtils.getDateTime(CommonUtils.getCalendar(pcenter.get(0).Date+" 05:00"));\r
+                                       if ( prevEnd.compareTo(pdl.startDateTime) < 0 ) {\r
                                                // 最前列の情報がとれなかった\r
-                                               addEnmptyInfo(all, prevend, pdl.startDateTime);\r
+                                               addEmptyInfo(all, prevEnd, pdl.startDateTime);\r
                                        }\r
                                }\r
                                else {\r
-                                       ProgDetailList prevpdl = all.pdetail.get(all.pdetail.size()-1);\r
-                                       if ( prevpdl.startDateTime.equals(pdl.startDateTime) ) {\r
+                                       if ( prevStart.equals(pdl.startDateTime) ) {\r
                                                // 重複は破棄\r
                                                continue;\r
                                        }\r
-                                       else if ( prevpdl.endDateTime.compareTo(pdl.startDateTime) < 0 ) {\r
+                                       else if ( prevEnd.compareTo(pdl.startDateTime) < 0 ) {\r
                                                // 隙間を埋める\r
-                                               addEnmptyInfo(all, prevpdl.endDateTime, pdl.startDateTime);\r
+                                               addEmptyInfo(all, prevEnd, pdl.startDateTime);\r
                                        }\r
                                }\r
+\r
+                               prevStart = pdl.startDateTime;\r
+                               prevEnd = pdl.endDateTime;\r
+\r
                                all.pdetail.add(pdl);\r
                                all.row += pdl.length;\r
                        }\r
@@ -370,7 +390,8 @@ public class PlugIn_CSPSkyperfectTV2012 extends TVProgramUtils implements TVProg
                                String da = CommonUtils.getDateTime(cz);\r
                                cz.add(Calendar.DATE, 1);\r
                                String dz = CommonUtils.getDateTime(cz);\r
-                               if ( CommonUtils.isOverlap(pdl.startDateTime, pdl.endDateTime, da, dz, true) ) {\r
+                               String endDateTime = pdl.endDateTime.length() > 0 ? pdl.endDateTime : CommonUtils.getDateTime(CommonUtils.getCalendar(pdl.startDateTime, pdl.length * 60));\r
+                               if ( CommonUtils.isOverlap(pdl.startDateTime, endDateTime, da, dz, true) ) {\r
                                        if ( cnt++ == 0 ) {\r
                                                pcl.pdetail.add(pdl);\r
                                        }\r
@@ -389,7 +410,9 @@ public class PlugIn_CSPSkyperfectTV2012 extends TVProgramUtils implements TVProg
                        // 1日の合計分数を足し合わせる\r
                        for ( ProgDetailList pdl : pcl.pdetail ) {\r
                                String da = (pcl.row == 0) ? pcl.Date+" 05:00" : pdl.startDateTime;\r
-                               pdl.length = (int)(CommonUtils.getCompareDateTime(pdl.endDateTime, da)/60000L);\r
+                               if ( pdl.endDateTime.length() > 0 ) {\r
+                                       pdl.length = (int)(CommonUtils.getCompareDateTime(pdl.endDateTime, da)/60000L);\r
+                               }\r
                                pcl.row += pdl.length;\r
                        }\r
                        // おしりがとどかない場合(デメリット:これをやると、サイト側のエラーで欠けてるのか、そもそも休止なのかの区別がつかなくなる)\r
@@ -398,7 +421,7 @@ public class PlugIn_CSPSkyperfectTV2012 extends TVProgramUtils implements TVProg
                                GregorianCalendar cz = (GregorianCalendar) ca.clone();\r
                                ca.add(Calendar.MINUTE, pcl.row);\r
                                cz.add(Calendar.MINUTE, 24*60);\r
-                               addEnmptyInfo(pcl, CommonUtils.getDateTime(ca), CommonUtils.getDateTime(cz));\r
+                               addEmptyInfo(pcl, CommonUtils.getDateTime(ca), CommonUtils.getDateTime(cz));\r
                        }\r
                }\r
        }\r
@@ -566,40 +589,139 @@ public class PlugIn_CSPSkyperfectTV2012 extends TVProgramUtils implements TVProg
 \r
        \r
        /**\r
-        * こちらは番組IDがとれる代わりに出演者情報がとれなくなるので保留とする\r
+        * こちらは50番組/日までしかとれないため、保留\r
         */\r
-       private void getPrograms_basic(ProgList pl, int dtidx, String response) {\r
-               \r
-               Matcher ma = Pattern.compile("<SIInformation(.+?)</SIInformation>",Pattern.DOTALL).matcher(response);\r
-               while ( ma.find() ) {\r
-                       Matcher mb = Pattern.compile("eventId=\"(.+?)\".+?broadCastStartDate=\"(\\d{8})(\\d{4})",Pattern.DOTALL).matcher(ma.group(1));\r
-                       if ( mb.find() ) {\r
-                               \r
-                       }\r
-                       /*\r
-                       mb = Pattern.compile("<(.+?)>(.+?)</\\1>",Pattern.DOTALL).matcher(ma.group(1));\r
-                       while ( mb.find() ) {\r
-                               if ( mb.group(1).equals("ChannelName") ) {\r
-                                       \r
+       private void getPrograms_basic(ProgList pl, int dtidx, String filename) throws ParserConfigurationException, IOException, SAXException {\r
+\r
+               ProgDateList pcl = pl.pdate.get(dtidx);\r
+\r
+               DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();\r
+               DocumentBuilder db = dbf.newDocumentBuilder();\r
+\r
+               Document parseDoc = db.parse(new FileInputStream(filename));\r
+\r
+               NodeList list = parseDoc.getElementsByTagName("SIInformation");\r
+               for ( int i=0; i < list.getLength(); i++ ) {\r
+                       ProgDetailList pdl = new ProgDetailList();\r
+                       Node node = list.item(i);\r
+                       try {\r
+                               NamedNodeMap attributes = node.getAttributes();\r
+                               String startValue = attributes.getNamedItem("broadCastStartDate").getNodeValue().substring(8,12);\r
+                               pdl.start = startValue.substring(0,2) + ":" + startValue.substring(2);\r
+                               String endValue = attributes.getNamedItem("broadCastEndDate").getNodeValue().substring(8,12);\r
+                               pdl.end = endValue.substring(0,2) + ":" + endValue.substring(2);\r
+                               pdl.length = CommonUtils.getRecMinVal(pdl.start, pdl.end);\r
+\r
+                               int onid = Integer.decode(attributes.getNamedItem("networkId").getNodeValue());\r
+                               //Node tsid = attributes.getNamedItem("").getNodeValue();\r
+                               int sid = Integer.decode(attributes.getNamedItem("serviceId").getNodeValue());\r
+                               Node evidNode = attributes.getNamedItem("eventId");\r
+                               if ( evidNode != null ) {\r
+                                       int evid = Integer.decode(evidNode.getNodeValue());\r
+                                       pdl.progid = ContentIdEDCB.getContentId(onid, 0, sid, evid);\r
                                }\r
-                               else if ( mb.group(1).equals("Title") ) {\r
-                                       \r
+\r
+                               pdl.title = queryNode(node, "Title").getTextContent();\r
+\r
+                               Node detailNode = queryNode(node, "Synopsis");\r
+                               if ( detailNode != null ) {\r
+                                       pdl.detail = detailNode.getTextContent();\r
                                }\r
-                               else if ( mb.group(1).equals("Synopsis") ) {\r
-                                       \r
+\r
+                               Node genreNode = queryNode(node, "Genres");\r
+                               if ( genreNode != null ) {\r
+                                       NamedNodeMap genreAttributes = queryNode(genreNode, "Genre").getAttributes();\r
+                                       String majorGenreId = genreAttributes.getNamedItem("majorGenreId").getNodeValue();\r
+                                       String minorGenreId = genreAttributes.getNamedItem("minorGenreId").getNodeValue();\r
+                                       pdl.genre = ProgGenre.getByIEPG(majorGenreId.substring(majorGenreId.length()-1));\r
+                                       pdl.subgenre = ProgSubgenre.getByIEPG(pdl.genre, minorGenreId.substring(minorGenreId.length() - 1));\r
                                }\r
-                               else if ( mb.group(1).equals("Genres") ) {\r
-                                       Matcher mc = Pattern.compile("<Genre majorGenreId=\".+?\" minorGenreId=\".+?\"",Pattern.DOTALL).matcher(mb.group(2));\r
-                                       while ( mc.find() ) {\r
-                                               \r
+                               if ( pdl.genre == null || pdl.subgenre == null ) {\r
+                                       pdl.genre = ProgGenre.NOGENRE;\r
+                                       pdl.subgenre = ProgSubgenre.NOGENRE_ETC;\r
+                               }\r
+\r
+                               Node actorNode = queryNode(node, "ActorInformation");\r
+                               if ( actorNode != null ) {\r
+                                       if ( pdl.detail == null ) {\r
+                                               pdl.detail = "";\r
+                                       }\r
+                                       else if ( pdl.detail.length() > 0 ) {\r
+                                               pdl.detail += "\n";\r
+                                       }\r
+\r
+                                       String prePostValue = "";\r
+                                       ArrayList<Node> nodes = queryNodes(queryNode(actorNode, "Actors"), "Actor");\r
+                                       for ( Node actor : nodes ) {\r
+                                               Node post = queryNode(actor, "Post");\r
+                                               Node name = queryNode(actor, "Name");\r
+                                               if ( post != null && name != null ) {\r
+                                                       String postValue = post.getTextContent();\r
+                                                       if ( ! postValue.equals(prePostValue) ) {\r
+                                                               pdl.detail += "\n" + postValue + ":";\r
+                                                               prePostValue = postValue;\r
+                                                       }\r
+                                                       pdl.detail += name.getTextContent() + "、";\r
+                                               }\r
                                        }\r
+\r
+                                       pdl.detail = pdl.detail.replaceFirst("、$","");\r
                                }\r
+\r
+                               Node copyRights = queryNode(node, "CopyRights");\r
+                               if ( copyRights != null ) {\r
+                                       pdl.detail += "\n\n"+copyRights.getTextContent();\r
+                               }\r
+\r
+                               // タイトルから各種フラグを分離する\r
+                               doSplitFlags(pdl, nf);\r
+\r
+                               // サブタイトル分離(ポインタを活用してメモリを節約する)\r
+                               doSplitSubtitle(pdl);\r
+\r
+                               // その他フラグ\r
+                               pdl.extension = false;\r
+                               pdl.nosyobo = false;\r
+\r
+                               pcl.pdetail.add(pdl);\r
+                       }\r
+                       catch ( Exception e ) {\r
+                               e.printStackTrace();\r
                        }\r
-                       */\r
                }\r
        }\r
 \r
-       \r
+       private Node queryNode(Node root, String query) {\r
+               if ( root.getNodeType() != Node.ELEMENT_NODE ) {\r
+                       return null;\r
+               }\r
+               if ( root.getNodeName().equals(query) ) {\r
+                       return root;\r
+               }\r
+               NodeList list = root.getChildNodes();\r
+               for ( int i=0; i < list.getLength(); i++ ) {\r
+                       Node n = queryNode(list.item(i), query);\r
+                       if ( n != null ) {\r
+                               return n;\r
+                       }\r
+               }\r
+               return null;\r
+       }\r
+\r
+       private ArrayList<Node> queryNodes(Node root, String query) {\r
+               ArrayList<Node> nodes = new ArrayList<Node>();\r
+               if ( root.getNodeType() != Node.ELEMENT_NODE ) {\r
+                       return null;\r
+               }\r
+               NodeList list = root.getChildNodes();\r
+               for ( int i=0; i < list.getLength(); i++ ) {\r
+                       Node n = queryNode(list.item(i), query);\r
+                       if ( n != null ) {\r
+                               nodes.add(n);\r
+                       }\r
+               }\r
+               return nodes;\r
+       }\r
        /*\r
         * ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\r
         * ★★★★★ 放送地域を取得する(TVAreaから降格)-ここから ★★★★★\r
index 68a339d..7e80a9e 100644 (file)
@@ -19,8 +19,6 @@ import tainavi.ProgDetailList;
 import tainavi.ProgList;\r
 import tainavi.TVProgram;\r
 import tainavi.TVProgramUtils;\r
-import tainavi.TVProgram.ProgSubtype;\r
-import tainavi.TVProgram.ProgType;\r
 \r
 \r
 public class PlugIn_TVPDimora extends TVProgramUtils implements TVProgram,Cloneable {\r
@@ -308,7 +306,8 @@ public class PlugIn_TVPDimora extends TVProgramUtils implements TVProgram,Clonea
                                        break;\r
                                }\r
                        }\r
-                       if ( pcl == null ) {\r
+                       if ( pcl == null || pcl.row > 0 ) {\r
+                               // 複数地域を同時に選択していると、BSの番組情報が重複して取得されるので、既得(pcl.row>0)ならスキップ\r
                                continue;\r
                        }\r
                        \r
@@ -355,13 +354,13 @@ public class PlugIn_TVPDimora extends TVProgramUtils implements TVProgram,Clonea
                                        }\r
                                        else if ( cx.compareTo(ca) < 0 ) {\r
                                                // 開始時刻が05:00よりあと\r
-                                               addEnmptyInfo(pcl, sdat, dat[1]);\r
+                                               addEmptyInfo(pcl, sdat, dat[1]);\r
                                        }\r
                                }\r
                                else {\r
                                        if ( pcz.compareTo(ca) < 0 ) {\r
                                                // 前の番組との間が空いている\r
-                                               addEnmptyInfo(pcl, CommonUtils.getDateTime(pcz), dat[1]);\r
+                                               addEmptyInfo(pcl, CommonUtils.getDateTime(pcz), dat[1]);\r
                                        }\r
                                }\r
                                \r
@@ -418,11 +417,11 @@ public class PlugIn_TVPDimora extends TVProgramUtils implements TVProgram,Clonea
                        }\r
                        if ( pcz == null ) {\r
                                // 番組情報がないよ\r
-                               addEnmptyInfo(pcl, CommonUtils.getDateTime(cx), CommonUtils.getDateTime(cy));\r
+                               addEmptyInfo(pcl, CommonUtils.getDateTime(cx), CommonUtils.getDateTime(cy));\r
                        }\r
                        else if ( pcz.compareTo(cy) < 0 ) {\r
                                // 終了時刻が29:00より前\r
-                               addEnmptyInfo(pcl, CommonUtils.getDateTime(pcz), CommonUtils.getDateTime(cy));\r
+                               addEmptyInfo(pcl, CommonUtils.getDateTime(pcz), CommonUtils.getDateTime(cy));\r
                        }\r
                }\r
        }\r