OSDN Git Service

番組追跡の処理の効率化ほか
[tainavi/TinyBannavi.git] / TinyBannavi / src / tainavi / PassedProgram.java
1 package tainavi;\r
2 \r
3 import java.io.File;\r
4 import java.util.ArrayList;\r
5 import java.util.Arrays;\r
6 import java.util.Calendar;\r
7 import java.util.GregorianCalendar;\r
8 import java.util.regex.Matcher;\r
9 import java.util.regex.Pattern;\r
10 \r
11 import tainavi.ProgDetailList.WrHeader;\r
12 import tainavi.TVProgramIterator.IterationType;\r
13 \r
14 /**\r
15  * 過去ログを処理するクラス\r
16  */\r
17 public class PassedProgram extends TVProgramUtils implements TVProgram,Cloneable {\r
18 \r
19         //private static final String thisEncoding = "UTF-8";\r
20         \r
21         public void setDebug(boolean b) { debug = b; }\r
22         private static boolean debug = false;\r
23         \r
24         /* 必須コード  - ここから */\r
25         \r
26         /*******************************************************************************\r
27          * 種族の特性\r
28          ******************************************************************************/\r
29         \r
30         @Override\r
31         public String getTVProgramId() { return tvProgId; }\r
32         private static final String tvProgId = "PassedProgram";\r
33         \r
34         @Override\r
35         public boolean isAreaSelectSupported() { return false; }\r
36         \r
37         @Override\r
38         public ProgType getType() { return ProgType.PASSED; }\r
39         @Override\r
40         public ProgSubtype getSubtype() { return ProgSubtype.NONE; }\r
41         \r
42         public PassedProgram clone() {\r
43                 return (PassedProgram) super.clone();\r
44         }\r
45         \r
46         // リフレッシュされないようにする\r
47         @Override\r
48         public void refresh() {}\r
49         \r
50         /*******************************************************************************\r
51          * 個体の特性\r
52          ******************************************************************************/\r
53         \r
54         @Override\r
55         public int getTimeBarStart() {return 5;}\r
56         \r
57         //private int getDogDays() { return 7; }\r
58         \r
59         public void setUseXML(boolean b) { useXML = b; }\r
60         private static boolean useXML = false;\r
61         \r
62         \r
63         /*******************************************************************************\r
64          * 定数\r
65          ******************************************************************************/\r
66         \r
67         public static final String SEARCH_RESULT_CENTER = "$SRCRESCNT$";\r
68         \r
69         private static final String MSGID = "[過去ログ] ";\r
70         private static final String ERRID = "[ERROR]"+MSGID;\r
71         private static final String DBGID = "[DEBUG]"+MSGID;\r
72         \r
73         /*******************************************************************************\r
74          * 部品\r
75          ******************************************************************************/\r
76         \r
77         // コンポーネント以外\r
78         \r
79         /**\r
80          * 保存先のディレクトリを設定する\r
81          * @param s\r
82          */\r
83         public void setPassedDir(String s) {\r
84                 dname = s;\r
85         }\r
86         private static String dname = "passed";\r
87         \r
88         public int getProgCount() { return progcount; }\r
89         private int progcount = 0;\r
90         \r
91 \r
92         /*******************************************************************************\r
93          * コンストラクタ\r
94          ******************************************************************************/\r
95         \r
96         public PassedProgram() {\r
97                 super();\r
98                 cleanup();\r
99         }\r
100 \r
101         /**\r
102          * 情報を全部破棄\r
103          */\r
104         private void cleanup() {\r
105                 \r
106                 crlist = new ArrayList<Center>();               // 番組情報を全部破棄\r
107                 sortedcrlist = new ArrayList<Center>(); // 番組情報を全部破棄\r
108                 pcenter = new ArrayList<ProgList>();    // 番組情報を全部破棄\r
109                 \r
110         }\r
111 \r
112         \r
113         /*******************************************************************************\r
114          * 本体\r
115          ******************************************************************************/\r
116         \r
117         public void loadProgram(String areaCode, boolean force) {}      // 使用しない。ダミー。\r
118         \r
119         /**\r
120          * 指定の日付のすべての過去ログを取得する\r
121          * @param date\r
122          * @return\r
123          */\r
124         public boolean loadAllCenters(String date) {\r
125                 return loadByCenter(date,null);\r
126         }\r
127         \r
128         final String expr_a = "^(\\d)_(\\d+)_(.+)\\.";\r
129         final String expr_z = "(xml|txt)$";\r
130         \r
131         /**\r
132          * 指定の日付の指定の放送局の過去ログを取得する\r
133          * @param date\r
134          * @param center\r
135          * @return\r
136          */\r
137         public boolean loadByCenter(String date, String center) {\r
138                 \r
139                 progcount = 0;\r
140                 \r
141                 final String ymname = dname+File.separator+date.substring(0,7).replace("/", "_");\r
142                 final String ddname = ymname+File.separator+date.replace("/", "_");\r
143                 \r
144                 File f = new File(ymname);\r
145                 if ( ! f.exists() && ! f.isDirectory()) {\r
146                         System.out.println(MSGID+"年ディレクトがみつかりません: "+f.getAbsolutePath());\r
147                         return false;\r
148                 }\r
149                 \r
150                 File g = new File(ddname);\r
151                 if ( ! g.exists() && ! g.isDirectory()) {\r
152                         System.out.println(MSGID+"月日ディレクトがみつかりません: "+g.getAbsolutePath());\r
153                         return false;\r
154                 }\r
155 \r
156                 // 取得開始\r
157                 \r
158                 TatCount tc = new TatCount();\r
159                 \r
160                 // 番組情報を全部破棄\r
161                 this.cleanup();\r
162                 \r
163                 String[] flist = g.list();\r
164                 Arrays.sort(flist);\r
165                 ArrayList<String> fxlist = new ArrayList<String>();\r
166                 for (int i=0; i<flist.length; i++)\r
167                 {\r
168                         if ( ! flist[i].matches(expr_a+expr_z) )\r
169                         {\r
170                                 if (debug) System.out.println(DBGID+"Invalid file name: "+flist[i]);\r
171                                 continue;                               // ファイル名の書式が合わないものは無視\r
172                         }\r
173                         \r
174                         String base = flist[i].replaceFirst(expr_z, "");\r
175                         if ( ! fxlist.contains(base) )\r
176                         {\r
177                                 fxlist.add(base);\r
178                         }\r
179                 }\r
180                 \r
181                 for ( String fx : fxlist ) {\r
182                         \r
183                         Matcher ma = Pattern.compile(expr_a,Pattern.DOTALL).matcher(fx);\r
184                         ma.find();\r
185                         \r
186                         String fcenter = CommonUtils.unEscape(ma.group(3));\r
187                         \r
188                         if ( center != null && ! center.equals(fcenter) )\r
189                         {\r
190                                 if (debug) System.out.println(DBGID+"not selected: "+fx);\r
191                                 continue;                               // 放送局指定がされている場合はその局のみ\r
192                         }\r
193                         \r
194                         int order = Integer.valueOf(ma.group(2));\r
195                         if ( order == 0 )\r
196                         {\r
197                                 if (debug) System.out.println(DBGID+"ignored center: "+fx);\r
198                                 continue;                               // 0 だったらそれは無効放送局の情報\r
199                         }\r
200 \r
201                         final String txtname = ddname+File.separator+fx+"txt";\r
202                         final String xmlname = ddname+File.separator+fx+"xml";\r
203 \r
204                         // 局リストの追加\r
205                         Center cr = new Center();\r
206                         cr.setCenter(fcenter);\r
207                         cr.setEnabled(true);\r
208                         cr.setOrder(order);\r
209                         crlist.add(cr);\r
210                         sortedcrlist.add(cr);\r
211                         \r
212                         // 番組表局リストの追加\r
213                         ProgList pl = new ProgList();\r
214                         pl.Center = fcenter;\r
215                         pl.enabled = true;\r
216                         pcenter.add(pl);\r
217                         \r
218                         // 日付リストの追加\r
219                         ProgDateList pcl = new ProgDateList();\r
220                         pcl.Date = date;\r
221                         pl.pdate.add(pcl);\r
222                         \r
223                         TatCount tx = new TatCount();\r
224                         if ( new File(txtname).exists() ) {\r
225                                 progcount += readTXT(pl.Center,pcl,txtname);\r
226                                 if (debug) System.err.println(String.format(DBGID+"テキスト形式での読み込みにかかった時間(%.4f秒): %s",tx.end(),txtname));\r
227                         }\r
228                         else if ( new File(xmlname).exists() ) {\r
229                                 progcount += readXML(pl.Center,pcl,date,xmlname);\r
230                                 if (debug) System.err.println(String.format(DBGID+"XML形式での読み込みにかかった時間(%.4f秒): %s",tx.end(),xmlname));\r
231                                 tx.restart();\r
232                                 writeTXT(pcl,txtname);  //かきこ\r
233                                 if (debug) System.err.println(String.format(DBGID+"テキスト形式での書き込みにかかった時間(%.4f秒): %s",tx.end(),txtname));\r
234                         }\r
235                         else {\r
236                                 System.err.println(String.format(ERRID+"ファイルがない: %s.(xml|txt)",ddname+File.separator+fx));\r
237                         }\r
238                 }\r
239 \r
240                 if (debug)\r
241                 {\r
242                         for ( ProgList pl : pcenter )\r
243                         {\r
244                                 int cnt = 0;\r
245                                 for ( ProgDateList pcl : pl.pdate )\r
246                                 {\r
247                                         for ( ProgDetailList pdl : pcl.pdetail )\r
248                                         {\r
249                                                 cnt++;\r
250                                         }\r
251                                 }\r
252                                 System.err.println(DBGID+"取得した過去ログ: "+pl.Center+" "+cnt);\r
253                                 progcount += cnt;\r
254                         }\r
255                 }\r
256                 System.out.println(String.format(MSGID+"取得しました(%.2f秒): %s %s %d件",tc.end(),date,(center!=null)?(center):("全放送局"),progcount));\r
257 \r
258                 return true;\r
259         }\r
260         \r
261         private int readTXT(String center, ProgDateList pcl, String txtname) {\r
262                 \r
263                 String txt = CommonUtils.read4file(txtname, false);\r
264                 if ( txt == null ) {\r
265                         return -1;\r
266                 }\r
267                 \r
268                 int index = 0;\r
269                 while ( index < txt.length() )\r
270                 {\r
271                         // 番組ヘッダを探す\r
272                         int newtop = txt.indexOf(WrHeader.STARTMARK.toString(),index);\r
273                         if ( newtop == -1 ) {\r
274                                 break;\r
275                         }\r
276                         newtop += WrHeader.STARTMARK.toString().length()+1;\r
277                         \r
278                         // 番組フッタを探す\r
279                         int newtail = txt.indexOf(WrHeader.ENDMARK.toString(),newtop);\r
280                         if ( newtail == -1 ) {\r
281                                 break;\r
282                         }\r
283                         index = newtail+WrHeader.ENDMARK.toString().length()+1;\r
284                         \r
285                         // 解析する\r
286                         ProgDetailList pdl = new ProgDetailList(txt.substring(newtop,newtail));\r
287                         \r
288                         // サブタイトル分離\r
289                         doSplitSubtitle(pdl);\r
290                         \r
291                         pcl.pdetail.add(pdl);\r
292 \r
293                         // 情報を追加\r
294                         pdl.center = center;\r
295                         pdl.type = this.getType();\r
296                 }\r
297                 \r
298                 return pcl.pdetail.size();\r
299         }\r
300         \r
301         private int readXML(String center, ProgDateList pcl, String date, String xmlname) {\r
302                 try {\r
303 \r
304                         @SuppressWarnings("unchecked")\r
305                         ArrayList<PassedProgramList> da = (ArrayList<PassedProgramList>) CommonUtils.readXML(xmlname);\r
306                         if ( da == null )\r
307                         {\r
308                                 System.err.println(ERRID+"読み込みに失敗しました: "+xmlname);\r
309                                 return -1;\r
310                         }\r
311                         \r
312                         GregorianCalendar cal = CommonUtils.getCalendar(date);\r
313                         for ( int j=0; j<da.size(); j++ )\r
314                         {\r
315                                 PassedProgramList data = da.get(j);\r
316 \r
317                                 // 5:00以前から続いている場合の長さ補正\r
318                                 int prelength = 0;\r
319 \r
320                                 // クソバグ対応(GENRE.KIDSを廃止したら過去ログが読めなくなったという)\r
321                                 if (data.genre == null)\r
322                                 {\r
323                                         data.genre = ProgGenre.NOGENRE;\r
324                                         data.subgenre = ProgSubgenre.NOGENRE_ETC;\r
325                                 }\r
326                                 if ( data.genrelist != null )\r
327                                 {\r
328                                         for ( int n=0; n<data.genrelist.size(); n++ )\r
329                                         {\r
330                                                 if (data.genrelist.get(n) == null)\r
331                                                 {\r
332                                                         data.genrelist.set(n, ProgGenre.NOGENRE);\r
333                                                         data.subgenrelist.set(n, ProgSubgenre.NOGENRE_ETC);\r
334                                                 }\r
335                                         }\r
336                                 }\r
337                                 \r
338                                 // クソバグ対応(番組詳細のない情報があった)\r
339                                 if (data.detail == null)\r
340                                 {\r
341                                         data.detail="";\r
342                                 }\r
343                                 \r
344                                 // 後方互換(EDCB番組表で追加された追加番組詳細情報への対応)\r
345                                 if (data.addedDetail == null)\r
346                                 {\r
347                                         data.addedDetail = "";\r
348                                 }\r
349                                 \r
350                                 //\r
351                                 data.splitted_title = data.title;\r
352                                 data.splitted_detail = data.detail;\r
353                                 \r
354                                 // 検索用インデックスを生成\r
355                                 data.titlePop = TraceProgram.replacePop(data.title);\r
356                                 data.detailPop = TraceProgram.replacePop(data.detail);\r
357                                 \r
358                                 // 終了時刻・実日付を生成\r
359                                 String[] Ahm = data.start.split(":",2);\r
360                                 if ( Ahm.length == 2 )\r
361                                 {\r
362                                         // 詳細情報をもつもの\r
363                                         GregorianCalendar cale = (GregorianCalendar) cal.clone();\r
364                                         int hh = Integer.valueOf(Ahm[0]);\r
365                                         int mm = Integer.valueOf(Ahm[1]);\r
366                                         \r
367                                         if ( j == 0 )\r
368                                         {\r
369                                                 if ( CommonUtils.isLateNight(hh) )\r
370                                                 {\r
371                                                         // 1個目で00-05時はうめうめ\r
372                                                         prelength = (5*60 - (hh*60+mm));\r
373                                                 }\r
374                                                 else if ( hh >= 18 && hh < 24 )\r
375                                                 {\r
376                                                         // 1個目で18-24時は前日だ\r
377                                                         cale.add(Calendar.DATE, -1);\r
378                                                         prelength = (29*60 - (hh*60+mm));\r
379                                                 }\r
380                                         }\r
381                                         else if ( CommonUtils.isLateNight(hh) )\r
382                                         {\r
383                                                 // 2個目以降で00-05時は翌日だ\r
384                                                 cale.add(Calendar.DATE, 1);\r
385                                         }\r
386                                         \r
387                                         data.accurateDate = CommonUtils.getDate(cale);\r
388                                         \r
389                                         cale.set(Calendar.HOUR_OF_DAY, hh);\r
390                                         cale.set(Calendar.MINUTE, mm);\r
391                                         data.startDateTime = CommonUtils.getDateTime(cale);\r
392                                         data.start = CommonUtils.getTime(cale);\r
393                                         \r
394                                         cale.add(Calendar.MINUTE, prelength+data.length);\r
395                                         data.end = CommonUtils.getTime(cale);\r
396                                         data.endDateTime = CommonUtils.getDateTime(cale);\r
397                                         \r
398                                         data.recmin = CommonUtils.getRecMinVal(data.start,data.end);\r
399                                 }\r
400                                 \r
401                                 pcl.pdetail.add(data);\r
402 \r
403                                 // 情報を追加\r
404                                 data.center = center;\r
405                                 data.type = this.getType();\r
406                         }\r
407                         \r
408                         return pcl.pdetail.size();\r
409                 }\r
410                 catch ( Exception e )\r
411                 {\r
412                         System.err.println(ERRID+"過去ログの読み込みに失敗しました: "+xmlname);\r
413                         e.printStackTrace();\r
414                 } \r
415                 return -1;\r
416         }\r
417         \r
418         /**\r
419          * プログラムリストをファイルに保存する\r
420          * @param tviterator\r
421          * @param clst\r
422          * @param prepCount 何日先のログまで保存するか\r
423          * @return\r
424          */\r
425         public boolean save(TVProgramIterator tviterator, ArrayList<Center> clst, int prepCount) {\r
426                 \r
427                 TVProgramIterator pli = tviterator.build(clst, IterationType.ALL);\r
428                 \r
429                 String curDate = CommonUtils.getDate529(0,true);\r
430                 \r
431                 // 古いログは削除\r
432                 {\r
433                         ArrayList<String> dirs = new ArrayList<String>();\r
434                         // リストアップ\r
435                         for ( ProgList pl : pli )\r
436                         {\r
437                                 for (ProgDateList cl : pl.pdate)\r
438                                 {\r
439                                         if (cl.Date.compareTo(curDate) < 0)\r
440                                         {\r
441                                                 continue;\r
442                                         }\r
443                                         String ymname = dname+File.separator+cl.Date.substring(0,7).replace("/", "_");\r
444                                         String ddname = ymname+File.separator+cl.Date.replace("/", "_");\r
445                                         boolean b  = true;\r
446                                         for (String dir : dirs)\r
447                                         {\r
448                                                 if (dir.equals(ddname))\r
449                                                 {\r
450                                                         b = false;\r
451                                                         break;\r
452                                                 }\r
453                                         }\r
454                                         if (b)\r
455                                         {\r
456                                                 dirs.add(ddname);\r
457                                         }\r
458                                 }\r
459                         }\r
460                         \r
461                         // 削除\r
462                         for (String dir : dirs)\r
463                         {\r
464                                 File d = new File(dir);\r
465                                 if (d.exists())\r
466                                 {\r
467                                         for (String file : d.list())\r
468                                         {\r
469                                                 if (file.matches(expr_a+expr_z))\r
470                                                 {\r
471                                                         File f = new File(dir+File.separator+file);\r
472                                                         f.delete();\r
473                                                 }\r
474                                         }\r
475                                 }\r
476                         }\r
477                 }\r
478                 \r
479                 // 放送局名をキーにプログラムリストをなめる\r
480                 TatCount tc = new TatCount();\r
481                 \r
482                 pli.rewind();   // まきもどせ\r
483                 \r
484                 int centerid = 0;\r
485                 for ( ProgList pl : pli )\r
486                 {\r
487                         ++centerid;\r
488                         \r
489                         tc.restart();\r
490                         String firstD = "";\r
491                         String lastD = "";\r
492                         \r
493                         int count = 1;\r
494                         for ( ProgDateList cl : pl.pdate )\r
495                         {\r
496                                 if (cl.Date.compareTo(curDate) < 0)\r
497                                 {\r
498                                         continue;       // 過去日のログは不要\r
499                                 }\r
500                                 \r
501                                 if ( count++ > prepCount )\r
502                                 {\r
503                                         break;          // 指定日数以上は保存しない\r
504                                 }\r
505                                 \r
506                                 if ( firstD.length() == 0 ) firstD = cl.Date;\r
507                                 lastD = cl.Date;\r
508                                 \r
509                                 // 出力先の決定\r
510                                 String ymname = dname+File.separator+cl.Date.substring(0,7).replace("/", "_");\r
511                                 String ddname = ymname+File.separator+cl.Date.replace("/", "_");\r
512                                 String xmlname = ddname+File.separator+String.format("%d_%04d_%s.xml", 1, centerid, CommonUtils.escapeFilename(pl.Center));\r
513                                 String txtname = ddname+File.separator+String.format("%d_%04d_%s.txt", 1, centerid, CommonUtils.escapeFilename(pl.Center));\r
514                                 \r
515                                 for ( String xname : new String[] { dname,ymname,ddname } )\r
516                                 {\r
517                                         File f = new File(xname);\r
518                                         if ( ! f.exists() && ! f.mkdir() )\r
519                                         {\r
520                                         System.err.println(ERRID+"ディレクトリの作成に失敗しました: "+f.getAbsolutePath());\r
521                                         continue;\r
522                                         }\r
523                                 }\r
524 \r
525                                 TatCount tx = new TatCount();\r
526                                 if ( ! useXML ) {\r
527                                         writeTXT(cl,txtname);\r
528                                         if (debug) System.err.println(String.format(DBGID+"テキスト形式での保存にかかった時間(%.4f秒): %s->%s %s",tx.end(),firstD,lastD,pl.Center));\r
529                                 }\r
530                                 else {\r
531                                         writeXML(cl,xmlname);\r
532                                         if (debug) System.err.println(String.format(DBGID+"XML形式での保存にかかった時間(%.4f秒): %s->%s %s",tx.end(),firstD,lastD,pl.Center));\r
533                                 }\r
534                         }\r
535                         \r
536                         reportProgress(String.format(MSGID+"保存しました(%.2f秒): %s->%s %s",tc.end(),firstD,lastD,pl.Center));\r
537                 }\r
538                 return true;\r
539                 \r
540         }\r
541         \r
542         private boolean writeTXT(ProgDateList pcl, String txtname) {\r
543                 StringBuilder sb = new StringBuilder();\r
544                 for ( ProgDetailList d : pcl.pdetail ) {\r
545                         sb.append(d.toString());\r
546                 }\r
547                 if ( ! CommonUtils.write2file(txtname, sb.toString()) ) {\r
548                         return false;\r
549                 }\r
550                 return true;\r
551         }\r
552 \r
553         private boolean writeXML(ProgDateList pcl, String xmlname) {\r
554                 // 詳細をコピーする\r
555                 ArrayList<PassedProgramList> da = new ArrayList<PassedProgramList>();\r
556                 for ( ProgDetailList d : pcl.pdetail )\r
557                 {\r
558                         PassedProgramList data = new PassedProgramList();\r
559                         data.setTitle(d.title);\r
560                         data.setDetail(d.detail);\r
561                         data.setAddedDetail(d.addedDetail);\r
562                         data.setStart(d.start);\r
563                         data.setLength(d.length);\r
564                         data.setExtension(d.extension);\r
565                         data.setNoscrumble(d.noscrumble);\r
566                         data.setGenre(d.genre);\r
567                         data.setSubgenre(d.subgenre);\r
568                         data.setFlag(d.flag);\r
569                         data.setOption(d.option);\r
570                         da.add(data);\r
571                 }\r
572                 \r
573                 // 出力\r
574                 if ( ! CommonUtils.writeXML(xmlname, da) )\r
575                 {\r
576                 return false;\r
577                 }\r
578                 \r
579                 return true;\r
580         }\r
581 \r
582         // @see #getDateList()\r
583         private static String pregetdate = "1999/12/31";\r
584         private static String[] dd = new String[0];\r
585 \r
586         /**\r
587          *  ディレクトリ一覧を取得する(日に一回しか検索しない)\r
588          */\r
589         public String[] getDateList(int maxCnt) {\r
590                 \r
591                 String getdate = CommonUtils.getDate529(0,true);\r
592                 if ( getdate.compareTo(pregetdate) <= 0 )\r
593                 {\r
594                         return dd;\r
595                 }\r
596                 pregetdate = getdate;\r
597                 \r
598                 System.out.println(MSGID+"フォルダを検索して過去ログをリストアップします. "+getdate);\r
599                                 \r
600                 // 最初のエントリーはダミー\r
601                 ArrayList<String> da = new ArrayList<String>();\r
602                 da.add("過去ログ");\r
603                 \r
604                 // 過去日のディレクトリのみが対象\r
605                 GregorianCalendar cal = CommonUtils.getCalendar(0);\r
606                 if ( CommonUtils.isLateNight(cal) )\r
607                 {\r
608                         cal.add(Calendar.DAY_OF_MONTH, -1);\r
609                 }\r
610                 String date = String.format("%04d_%02d_%02d", cal.get(Calendar.YEAR), cal.get(Calendar.MONTH)+1, cal.get(Calendar.DAY_OF_MONTH));\r
611                 \r
612                 // トップディレクトリは存在するかな?\r
613                 File d = new File(dname);\r
614                 if ( ! d.exists() && ! d.isDirectory())\r
615                 {\r
616                         System.out.println(MSGID+"ディレクトリがみつかりません: "+d.getAbsolutePath());\r
617                         return da.toArray(new String[0]);\r
618                 }\r
619                 \r
620                 // 日付降順に処理する\r
621                 int cnt = 0;\r
622                 String[] dlist = d.list();\r
623                 Arrays.sort(dlist);\r
624                 for (int j=dlist.length-1; j>=0 && cnt < maxCnt; j--)\r
625                 {\r
626                         // YYYY_MM形式のもののみ\r
627                         Matcher ma = Pattern.compile("^\\d\\d\\d\\d_\\d\\d$").matcher(dlist[j]);\r
628                         if ( ! ma.find())\r
629                         {\r
630                                 continue;\r
631                         }\r
632                         \r
633                         // ディレクトリだよね?\r
634                         final String ddname = d.getName()+File.separator+dlist[j];\r
635                         File f = new File(ddname);\r
636                         if ( ! f.exists() && ! f.isDirectory())\r
637                         {\r
638                                 System.out.println(MSGID+"ディレクトリがみつかりません: "+f.getAbsolutePath());\r
639                                 return null;\r
640                         }\r
641                         \r
642                         // 日付降順に処理する\r
643                         String[] flist = f.list();\r
644                         Arrays.sort(flist);\r
645                         for (int i=flist.length-1; i>=0 && cnt<maxCnt; i--)\r
646                         {\r
647                                 // YYYY_MM_DD(曜日)形式で過去日のもののみ\r
648                                 ma = Pattern.compile("^(\\d\\d\\d\\d_\\d\\d_\\d\\d)").matcher(flist[i]);\r
649                                 if ( ! ma.find())\r
650                                 {\r
651                                         continue;\r
652                                 }\r
653                                 if (ma.group(1).compareTo(date) >= 0)\r
654                                 {\r
655                                         continue;\r
656                                 }\r
657                                 da.add(flist[i].replace("_", "/"));\r
658                                 cnt++;\r
659                         }\r
660                 }\r
661                 dd = da.toArray(new String[0]);\r
662                 return dd;\r
663         }\r
664         \r
665         /* ここまで */\r
666         \r
667         \r
668         \r
669         /*\r
670          * ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\r
671          * ★★★★★ 放送地域を取得する(TVAreaから降格)-ここから ★★★★★\r
672          * ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\r
673          */\r
674         \r
675         /*\r
676          * 公開メソッド\r
677          */\r
678         \r
679         //\r
680         @Override\r
681         public String getDefaultArea() {return "東京";}\r
682         \r
683         //\r
684         public void loadAreaCode() {}\r
685         \r
686         //\r
687         public void saveAreaCode() {}\r
688         \r
689         /*\r
690          * ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\r
691          * ★★★★★ 放送地域を取得する(TVAreaから降格)-ここまで ★★★★★\r
692          * ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\r
693          */\r
694         \r
695         \r
696         \r
697         /*\r
698          * ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\r
699          * ★★★★★ 放送局を選択する(TVCenterから降格)-ここから ★★★★★\r
700          * ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\r
701          */\r
702         \r
703         /*\r
704          * 公開メソッド\r
705          */\r
706         \r
707         // 設定ファイルがなければWebから取得\r
708         public void loadCenter(String code, boolean force) {}\r
709         \r
710         // 設定ファイルへ書き出し\r
711         public boolean saveCenter() { return false; }\r
712         \r
713         /*\r
714          * ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\r
715          * ★★★★★ 放送局を選択する(TVCenterから降格)-ここまで ★★★★★\r
716          * ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\r
717          */\r
718 }\r
719 \r