OSDN Git Service

コミット漏れ
[coroid/inqubus.git] / frontend / src / saccubus / converter / filegetter / FileInstanciator.java
1 /* $Id$ */
2 package saccubus.converter.filegetter;
3
4 import java.io.File;
5 import java.io.FileNotFoundException;
6 import java.io.IOException;
7 import org.apache.commons.io.FilenameUtils;
8 import saccubus.ConvertStopFlag;
9 import yukihane.saccubus.converter.profile.InputFileSetting;
10 import saccubus.net.TextProgressListener;
11 import yukihane.saccubus.converter.profile.LoinProfile;
12 import yukihane.saccubus.converter.profile.ProxyProfile;
13
14 /**
15  * ダウンロード処理を全く必要としない場合のファイルインスタンス化クラス.
16  * @author yuki
17  */
18 public class FileInstanciator {
19
20     private final InstanciationType videoType;
21     private final InstanciationType commentType;
22     private final InstanciationType tcommType;
23     private final String videoId;
24     private FileGetter videoFileGetter;
25     private FileGetter commentFileGetter;
26     private FileGetter tcommFileGetter;
27
28     protected void setVideoFileGetter(FileGetter getter) {
29         this.videoFileGetter = getter;
30     }
31
32     protected void setCommentFileGetter(FileGetter getter) {
33         this.commentFileGetter = getter;
34     }
35
36     protected void setTcommFileGetter(FileGetter getter) {
37         this.tcommFileGetter = getter;
38     }
39
40     public static FileInstanciator create(
41             ConvertStopFlag stopFlag,
42             InstanciationType videoType,
43             CommentInstanciationType commentType,
44             InstanciationType tcommType,
45             LoinProfile li,
46             ProxyProfile proxy,
47             String tag,
48             long time) throws
49             IOException {
50         FileInstanciator getter;
51         if (videoType.isDownload() || commentType.isDownload() || tcommType.isDownload()) {
52             getter = new WebFileInstanciator(stopFlag, videoType, commentType, tcommType, li, proxy, tag, time);
53         } else {
54             getter = new FileInstanciator(videoType, commentType, tcommType, tag);
55         }
56         return getter;
57     }
58
59     protected FileInstanciator(
60             InstanciationType videoType,
61             InstanciationType commentType,
62             InstanciationType tcommType,
63             String videoId) {
64         this.videoType = videoType;
65         this.commentType = commentType;
66         this.tcommType = tcommType;
67         this.videoId = videoId;
68         FileGetter getter = new FileGetter();
69         setVideoFileGetter(getter);
70         setCommentFileGetter(getter);
71         setTcommFileGetter(getter);
72     }
73
74     /**
75      * @return 動画のタイトル.
76      * @throws FileNotFoundException ビデオタイトルの自動命名時、参考となるファイルが見つからなかった。
77      */
78     public String getVideoTitle() throws FileNotFoundException {
79         String fileName = null;
80         if (!videoType.isAutoFileName()) {
81             // 動画ファイル名を直接指定している場合は、そのファイル名を基にタイトルを取得する.
82             fileName = videoType.getInitFile().toString();
83         } else {
84             // 自動命名の場合は、ディレクトリ内にあるファイルからタイトル名を類推。
85             String[] files = videoType.getInitFile().list();
86             if (files != null) {
87                 for (String file : files) {
88                     if (file.startsWith(getVideoIdWithBracket())) {
89                         fileName = FilenameUtils.getBaseName(file);
90                         break;
91                     }
92                 }
93             }
94             if (fileName == null) {
95                 throw new FileNotFoundException(getVideoIdWithBracket() + "のファイルを特定できませんでした。");
96             }
97         }
98
99         String baseName = FilenameUtils.getBaseName(fileName);
100         int s = baseName.indexOf(getVideoIdWithBracket());
101         return baseName.replace(getVideoIdWithBracket(), "");
102     }
103
104     /**
105      * 動画ファイルを取得します.
106      * @param listener 進捗通知を受け取るためのリスナ.
107      * @return 動画ファイル.
108      * @throws IOException 動画ファイルが存在しない, 取得に失敗した.
109      */
110     public final File getVideoFile(TextProgressListener listener) throws IOException {
111         File file = new FileLocator(videoType.isAutoFileName(), videoType.getInitFile(), getVideoIdWithBracket(),
112                 getVideoTitle(), ".flv", ".mp4", ".swf").getFile();
113         file = videoFileGetter.get(file, listener);
114         return file;
115     }
116
117     /**
118      * コメントファイルを取得します.
119      * @param listener 進捗通知を受け取るためのリスナ.
120      * @return コメントファイル.
121      * @throws IOException コメントファイルが存在しない, 取得に失敗した.
122      */
123     public final File getCommentFile(TextProgressListener listener) throws IOException {
124         File file = new FileLocator(commentType.isAutoFileName(), commentType.getInitFile(), getVideoIdWithBracket(),
125                 getVideoTitle(), ".xml").getFile();
126         file = commentFileGetter.get(file, listener);
127         return file;
128     }
129
130     /**
131      * 投稿者コメントファイルを取得します.
132      * @param listener 進捗通知を受け取るためのリスナ.
133      * @return 投稿者コメントファイル.
134      * @throws IOException コメントファイルが存在しない, 取得に失敗した.
135      */
136     public final File getTcommFile(TextProgressListener listener) throws IOException {
137         File file = new FileLocator(tcommType.isAutoFileName(), tcommType.getInitFile(), getVideoIdWithBracket(),
138                 getVideoTitle(), ".xml").getFile();
139         file = tcommFileGetter.get(file, listener);
140         return file;
141     }
142
143     private String getVideoIdWithBracket() {
144         return "[" + videoId + "]";
145     }
146
147     public static class InstanciationType {
148
149         private final boolean download;
150         private final boolean autoFileName;
151         private final File initFile;
152
153         /**
154          * ファイルをインスタンス化する方法を指定するクラス.
155          */
156         public InstanciationType(InputFileSetting fileSetting) {
157             this.download = fileSetting.isDownload();
158             this.autoFileName = !fileSetting.getFile().isFile();
159             this.initFile = fileSetting.getFile().getFile();
160         }
161
162         public boolean isDownload() {
163             return download;
164         }
165
166         public File getInitFile() {
167             return initFile;
168         }
169
170         public boolean isAutoFileName() {
171             return autoFileName;
172         }
173     }
174
175     public static class CommentInstanciationType extends InstanciationType {
176
177         private final boolean autoCommentNum;
178         private final int backComment;
179         private final boolean reduceComment;
180
181         public CommentInstanciationType(InputFileSetting fileSetting, boolean autoCommentNum, int backComment,
182                 boolean reduceComment) {
183             super(fileSetting);
184             this.autoCommentNum = autoCommentNum;
185             this.backComment = backComment;
186             this.reduceComment = reduceComment;
187         }
188
189         public boolean isAutoCommentNum() {
190             return autoCommentNum;
191         }
192
193         public int getBackComment() {
194             return backComment;
195         }
196
197         boolean isReduceComment() {
198             return reduceComment;
199         }
200     }
201 }