4 import java.io.UnsupportedEncodingException;
\r
5 import java.net.URLDecoder;
\r
6 import java.util.ArrayList;
\r
7 import java.util.Calendar;
\r
8 import java.util.Date;
\r
9 import java.util.GregorianCalendar;
\r
10 import java.util.HashMap;
\r
11 import java.util.regex.Matcher;
\r
12 import java.util.regex.Pattern;
\r
15 public class PlugIn_CSPSkyperfectTV2012 extends TVProgramUtils implements TVProgram,Cloneable {
\r
17 public PlugIn_CSPSkyperfectTV2012 clone() {
\r
18 return (PlugIn_CSPSkyperfectTV2012) super.clone();
\r
21 private static final String thisEncoding = "UTF-8";
\r
24 /*******************************************************************************
\r
26 ******************************************************************************/
\r
29 public String getTVProgramId() { return "スカパー!"; }
\r
32 public ProgType getType() { return ProgType.PROG; }
\r
34 public ProgSubtype getSubtype() { return ProgSubtype.CS; }
\r
38 public boolean isAreaSelectSupported() { return false; }
\r
40 /*******************************************************************************
\r
42 ******************************************************************************/
\r
45 public int getTimeBarStart() {return 5;}
\r
47 private int getDogDays() { return ((getExpandTo8())?(8):(7)); }
\r
50 /*******************************************************************************
\r
52 ******************************************************************************/
\r
54 private static final String XTYPE_BASIC = "e2";
\r
55 private static final String XTYPE_PREMIUM = "HD";
\r
57 private static final String CHNM_PREFIX_BS = "BS";
\r
58 private static final String CHNM_PREFIX_CS = "CS";
\r
59 private static final String CHNM_PREFIX_PR = "Ch.";
\r
61 private static final String CHID_PREFIX_BS = "BS";
\r
62 private static final String CHID_PREFIX_CS = "CS";
\r
63 private static final String CHID_PREFIX_PR = "HD";
\r
65 private final String MSGID = "["+getTVProgramId()+"] ";
\r
66 private final String ERRID = "[ERROR]"+MSGID;
\r
67 private final String DBGID = "[DEBUG]"+MSGID;
\r
70 /*******************************************************************************
\r
72 ******************************************************************************/
\r
74 protected ArrayList<ProgList> newplist;
\r
76 private HashMap<String,String> nf = null;
\r
77 private HashMap<String,String> gf = null;
\r
81 private static final HashMap<String,ProgGenre> genremap = new HashMap<String, TVProgram.ProgGenre>() {
\r
83 private static final long serialVersionUID = 1L;
\r
86 put("アニメ/特撮",ProgGenre.ANIME);
\r
87 put("こども向け/教育",ProgGenre.ANIME);
\r
89 put("映画",ProgGenre.MOVIE);
\r
90 put("洋画",ProgGenre.MOVIE);
\r
91 put("邦画",ProgGenre.MOVIE);
\r
93 put("ドラマ/演劇",ProgGenre.DORAMA);
\r
94 put("ドラマ",ProgGenre.DORAMA);
\r
96 put("劇場/公演",ProgGenre.THEATER);
\r
98 put("ドキュメンタリー/教養",ProgGenre.DOCUMENTARY);
\r
100 put("音楽",ProgGenre.MUSIC);
\r
102 put("バラエティー",ProgGenre.VARIETYSHOW);
\r
103 put("バラエティ",ProgGenre.VARIETYSHOW);
\r
105 put("スポーツ",ProgGenre.SPORTS);
\r
107 put("ニュース/報道",ProgGenre.NEWS);
\r
109 put("アダルト",ProgGenre.NOGENRE);
\r
115 public void loadProgram(String areaCode, boolean force) {
\r
116 // 新しい入れ物(トップ)を用意する
\r
117 newplist = new ArrayList<ProgList>();
\r
119 nf = new HashMap<String, String>();
\r
120 gf = new HashMap<String, String>();
\r
122 // 最終日の24時以降の情報は、+1したとこから取得する
\r
123 int counterMax = getSortedCRlist().size() * (getDogDays()+1);
\r
125 for ( Center c : getSortedCRlist() ) {
\r
126 if (getDebug()) System.err.println(DBGID+"load program: "+c.getCenter());
\r
127 _loadProgram(c, force, counter, counterMax);
\r
128 counter += getDogDays()+1;
\r
131 // 古いデータから補完できないかな?
\r
132 CompensatesPrograms(newplist);
\r
136 for ( String f : nf.keySet() ) {
\r
137 System.err.println(String.format("【デバッグ情報】未定義のフラグです: [%s]",f));
\r
139 for ( String g : gf.keySet() ) {
\r
140 System.err.println(String.format("【デバッグ情報】未定義のジャンルです: [%s]",g));
\r
145 pcenter = newplist;
\r
155 protected void _loadProgram(Center cr, boolean force, int counter, int counterMax) {
\r
161 ProgList pl = new ProgList();
\r
162 pl.Center = cr.getCenter();
\r
163 pl.CenterId = cr.getLink();
\r
167 if ( cr.getCenterOrig().startsWith(CHNM_PREFIX_BS) ) {
\r
170 else if ( cr.getCenterOrig().startsWith(CHNM_PREFIX_CS) ) {
\r
173 if ( onid != -1 ) {
\r
174 Matcher ma = Pattern.compile("(\\d+)").matcher(cr.getCenterOrig());
\r
176 ContentIdDIMORA.decodeChId(String.format("%04X%04X%04X", onid,0,Integer.valueOf(ma.group(1))));
\r
177 pl.ChId = ContentIdDIMORA.getContentId(0,"");
\r
181 pl.Area = cr.getAreaCode();
\r
182 pl.BgColor = cr.getBgColor();
\r
190 for ( int i=0; i<pl.pdate.size(); i++ ) {
\r
192 GregorianCalendar cal = CommonUtils.getCalendar(pl.pdate.get(i).Date);
\r
193 final String progCacheFile = String.format("%s%sSKP2012_%s_%d.txt", getProgDir(), File.separator, pl.CenterId, cal.get(Calendar.DAY_OF_MONTH));
\r
195 File f = new File(progCacheFile);
\r
196 if (force == true ||
\r
197 (f.exists() == true && isCacheOld(progCacheFile) == true) ||
\r
198 (f.exists() == false && isCacheOld(null) == true)) {
\r
200 String xtype = (pl.CenterId.startsWith(CHID_PREFIX_BS) || pl.CenterId.startsWith(CHID_PREFIX_CS)) ? XTYPE_BASIC : XTYPE_PREMIUM;
\r
201 String chid = xtype != XTYPE_PREMIUM ? pl.CenterId : pl.CenterId.replaceFirst("^"+CHID_PREFIX_PR, "");
\r
202 String dt = CommonUtils.getDateYMD(cal);
\r
203 String url = "http://bangumi.skyperfectv.co.jp/"+xtype+"/channel:"+chid+"/date:"+dt.substring(2)+"/";
\r
205 if ( pl.ChId.length() == 0 ) {
\r
206 url = "http://bangumi.skyperfectv.co.jp/api/version:3/search/date:"+dt.substring(2)+"/channel:"+pl.CenterId+"/?api_key=336eec3423";
\r
209 url = "http://www.skyperfectv.co.jp/xml/"+dt+"_"+pl.ChId.substring(2)+".xml";
\r
212 webToFile(url, progCacheFile, thisEncoding);
\r
214 reportProgress(getTVProgramId()+"(オンライン)を取得しました: ("+(counter+i)+"/"+counterMax+") "+pl.Center+"["+cal.get(Calendar.DAY_OF_MONTH)+"日] "+url);
\r
216 else if (CommonUtils.isFileAvailable(f,10)) {
\r
217 reportProgress(getTVProgramId()+"(キャッシュ)を取得しました: ("+(counter+i)+"/"+counterMax+") "+pl.Center+"["+cal.get(Calendar.DAY_OF_MONTH)+"日] "+progCacheFile);
\r
220 reportProgress(getTVProgramId()+"(キャッシュ)がみつかりません: ("+(counter+i)+"/"+counterMax+") "+pl.Center+"["+cal.get(Calendar.DAY_OF_MONTH)+"日] "+progCacheFile);
\r
224 String response = CommonUtils.read4file(progCacheFile, true);
\r
228 getPrograms(pl, i, response);
\r
230 if ( pl.ChId.length() == 0 ) {
\r
231 getPrograms(pl, i, response);
\r
234 getPrograms_basic(pl, i, response);
\r
238 catch ( Exception e ) {
\r
239 e.printStackTrace();
\r
244 refreshList(pl.pdate);
\r
246 catch (Exception e) {
\r
248 System.out.println("Exception: _loadProgram()");
\r
253 private void getDate(ProgList pl) {
\r
255 GregorianCalendar c = new GregorianCalendar();
\r
256 c.setTime(new Date());
\r
257 if ( CommonUtils.isLateNight(c) ) {
\r
259 c.add(Calendar.DATE, -1);
\r
261 // 最終日の24時以降の情報は、+1したとこから取得する
\r
262 for ( int i=0; i<getDogDays()+1; i++ ) {
\r
263 ProgDateList cl = new ProgDateList();
\r
264 cl.Date = CommonUtils.getDate(c);
\r
267 c.add(Calendar.DATE,1);
\r
272 private void refreshList(ArrayList<ProgDateList> pcenter) {
\r
274 for ( int i=0; i<pcenter.size(); i++ ) {
\r
275 ProgDateList pl = pcenter.get(i);
\r
276 GregorianCalendar ca = CommonUtils.getCalendar(pl.Date);
\r
277 for ( int j=pl.pdetail.size()-1,k=0; j>=0; j--,k++ ) {
\r
278 ProgDetailList pdl = pl.pdetail.get(j);
\r
279 GregorianCalendar cz = (GregorianCalendar) ca.clone();
\r
281 if ( CommonUtils.isLateNight(pdl.start.substring(0,2)) ) {
\r
283 ca.add(Calendar.DATE, 1);
\r
284 cz = (GregorianCalendar) ca.clone();
\r
286 else if ( pdl.start.compareTo(pdl.end) > 0 ) {
\r
288 cz.add(Calendar.DATE, 1);
\r
292 if ( pdl.start.compareTo(pdl.end) > 0 ) {
\r
294 ca.add(Calendar.DATE, -1);
\r
297 pdl.accurateDate = CommonUtils.getDate(ca);
\r
298 pdl.startDateTime = CommonUtils.getDate(ca,false)+" "+pdl.start;
\r
299 pdl.endDateTime = CommonUtils.getDate(cz,false)+" "+pdl.end;
\r
304 ProgDateList all = new ProgDateList();
\r
305 all.pdetail = new ArrayList<ProgDetailList>();
\r
306 for ( ProgDateList pcl : pcenter ) {
\r
307 for ( ProgDetailList pdl : pcl.pdetail ) {
\r
308 if ( all.row == 0 ) {
\r
309 String prevend = CommonUtils.getDateTime(CommonUtils.getCalendar(pcenter.get(0).Date+" 05:00"));
\r
310 if ( prevend.compareTo(pdl.startDateTime) < 0 ) {
\r
312 addEnmptyInfo(all, prevend, pdl.startDateTime);
\r
316 ProgDetailList prevpdl = all.pdetail.get(all.pdetail.size()-1);
\r
317 if ( prevpdl.startDateTime.equals(pdl.startDateTime) ) {
\r
321 else if ( prevpdl.endDateTime.compareTo(pdl.startDateTime) < 0 ) {
\r
323 addEnmptyInfo(all, prevpdl.endDateTime, pdl.startDateTime);
\r
326 all.pdetail.add(pdl);
\r
327 all.row += pdl.length;
\r
330 pcl.pdetail = new ArrayList<ProgDetailList>();
\r
335 for ( ProgDetailList pdl : all.pdetail ) {
\r
337 for ( ProgDateList pcl : pcenter ) {
\r
338 GregorianCalendar cz = CommonUtils.getCalendar(pcl.Date+" 05:00");
\r
339 String da = CommonUtils.getDateTime(cz);
\r
340 cz.add(Calendar.DATE, 1);
\r
341 String dz = CommonUtils.getDateTime(cz);
\r
342 if ( CommonUtils.isOverlap(pdl.startDateTime, pdl.endDateTime, da, dz, true) ) {
\r
343 if ( cnt++ == 0 ) {
\r
344 pcl.pdetail.add(pdl);
\r
347 pcl.pdetail.add(pdl.clone());
\r
353 // 24時以降の情報は日付+1したとこから取得しているので、最終日の次のリストは削除
\r
354 pcenter.remove(pcenter.size()-1);
\r
357 for ( ProgDateList pcl : pcenter ) {
\r
359 for ( ProgDetailList pdl : pcl.pdetail ) {
\r
360 String da = (pcl.row == 0) ? pcl.Date+" 05:00" : pdl.startDateTime;
\r
361 pdl.length = (int)(CommonUtils.getCompareDateTime(pdl.endDateTime, da)/60000L);
\r
362 pcl.row += pdl.length;
\r
364 // おしりがとどかない場合(デメリット:これをやると、サイト側のエラーで欠けてるのか、そもそも休止なのかの区別がつかなくなる)
\r
365 if ( pcl.row < 24*60 ) {
\r
366 GregorianCalendar ca = CommonUtils.getCalendar(pcl.Date+" 05:00");
\r
367 GregorianCalendar cz = (GregorianCalendar) ca.clone();
\r
368 ca.add(Calendar.MINUTE, pcl.row);
\r
369 cz.add(Calendar.MINUTE, 24*60);
\r
370 addEnmptyInfo(pcl, CommonUtils.getDateTime(ca), CommonUtils.getDateTime(cz));
\r
376 private void getPrograms(ProgList pl, int dtidx, String response) {
\r
378 ProgDateList pcl = pl.pdate.get(dtidx);
\r
380 String[][] keys = {
\r
381 { "class", "pg-title" },
\r
382 { "class", "start-time" },
\r
383 { "class", "end-time" },
\r
384 { "class", "pg-genre" },
\r
385 { "class", "pg-explanation" },
\r
386 { "id", "actor-name" },
\r
389 Matcher ma = Pattern.compile("<tbody\\s+id=\"event-\\d+\"[^>]*?>(.+?)</tbody>",Pattern.DOTALL).matcher(response);
\r
390 for ( int cnt = 0; ma.find(); cnt++ ) {
\r
391 ProgDetailList pdl = new ProgDetailList();
\r
392 String subtitle = "";
\r
393 String person = "";
\r
395 for ( String[] k : keys ) {
\r
396 Matcher mb = Pattern.compile("<span\\s+"+k[0]+"=\""+k[1]+"\"[^>]*?>\\s*(.+?)\\s*</span>",Pattern.DOTALL).matcher(ma.group(1));
\r
397 while ( mb.find() ) {
\r
398 if ( mb.group(1) == null ) {
\r
402 if ( k[1].equals("pg-title") ) {
\r
403 pdl.title = CommonUtils.unEscape(mb.group(1)).trim();
\r
405 else if ( k[1].equals("start-time") ) {
\r
406 pdl.start = mb.group(1);
\r
408 else if ( k[1].equals("end-time") ) {
\r
409 pdl.end = mb.group(1);
\r
411 GregorianCalendar c = CommonUtils.getCalendar(pcl.Date);
\r
413 if ( cnt == 0 && pdl.start.compareTo(pdl.end) > 0 ) {
\r
414 c.add(Calendar.DATE, -1);
\r
416 pdl.accurateDate = CommonUtils.getDate(c);
\r
417 pdl.startDateTime = CommonUtils.getDate(c,false)+" "+pdl.start;
\r
419 if ( pdl.start.compareTo(pdl.end) > 0 ) {
\r
420 c.add(Calendar.DATE, 1);
\r
422 pdl.endDateTime = CommonUtils.getDate(c,false)+" "+pdl.end;
\r
424 pdl.length = CommonUtils.getRecMinVal(pdl.start, pdl.end);
\r
426 else if ( k[1].equals("pg-genre") ) {
\r
427 Matcher mc = Pattern.compile("/large_genre:(.+?)/medium_genre:(.+?)/",Pattern.DOTALL).matcher(mb.group(1));
\r
430 String grstr = URLDecoder.decode(mc.group(1),"utf8").replaceAll("/", "/");
\r
431 ProgGenre gr = ProgGenre.get(grstr);
\r
432 if ( gr == null ) {
\r
433 gr = genremap.get(grstr);
\r
436 gr = ProgGenre.NOGENRE;
\r
437 gf.put(grstr,null);
\r
440 if ( pdl.genre == null || (pdl.genre == ProgGenre.NOGENRE && gr != ProgGenre.NOGENRE) ) {
\r
444 String sgstr = URLDecoder.decode(mc.group(2),"utf8").replaceAll("ィー", "ィ");
\r
445 ProgSubgenre sg = ProgSubgenre.get(gr, sgstr);
\r
446 if ( sg == null ) {
\r
448 ArrayList<ProgSubgenre> vals = ProgSubgenre.values(gr);
\r
449 sg = vals.get(vals.size()-1);
\r
452 } catch (UnsupportedEncodingException e) {
\r
453 e.printStackTrace();
\r
454 pdl.genre = ProgGenre.NOGENRE;
\r
455 pdl.subgenre = ProgSubgenre.NOGENRE_ETC;
\r
459 pdl.genre = ProgGenre.NOGENRE;
\r
460 pdl.subgenre = ProgSubgenre.NOGENRE_ETC;
\r
463 else if ( k[1].equals("pg-explanation") ) {
\r
464 pdl.detail += CommonUtils.decBr(CommonUtils.unEscape(mb.group(1))).trim()+"\n";
\r
466 else if ( k[1].equals("actor-name") ) {
\r
467 person += "、"+CommonUtils.unEscape(mb.group(1)).trim();
\r
473 if ( person.length() > 0 ) {
\r
474 person = person.substring(1);
\r
479 ((subtitle.length()>0)?(subtitle+DETAIL_SEP):(""))
\r
481 +((person.length()>0)?(DETAIL_SEP+person):(""));
\r
482 pdl.detail = pdl.detail.replaceFirst("[\r\n]+$", "");
\r
484 Matcher mb = Pattern.compile("<img\\s+src=\"/i/icon_(.+?)\\.gif",Pattern.DOTALL).matcher(ma.group(1));
\r
485 while ( mb.find() ) {
\r
486 if ( mb.group(1).equals("5.1") ) {
\r
487 pdl.addOption(ProgOption.SURROUND);
\r
489 else if ( mb.group(1).equals("jimaku") ) {
\r
490 pdl.addOption(ProgOption.SUBTITLE);
\r
492 else if ( mb.group(1).equals("2kakoku") ) {
\r
493 pdl.addOption(ProgOption.BILINGUAL);
\r
495 else if ( mb.group(1).equals("fukikae") ) {
\r
496 pdl.addOption(ProgOption.STANDIN);
\r
498 else if ( mb.group(1).equals("tajuu") ) {
\r
499 pdl.addOption(ProgOption.MULTIVOICE);
\r
501 else if ( mb.group(1).equals("r15") || mb.group(1).equals("r18") || mb.group(1).equals("adult") ) {
\r
502 pdl.addOption(ProgOption.RATING);
\r
504 else if ( mb.group(1).equals("ppv") ) {
\r
505 pdl.addOption(ProgOption.PV);
\r
507 else if ( mb.group(1).equals("nama") ) {
\r
508 pdl.addOption(ProgOption.LIVE);
\r
511 nf.put(mb.group(1), null);
\r
515 // タイトルから各種フラグを分離する
\r
516 doSplitFlags(pdl, nf);
\r
518 // サブタイトル分離(ポインタを活用してメモリを節約する)
\r
519 doSplitSubtitle(pdl);
\r
522 if ( ContentIdDIMORA.isValid(pl.ChId) ) {
\r
523 pdl.progid = pl.ChId;
\r
527 pdl.extension = false;
\r
528 pdl.nosyobo = false;
\r
530 pcl.pdetail.add(pdl);
\r
532 if (getDebug()) System.err.println(DBGID+"program: "+pdl.startDateTime+" - "+pdl.endDateTime+" "+pdl.length+"m "+pdl.noscrumble+" "+pdl.title);
\r
538 * こちらは番組IDがとれる代わりに出演者情報がとれなくなるので保留とする
\r
540 private void getPrograms_basic(ProgList pl, int dtidx, String response) {
\r
542 Matcher ma = Pattern.compile("<SIInformation(.+?)</SIInformation>",Pattern.DOTALL).matcher(response);
\r
543 while ( ma.find() ) {
\r
544 Matcher mb = Pattern.compile("eventId=\"(.+?)\".+?broadCastStartDate=\"(\\d{8})(\\d{4})",Pattern.DOTALL).matcher(ma.group(1));
\r
549 mb = Pattern.compile("<(.+?)>(.+?)</\\1>",Pattern.DOTALL).matcher(ma.group(1));
\r
550 while ( mb.find() ) {
\r
551 if ( mb.group(1).equals("ChannelName") ) {
\r
554 else if ( mb.group(1).equals("Title") ) {
\r
557 else if ( mb.group(1).equals("Synopsis") ) {
\r
560 else if ( mb.group(1).equals("Genres") ) {
\r
561 Matcher mc = Pattern.compile("<Genre majorGenreId=\".+?\" minorGenreId=\".+?\"",Pattern.DOTALL).matcher(mb.group(2));
\r
562 while ( mc.find() ) {
\r
573 * ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
\r
574 * ★★★★★ 放送地域を取得する(TVAreaから降格)-ここから ★★★★★
\r
575 * ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
\r
583 public String getDefaultArea() {return "全国";}
\r
584 private String getDefaultCode() {return "SKP2012";}
\r
587 public void loadAreaCode() {
\r
588 aclist = new ArrayList<AreaCode>();
\r
589 AreaCode ac = new AreaCode();
\r
590 ac.setArea(getDefaultArea());
\r
591 ac.setCode(getDefaultCode());
\r
592 ac.setSelected(true);
\r
596 public void saveAreaCode() {}
\r
599 public String getArea(String code) { return(getDefaultArea()); }
\r
601 public String getCode(String area) { return(getDefaultCode()); }
\r
603 public String setSelectedAreaByName(String area) { return(getDefaultCode()); }
\r
605 public String getSelectedArea() { return(getDefaultArea()); }
\r
607 public String getSelectedCode() { return(getDefaultCode()); }
\r
610 * ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
\r
611 * ★★★★★ 放送地域を取得する(TVAreaから降格)-ここまで ★★★★★
\r
612 * ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
\r
618 * ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
\r
619 * ★★★★★ 放送局を選択する(TVCenterから降格)-ここから ★★★★★
\r
620 * ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
\r
627 // 設定ファイルがなければWebから取得
\r
629 public void loadCenter(String code, boolean force) {
\r
631 if ( code == null ) {
\r
632 System.out.println(ERRID+"地域コードがnullです.");
\r
636 String centerListFile = getCenterListFile(getTVProgramId(), code);
\r
639 File f = new File(centerListFile);
\r
643 File f = new File(centerListFile);
\r
644 if (f.exists() == true) {
\r
645 @SuppressWarnings("unchecked")
\r
646 ArrayList<Center> tmp = (ArrayList<Center>)CommonUtils.readXML(centerListFile);
\r
647 if ( tmp != null ) {
\r
654 {CHNM_PREFIX_BS, CHID_PREFIX_BS},
\r
655 {CHNM_PREFIX_CS, CHID_PREFIX_CS},
\r
656 {CHNM_PREFIX_PR, CHID_PREFIX_PR},
\r
660 for ( Center cr : crlist ) {
\r
661 for ( String[] a : prs ) {
\r
662 if ( cr.getCenterOrig().startsWith(a[0]) ) {
\r
663 if ( ! cr.getLink().startsWith(a[1]) ) {
\r
664 Matcher ma = Pattern.compile("^.*?(\\d+)",Pattern.DOTALL).matcher(cr.getCenterOrig());
\r
666 String chid = a[1]+ma.group(1);
\r
667 System.err.println(DBGID+"converted: "+cr.getCenterOrig()+", "+cr.getLink()+" -> "+chid);
\r
677 System.out.println("放送局リストを読み込みました: "+centerListFile);
\r
681 System.out.println("放送局リストの読み込みに失敗しました: "+centerListFile);
\r
686 ArrayList<Center> newcrlist = new ArrayList<Center>();
\r
688 for ( String xtype : new String[] { XTYPE_BASIC,XTYPE_PREMIUM } ) {
\r
689 ArrayList<Center> crl = getCenters(xtype,code);
\r
690 if ( crl != null ) {
\r
691 reportProgress("放送局情報を取得しました: ("+xtype+") "+crl.size()+"ch");
\r
694 for ( Center cr : crl ) {
\r
699 if ( newcrlist.size() == 0 ) {
\r
700 System.err.println(ERRID+"放送局情報の取得結果が0件だったため情報を更新しません");
\r
704 crlist = newcrlist;
\r
705 attachChFilters(); // 放送局名にフィルタをかける
\r
709 private ArrayList<Center> getCenters(String xtype, String areacode) {
\r
711 ArrayList<Center> crl = new ArrayList<Center>();
\r
713 String url = String.format("http://bangumi.skyperfectv.co.jp/index/channel/%s/",xtype);
\r
714 if (getDebug()) System.err.println(DBGID+"get page: "+url);
\r
715 String response = webToBuffer(url,thisEncoding,true);
\r
716 if ( response == null ) {
\r
717 reportProgress("放送局情報の取得に失敗しました: "+xtype);
\r
721 Matcher ma = Pattern.compile("<td class=\"channel-icon\">\\s*<a href=\".*?/channel:(.+?)/\".*?>\\s*<img src=\".*?\" alt=\"(.+?)\"",Pattern.DOTALL).matcher(response);
\r
722 while ( ma.find() ) {
\r
723 String chid = (xtype.equals(XTYPE_PREMIUM) ? CHID_PREFIX_PR : "") + ma.group(1);
\r
724 String chnm = CommonUtils.toHANALNUM(CommonUtils.unEscape(ma.group(2))).replaceFirst("[ \\t]+▲$", "");
\r
727 if ( xtype.equals(XTYPE_PREMIUM) && ! chnm.startsWith(CHNM_PREFIX_PR) ) {
\r
728 chnm = CHNM_PREFIX_PR+chnm;
\r
731 Center cr = new Center();
\r
732 cr.setAreaCode(areacode);
\r
734 cr.setEnabled(true);
\r
735 cr.setCenterOrig(chnm);
\r
739 for ( Center ct : crl ) {
\r
740 if ( ct.getCenterOrig().compareTo(cr.getCenterOrig()) > 0 ) {
\r
747 if (getDebug()) System.err.println(DBGID+"center: "+cr.getCenterOrig()+", "+cr.getLink());
\r
754 * ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
\r
755 * ★★★★★ 放送局を選択する(TVCenterから降格)-ここまで ★★★★★
\r
756 * ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
\r