OSDN Git Service

bcda5239748ba83f02750c3a5cc73dcc6bcead13
[coroid/inqubus.git] / frontend / src / saccubus / converter / filegetter / WebFileInstanciator.java
1 /* $Id$ */
2 package saccubus.converter.filegetter;
3
4 import java.io.IOException;
5 import java.text.Normalizer;
6 import saccubus.ConvertStopFlag;
7 import saccubus.converter.profile.Proxy;
8 import saccubus.net.CommentInfo;
9 import saccubus.net.NicoClient;
10 import saccubus.net.NicoClientImpl;
11 import saccubus.net.VideoInfo;
12
13 /**
14  * 動画ファイル, コメントファイルなど必要なファイルのうち, 1つでもダウンロード処理を必要とする場合のインスタンス化クラス.
15  * @author yuki
16  */
17 public class WebFileInstanciator extends FileInstanciator {
18
19     private final NicoClient client;
20     private final VideoInfo videoInfo;
21     private final CommentInfo commentInfo;
22
23     WebFileInstanciator(
24             ConvertStopFlag stopFlag,
25             InstanciationType videoType,
26             CommentInstanciationType commentType,
27             InstanciationType tcommType,
28             LoginInfo li,
29             String tag,
30             String time) throws IOException {
31         super(videoType, commentType, tcommType, tag);
32
33         if (li.getMail() == null || li.getPass() == null || li.getMail().equals("") || li.getPass().equals("")) {
34             throw new IllegalArgumentException("メールアドレスかパスワードが空白です。");
35         }
36
37         String host;
38         int port;
39         if (li.getProxy() != Proxy.NO_PROXY) {
40             host = li.getProxy().getHost();
41             port = li.getProxy().getPort();
42         } else {
43             host = null;
44             port = -1;
45         }
46         // TODO Implを直接newしている
47         client = new NicoClientImpl(li.getMail(), li.getPass(), stopFlag, host, port) {};
48
49         if (!client.isLoggedIn()) {
50             throw new IOException("ログインに失敗");
51         }
52
53         try {
54             videoInfo = client.getVideoInfo(tag);
55             commentInfo = client.getWayBackKey(videoInfo, time);
56
57         } catch (IOException ex) {
58             throw new IOException(tag + "の情報の取得に失敗", ex);
59         }
60
61         if (videoType.isDoanload()) {
62             setVideoFileGetter(new VideoFileWebGetter(client, videoInfo));
63         }
64
65         if (commentType.isDoanload()) {
66             setCommentFileGetter(new CommentFileWebGetter(client, videoInfo, commentInfo, commentType.isAutoCommentNum(),
67                     commentType.getBackComment()));
68         }
69
70         if (tcommType.isDoanload()) {
71             setTcommFileGetter(new TcommFileWebGetter(client, videoInfo));
72         }
73     }
74
75     /**
76      * 動画のタイトルを取得する。
77      * 実際の動画タイトルはファイル名に用いることが出来ない文字を含んである場合があるため、ファイル名に適合するように編集した値が返る。
78      * @return
79      */
80     @Override
81     public String getVideoTitle() {
82         String name = videoInfo.getVideoTitle();
83         name = Normalizer.normalize(name, Normalizer.Form.NFKC);
84         name = name.replaceAll("[\\\\/:*?\"<>|.]", "_");
85         name = name.replace('\u2212', '\uff0d'); // - U+2212(MINUS SIGN) -> U+FF0D(FULLWIDTH HYPHEN-MINUS)
86         name = name.replace('\u301c', '\uff5e'); // ~ U+301C(WAVE DASH) -> U+FF5E(FULLWIDTH TILDE)
87         name = name.replace('\u223c', '\uff5e'); // ~ U+223C(TILDE OPERATOR) -> U+FF5E(FULLWIDTH TILDE)
88         name = name.replace('\u00a2', '\uffe0'); // ¢ U+00A2(CENT SIGN) -> U+FFE0(FULLWIDTH CENT SIGN)
89         name = name.replace('\u00a3', '\uffe1'); // £ U+00A3(POUND SIGN) -> U+FFE1(FULLWIDTH POUND SIGN)
90         name = name.replace('\u00ac', '\uffe2'); // ¬ U+00AC(NOT SIGN) -> U+FFE2(FULLWIDHT NOT SIGN)
91         return name;
92     }
93 }