タイニー番組ナビゲータ本体
Revisión | 9f3c8fc166e2ac73c93e1bffd9e966732044d651 (tree) |
---|---|
Tiempo | 2021-10-01 15:15:04 |
Autor | Masahiko Kimura <mkimura@u01....> |
Commiter | Masahiko Kimura |
Ver.1.13.1 (2021/10/1)
1. [テレビ王国]UNICODE文字化したARIBの番組表記号に対応する
2. [DiMORA]番組表の枠がなくてもエラーにならないようにする
@@ -292,7 +292,7 @@ abstract class AbsTitleDialog extends JDialog { | ||
292 | 292 | |
293 | 293 | String[] patterns = { |
294 | 294 | "^(.*?)(#|#|♯)", |
295 | - "^(.*?)第.*?(話|回|羽)", | |
295 | + "^(.*?)第.*?(話|回|羽|夜)", | |
296 | 296 | "^(.*?)(\\(|()[0-90-9]+(\\)|))"}; |
297 | 297 | |
298 | 298 | for (String pat : patterns){ |
@@ -329,7 +329,7 @@ abstract class AbsTitleDialog extends JDialog { | ||
329 | 329 | String[] patterns = { |
330 | 330 | "(#|#|♯)( | ){0,1}([0-90-9]{1,3})", |
331 | 331 | "(\\(|()( | ){0,1}([0-90-9]{1,3})(\\)|)){0,1}", |
332 | - "(第)( | ){0,1}([0-90-9]{1,3})(話|回|羽)"}; | |
332 | + "(第)( | ){0,1}([0-90-9]{1,3})(話|回|羽|夜)"}; | |
333 | 333 | String ntitle = Normalizer.normalize(title, Normalizer.Form.NFKC); |
334 | 334 | |
335 | 335 | for (String pat : patterns){ |
@@ -385,7 +385,7 @@ abstract class AbsTitleDialog extends JDialog { | ||
385 | 385 | String[] patterns = { |
386 | 386 | "(#|#)([0-90-9]{1,3})", |
387 | 387 | "(\\(|()([0-90-9]{1,3})(\\)|))", |
388 | - "(第)([0-90-9]{1,3})(話|回|羽)" | |
388 | + "(第)([0-90-9]{1,3})(話|回|羽|夜)" | |
389 | 389 | }; |
390 | 390 | |
391 | 391 | for (String pat : patterns){ |
@@ -454,9 +454,9 @@ abstract class AbsTitleDialog extends JDialog { | ||
454 | 454 | */ |
455 | 455 | protected String searchSubtitleCombo(String title){ |
456 | 456 | String[] patternsCombo = { |
457 | - "(第|#|#)([0-90-9]{1,3})(話|回|羽)?( | )?「(.*?)」", | |
458 | - "(第|#|#)([0-90-9]{1,3})(話|回|羽)?( | )?『(.*?)』", | |
459 | - "(第|#|#)([0-90-9]{1,3})(話|回|羽)?( | )?【(.*?)】"}; | |
457 | + "(第|#|#)([0-90-9]{1,3})(話|回|羽|夜)?( | )?「(.*?)」", | |
458 | + "(第|#|#)([0-90-9]{1,3})(話|回|羽|夜)?( | )?『(.*?)』", | |
459 | + "(第|#|#)([0-90-9]{1,3})(話|回|羽|夜)?( | )?【(.*?)】"}; | |
460 | 460 | |
461 | 461 | for (String pat : patternsCombo){ |
462 | 462 | Matcher m = Pattern.compile(pat).matcher(title); |
@@ -1512,8 +1512,13 @@ public abstract class AbsTitleListView extends JPanel { | ||
1512 | 1512 | // |
1513 | 1513 | Point p = e.getPoint(); |
1514 | 1514 | final int vrow = jTable_title.rowAtPoint(p); |
1515 | + | |
1516 | + if (vrow >= jTable_title.getRowCount()) | |
1517 | + return; | |
1515 | 1518 | final int row = jTable_title.convertRowIndexToModel(vrow); |
1516 | 1519 | |
1520 | + if (row >= rowView.size()) | |
1521 | + return; | |
1517 | 1522 | TitleItem ra = rowView.get(row); |
1518 | 1523 | final String title = ra.title; |
1519 | 1524 | final String chnam = ra.chname; |
@@ -42,7 +42,8 @@ public interface TVProgram { | ||
42 | 42 | PRECEDING, |
43 | 43 | RATING, |
44 | 44 | BS4K, |
45 | - BS8K | |
45 | + BS8K, | |
46 | + NOOPTION | |
46 | 47 | }; |
47 | 48 | |
48 | 49 | public static enum ProgGenre { |
@@ -1030,10 +1030,161 @@ public class TVProgramUtils implements Cloneable { | ||
1030 | 1030 | } |
1031 | 1031 | } |
1032 | 1032 | |
1033 | + | |
1034 | + /** | |
1035 | + * コードポイントを文字に変換する | |
1036 | + * | |
1037 | + * @param cp コードポイント | |
1038 | + * @return 変換後の文字 | |
1039 | + */ | |
1040 | + protected static String cp2s(int cp){ | |
1041 | + StringBuffer sb = new StringBuffer(""); | |
1042 | + sb.appendCodePoint(cp); | |
1043 | + | |
1044 | + return sb.toString(); | |
1045 | + } | |
1046 | + | |
1047 | + /* | |
1048 | + * UNIODEの番組記号のマッピング情報 | |
1049 | + * | |
1050 | + * 無視するオプション:S|N|B|映|双|解|手|天|英|日|録|HV | |
1051 | + */ | |
1052 | + enum UnicodeCharMap{ | |
1053 | + BS4K ("4K" ,0x0001F19E, ProgOption.BS4K), | |
1054 | + BS8K ("8K" ,0x0001F19F, ProgOption.BS8K), | |
1055 | + | |
1056 | + BMODE ("B" ,0x0001F131, ProgOption.NOOPTION), | |
1057 | + NEWS ("N" ,0x0001F13D, ProgOption.NOOPTION), | |
1058 | +// PROGRESSIVE ("P" ,0x0001F13F), | |
1059 | + STEREO ("S" ,0x0001F142, ProgOption.NOOPTION), | |
1060 | +// WIDE ("W" ,0x0001F146), | |
1061 | + HDTV ("HV" ,0x0001F14A, ProgOption.NOOPTION), | |
1062 | +// MULTIVIEW ("MV" ,0x0001F14B), | |
1063 | +// SDTV ("SD" ,0x0001F14C), | |
1064 | + SURROUND ("SS" ,0x0001F14D, ProgOption.SURROUND), | |
1065 | +// PPV ("PPV" ,0x0001F14E), | |
1066 | + | |
1067 | + SIGN ("手" ,0x0001F210, ProgOption.NOOPTION), | |
1068 | + SUBTITLE ("字" ,0x0001F211, ProgOption.SUBTITLE), | |
1069 | + TWOWAY ("双" ,0x0001F212, ProgOption.NOOPTION), | |
1070 | + DATA ("デ" ,0x0001F213, ProgOption.DATA), | |
1071 | + BILINGUAL ("二" ,0x0001F214, ProgOption.BILINGUAL), | |
1072 | + MULTIPLEX ("多" ,0x0001F215, ProgOption.MULTIVOICE), | |
1073 | + COMMENTARY ("解" ,0x0001F216, ProgOption.NOOPTION), | |
1074 | + WEATHER ("天" ,0x0001F217, ProgOption.NOOPTION), | |
1075 | +// TRAFFIC ("交" ,0x0001F218), | |
1076 | + MOVIE ("映" ,0x0001F219, ProgOption.NOOPTION), | |
1077 | + FREE ("無" ,0x0001F21A, ProgOption.NOOPTION), | |
1078 | + PAY ("料" ,0x0001F21B, ProgOption.PV), | |
1079 | +// FORMER ("前" ,0x0001F21C), | |
1080 | +// LATTER ("後" ,0x0001F21D), | |
1081 | + REAIR ("再" ,0x0001F21E, ProgOption.REPEAT), | |
1082 | + NEW ("新" ,0x0001F21F, ProgOption.NOOPTION), | |
1083 | + FIRST ("初" ,0x0001F220, ProgOption.FIRST), | |
1084 | + END ("終" ,0x0001F221, ProgOption.NOOPTION), | |
1085 | + LIVE ("生" ,0x0001F222, ProgOption.LIVE), | |
1086 | +// SHOPPING ("販" ,0x0001F223), | |
1087 | +// VOICE ("声" ,0x0001F224), | |
1088 | + DUBBED ("吹" ,0x0001F225, ProgOption.STANDIN), | |
1089 | + | |
1090 | + SURROUND51 ("5.1" ,0x0001F1A0, ProgOption.NOOPTION), | |
1091 | + SURROUND222 ("22.2" ,0x0001F1A2, ProgOption.NOOPTION), | |
1092 | + HDR ("HDR" ,0x0001F1A7, ProgOption.NOOPTION), | |
1093 | + ; | |
1094 | + | |
1095 | + String label; // ラベル | |
1096 | + int codePoint; // コードポイント | |
1097 | + ProgOption progOption; // 番組オプション | |
1098 | + | |
1099 | + /** | |
1100 | + * コンストラクタ | |
1101 | + * | |
1102 | + * @param l ラベル | |
1103 | + * @param cp コードポイント | |
1104 | + * @param po 番組オプション | |
1105 | + */ | |
1106 | + private UnicodeCharMap(String l, int cp, ProgOption po){ | |
1107 | + label = l; | |
1108 | + codePoint = cp; | |
1109 | + progOption = po; | |
1110 | + } | |
1111 | + | |
1112 | + /** | |
1113 | + * ラベルを取得する | |
1114 | + * | |
1115 | + * @return ラベル | |
1116 | + */ | |
1117 | + public String getLabel(){ return label; } | |
1118 | + | |
1119 | + /** | |
1120 | + * 指定した文字列で検索する | |
1121 | + * | |
1122 | + * @param str 検索対象の文字列 | |
1123 | + * @return Matcherオブジェクト | |
1124 | + */ | |
1125 | + public Matcher getMatcher(String str){ | |
1126 | + return Pattern.compile(cp2s(codePoint)).matcher(str); | |
1127 | + } | |
1128 | + | |
1129 | + /** | |
1130 | + * 番組情報から記号を抽出する | |
1131 | + * | |
1132 | + * @param pdl 番組情報 | |
1133 | + */ | |
1134 | + public void extractSymbol(ProgDetailList pdl){ | |
1135 | + Matcher md = getMatcher(pdl.title); | |
1136 | + if ( md.find() ) { | |
1137 | + if (progOption != ProgOption.NOOPTION) | |
1138 | + pdl.addOption(progOption); | |
1139 | + pdl.title = md.replaceAll(""); | |
1140 | + } | |
1141 | + } | |
1142 | + | |
1143 | + /** | |
1144 | + * 番組情報からすべての記号を抽出する | |
1145 | + * | |
1146 | + * @param pdl 番組情報 | |
1147 | + */ | |
1148 | + public static void ExtractAllSymbols(ProgDetailList pdl){ | |
1149 | + for (UnicodeCharMap chm : UnicodeCharMap.values()){ | |
1150 | + chm.extractSymbol(pdl); | |
1151 | + } | |
1152 | + } | |
1153 | + } | |
1154 | + | |
1155 | + /** | |
1156 | + * 番組情報からUNICODEの記号を抽出する | |
1157 | + * | |
1158 | + * @param pdl 番組情報 | |
1159 | + */ | |
1160 | + protected void ExtractAllUnicodeSymbols(ProgDetailList pdl){ | |
1161 | + // [新] | |
1162 | + Matcher md = UnicodeCharMap.NEW.getMatcher(pdl.title); | |
1163 | + if ( md.find() ) { | |
1164 | + pdl.flag = ProgFlags.NEW; | |
1165 | + pdl.title = md.replaceAll(""); | |
1166 | + } | |
1167 | + // [終] | |
1168 | + md = UnicodeCharMap.END.getMatcher(pdl.title); | |
1169 | + if ( md.find() ) { | |
1170 | + pdl.flag = ProgFlags.LAST; | |
1171 | + pdl.title = md.replaceAll(""); | |
1172 | + } | |
1173 | + // [無] | |
1174 | + md = UnicodeCharMap.FREE.getMatcher(pdl.title); | |
1175 | + if ( md.find() ) { | |
1176 | + pdl.noscrumble = ProgScrumble.NOSCRUMBLE; | |
1177 | + pdl.title = md.replaceAll(""); | |
1178 | + } | |
1179 | + | |
1180 | + UnicodeCharMap.ExtractAllSymbols(pdl); | |
1181 | + } | |
1182 | + | |
1033 | 1183 | /* |
1034 | 1184 | * タイトルからフラグを抽出する |
1035 | 1185 | */ |
1036 | 1186 | protected void doSplitFlags(ProgDetailList pdl, HashMap<String, String> nf) { |
1187 | + ExtractAllUnicodeSymbols(pdl); | |
1037 | 1188 | |
1038 | 1189 | Matcher md = Pattern.compile("(#1|第1話)\\b").matcher(pdl.title); |
1039 | 1190 | if ( md.find() ) { |
@@ -5,7 +5,7 @@ import java.util.regex.Pattern; | ||
5 | 5 | |
6 | 6 | |
7 | 7 | public class VersionInfo { |
8 | - private static final String Version = "タイニー番組ナビゲータ for DBR-T2007 3.22.18β+1.13.0"; | |
8 | + private static final String Version = "タイニー番組ナビゲータ for DBR-T2007 3.22.18β+1.13.1"; | |
9 | 9 | |
10 | 10 | private static final String OSname = System.getProperty("os.name"); |
11 | 11 | private static final String OSvers = System.getProperty("os.version"); |
@@ -341,7 +341,7 @@ public class PlugIn_TVPDimora extends TVProgramUtils implements TVProgram,Clonea | ||
341 | 341 | // 番組リストの追加 |
342 | 342 | if (!getPrograms(areacode, wdaycol, response)){ |
343 | 343 | reportProgress(ERRID+"番組表に有効なエントリがありません"+targetCache); |
344 | - return false; | |
344 | +// return false; | |
345 | 345 | } |
346 | 346 | |
347 | 347 | if ( prefix != null ){ |