4 import java.util.ArrayList;
\r
5 import java.util.HashMap;
\r
6 import java.util.Map.Entry;
\r
7 import java.util.regex.Matcher;
\r
8 import java.util.regex.Pattern;
\r
11 * <P>レコーダで利用するCHコード設定を保持するクラス。
\r
12 * <P>NAME : Web番組表の放送局名
\r
15 * @version 3.15.4β EDCBの旧型式→新形式自動変換追加、DIGAの旧型式→新形式自動変換廃止ほか
\r
17 public class ChannelCode extends ArrayList<String> implements Cloneable {
\r
19 private static final long serialVersionUID = 1L;
\r
21 private final String datfile = "env"+File.separator+"RdChannelCode.dat";
\r
22 private String recId = null;
\r
24 private static final String MSGID = "[CHコード設定] ";
\r
25 private static final String ERRID = "[ERROR]"+MSGID;
\r
26 private static final String DBGID = "[DEBUG]"+MSGID;
\r
28 private final HashMap<String,String> CH_REC2WEB = new HashMap<String,String>();
\r
29 private final HashMap<String,String> CH_CODE2REC = new HashMap<String,String>();
\r
30 private final HashMap<String,String> CH_WEB2CODE = new HashMap<String,String>();
\r
32 public void setCH_REC2WEB(String key, String val) { CH_REC2WEB.put(key, val); }
\r
33 public void setCH_CODE2REC(String key, String val) { CH_CODE2REC.put(key, val); }
\r
34 public void setCH_WEB2CODE(String key, String val) { CH_WEB2CODE.put(key, val); }
\r
37 * レコーダの放送局名 を Web番組表の放送局名 に変換する。
\r
39 public String getCH_REC2WEB(String recChName) { return (String)CH_REC2WEB.get(recChName); }
\r
42 * Web番組表の放送局名 を レコーダの放送局名 に変換する。
\r
44 public String getCH_WEB2REC(String webChName) {
\r
45 for ( Entry<String,String> e : CH_REC2WEB.entrySet() ) {
\r
46 if ( e.getValue().equals(webChName) ) {
\r
54 * 放送局コード を レコーダの放送局名 に変換する。
\r
56 public String getCH_CODE2REC(String chCode) { return (String)CH_CODE2REC.get(chCode); }
\r
59 * レコーダの放送局名 を 放送局コード に変換する。
\r
61 public String getCH_REC2CODE(String recChName) {
\r
62 for ( Entry<String,String> e : CH_CODE2REC.entrySet() ) {
\r
63 if ( e.getValue().equals(recChName) ) {
\r
71 * Web番組表の放送局名 を 放送局コード に変換する。
\r
73 public String getCH_WEB2CODE(String webChName) { return (String)CH_WEB2CODE.get(webChName); }
\r
76 * 放送局コード を Web番組表の放送局名 に変換する。
\r
78 public String getCH_CODE2WEB(String chCode) {
\r
79 for ( Entry<String,String> e : CH_WEB2CODE.entrySet() ) {
\r
80 if ( e.getValue().equals(chCode) ) {
\r
88 public ChannelCode(String recId) {
\r
89 this.recId = recId;
\r
93 * Web番組表の放送局名のリストを返す
\r
95 public ArrayList<String> getChNames() {
\r
102 public boolean load(boolean logging)
\r
105 CH_REC2WEB.clear();
\r
106 CH_CODE2REC.clear();
\r
107 CH_WEB2CODE.clear();
\r
110 String ccFile = datfile+"."+recId;
\r
112 if ( ! new File(ccFile).exists() ) {
\r
113 System.err.println(ERRID+"設定ファイルがみつかりません: "+ccFile);
\r
119 String buf = CommonUtils.read4file(ccFile, false);
\r
120 if ( buf == null ) {
\r
121 System.err.println(ERRID+"設定ファイルの取得に失敗しました: "+ccFile);
\r
125 String[] codes = buf.split("[\r\n]+");
\r
126 for ( String code : codes ) {
\r
127 Matcher ma = Pattern.compile("^\\s*\"(.+?)\",\"(.+?)\",\"(.+?)\"").matcher(code);
\r
129 if (getCH_WEB2CODE(ma.group(1)) == null) setCH_WEB2CODE(ma.group(1),ma.group(3));
\r
130 if (getCH_REC2WEB(ma.group(2)) == null || ma.group(1).startsWith("外部入力")) setCH_REC2WEB(ma.group(2),ma.group(1));
\r
131 if (getCH_CODE2REC(ma.group(3)) == null) setCH_CODE2REC(ma.group(3),ma.group(2));
\r
133 this.add(ma.group(1));
\r
137 boolean oldflag = false;
\r
139 if ( recId.equals("EpgDataCap_Bon") ) { // 本当はプラグインからレコーダIDの文字列を取得したかったのだけど
\r
140 oldflag = ccModEDCB();
\r
143 if ( recId.equals("TVTest") ) {
\r
144 oldflag = ccModTVTest();
\r
147 System.out.println(MSGID+"CHコード設定が自動修正されました: "+ccFile);
\r
152 System.out.println(DBGID+"--- "+ccFile+" Start---");
\r
154 String[] keys = CH_REC2WEB.keySet().toArray(new String[0]);
\r
155 for ( String recChName : keys ) {
\r
156 String webChName = CH_REC2WEB.get(recChName);
\r
157 String chCode = CH_WEB2CODE.get(webChName);
\r
158 if ( chCode.equals("error") ) {
\r
159 System.out.printf("CH: %7s %-32s %-8s %s\n","<Error>",webChName,recChName,chCode);
\r
162 System.out.printf("CH: %7s %-32s %-8s %s\n","",webChName,recChName,chCode);
\r
166 System.out.println(DBGID+"--- "+ccFile+" End ---");
\r
173 * 古いEDCBの情報を新形式に更新する。
\r
176 private boolean ccModEDCB() {
\r
177 boolean oldflag = false;
\r
178 String[] keys = CH_REC2WEB.keySet().toArray(new String[0]);
\r
179 for ( String recChName : keys ) {
\r
180 if ( ! recChName.matches("^\\d+$") ) {
\r
182 String webChName = CH_REC2WEB.get(recChName);
\r
183 String chCode = CH_WEB2CODE.get(webChName);
\r
184 CH_REC2WEB.remove(recChName);
\r
185 CH_CODE2REC.remove(chCode);
\r
186 CH_REC2WEB.put(chCode,webChName);
\r
187 CH_CODE2REC.put(chCode,chCode);
\r
195 * 古いEDCBの情報を新形式に更新する。
\r
197 private boolean ccModTVTest() {
\r
198 boolean oldflag = false;
\r
199 if (CH_REC2WEB.remove("-") != null) {
\r
201 String[] keys = CH_CODE2REC.keySet().toArray(new String[0]);
\r
202 for ( String chCode : keys ) {
\r
203 String recChName = chCode;
\r
204 CH_CODE2REC.remove(chCode);
\r
205 CH_CODE2REC.put(chCode, recChName);
\r
206 for ( Entry<String,String> ent : CH_WEB2CODE.entrySet() ) { // NAME2CODEは変更の必要がない
\r
207 if ( ent.getValue().equals(chCode) ) {
\r
208 String webChName = ent.getKey();
\r
209 CH_REC2WEB.put(recChName,webChName);
\r
221 public boolean save(ArrayList<String> webChNames, ArrayList<String> recChNames, ArrayList<String> chCodes) {
\r
223 String ccFile = datfile+"."+recId;
\r
225 System.err.println(MSGID+"設定ファイルを保存します: "+ccFile);
\r
226 StringBuilder sb = new StringBuilder();
\r
227 sb.append("# "+CommonUtils.getDateTime(0)+"\n");
\r
228 for ( int i=0; i<webChNames.size(); i++ ) {
\r
229 sb.append(String.format("\"%s\",\"%s\",\"%s\"\n", webChNames.get(i), recChNames.get(i), chCodes.get(i)));
\r
231 if ( ! CommonUtils.write2file(ccFile, sb.toString()) ) {
\r
232 System.err.println(MSGID+"設定ファイルの保存に失敗しました: "+ccFile);
\r
241 private boolean save() {
\r
242 ArrayList<String> webChNames = new ArrayList<String>();
\r
243 ArrayList<String> recChNames = new ArrayList<String>();
\r
244 ArrayList<String> chCodes = new ArrayList<String>();
\r
245 for ( String webChName : this ) {
\r
246 String chCode = CH_WEB2CODE.get(webChName);
\r
247 String recChName = CH_CODE2REC.get(chCode);
\r
249 webChNames.add(webChName);
\r
250 recChNames.add(recChName);
\r
251 chCodes.add(chCode);
\r
253 return this.save(webChNames, recChNames, chCodes);
\r
258 public ChannelCode clone() {
\r
259 ChannelCode cc = (ChannelCode) super.clone();
\r
260 CommonUtils.FieldCopy(cc, this); // ディープコピーするよ
\r