• R/O
  • HTTP
  • SSH
  • HTTPS

TinyBannavi: Commit

タイニー番組ナビゲータ本体


Commit MetaInfo

Revisión8896a72318f58dfde565169d579f0edd30a84375 (tree)
Tiempo2013-12-17 10:06:32
Autorpeeweedee <peeweedee@user...>
Commiterpeeweedee

Log Message

番組追跡の処理の効率化ほか

Cambiar Resumen

Diferencia incremental

--- a/TinyBannavi/src/statusView/Viewer.java
+++ b/TinyBannavi/src/statusView/Viewer.java
@@ -333,7 +333,7 @@ public class Viewer extends JFrame {
333333 if ( r.getRecorderIPAddr().equals("") ) {
334334 continue;
335335 }
336- if ( r.getRecorderId().contains("RD-") || r.getRecorderId().contains("DBR-Z") ) {
336+ if ( ! r.getRecorderId().contains("RD-") && ! r.getRecorderId().contains("DBR-Z") ) {
337337 continue;
338338 }
339339
--- a/TinyBannavi/src/tainavi/AbsSettingView.java
+++ b/TinyBannavi/src/tainavi/AbsSettingView.java
@@ -395,6 +395,11 @@ public abstract class AbsSettingView extends JScrollPane {
395395 CommonSwingUtils.putComponentOn(jPanel_setting, getNoticeMsg(" 閾値を大きくすると判定が厳しくなります。キーワードが短いためにヒットしまくりで検索ノイズが多くなった場合に、値を大きくしてみてください。"), DESCRIPTION_WIDTH, PARTS_HEIGHT, SEP_WIDTH*2, y);
396396
397397 y+=(PARTS_HEIGHT+SEP_HEIGHT);
398+ CommonSwingUtils.putComponentOn(jPanel_setting, jCBP_traceOnlyTitle = new JCheckBoxPanel("タイトル中に含まれるサブタイトルは番組追跡の対象にしない",LABEL_WIDTH), PARTS_WIDTH, PARTS_HEIGHT, SEP_WIDTH, y);
399+ jCBP_traceOnlyTitle.setSelected(env.getTraceOnlyTitle());
400+ jCBP_traceOnlyTitle.addItemListener(IL_RELOAD_PROG_NEEDED);
401+
402+ y+=(PARTS_HEIGHT+SEP_HEIGHT);
398403 CommonSwingUtils.putComponentOn(jPanel_setting, jCBP_syoboFilterByCenters = new JCheckBoxPanel("しょぼかるの検索結果も有効な放送局のみに絞る",LABEL_WIDTH), PARTS_WIDTH, PARTS_HEIGHT, SEP_WIDTH, y);
399404 jCBP_syoboFilterByCenters.setSelected(env.getSyoboFilterByCenters());
400405 // RELOADリスナー不要
@@ -739,24 +744,11 @@ public abstract class AbsSettingView extends JScrollPane {
739744 jCBP_autoEventIdComplete.setSelected(env.getAutoEventIdComplete());
740745 // RELOADリスナー不要
741746
742- {
743- y+=(PARTS_HEIGHT+SEP_HEIGHT);
744- CommonSwingUtils.putComponentOn(jPanel_setting, jCBP_splitEpno = new JCheckBoxPanel("タイトルに話数が含まれる場合に以降を分離する",LABEL_WIDTH), PARTS_WIDTH, PARTS_HEIGHT, SEP_WIDTH, y);
745- jCBP_splitEpno.setSelected( ! env.getSplitEpno());
746- jCBP_splitEpno.addItemListener(IL_RELOAD_PROG_NEEDED);
747-
748- y+=(PARTS_HEIGHT+SEP_HEIGHT);
749- CommonSwingUtils.putComponentOn(jPanel_setting, jCBP_traceOnlyTitle = new JCheckBoxPanel("┗ サブタイトルを番組追跡の対象から除外する",LABEL_WIDTH), PARTS_WIDTH, PARTS_HEIGHT, SEP_WIDTH, y);
750- jCBP_traceOnlyTitle.setSelected(env.getTraceOnlyTitle());
751- jCBP_traceOnlyTitle.addItemListener(IL_RELOAD_PROG_NEEDED);
747+ y+=(PARTS_HEIGHT+SEP_HEIGHT);
748+ CommonSwingUtils.putComponentOn(jPanel_setting, jCBP_splitEpno = new JCheckBoxPanel("タイトルに話数が含まれる場合に以降を分離する",LABEL_WIDTH), PARTS_WIDTH, PARTS_HEIGHT, SEP_WIDTH, y);
749+ jCBP_splitEpno.setSelected( ! env.getSplitEpno());
750+ jCBP_splitEpno.addItemListener(IL_RELOAD_PROG_NEEDED);
752751
753- // 連動設定
754-
755- jCBP_splitEpno.addItemListener(al_splitepno);
756-
757- jCBP_splitEpno.setSelected( ! jCBP_splitEpno.isSelected());
758- }
759-
760752 y+=(PARTS_HEIGHT+SEP_HEIGHT);
761753 CommonSwingUtils.putComponentOn(jPanel_setting, jCBP_fixTitle = new JCheckBoxPanel("タイトル先頭の「アニメ 」を削除(NHKのみ)",LABEL_WIDTH), PARTS_WIDTH, PARTS_HEIGHT, SEP_WIDTH, y);
762754 jCBP_fixTitle.setSelected(env.getFixTitle());
--- a/TinyBannavi/src/tainavi/MarkedProgramList.java
+++ b/TinyBannavi/src/tainavi/MarkedProgramList.java
@@ -160,13 +160,14 @@ public class MarkedProgramList {
160160 }
161161 else {
162162 //あいまい検索・正引き
163- fazScore = TraceProgram.sumScore(tvd.SearchStrKeys,tKey._getTitlePop());
163+ String target = ProgDetailList.tracenOnlyTitle ? tvd.splitted_titlePop : tvd.titlePop;
164+ fazScore = TraceProgram.sumScore(target, tKey._getTitlePop());
164165 if (fazScore >= tKey.getFazzyThreshold()) {
165166 isFind = true;
166167 }
167168 else if ( ! this.disableFazzySearchReverse) {
168169 // 逆引き
169- fazScore = TraceProgram.sumScore(tKey._getSearchStrKeys(),tvd.titlePop);
170+ fazScore = TraceProgram.sumScore(tKey._getTitlePop(), target);
170171 if (fazScore >= tKey.getFazzyThreshold()) {
171172 isFind = true;
172173 }
--- a/TinyBannavi/src/tainavi/PassedProgram.java
+++ b/TinyBannavi/src/tainavi/PassedProgram.java
@@ -354,7 +354,6 @@ public class PassedProgram extends TVProgramUtils implements TVProgram,Cloneable
354354 // 検索用インデックスを生成
355355 data.titlePop = TraceProgram.replacePop(data.title);
356356 data.detailPop = TraceProgram.replacePop(data.detail);
357- data.SearchStrKeys = TraceProgram.splitKeys(data.titlePop);
358357
359358 // 終了時刻・実日付を生成
360359 String[] Ahm = data.start.split(":",2);
--- a/TinyBannavi/src/tainavi/ProgDetailList.java
+++ b/TinyBannavi/src/tainavi/ProgDetailList.java
@@ -91,7 +91,7 @@ public class ProgDetailList implements Cloneable {
9191 // 検索高速化用のデータ
9292
9393 /**
94- * キーワード検索で使うよ
94+ * キーワード検索・番組追跡で使うよ
9595 */
9696 String titlePop = "";
9797
@@ -103,7 +103,7 @@ public class ProgDetailList implements Cloneable {
103103 /**
104104 * 番組追跡で使うよ
105105 */
106- ArrayList<String> SearchStrKeys = null;
106+ static boolean tracenOnlyTitle = false;
107107
108108 /*******************************************************************************
109109 * NGワード処理
@@ -135,7 +135,6 @@ public class ProgDetailList implements Cloneable {
135135
136136 titlePop = "";
137137 detailPop = "";
138- SearchStrKeys = new ArrayList<String>();
139138 }
140139
141140 /*******************************************************************************
@@ -535,7 +534,6 @@ public class ProgDetailList implements Cloneable {
535534 case TITLE:
536535 this.title = body;
537536 this.titlePop = TraceProgram.replacePop(this.title);
538- this.SearchStrKeys = TraceProgram.splitKeys(this.titlePop);
539537 break;
540538 case DETAIL:
541539 this.detail = body;
--- a/TinyBannavi/src/tainavi/Syobocal.java
+++ b/TinyBannavi/src/tainavi/Syobocal.java
@@ -368,7 +368,6 @@ public class Syobocal extends TVProgramUtils implements TVProgram,Cloneable {
368368
369369 // 詳細を登録する
370370 pDetail.titlePop = TraceProgram.replacePop(pDetail.title);
371- pDetail.SearchStrKeys = TraceProgram.splitKeys(pDetail.titlePop);
372371 pDetail.detailPop = TraceProgram.replacePop(pDetail.detail);
373372 pDetail.length = Integer.valueOf(CommonUtils.getRecMin(pDetail.start.substring(0,2),pDetail.start.substring(3,5),pDetail.end.substring(0,2),pDetail.end.substring(3,5)));
374373 }
--- a/TinyBannavi/src/tainavi/TVProgramUtils.java
+++ b/TinyBannavi/src/tainavi/TVProgramUtils.java
@@ -509,7 +509,8 @@ public class TVProgramUtils implements Cloneable {
509509 pdl.titlePop = TraceProgram.replacePop(key_title);
510510 pdl.detailPop = TraceProgram.replacePop(key_detail);
511511
512- pdl.SearchStrKeys = TraceProgram.splitKeys(pdl.titlePop);
512+ // 分離しない場合でも、番組追跡はサブタイトル抜きでの検索ができるようにしたい
513+ pdl.splitted_titlePop = TraceProgram.replacePop(pdl.splitted_title);
513514 }
514515
515516 /**
@@ -850,7 +851,6 @@ public class TVProgramUtils implements Cloneable {
850851 pd2.link = pd1.link;
851852 pd2.titlePop = pd1.titlePop;
852853 pd2.detailPop = pd1.detailPop;
853- pd2.SearchStrKeys = pd1.SearchStrKeys;
854854 pd2.nosyobo = pd1.nosyobo;
855855 pd2.extension = pd1.extension;
856856 pd2.flag = pd1.flag;
--- a/TinyBannavi/src/tainavi/TraceKey.java
+++ b/TinyBannavi/src/tainavi/TraceKey.java
@@ -13,7 +13,6 @@ public class TraceKey implements SearchItem {
1313 private String center = null;
1414 private int fazzyThreshold = 0;
1515 private String okiniiri = null;
16- private ArrayList<String> SearchStrKeys = null;
1716 private boolean disableRepeat = false;
1817 private boolean showLatestOnly = false;
1918
@@ -37,8 +36,6 @@ public class TraceKey implements SearchItem {
3736 public String _getLabel() { return label; }
3837 public void setTitlePop(String s) { titlePop = s; }
3938 public String _getTitlePop() { return titlePop; }
40- public void setSearchStrKeys(ArrayList<String> sa) { SearchStrKeys = sa; }
41- public ArrayList<String> _getSearchStrKeys() { return SearchStrKeys; }
4239
4340 // interface
4441
--- a/TinyBannavi/src/tainavi/TraceProgram.java
+++ b/TinyBannavi/src/tainavi/TraceProgram.java
@@ -49,8 +49,6 @@ public class TraceProgram {
4949
5050 tr.setTitlePop(replacePop(tr.getTitle()));
5151
52- tr.setSearchStrKeys(splitKeys(tr._getTitlePop()));
53-
5452 tr.setLabel(getNewLabel(tr.getTitle(), tr.getCenter()));
5553 }
5654 }
@@ -104,55 +102,44 @@ public class TraceProgram {
104102 return(sb.toString());
105103 }
106104
107- // あいまい検索用キー文字列群の生成
108- public static ArrayList<String> splitKeys(String s)
109- {
110- ArrayList<String> SearchStrKeys = new ArrayList<String>();
111-
112- int countStr=s.length();
113- if (countStr == 1) {
114- SearchStrKeys.add(s);
115- }
116- else {
117- for (int i=1; i<countStr; i++) {
118- SearchStrKeys.add(s.substring(i-1, i+1));
119- }
120- }
121-
122- return(SearchStrKeys);
123- }
124-
125- // 2つの文字を比較してスコアを計算する(special thanks to ◆kzz0PzTAMM)
126- public static int sumScore(String SearchStr1, String SearchStr2)
127- {
128- // 検索ワードが空なら検索終了
129- if (SearchStr1.equals("") || SearchStr2.equals("")) {
130- return 0;
131- }
132-
133- // 検索ワードを基準に検索する
134- return sumScore(splitKeys(SearchStr1), SearchStr2);
135- }
136- public static int sumScore(ArrayList<String> SearchStr1Keys, String SearchStr2)
105+ // 最少比較単位は2文字(バイグラム)
106+ private static final int COMPCHARLEN = 2;
107+
108+ /**
109+ * 2つの文字を比較してスコアを計算する(special thanks to ◆kzz0PzTAMM)
110+ * @param searchkey 番組追跡の検索キー
111+ * @param target タイトル(中の文字がsearchkeyに何個含まれているかを確認する)
112+ * @return
113+ */
114+ public static int sumScore(String searchkey, String target)
137115 {
138116
139117 // 検索ワードが空なら検索終了
140- if (SearchStr1Keys.size() == 0 || "".equals(SearchStr2)) {
118+ if (searchkey == null || target == null || "".equals(searchkey) || "".equals(target)) {
141119 return 0;
142120 }
143121
144- // 検索ワードを基準に検索する
145- int searchCount=0;
146- int score=0;
147- for (String key : SearchStr1Keys) {
148- if (SearchStr2.indexOf(key) >= 0) {
149- score++;
150- }
151- searchCount++;
152- }
153-
154- score=Math.round(score*100/searchCount);
155- return(score);
122+ int searchCountMax = searchkey.length();
123+ if ( searchCountMax > COMPCHARLEN ) {
124+ // 検索キーが最少比較単位より長い
125+ searchCountMax = searchCountMax - COMPCHARLEN + 1;
126+ int score = 0;
127+ int searchCount = 0;
128+ for ( ; searchCount < searchCountMax; searchCount++ ) {
129+ if ( target.indexOf(searchkey.substring(searchCount,searchCount+COMPCHARLEN)) != -1 ) {
130+ score++;
131+ }
132+ }
133+ return Math.round(score * 100 / searchCount);
134+ }
135+ else {
136+ if ( target.indexOf(searchkey) != -1 ) {
137+ System.err.println("xxxx "+target+", "+searchkey);
138+ return 100;
139+ }
140+ }
141+
142+ return 0;
156143 }
157144
158145
--- a/TinyBannavi/src/tainavi/VWTraceKeyDialog.java
+++ b/TinyBannavi/src/tainavi/VWTraceKeyDialog.java
@@ -318,7 +318,6 @@ public class VWTraceKeyDialog extends JEscCancelDialog {
318318 xKey.setCenter(jTextField_channel.getText());
319319 xKey.setTitle(jTextField_title.getText().trim());
320320 xKey.setTitlePop(TraceProgram.replacePop(xKey.getTitle()));
321- xKey.setSearchStrKeys(TraceProgram.splitKeys(xKey._getTitlePop()));
322321 xKey.setFazzyThreshold(jSlider_fazzyThreshold.getValue());
323322 xKey.setOkiniiri((String) jComboBox_okiniiri.getSelectedItem());
324323 xKey.setDisableRepeat(jCheckBox_disableRepeat.isSelected());
--- a/TinyBannavi/src/tainavi/Viewer.java
+++ b/TinyBannavi/src/tainavi/Viewer.java
@@ -3393,6 +3393,8 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener,H
33933393
33943394 // 番組タイトルを整形する
33953395 private void fixTitle() {
3396+ // 番組追跡からサブタイトルを除外するかどうかのフラグ
3397+ ProgDetailList.tracenOnlyTitle = env.getFixTitle() && env.getTraceOnlyTitle();
33963398 //
33973399 if ( ! env.getFixTitle()) {
33983400 return;
@@ -3417,7 +3419,6 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener,H
34173419 // NHK系で先頭が「アニメ 」ではじまるものから「アニメ 」を削除する
34183420 tvd.title = tvd.title.replaceFirst("^アニメ[  ・]+","");
34193421 tvd.titlePop = TraceProgram.replacePop(tvd.title);
3420- tvd.SearchStrKeys = TraceProgram.splitKeys(tvd.titlePop);
34213422 }
34223423 if ( tvd.title.contains("コメンタリ") || tvd.detail.contains("コメンタリ") ) {
34233424 // "コメンタリ"の記述のあるものは「副音声」扱いにする(副音声でなくても)
@@ -3443,11 +3444,6 @@ public class Viewer extends JFrame implements ChangeListener,TickTimerListener,H
34433444 // ジャンル=映画でサブジャンルが複数ありアニメが優先されてないものはアニメを優先する
34443445 tvd.subgenre = ProgSubgenre.MOVIE_ANIME;
34453446 }
3446-
3447- // サブタイトルを番組追跡の対象から外す
3448- if ( env.getTraceOnlyTitle() && tvd.title != tvd.splitted_title ) {
3449- tvd.SearchStrKeys = TraceProgram.splitKeys(TraceProgram.replacePop(tvd.splitted_title)); // 番組追跡の検索用インデックスは、サブタイトルを削除したもので置き換える
3450- }
34513447 }
34523448 }
34533449 }
Show on old repository browser