2 package nicobrowser.main;
5 import java.util.ArrayList;
6 import java.util.Calendar;
8 import java.util.HashMap;
10 import javax.persistence.EntityManager;
11 import javax.persistence.EntityManagerFactory;
12 import javax.persistence.EntityTransaction;
13 import javax.persistence.Persistence;
14 import javax.persistence.Query;
15 import javax.swing.JFrame;
16 import javax.swing.SwingUtilities;
17 import nicobrowser.config.Config;
18 import nicobrowser.GetFlvResult;
19 import nicobrowser.NamePattern;
20 import nicobrowser.NicoHttpClient;
21 import nicobrowser.ProgressListener;
22 import nicobrowser.VideoInfo;
23 import nicobrowser.config.NicoFeed;
24 import nicobrowser.entity.NicoContent;
25 import nicobrowser.entity.NicoContent.Status;
26 import nicobrowser.gui.config.ConfigFrame;
27 import nicobrowser.update.DBUpdater;
28 import org.apache.commons.cli.CommandLine;
29 import org.apache.commons.cli.CommandLineParser;
30 import org.apache.commons.cli.HelpFormatter;
31 import org.apache.commons.cli.Options;
32 import org.apache.commons.cli.ParseException;
33 import org.apache.commons.cli.PosixParser;
34 import org.apache.commons.io.FilenameUtils;
35 import org.slf4j.Logger;
36 import org.slf4j.LoggerFactory;
40 public static final String VERSION = "0.12.0";
41 private static Logger log = LoggerFactory.getLogger(Main.class);
43 public static void main(String[] args) throws Exception {
44 final boolean res = Config.createNewConfigFiles();
46 CommandLineParser parser = new PosixParser();
47 Options options = createOptions();
50 // parse the command line arguments
51 CommandLine line = parser.parse(options, args);
53 if (line.hasOption("help")) {
54 new HelpFormatter().printHelp("java -jar NicoBrowser.jar [option]", options);
56 } else if (line.hasOption("version")) {
57 System.out.println(VERSION);
59 } else if (line.hasOption("property")) {
63 } catch (ParseException exp) {
64 HelpFormatter formatter = new HelpFormatter();
65 formatter.printHelp("java -jar NicoBrowser.jar [option]", options);
74 DBUpdater updater = new DBUpdater();
75 if (args.length > 0 && "sync".equals(args[0])) {
78 } else if (args.length > 0 && "sync4".equals(args[0])) {
87 private static Options createOptions() throws IllegalArgumentException {
88 Options options = new Options();
89 options.addOption("h", "help", false, "このメッセージを表示します");
90 options.addOption("p", "property", false, "コンフィグ設定画面を起動します");
91 options.addOption("v", "version", false, "バージョン情報を表示します");
95 private static void propertyOpen() {
96 SwingUtilities.invokeLater(new Runnable() {
99 ConfigFrame.setLookAndFeel();
100 JFrame frame = new ConfigFrame();
101 frame.setLocationByPlatform(true);
102 frame.setVisible(true);
107 public void start() {
108 log.info("program start");
110 final Config config = Config.getInstance();
111 List<NicoContent> dailyList = new ArrayList<NicoContent>();
112 ArrayList<List<NicoContent>> myLists = new ArrayList<List<NicoContent>>();
113 NicoHttpClient instance = null;
115 log.info("リストを取得します");
116 if (config.getProxyUse()) {
117 final int port = Integer.parseInt(config.getProxyPort());
118 instance = new NicoHttpClient(config.getProxyHost(), port);
120 instance = new NicoHttpClient();
122 List<NicoFeed> feeds = config.getNicoFeeds();
123 for (NicoFeed f : feeds) {
124 List<NicoContent> list = instance.getContentsFromRss(f.getUrl());
126 for (NicoContent l : list) {
127 if (count >= f.getNumber()) {
134 List<String> mylists = config.getDownLoadMyList();
135 for (String l : mylists) {
136 List<NicoContent> list = instance.loadMyList(l);
139 } catch (Exception e) {
144 log.info("今回取得したデータを過去の取得データと比較します");
146 EntityManagerFactory factory;
147 EntityManager manager;
149 HashMap<String, String> map = new HashMap<String, String>();
150 map.put("toplink.jdbc.url", "jdbc:h2:" + config.getDbFile());
151 factory = Persistence.createEntityManagerFactory("NicoBrowserPU", map);
152 manager = factory.createEntityManager();
154 EntityTransaction transaction = manager.getTransaction();
160 for (NicoContent c : dailyList) {
166 for (List<NicoContent> l : myLists) {
167 for (NicoContent c : l) {
172 transaction.commit();
174 Query query = manager.createQuery("SELECT cont FROM NicoContent AS cont " + "WHERE ?1 <> cont.status").
175 setParameter(1, NicoContent.Status.GET_FILE);
176 @SuppressWarnings("unchecked")
177 List<NicoContent> results = query.getResultList();
178 Date prevDate = null;
179 for (NicoContent c : results) {
180 if (c.getFailTimes() >= config.getMaxRetry()) {
183 if (prevDate != null) {
184 Date nowDate = Calendar.getInstance().getTime();
185 long sleep = nowDate.getTime() - prevDate.getTime();
186 sleep = config.getWaitTime() * 1000 - sleep;
188 log.info("" + sleep / 1000 + "秒待機します。");
191 } catch (InterruptedException e) {
192 log.info("スリープ中断", e);
196 prevDate = Calendar.getInstance().getTime();
197 File saveDir = new File(config.getSrcSaveDir());
198 NamePattern np = new NamePattern(config.getFileNamePattern(), c.getTitle());
199 log.info("ファイルを取得します: " + c.getNicoId() + " " + c.getTitle());
200 final boolean authed = instance.challengeAuth();
203 instance.login(config.getNicoMail(), config.getNicoPassword());
206 VideoInfo vi = instance.getVideoInfo(c.getNicoId());
207 GetFlvResult result = instance.getFlvFile(vi, saveDir, np, c.getStatus(), config.needLowFile(),
208 ProgressListener.EMPTY_LISTENER);
210 final File f = result.getFile();
212 c.setFileName(FilenameUtils.getBaseName(f.toString()));
214 c.setAuthor(result.getAuthor());
215 Status status = result.getStatus();
217 if (status == Status.GET_INFO) {
218 c.setFailTimes(c.getFailTimes() + 1);
220 } catch (Exception ex) {
221 c.setFailTimes(c.getFailTimes() + 1);
222 log.error("ファイル取得に失敗しました: " + c.getNicoId() + ", 通算失敗回数: " + c.getFailTimes(), ex);
226 transaction.commit();
229 } catch (Exception ex) {
230 ex.printStackTrace();
231 transaction.rollback();
239 private void save(EntityManager manager, NicoContent c) {
240 Query query = manager.createQuery("SELECT cont FROM NicoContent AS cont " + "WHERE ?1 = cont.nicoId").
241 setParameter(1, c.getNicoId());
242 @SuppressWarnings("unchecked")
243 List<NicoContent> resList = query.getResultList();
244 if (resList.isEmpty()) {
245 log.info("NEW! " + c.getNicoId() + " : " + c.getTitle());