4 import java.io.BufferedInputStream;
5 import java.io.BufferedReader;
7 import java.io.FileInputStream;
8 import java.io.IOException;
9 import java.io.InputStream;
10 import java.io.InputStreamReader;
11 import java.net.URISyntaxException;
13 import java.util.ArrayList;
14 import java.util.List;
15 import java.util.Properties;
16 import org.apache.commons.io.FileUtils;
17 import org.apache.commons.logging.Log;
18 import org.apache.commons.logging.LogFactory;
20 public final class Config {
23 * feedurl.txtから取得した情報を格納する.
25 public static class NicoFeed {
27 private final String url;
28 private final int number;
30 public NicoFeed(String url, int number) {
35 /** @return 上位いくつまでダウンロード対象とするか. */
36 public int getNumber() {
40 /** @return フィードのURL. */
41 public String getUrl() {
46 public String toString() {
47 return getUrl() + ", " + getNumber();
50 private static Log log = LogFactory.getLog(Config.class);
51 private static Config instance;
52 private final Properties properties;
53 private static final String APPLICATION_NAME = "nicobrowser";
54 private static final String CONFIG_NAME = APPLICATION_NAME + ".properties";
55 private static final String FEEDURL_NAME = "feedurl.txt";
56 private static final File APP_HOME = new File(System.getProperty("user.home", "."), "." + APPLICATION_NAME);
57 private static final File CONFIG_FILE = new File(APP_HOME, CONFIG_NAME);
58 private static final File FEEDURL_FILE = new File(APP_HOME, FEEDURL_NAME);
59 private static final String P_PATH_DB = "path.db";
60 private static final String P_PATH_SAVEFILE = "path.savefile";
61 private static final String P_FILE_ENCODING = "encoding";
62 private static final String P_NICOVIDEO_MAIL = "nicovideo.mail";
63 private static final String P_NICOVIDEO_PASSWORD = "nicovideo.password";
64 private static final String P_DOWNLOAD_RETRY = "download.retry";
65 private static final String P_DOWNLOAD_MYLIST = "download.mylist";
68 * プログラム実行に必要なコンフィグファイルを作成する.
69 * @return 今回コンフィグを作成したのであればtrue. 既に存在していたため, ファイル作成を行わなかった場合にはfalse.
70 * @throws java.io.IOException ファイル作成に失敗した.
72 public static boolean createNewConfigFiles() throws IOException {
73 boolean result = false;
74 if (!CONFIG_FILE.exists()) {
75 createNewConfigFile(CONFIG_FILE);
77 log.info("コンフィグファイルを作成しました: " + CONFIG_FILE.getCanonicalPath());
79 if (!FEEDURL_FILE.exists()) {
80 InputStream resource = null;
82 resource = ClassLoader.getSystemResourceAsStream("resources/" + FEEDURL_NAME);
83 createNewFeedFile(resource, FEEDURL_FILE);
85 log.info("FEED URLファイルを作成しました: " + FEEDURL_FILE.getCanonicalPath());
87 if (resource != null) {
95 private static void createNewConfigFile(File file) throws IOException {
96 ArrayList<CharSequence> props = new ArrayList<CharSequence>();
98 StringBuilder dbpath = new StringBuilder(P_PATH_DB + "=");
99 File dbDir = new File(APP_HOME, "db");
101 //Windowsのパス区切りバックスペースをエスケープするための処理も入れている.
102 dbpath.append(dbDir.getAbsolutePath().replaceAll("\\\\", "\\\\\\\\"));
105 StringBuilder savepath = new StringBuilder(P_PATH_SAVEFILE + "=");
106 File saveDir = new File(APP_HOME, "flv");
108 savepath.append(saveDir.getAbsolutePath().replaceAll("\\\\", "\\\\\\\\"));
111 props.add(P_FILE_ENCODING + "=" + System.getProperty("file.encoding"));
113 props.add(P_NICOVIDEO_MAIL + "=set.your@mail.address");
114 props.add(P_NICOVIDEO_PASSWORD + "=set_your_password");
115 props.add(P_DOWNLOAD_RETRY + "=3");
116 props.add(P_DOWNLOAD_MYLIST + "=");
118 FileUtils.writeLines(file, props);
121 private static void createNewFeedFile(InputStream resource, File dest) throws IOException {
122 List<String> list = new ArrayList<String>();
123 BufferedReader br = new BufferedReader(new InputStreamReader(resource, "UTF-8"));
125 String text = br.readLine();
131 FileUtils.writeLines(dest, list);
135 properties = new Properties();
136 FileInputStream fis = null;
138 fis = new FileInputStream(CONFIG_FILE);
139 properties.load(fis);
140 } catch (IOException ex) {
141 log.fatal("コンフィグの読み込みに失敗: " + CONFIG_FILE);
142 throw new RuntimeException(ex);
147 } catch (IOException ex) {
154 List urls = FileUtils.readLines(FEEDURL_FILE);
155 } catch (IOException ex) {
156 log.fatal("コンフィグの読み込みに失敗: " + CONFIG_FILE);
157 throw new RuntimeException(ex);
161 public static Config getInstance() {
162 if (instance == null) {
163 instance = new Config();
169 * @return ニコニコ動画ログインID.
171 public String getNicoMail() {
172 return properties.getProperty(P_NICOVIDEO_MAIL);
176 * @return ニコニコ動画ログインパスワード.
178 public String getNicoPassword() {
179 return properties.getProperty(P_NICOVIDEO_PASSWORD);
183 public String getDbFile() {
184 return new File(properties.getProperty(P_PATH_DB), "nicodb").getAbsolutePath();
187 /** @return 保存先の指定. */
188 public String getSrcSaveDir() {
189 return properties.getProperty(P_PATH_SAVEFILE);
192 /** @return feedurl.txtの文字エンコーディング. */
193 public String getEncoding() {
194 String res = properties.getProperty(P_FILE_ENCODING, System.getProperty("file.encoding"));
198 // * video/mp4のストリーム保存時、ファイルの拡張子に
199 // * .mp4を使用する(true)か、使用しない(.flv)か.
200 // * @return mp4拡張子を使用する場合true.
202 // public boolean isExtMp4Use() {
203 // String res = properties.getProperty("download.ext.mp4");
204 // if ("false".equalsIgnoreCase(res)) {
212 * 失敗したダウンロードファイルの最大リトライ回数を取得する.
215 public int getMaxRetry() {
216 String res = properties.getProperty(P_DOWNLOAD_RETRY);
217 return Integer.parseInt(res);
221 // * 上位何位までの動画をダウンロードするか.
222 // * @return ダウンロードするファイルの最下位.
224 // public int getMaxDownloadNumber() {
225 // String res = properties.getProperty("download.number");
226 // return Integer.parseInt(res);
230 public List<String> getDownLoadMyList() {
231 List<String> list = new ArrayList<String>();
232 String res = properties.getProperty(P_DOWNLOAD_MYLIST);
233 String[] nums = res.split(",");
234 for (int i = 0; i < nums.length; i++) {
235 String text = nums[i].trim();
236 if (!text.isEmpty()) {
243 public List<NicoFeed> getNicoFeeds() {
244 List<NicoFeed> list = new ArrayList<NicoFeed>();
246 List lines = FileUtils.readLines(FEEDURL_FILE, getEncoding());
247 for (Object line : lines) {
248 final String str = line.toString();
249 if (str.isEmpty() || str.startsWith("#")) {
254 String[] values = str.split(",");
255 NicoFeed feed = new NicoFeed(values[0].trim(), Integer.parseInt(values[1].trim()));
258 } catch (IOException ex) {
259 log.error("ファイルが見つかりません: " + FEEDURL_FILE);