OSDN Git Service

b30c087243cda3f1c09ec1025fc2ca2ff58cd479
[coroid/NicoBrowser.git] / src / nicobrowser / main / Main.java
1 /*$Id$*/
2 package nicobrowser.main;
3
4 import java.io.File;
5 import java.util.ArrayList;
6 import java.util.Calendar;
7 import java.util.Date;
8 import java.util.HashMap;
9 import java.util.List;
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;
37
38 public class Main {
39
40     public static final String VERSION = "0.12.0";
41     private static Logger log = LoggerFactory.getLogger(Main.class);
42
43     public static void main(String[] args) throws Exception {
44         final boolean res = Config.createNewConfigFiles();
45
46         CommandLineParser parser = new PosixParser();
47         Options options = createOptions();
48
49         try {
50             // parse the command line arguments
51             CommandLine line = parser.parse(options, args);
52
53             if (line.hasOption("help")) {
54                 new HelpFormatter().printHelp("java -jar NicoBrowser.jar [option]", options);
55                 return;
56             } else if (line.hasOption("version")) {
57                 System.out.println(VERSION);
58                 return;
59             } else if (line.hasOption("property")) {
60                 propertyOpen();
61                 return;
62             }
63         } catch (ParseException exp) {
64             HelpFormatter formatter = new HelpFormatter();
65             formatter.printHelp("java -jar NicoBrowser.jar [option]", options);
66             return;
67         }
68
69         if (res) {
70             propertyOpen();
71             return;
72         }
73
74         DBUpdater updater = new DBUpdater();
75         if (args.length > 0 && "sync".equals(args[0])) {
76             updater.sync();
77             return;
78         } else if (args.length > 0 && "sync4".equals(args[0])) {
79             updater.sync_for_4();
80             return;
81         }
82         updater.update();
83
84         new Main().start();
85     }
86
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, "バージョン情報を表示します");
92         return options;
93     }
94
95     private static void propertyOpen() {
96         SwingUtilities.invokeLater(new Runnable() {
97
98             public void run() {
99                 ConfigFrame.setLookAndFeel();
100                 JFrame frame = new ConfigFrame();
101                 frame.setLocationByPlatform(true);
102                 frame.setVisible(true);
103             }
104         });
105     }
106
107     public void start() {
108         log.info("program start");
109
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;
114         try {
115             log.info("リストを取得します");
116             if (config.getProxyUse()) {
117                 final int port = Integer.parseInt(config.getProxyPort());
118                 instance = new NicoHttpClient(config.getProxyHost(), port);
119             } else {
120                 instance = new NicoHttpClient();
121             }
122             List<NicoFeed> feeds = config.getNicoFeeds();
123             for (NicoFeed f : feeds) {
124                 List<NicoContent> list = instance.getContentsFromRss(f.getUrl());
125                 int count = 0;
126                 for (NicoContent l : list) {
127                     if (count >= f.getNumber()) {
128                         break;
129                     }
130                     dailyList.add(l);
131                     count++;
132                 }
133             }
134             List<String> mylists = config.getDownLoadMyList();
135             for (String l : mylists) {
136                 List<NicoContent> list = instance.loadMyList(l);
137                 myLists.add(list);
138             }
139         } catch (Exception e) {
140             e.printStackTrace();
141             return;
142         }
143
144         log.info("今回取得したデータを過去の取得データと比較します");
145
146         EntityManagerFactory factory;
147         EntityManager manager;
148
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();
153
154         EntityTransaction transaction = manager.getTransaction();
155
156         transaction.begin();
157         try {
158             // ランキング上位のコンテンツ保存
159             int num = 0;
160             for (NicoContent c : dailyList) {
161                 save(manager, c);
162                 num++;
163             }
164
165             // マイリストに登録したコンテンツ保存
166             for (List<NicoContent> l : myLists) {
167                 for (NicoContent c : l) {
168                     save(manager, c);
169                 }
170             }
171
172             transaction.commit();
173
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()) {
181                     continue;
182                 }
183                 if (prevDate != null) {
184                     Date nowDate = Calendar.getInstance().getTime();
185                     long sleep = nowDate.getTime() - prevDate.getTime();
186                     sleep = config.getWaitTime() * 1000 - sleep;
187                     if (sleep > 0) {
188                         log.info("" + sleep / 1000 + "秒待機します。");
189                         try {
190                             Thread.sleep(sleep);
191                         } catch (InterruptedException e) {
192                             log.info("スリープ中断", e);
193                         }
194                     }
195                 }
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();
201                 if (!authed) {
202                     log.info("ログインします");
203                     instance.login(config.getNicoMail(), config.getNicoPassword());
204                 }
205                 try {
206                     VideoInfo vi = instance.getVideoInfo(c.getNicoId());
207                     GetFlvResult result = instance.getFlvFile(vi, saveDir, np, c.getStatus(), config.needLowFile(),
208                             ProgressListener.EMPTY_LISTENER);
209
210                     final File f = result.getFile();
211                     if(f != null){
212                         c.setFileName(FilenameUtils.getBaseName(f.toString()));
213                     }
214                     c.setAuthor(result.getAuthor());
215                     Status status = result.getStatus();
216                     c.setStatus(status);
217                     if (status == Status.GET_INFO) {
218                         c.setFailTimes(c.getFailTimes() + 1);
219                     }
220                 } catch (Exception ex) {
221                     c.setFailTimes(c.getFailTimes() + 1);
222                     log.error("ファイル取得に失敗しました: " + c.getNicoId() + ", 通算失敗回数: " + c.getFailTimes(), ex);
223                 }
224                 transaction.begin();
225                 manager.persist(c);
226                 transaction.commit();
227                 log.info("完了しました");
228             }
229         } catch (Exception ex) {
230             ex.printStackTrace();
231             transaction.rollback();
232         } finally {
233             manager.close();
234             factory.close();
235         }
236
237     }
238
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());
246             manager.persist(c);
247         }
248     }
249 }