OSDN Git Service

ダウンロード失敗をIOExceptionで返すように変更。
[coroid/inqubus.git] / frontend / src / saccubus / converter / Converter.java
1 package saccubus.converter;
2
3 import saccubus.converter.profile.Profile;
4 import saccubus.converter.profile.FfmpegOption;
5 import saccubus.converter.filegetter.FileInstanciator;
6 import java.io.File;
7 import java.io.IOException;
8 import saccubus.ConvertStopFlag;
9 import saccubus.net.TextProgressListener;
10
11 /**
12  * <p>\83^\83C\83g\83\8b\82³\82«\82ã\82Î\82·</p>
13  *
14  * <p>\90à\96¾: \83j\83R\83j\83R\93®\89æ\82Ì\93®\89æ\82ð\83R\83\81\83\93\83g\82Â\82«\82Å\95Û\91¶</p>
15  *
16  * <p>\92\98\8dì\8c : Copyright (c) 2007 PSI</p>
17  *
18  * <p>\89ï\8eÐ\96¼: </p>
19  *
20  * @author \96¢\93ü\97Í
21  * @version 1.0
22  */
23 public class Converter extends AbstractCommand implements Runnable {
24
25     private static final String VIDEO_URL_PARSER = "http://www.nicovideo.jp/watch/";
26     private final Profile Setting;
27     private final String Tag;
28     private final String Time;
29
30     public Converter(String url, String time, Profile setting,
31             TextProgressListener listener, ConvertStopFlag flag) {
32         super(listener, flag);
33         url = url.trim();
34         if (url.startsWith(VIDEO_URL_PARSER)) {
35             int index = url.indexOf('?', VIDEO_URL_PARSER.length());
36             if (index >= 0) {
37                 Tag = url.substring(VIDEO_URL_PARSER.length(), index);
38             } else {
39                 Tag = url.substring(VIDEO_URL_PARSER.length());
40             }
41         } else {
42             Tag = url;
43         }
44         Time = time;
45         Setting = setting;
46     }
47
48     @Override
49     public void run() {
50         try {
51             runConvert();
52         } catch (Exception ex) {
53             String text = (ex.getMessage() != null) ? ex.getMessage() : "\97\\8aú\82µ\82È\82¢\83G\83\89\81[\94­\90\82Ì\82½\82ß\92\86\92f\82µ\82Ü\82µ\82½\81B";
54             sendText(text);
55             ex.printStackTrace();
56         } finally {
57             getStopFlag().finished();
58         }
59     }
60
61     private void runConvert() throws IOException, InterruptedException {
62         if (!Setting.shouldRun()) {
63             sendText("\89½\82à\82·\82é\82±\82Æ\82ª\82 \82è\82Ü\82¹\82ñ");
64             return;
65         }
66
67         validSetting();
68         final FfmpegOption ov = Setting.getFfmpeg().getFfmpegOption();
69
70         sendText("\83\8d\83O\83C\83\93\92\86");
71
72         final FileInstanciator fi = createInstanciator();
73
74         stopFlagReturn();
75
76         final File videoFile = fi.getVideoFile(getListener());
77
78         stopFlagReturn();
79
80         File commentFile = fi.getCommentFile(getListener());
81
82         stopFlagReturn();
83
84         File tcommFile = fi.getTcommFile(getListener());
85
86         if (!Setting.needsConvert()) {
87             sendText("\93®\89æ\81E\83R\83\81\83\93\83g\82ð\95Û\91\82µ\81A\95Ï\8a·\82Í\8ds\82¢\82Ü\82¹\82ñ\82Å\82µ\82½\81B");
88             return;
89         }
90
91         if (!videoFile.isFile()) {
92             throw new IOException("\93ü\97Í\93®\89æ\83t\83@\83C\83\8b\82ª\91\8dÝ\82µ\82Ü\82¹\82ñ:" + videoFile.getPath());
93         }
94
95         if (Setting.getOutputFileSetting().isAddComment()) {
96             if (!commentFile.isFile()) {
97                 throw new IOException("\93ü\97Í\83R\83\81\83\93\83g\83t\83@\83C\83\8b\82ª\91\8dÝ\82µ\82Ü\82¹\82ñ:" + commentFile.getPath());
98             }
99         } else {
100             commentFile = null;
101         }
102
103         if (Setting.getOutputFileSetting().isAddTcomment()) {
104             if (!tcommFile.isFile()) {
105                 throw new IOException("\93ü\97Í\93\8a\8de\8eÒ\83R\83\81\83\93\83g\83t\83@\83C\83\8b\82ª\91\8dÝ\82µ\82Ü\82¹\82ñ" + tcommFile.getPath());
106             }
107         } else {
108             tcommFile = null;
109         }
110
111         /*\83r\83f\83I\96¼\82Ì\8am\92è*/
112         File convertedVideoFile;
113         if (!Setting.getOutputFileSetting().getFile().isFile()) {
114             String conv_name = fi.getVideoTitle();
115             if (Setting.getOutputFileSetting().isAppendPrefixVideoId()) {
116                 conv_name = getVideoIDWithBracket() + conv_name;
117             }
118             convertedVideoFile = new File(Setting.getOutputFileSetting().getFile().getFile(),
119                     conv_name + ov.getExtOption());
120         } else {
121             String filename = Setting.getOutputFileSetting().getFile().getFile().getPath();
122             if (!filename.endsWith(ov.getExtOption())) {
123                 filename = filename.substring(0, filename.lastIndexOf('.')) + ov.getExtOption();
124                 convertedVideoFile = new File(filename);
125             } else {
126                 convertedVideoFile = Setting.getOutputFileSetting().getFile().getFile();
127             }
128         }
129
130         boolean res = new FfmpegCommand(getListener(), getStopFlag(), commentFile, tcommFile, videoFile,
131                 convertedVideoFile, Setting.getFfmpeg()).execute();
132         if (res) {
133             if (Setting.getCommentSetting().isDelete()) {
134                 commentFile.delete();
135             }
136             if (Setting.getVideoSetting().isDelete()) {
137                 videoFile.delete();
138             }
139             if (Setting.getTcommentSetting().isDelete()) {
140                 tcommFile.delete();
141             }
142         }
143     }
144
145     private FileInstanciator createInstanciator() throws IOException {
146         FileInstanciator fi;
147
148         FileInstanciator.InstanciationType videoType = new FileInstanciator.InstanciationType(Setting.getVideoSetting());
149
150         FileInstanciator.CommentInstanciationType commentType = new FileInstanciator.CommentInstanciationType(Setting.
151                 getCommentSetting(), Setting.getCommentGetInfo().isselfAdjustCommentNum(), Setting.getCommentGetInfo().
152                 getBackComment());
153
154         FileInstanciator.InstanciationType tcommType = new FileInstanciator.InstanciationType(
155                 Setting.getTcommentSetting());
156
157         fi = FileInstanciator.create(getStopFlag(), videoType, commentType, tcommType, Setting.getLoginInfo(), Tag, Time);
158         return fi;
159     }
160
161     /**
162      * (\83l\83b\83g\83\8f\81[\83N\90Ý\92è\88È\8aO\82Ì)\90Ý\92è\82ð\8c\9f\8fØ\82·\82é.
163      * @throws IllegalArgumentException \90Ý\92è\82É\95s\94õ\82ª\82 \82é\8fê\8d\87.
164      */
165     private void validSetting() {
166         if (Setting.needsConvert()) {
167             File a = Setting.getFfmpeg().getFfmpeg();
168             if (!a.canRead()) {
169                 throw new IllegalArgumentException("FFmpeg\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ\81B");
170             }
171             if (Setting.getFfmpeg().getVhook().getPath().indexOf(' ') >= 0) {
172                 throw new IllegalArgumentException("\82·\82¢\82Ü\82¹\82ñ\81B\8c»\8dÝvhook\83\89\83C\83u\83\89\83\8a\82É\82Í\94¼\8ap\8bó\94\92\82Í\8eg\82¦\82Ü\82¹\82ñ\81B");
173             }
174             a = Setting.getFfmpeg().getVhook();
175             if (!a.canRead()) {
176                 throw new IllegalArgumentException("Vhook\83\89\83C\83u\83\89\83\8a\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ\81B");
177             }
178             a = Setting.getFfmpeg().getFont();
179             if (!a.canRead()) {
180                 throw new IllegalArgumentException("\83t\83H\83\93\83g\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ\81B");
181             }
182         } else {
183             if (Setting.getVideoSetting().isDelete()) {
184                 throw new IllegalArgumentException("\95Ï\8a·\82µ\82È\82¢\82Ì\82É\81A\93®\89æ\8dí\8f\9c\82µ\82¿\82á\82Á\82Ä\97Ç\82¢\82ñ\82Å\82·\82©\81H");
185             }
186             if (Setting.getCommentSetting().isDelete()) {
187                 throw new IllegalArgumentException("\95Ï\8a·\82µ\82È\82¢\82Ì\82É\81A\83R\83\81\83\93\83g\8dí\8f\9c\82µ\82¿\82á\82Á\82Ä\97Ç\82¢\82ñ\82Å\82·\82©\81H");
188             }
189             if (Setting.getTcommentSetting().isDelete()) {
190                 throw new IllegalArgumentException("\95Ï\8a·\82µ\82È\82¢\82Ì\82É\81A\93\8a\8de\8eÒ\83R\83\81\83\93\83g\8dí\8f\9c\82µ\82¿\82á\82Á\82Ä\97Ç\82¢\82ñ\82Å\82·\82©\81H");
191             }
192         }
193     }
194
195     private String getVideoIDWithBracket() {
196         return "[" + Tag + "]";
197     }
198
199     public boolean isConverted() {
200         return getStopFlag().isFinished();
201     }
202
203     @Override
204     public ConvertStopFlag getStopFlag() {
205         return super.getStopFlag();
206     }
207 }