OSDN Git Service

インタフェース名変更: LoginInfo -> LoginProfile
[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.Proxy;
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             Proxy proxy,
47             String tag, String time) throws
48             IOException {
49         FileInstanciator getter;
50         if (videoType.isDownload() || commentType.isDownload() || tcommType.isDownload()) {
51             getter = new WebFileInstanciator(stopFlag, videoType, commentType, tcommType, li, proxy, tag, time);
52         } else {
53             getter = new FileInstanciator(videoType, commentType, tcommType, tag);
54         }
55         return getter;
56     }
57
58     protected FileInstanciator(
59             InstanciationType videoType,
60             InstanciationType commentType,
61             InstanciationType tcommType,
62             String videoId) {
63         this.videoType = videoType;
64         this.commentType = commentType;
65         this.tcommType = tcommType;
66         this.videoId = videoId;
67         FileGetter getter = new FileGetter();
68         setVideoFileGetter(getter);
69         setCommentFileGetter(getter);
70         setTcommFileGetter(getter);
71     }
72
73     /**
74      * @return 動画のタイトル.
75      * @throws FileNotFoundException ビデオタイトルの自動命名時、参考となるファイルが見つからなかった。
76      */
77     public String getVideoTitle() throws FileNotFoundException {
78         String fileName = null;
79         if (!videoType.isAutoFileName()) {
80             // 動画ファイル名を直接指定している場合は、そのファイル名を基にタイトルを取得する.
81             fileName = videoType.getInitFile().toString();
82         } else {
83             // 自動命名の場合は、ディレクトリ内にあるファイルからタイトル名を類推。
84             String[] files = videoType.getInitFile().list();
85             if (files != null) {
86                 for (String file : files) {
87                     if (file.startsWith(getVideoIdWithBracket())) {
88                         fileName = FilenameUtils.getBaseName(file);
89                         break;
90                     }
91                 }
92             }
93             if (fileName == null) {
94                 throw new FileNotFoundException(getVideoIdWithBracket() + "のファイルを特定できませんでした。");
95             }
96         }
97
98         String baseName = FilenameUtils.getBaseName(fileName);
99         int s = baseName.indexOf(getVideoIdWithBracket());
100         return baseName.replace(getVideoIdWithBracket(), "");
101     }
102
103     /**
104      * 動画ファイルを取得します.
105      * @param listener 進捗通知を受け取るためのリスナ.
106      * @return 動画ファイル.
107      * @throws IOException 動画ファイルが存在しない, 取得に失敗した.
108      */
109     public final File getVideoFile(TextProgressListener listener) throws IOException {
110         File file = new FileLocator(videoType.isAutoFileName(), videoType.getInitFile(), getVideoIdWithBracket(),
111                 getVideoTitle(), ".flv", ".mp4", ".swf").getFile();
112         file = videoFileGetter.get(file, listener);
113         return file;
114     }
115
116     /**
117      * コメントファイルを取得します.
118      * @param listener 進捗通知を受け取るためのリスナ.
119      * @return コメントファイル.
120      * @throws IOException コメントファイルが存在しない, 取得に失敗した.
121      */
122     public final File getCommentFile(TextProgressListener listener) throws IOException {
123         File file = new FileLocator(commentType.isAutoFileName(), commentType.getInitFile(), getVideoIdWithBracket(),
124                 getVideoTitle(), ".xml").getFile();
125         file = commentFileGetter.get(file, listener);
126         return file;
127     }
128
129     /**
130      * 投稿者コメントファイルを取得します.
131      * @param listener 進捗通知を受け取るためのリスナ.
132      * @return 投稿者コメントファイル.
133      * @throws IOException コメントファイルが存在しない, 取得に失敗した.
134      */
135     public final File getTcommFile(TextProgressListener listener) throws IOException {
136         File file = new FileLocator(tcommType.isAutoFileName(), tcommType.getInitFile(), getVideoIdWithBracket(),
137                 getVideoTitle(), ".xml").getFile();
138         file = tcommFileGetter.get(file, listener);
139         return file;
140     }
141
142     private String getVideoIdWithBracket() {
143         return "[" + videoId + "]";
144     }
145
146     public static class InstanciationType {
147
148         private final boolean download;
149         private final boolean autoFileName;
150         private final File initFile;
151
152         /**
153          * ファイルをインスタンス化する方法を指定するクラス.
154          */
155         public InstanciationType(InputFileSetting fileSetting) {
156             this.download = fileSetting.isDownload();
157             this.autoFileName = !fileSetting.getFile().isFile();
158             this.initFile = fileSetting.getFile().getFile();
159         }
160
161         public boolean isDownload() {
162             return download;
163         }
164
165         public File getInitFile() {
166             return initFile;
167         }
168
169         public boolean isAutoFileName() {
170             return autoFileName;
171         }
172     }
173
174     public static class CommentInstanciationType extends InstanciationType {
175
176         private final boolean autoCommentNum;
177         private final int backComment;
178         private final boolean reduceComment;
179
180         public CommentInstanciationType(InputFileSetting fileSetting, boolean autoCommentNum, int backComment,
181                 boolean reduceComment) {
182             super(fileSetting);
183             this.autoCommentNum = autoCommentNum;
184             this.backComment = backComment;
185             this.reduceComment = reduceComment;
186         }
187
188         public boolean isAutoCommentNum() {
189             return autoCommentNum;
190         }
191
192         public int getBackComment() {
193             return backComment;
194         }
195
196         boolean isReduceComment() {
197             return reduceComment;
198         }
199     }
200 }