2 package nicobrowser.main;
5 import java.io.IOException;
6 import java.util.ArrayList;
7 import java.util.Calendar;
9 import java.util.HashMap;
10 import java.util.List;
11 import javax.persistence.EntityManager;
12 import javax.persistence.EntityManagerFactory;
13 import javax.persistence.EntityTransaction;
14 import javax.persistence.Persistence;
15 import javax.persistence.Query;
16 import javax.swing.JFrame;
17 import javax.swing.SwingUtilities;
18 import nicobrowser.Config;
19 import nicobrowser.GetFlvResult;
20 import nicobrowser.Config.NicoFeed;
21 import nicobrowser.NicoHttpClient;
22 import nicobrowser.entity.NicoContent;
23 import nicobrowser.entity.NicoContent.Status;
24 import nicobrowser.gui.config.ConfigFrame;
25 import nicobrowser.update.DBUpdater;
26 import org.apache.commons.cli.CommandLine;
27 import org.apache.commons.cli.CommandLineParser;
28 import org.apache.commons.cli.HelpFormatter;
29 import org.apache.commons.cli.Options;
30 import org.apache.commons.cli.ParseException;
31 import org.apache.commons.cli.PosixParser;
32 import org.apache.commons.logging.Log;
33 import org.apache.commons.logging.LogFactory;
37 public static final String VERSION = "version 0.3.0";
38 private static Log log = LogFactory.getLog(Main.class);
40 public static void main(String[] args) throws IOException {
41 final boolean res = Config.createNewConfigFiles();
43 CommandLineParser parser = new PosixParser();
44 Options options = createOptions();
47 // parse the command line arguments
48 CommandLine line = parser.parse(options, args);
50 if (line.hasOption("help")) {
51 new HelpFormatter().printHelp("java -jar NicoBrowser.jar [option]", options);
53 } else if (line.hasOption("version")) {
54 System.out.println(VERSION);
56 } else if (line.hasOption("property")) {
60 } catch (ParseException exp) {
61 HelpFormatter formatter = new HelpFormatter();
62 formatter.printHelp("java -jar NicoBrowser.jar [option]", options);
71 DBUpdater updater = new DBUpdater();
72 if (args.length > 0 && "sync".equals(args[0])) {
81 private static Options createOptions() throws IllegalArgumentException {
82 Options options = new Options();
83 options.addOption("h", "help", false, "このメッセージを表示します");
84 options.addOption("p", "property", false, "コンフィグ設定画面を起動します");
85 options.addOption("v", "version", false, "バージョン情報を表示します");
89 private static void propertyOpen() {
90 SwingUtilities.invokeLater(new Runnable() {
93 ConfigFrame.setLookAndFeel();
94 JFrame frame = new ConfigFrame();
95 frame.setLocationByPlatform(true);
96 frame.setVisible(true);
101 public void start() {
102 log.info("program start");
104 final Config config = Config.getInstance();
105 List<NicoContent> dailyList = new ArrayList<NicoContent>();
106 ArrayList<List<NicoContent>> myLists = new ArrayList<List<NicoContent>>();
107 NicoHttpClient instance = null;
109 log.info("リストを取得します");
110 instance = NicoHttpClient.getInstance();
111 List<NicoFeed> feeds = config.getNicoFeeds();
112 for (NicoFeed f : feeds) {
113 List<NicoContent> list = instance.getContentsFromRss(f.getUrl());
115 for (NicoContent l : list) {
116 if (count >= f.getNumber()) {
123 List<String> mylists = config.getDownLoadMyList();
124 for (String l : mylists) {
125 List<NicoContent> list = instance.loadMyList(l);
128 } catch (Exception e) {
133 log.info("今回取得したデータを過去の取得データと比較します");
135 EntityManagerFactory factory;
136 EntityManager manager;
138 HashMap<String, String> map = new HashMap<String, String>();
139 map.put("toplink.jdbc.url", "jdbc:h2:" + config.getDbFile());
140 factory = Persistence.createEntityManagerFactory("NicoBrowserPU", map);
141 manager = factory.createEntityManager();
143 EntityTransaction transaction = manager.getTransaction();
149 for (NicoContent c : dailyList) {
155 for (List<NicoContent> l : myLists) {
156 for (NicoContent c : l) {
161 transaction.commit();
163 Query query = manager.createQuery("SELECT cont FROM NicoContent AS cont " + "WHERE ?1 <> cont.status").
164 setParameter(1, NicoContent.Status.GET_FILE);
165 List<NicoContent> results = query.getResultList();
166 instance.login(config.getNicoMail(), config.getNicoPassword());
167 Date prevDate = null;
168 for (NicoContent c : results) {
169 if (c.getFailTimes() > config.getMaxRetry() + 1) {
172 if (prevDate != null) {
173 Date nowDate = Calendar.getInstance().getTime();
174 long sleep = nowDate.getTime() - prevDate.getTime();
175 sleep = config.getWaitTime() * 1000 - sleep;
177 log.info("" + sleep + "ms sleep");
180 } catch (InterruptedException e) {
181 log.info("スリープ中断", e);
185 prevDate = Calendar.getInstance().getTime();
186 File saveLocation = new File(config.getSrcSaveDir(), c.getFileName());
187 log.info("ファイルを取得します: " + c.getNicoId() + " " + c.getTitle());
189 GetFlvResult result = instance.getFlvFile(c.getNicoId(),
190 saveLocation.getCanonicalPath(), c.getStatus(),
192 c.setAuthor(result.getAuthor());
193 Status status = result.getStatus();
195 if (status == Status.GET_INFO) {
196 c.setFailTimes(c.getFailTimes() + 1);
198 } catch (Exception ex) {
199 c.setFailTimes(c.getFailTimes() + 1);
200 log.error("ファイル取得に失敗しました。" + c.getNicoId() + ", 通算失敗回数: " + c.getFailTimes(), ex);
204 transaction.commit();
207 } catch (Exception ex) {
208 ex.printStackTrace();
209 transaction.rollback();
217 private void save(EntityManager manager, NicoContent c) {
218 Query query = manager.createQuery("SELECT cont FROM NicoContent AS cont " + "WHERE ?1 = cont.nicoId").
219 setParameter(1, c.getNicoId());
220 List<NicoContent> resList = query.getResultList();
221 if (resList.isEmpty()) {
222 log.info("NEW! " + c.getNicoId() + " : " + c.getFileName());