OSDN Git Service

ファイル名永続化漏れの修正
[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.NamePattern;
22 import nicobrowser.NicoHttpClient;
23 import nicobrowser.ProgressListener;
24 import nicobrowser.VideoInfo;
25 import nicobrowser.entity.NicoContent;
26 import nicobrowser.entity.NicoContent.Status;
27 import nicobrowser.gui.config.ConfigFrame;
28 import nicobrowser.update.DBUpdater;
29 import nicobrowser.util.Util;
30 import org.apache.commons.cli.CommandLine;
31 import org.apache.commons.cli.CommandLineParser;
32 import org.apache.commons.cli.HelpFormatter;
33 import org.apache.commons.cli.Options;
34 import org.apache.commons.cli.ParseException;
35 import org.apache.commons.cli.PosixParser;
36 import org.apache.commons.io.FilenameUtils;
37 import org.apache.commons.logging.Log;
38 import org.apache.commons.logging.LogFactory;
39
40 public class Main {
41
42     public static final String VERSION = "version 0.5.1";
43     private static Log log = LogFactory.getLog(Main.class);
44
45     public static void main(String[] args) throws IOException {
46         final boolean res = Config.createNewConfigFiles();
47
48         CommandLineParser parser = new PosixParser();
49         Options options = createOptions();
50
51         try {
52             // parse the command line arguments
53             CommandLine line = parser.parse(options, args);
54
55             if (line.hasOption("help")) {
56                 new HelpFormatter().printHelp("java -jar NicoBrowser.jar [option]", options);
57                 return;
58             } else if (line.hasOption("version")) {
59                 System.out.println(VERSION);
60                 return;
61             } else if (line.hasOption("property")) {
62                 propertyOpen();
63                 return;
64             }
65         } catch (ParseException exp) {
66             HelpFormatter formatter = new HelpFormatter();
67             formatter.printHelp("java -jar NicoBrowser.jar [option]", options);
68             return;
69         }
70
71         if (res) {
72             propertyOpen();
73             return;
74         }
75
76         DBUpdater updater = new DBUpdater();
77         if (args.length > 0 && "sync".equals(args[0])) {
78             updater.sync();
79             return;
80         } else if (args.length > 0 && "sync4".equals(args[0])) {
81             updater.sync_for_4();
82             return;
83         }
84         updater.update();
85
86         new Main().start();
87     }
88
89     private static Options createOptions() throws IllegalArgumentException {
90         Options options = new Options();
91         options.addOption("h", "help", false, "このメッセージを表示します");
92         options.addOption("p", "property", false, "コンフィグ設定画面を起動します");
93         options.addOption("v", "version", false, "バージョン情報を表示します");
94         return options;
95     }
96
97     private static void propertyOpen() {
98         SwingUtilities.invokeLater(new Runnable() {
99
100             public void run() {
101                 ConfigFrame.setLookAndFeel();
102                 JFrame frame = new ConfigFrame();
103                 frame.setLocationByPlatform(true);
104                 frame.setVisible(true);
105             }
106         });
107     }
108
109     public void start() {
110         log.info("program start");
111
112         final Config config = Config.getInstance();
113         List<NicoContent> dailyList = new ArrayList<NicoContent>();
114         ArrayList<List<NicoContent>> myLists = new ArrayList<List<NicoContent>>();
115         NicoHttpClient instance = null;
116         try {
117             log.info("リストを取得します");
118             instance = new NicoHttpClient();
119             List<NicoFeed> feeds = config.getNicoFeeds();
120             for (NicoFeed f : feeds) {
121                 List<NicoContent> list = instance.getContentsFromRss(f.getUrl());
122                 int count = 0;
123                 for (NicoContent l : list) {
124                     if (count >= f.getNumber()) {
125                         break;
126                     }
127                     dailyList.add(l);
128                     count++;
129                 }
130             }
131             List<String> mylists = config.getDownLoadMyList();
132             for (String l : mylists) {
133                 List<NicoContent> list = instance.loadMyList(l);
134                 myLists.add(list);
135             }
136         } catch (Exception e) {
137             e.printStackTrace();
138             return;
139         }
140
141         log.info("今回取得したデータを過去の取得データと比較します");
142
143         EntityManagerFactory factory;
144         EntityManager manager;
145
146         HashMap<String, String> map = new HashMap<String, String>();
147         map.put("toplink.jdbc.url", "jdbc:h2:" + config.getDbFile());
148         factory = Persistence.createEntityManagerFactory("NicoBrowserPU", map);
149         manager = factory.createEntityManager();
150
151         EntityTransaction transaction = manager.getTransaction();
152
153         transaction.begin();
154         try {
155             // ランキング上位のコンテンツ保存
156             int num = 0;
157             for (NicoContent c : dailyList) {
158                 save(manager, c);
159                 num++;
160             }
161
162             // マイリストに登録したコンテンツ保存
163             for (List<NicoContent> l : myLists) {
164                 for (NicoContent c : l) {
165                     save(manager, c);
166                 }
167             }
168
169             transaction.commit();
170
171             Query query = manager.createQuery("SELECT cont FROM NicoContent AS cont " + "WHERE ?1 <> cont.status").
172                     setParameter(1, NicoContent.Status.GET_FILE);
173             List<NicoContent> results = query.getResultList();
174             instance.login(config.getNicoMail(), config.getNicoPassword());
175             Date prevDate = null;
176             for (NicoContent c : results) {
177                 if (c.getFailTimes() >= config.getMaxRetry()) {
178                     continue;
179                 }
180                 if (prevDate != null) {
181                     Date nowDate = Calendar.getInstance().getTime();
182                     long sleep = nowDate.getTime() - prevDate.getTime();
183                     sleep = config.getWaitTime() * 1000 - sleep;
184                     if (sleep > 0) {
185                         log.info("" + sleep / 1000 + "秒待機します。");
186                         try {
187                             Thread.sleep(sleep);
188                         } catch (InterruptedException e) {
189                             log.info("スリープ中断", e);
190                         }
191                     }
192                 }
193                 prevDate = Calendar.getInstance().getTime();
194                 File saveDir = new File(config.getSrcSaveDir());
195                 NamePattern np = new NamePattern(config.getFileNamePattern(), Util.getRegularFileName(c.getTitle()));
196                 log.info("ファイルを取得します: " + c.getNicoId() + " " + c.getTitle());
197                 try {
198                     VideoInfo vi = instance.getVideoInfo(c.getNicoId());
199                     GetFlvResult result = instance.getFlvFile(vi, saveDir, np, c.getStatus(), config.needLowFile(),
200                             ProgressListener.EMPTY_LISTENER);
201
202                     c.setFileName(FilenameUtils.getBaseName(result.getFile().toString()));
203                     c.setAuthor(result.getAuthor());
204                     Status status = result.getStatus();
205                     c.setStatus(status);
206                     if (status == Status.GET_INFO) {
207                         c.setFailTimes(c.getFailTimes() + 1);
208                     }
209                 } catch (Exception ex) {
210                     c.setFailTimes(c.getFailTimes() + 1);
211                     log.error("ファイル取得に失敗しました: " + c.getNicoId() + ", 通算失敗回数: " + c.getFailTimes(), ex);
212                 }
213                 transaction.begin();
214                 manager.persist(c);
215                 transaction.commit();
216                 log.info("完了しました");
217             }
218         } catch (Exception ex) {
219             ex.printStackTrace();
220             transaction.rollback();
221         } finally {
222             manager.close();
223             factory.close();
224         }
225
226     }
227
228     private void save(EntityManager manager, NicoContent c) {
229         Query query = manager.createQuery("SELECT cont FROM NicoContent AS cont " + "WHERE ?1 = cont.nicoId").
230                 setParameter(1, c.getNicoId());
231         List<NicoContent> resList = query.getResultList();
232         if (resList.isEmpty()) {
233             log.info("NEW! " + c.getNicoId() + " : " + c.getTitle());
234             manager.persist(c);
235         }
236     }
237 }