OSDN Git Service

aaca44b4f76a9261f46d77e64104b38383a77896
[coroid/NicoBrowser.git] / src / nicobrowser / main / Main.java
1 /*$Id$*/
2 package nicobrowser.main;
3
4 import java.io.File;
5 import java.io.IOException;
6 import java.util.ArrayList;
7 import java.util.Calendar;
8 import java.util.Date;
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;
34
35 public class Main {
36
37     public static final String VERSION = "version 0.3.0";
38     private static Log log = LogFactory.getLog(Main.class);
39
40     public static void main(String[] args) throws IOException {
41         final boolean res = Config.createNewConfigFiles();
42
43         CommandLineParser parser = new PosixParser();
44         Options options = createOptions();
45
46         try {
47             // parse the command line arguments
48             CommandLine line = parser.parse(options, args);
49
50             if (line.hasOption("help")) {
51                 new HelpFormatter().printHelp("java -jar NicoBrowser.jar [option]", options);
52                 return;
53             } else if (line.hasOption("version")) {
54                 System.out.println(VERSION);
55                 return;
56             } else if (line.hasOption("property")) {
57                 propertyOpen();
58                 return;
59             }
60         } catch (ParseException exp) {
61             HelpFormatter formatter = new HelpFormatter();
62             formatter.printHelp("java -jar NicoBrowser.jar [option]", options);
63             return;
64         }
65
66         if (res) {
67             propertyOpen();
68             return;
69         }
70
71         DBUpdater updater = new DBUpdater();
72         if (args.length > 0 && "sync".equals(args[0])) {
73             updater.sync();
74             return;
75         }
76         updater.update();
77
78         new Main().start();
79     }
80
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, "バージョン情報を表示します");
86         return options;
87     }
88
89     private static void propertyOpen() {
90         SwingUtilities.invokeLater(new Runnable() {
91
92             public void run() {
93                 ConfigFrame.setLookAndFeel();
94                 JFrame frame = new ConfigFrame();
95                 frame.setLocationByPlatform(true);
96                 frame.setVisible(true);
97             }
98         });
99     }
100
101     public void start() {
102         log.info("program start");
103
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;
108         try {
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());
114                 int count = 0;
115                 for (NicoContent l : list) {
116                     if (count >= f.getNumber()) {
117                         break;
118                     }
119                     dailyList.add(l);
120                     count++;
121                 }
122             }
123             List<String> mylists = config.getDownLoadMyList();
124             for (String l : mylists) {
125                 List<NicoContent> list = instance.loadMyList(l);
126                 myLists.add(list);
127             }
128         } catch (Exception e) {
129             e.printStackTrace();
130             return;
131         }
132
133         log.info("今回取得したデータを過去の取得データと比較します");
134
135         EntityManagerFactory factory;
136         EntityManager manager;
137
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();
142
143         EntityTransaction transaction = manager.getTransaction();
144
145         transaction.begin();
146         try {
147             // ランキング上位のコンテンツ保存
148             int num = 0;
149             for (NicoContent c : dailyList) {
150                 save(manager, c);
151                 num++;
152             }
153
154             // マイリストに登録したコンテンツ保存
155             for (List<NicoContent> l : myLists) {
156                 for (NicoContent c : l) {
157                     save(manager, c);
158                 }
159             }
160
161             transaction.commit();
162
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) {
170                     continue;
171                 }
172                 if (prevDate != null) {
173                     Date nowDate = Calendar.getInstance().getTime();
174                     long sleep = nowDate.getTime() - prevDate.getTime();
175                     sleep = config.getWaitTime() * 1000 - sleep;
176                     if (sleep > 0) {
177                         log.info("" + sleep + "ms sleep");
178                         try {
179                             Thread.sleep(sleep);
180                         } catch (InterruptedException e) {
181                             log.info("スリープ中断", e);
182                         }
183                     }
184                 }
185                 prevDate = Calendar.getInstance().getTime();
186                 File saveLocation = new File(config.getSrcSaveDir(), c.getFileName());
187                 log.info("ファイルを取得します: " + c.getNicoId() + " " + c.getTitle());
188                 try {
189                     GetFlvResult result = instance.getFlvFile(c.getNicoId(),
190                             saveLocation.getCanonicalPath(), c.getStatus(),
191                             true);
192                     c.setAuthor(result.getAuthor());
193                     Status status = result.getStatus();
194                     c.setStatus(status);
195                     if (status == Status.GET_INFO) {
196                         c.setFailTimes(c.getFailTimes() + 1);
197                     }
198                 } catch (Exception ex) {
199                     c.setFailTimes(c.getFailTimes() + 1);
200                     log.error("ファイル取得に失敗しました。" + c.getNicoId() + ", 通算失敗回数: " + c.getFailTimes(), ex);
201                 }
202                 transaction.begin();
203                 manager.persist(c);
204                 transaction.commit();
205                 log.info("完了しました");
206             }
207         } catch (Exception ex) {
208             ex.printStackTrace();
209             transaction.rollback();
210         } finally {
211             manager.close();
212             factory.close();
213         }
214
215     }
216
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());
223             manager.persist(c);
224         }
225     }
226 }