OSDN Git Service

merge
authoryuki <yuki@c066991c-cf13-ec4a-a49a-846e61667af5>
Mon, 21 Dec 2009 05:14:54 +0000 (05:14 +0000)
committeryuki <yuki@c066991c-cf13-ec4a-a49a-846e61667af5>
Mon, 21 Dec 2009 05:14:54 +0000 (05:14 +0000)
20091218_frontend_extention
r302-313
ダウンロード動画の拡張子正常化対応
公式動画コメントダウンロード対応

git-svn-id: http://192.168.11.7/svn/saccubus/trunk@314 c066991c-cf13-ec4a-a49a-846e61667af5

frontend/README.html
frontend/src/saccubus/MainFrame.java
frontend/src/saccubus/net/NicoClient.java
frontend/src/saccubus/net/VideoInfo.java
frontend/src/saccubus/properties/MovieSetting.java
frontend/src/yukihane/Util.java [new file with mode: 0644]

index 6fb584f..9c189a2 100644 (file)
 <ul>\r
   <li>さきゅばすver1.22rの全機能。</li>\r
   <li>投稿者コメントのダウンロード、動画への付与。</li>\r
+  <li>公式動画(soで始まる動画)のコメントダウンロード、変換。</li>\r
+  <ul>\r
+    <li>ただし、URLの入力には未対応。<a\r
+ href="http://www.nicovideo.jp/watch/so8900221">http://www.nicovideo.jp/watch/so8900221</a>\r
+でなく <a href="http://www.nicovideo.jp/watch/1259333700">http://www.nicovideo.jp/watch/1259333700</a>\r
+と入力する必要がある。<br>\r
+    </li>\r
+  </ul>\r
   <li>nmから始まる動画(swf動画)のダウンロード。\r
     <ul>\r
       <li>ただし、変換自体を正しく行えるものは少ないはず(<a href="http://www5.ssw.co.jp/nmm/">ニ\r
 コニコムービーメーカー</a>で作成したものはおそらく正常変換できないだろう)</li>\r
     </ul>\r
   </li>\r
-  <li>動画によって(動画名によって)変換処理が上手くいかない状況がある問題の解消。<br>\r
+  <li>動画によって(動画名によって)変換処理が上手くいかない状況がある問題の改善。</li>\r
+  <li>ダウンロードファイル拡張子の正しい設定。<br>\r
   </li>\r
 </ul>\r
 <h4>NicoBrowser拡張機能</h4>\r
@@ -47,7 +56,8 @@ ver.1.22rが動作できない事象もにちゃんねるで報告されてい
 <p>&nbsp;</p>\r
 <h3>本プログラムの導入方法</h3>\r
 <p>さきゅばすver.1.22rがインストールされているディレクトリに、本プログラムを上書きコピーする。</p>\r
-<p>なお、本プログラムを導入すると、<strong>Saccubus.jar及び<strong>saccubus.xml</strong></strong>が\r
+<p>なお、本プログラムを導入すると、<strong>Saccubus.jar, <strong>nicovideo.dll,\r
+saccubus.xml</strong></strong>が\r
 上書きされる。オリジナルのものを保持したい場合には事前にバックアップをとること。</p>\r
 <p>&nbsp;</p>\r
 <h3>拡張機能の使い方</h3>\r
@@ -70,6 +80,12 @@ ver.1.22rが動作できない事象もにちゃんねるで報告されてい
 <p><br>\r
 </p>\r
 <h3>&nbsp;更新履歴</h3>\r
+<p>2009/12/21 ver.1.3.0<br>\r
+公式動画のコメントダウンロード、変換に対応。<br>\r
+</p>\r
+<p>2009/12/18 ver.1.2.0<br>\r
+ダウンロード動画の拡張子を正しく設定する対応。<br>\r
+</p>\r
 <p>2009/12/15 ver.1.1.1<br>\r
 出力ファイルの初期拡張子誤り修正。<br>\r
 </p>\r
index 9986023..5e7d5fb 100644 (file)
@@ -75,7 +75,7 @@ import yukihane.nicovideo.NicoDBFinder;
 public class MainFrame extends JFrame {
 
     private static final long serialVersionUID = 2564486741331062989L;
-    public static final String VERSION = "1.22r NicoBrowser\8ag\92£ 1.1.1";
+    public static final String VERSION = "1.22r NicoBrowser\8ag\92£ 1.3.0";
     public static final Image WinIcon = Toolkit.getDefaultToolkit().createImage(saccubus.MainFrame.class.getResource(
             "icon32.png"));
     JPanel contentPane;
index 3374297..af8d8fe 100644 (file)
@@ -18,9 +18,13 @@ import java.text.DateFormat;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
 import javax.net.ssl.HttpsURLConnection;
 import saccubus.ConvertStopFlag;
 import saccubus.util.FileUtil;
+import yukihane.Util;
+import static saccubus.net.VideoInfo.OfficialOption;
 
 /**
  * <p>
@@ -123,9 +127,14 @@ public class NicoClient {
             con.connect();
             OutputStream os = con.getOutputStream();
             String tcommStr = (isTcomm) ? "fork=\"1\" " : "";
+            String official = "";
+            OfficialOption oo = vi.getOfficialOption();
+            if (oo != null) {
+                official = "force_184=\"" + oo.getForce184() + "\" threadkey=\"" + oo.getThreadKey() + "\" ";
+            }
             String req = "<thread user_id=\"" + vi.getUserId() + "\" when=\"" + WayBackTime + "\" waybackkey=\""
                     + WayBackKey + "\" res_from=\"-" + back_comment + "\" version=\"20061206\" thread=\"" + vi.
-                    getThreadId() + "\" " + tcommStr + "/>";
+                    getThreadId() + "\" " + tcommStr + official + "/>";
             os.write(req.getBytes());
             os.flush();
             os.close();
@@ -180,9 +189,9 @@ public class NicoClient {
                        return null;
                }
                try {
-                       if (file.canRead()) { // \83t\83@\83C\83\8b\82ª\82·\82Å\82É\91\8dÝ\82·\82é\82È\82ç\8dí\8f\9c\82·\82é\81B
-                               file.delete();
-                       }
+//                     if (file.canRead()) { // \83t\83@\83C\83\8b\82ª\82·\82Å\82É\91\8dÝ\82·\82é\82È\82ç\8dí\8f\9c\82·\82é\81B
+//                             file.delete();
+//                     }
                        HttpURLConnection con = (HttpURLConnection) (new URL(vi.getVideoUrl()))
                                        .openConnection(ConProxy);
                        /* \8fo\97Í\82Ì\82Ý */
@@ -194,8 +203,10 @@ public class NicoClient {
                                System.out.println("Can't get video:" + vi.getVideoUrl());
                                return null;
                        }
+            final String extension = Util.getExtention(con.getContentType());
+            File outFile = appendExtension(file, extension);
                        InputStream is = con.getInputStream();
-                       OutputStream os = new FileOutputStream(file);
+                       OutputStream os = new FileOutputStream(outFile);
                        String content_length_str = con.getHeaderField("Content-length");
                        int max_size = 0;
                        if (content_length_str != null && !content_length_str.equals("")) {
@@ -224,7 +235,7 @@ public class NicoClient {
                                        os.flush();
                                        os.close();
                                        con.disconnect();
-                                       file.delete();
+                                       outFile.delete();
                                        return null;
                                }
                        }
@@ -233,7 +244,7 @@ public class NicoClient {
                        os.flush();
                        os.close();
                        con.disconnect();
-                       return file;
+                       return outFile;
                } catch (FileNotFoundException ex) {
                        ex.printStackTrace();
                } catch (IOException ex) {
@@ -294,67 +305,30 @@ public class NicoClient {
 
     public VideoInfo getVideoInfo(String tag, String time) throws IOException {
         final String videoTitle = getVideoHistoryAndTitle(tag);
-        String threadId = null;
-        String videoUrl = null;
-        String msgUrl = null;
-        String userId = null;
-        int videoLength = -1;
 
         String url = "http://www.nicovideo.jp/api/getflv/" + tag;
         if (tag.startsWith("nm")) {
             url += "?as3=1";
         }
         System.out.print("Getting video informations...");
-        HttpURLConnection con = (HttpURLConnection) (new URL(url)).openConnection(ConProxy);
-        /* \83\8a\83N\83G\83X\83g\82Ì\90Ý\92è */
-        con.setRequestMethod("GET");
-        con.addRequestProperty("Cookie", Cookie);
-        con.addRequestProperty("Connection", "close");
-        con.connect();
-        if (con.getResponseCode() != HttpURLConnection.HTTP_OK) {
-            throw new IOException("Can't getVideoInfo:" + url);
-        }
-        /* \96ß\82è\92l\82Ì\8eæ\93¾ */
-        BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream()));
-        String ret = br.readLine();
-        br.close();
-        con.disconnect();
-        ret = URLDecoder.decode(ret, "Shift_JIS");
-        String[] array = ret.split("&");
-        int cnt = 0;
-        for (int i = 0; i < array.length; i++) {
-            int idx = array[i].indexOf("=");
-            if (idx < 0) {
-                continue;
-            }
-            String key = array[i].substring(0, idx);
-            String value = array[i].substring(idx + 1);
-            if (threadId == null && key.equalsIgnoreCase("thread_id")) {
-                threadId = value;
-                cnt++;
-            } else if (videoUrl == null && key.equalsIgnoreCase("url")) {
-                videoUrl = value;
-                cnt++;
-            } else if (msgUrl == null && key.equalsIgnoreCase("ms")) {
-                msgUrl = value;
-                cnt++;
-            } else if (userId == null && key.equalsIgnoreCase("user_id")) {
-                userId = value;
-                cnt++;
-            } else if (videoLength < 0 && key.equalsIgnoreCase("l")) {
-                try {
-                    videoLength = Integer.parseInt(value);
-                } catch (NumberFormatException e) {
-                    videoLength = -1;
-                }
-            }
-        }
-        if (cnt < 4) {
-            throw new IOException("ng.\nCan't getVideoInfo: Can't get video informations.");
+        Map<String,String> res = new NicoApiRequest(url).get();
+        String threadId = res.get("thread_id");
+        String videoUrl = res.get("url");
+        String msgUrl = res.get("ms");
+        String userId = res.get("user_id");
+        int videoLength = -1;
+        String videoLengthStr = res.get("l");
+        try{
+            videoLength = Integer.parseInt(videoLengthStr);
+        }catch(NumberFormatException ex){}
+
+        OfficialOption oo = null;
+        if ("1".equals(res.get("needs_key"))) {
+            oo = getOfficialOption(threadId);
         }
-        System.out.println("ok.");
 
-        VideoInfo vi = new VideoInfo(videoTitle, threadId, videoUrl, msgUrl, userId, videoLength);
+        VideoInfo vi = new VideoInfo(videoTitle, threadId, videoUrl, msgUrl, userId, videoLength, oo);
+        System.out.println("ok.");
 
         if (!(time == null || time.equals("")) && !getWayBackKey(vi, time)) { // WayBackKey
             throw new IOException();
@@ -362,6 +336,12 @@ public class NicoClient {
         return vi;
     }
 
+    private OfficialOption getOfficialOption(String threadId) throws IOException {
+        String url = "http://www.nicovideo.jp/api/getthreadkey?thread="+threadId;
+        Map<String,String> map = new NicoApiRequest(url).get();
+        return new OfficialOption(map.get("threadkey"), map.get("force_184"));
+    }
+
     private boolean getWayBackKey(VideoInfo vi, String time) {
                System.out.print("Setting wayback time...");
                Date date = null;
@@ -498,4 +478,57 @@ public class NicoClient {
                }
                return true;
        }
+
+    private File appendExtension(File file, String extension) {
+        final String e = "." + extension;
+        final String defExt = ".flv";
+        String path = file.getPath();
+        if (path.endsWith(e)) {
+            return file;
+        } else if (path.endsWith(defExt)) {
+            path = path.substring(0, path.length() - defExt.length());
+        }
+        return new File(path + e);
+    }
+
+    private class NicoApiRequest {
+
+        private final String url;
+
+        private NicoApiRequest(String url) {
+            this.url = url;
+        }
+
+        private Map<String,String> get() throws IOException {
+            Map<String, String> map = new HashMap<String, String>();
+            System.out.print("Getting video informations...");
+            HttpURLConnection con = (HttpURLConnection) (new URL(url)).openConnection(ConProxy);
+            /* \83\8a\83N\83G\83X\83g\82Ì\90Ý\92è */
+            con.setRequestMethod("GET");
+            con.addRequestProperty("Cookie", Cookie);
+            con.addRequestProperty("Connection", "close");
+            con.connect();
+            if (con.getResponseCode() != HttpURLConnection.HTTP_OK) {
+                throw new IOException("Can't getVideoInfo:" + url);
+            }
+            /* \96ß\82è\92l\82Ì\8eæ\93¾ */
+            BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream()));
+            String ret = br.readLine();
+            br.close();
+            con.disconnect();
+            ret = URLDecoder.decode(ret, "Shift_JIS");
+            String[] array = ret.split("&");
+            int cnt = 0;
+            for (int i = 0; i < array.length; i++) {
+                int idx = array[i].indexOf("=");
+                if (idx < 0) {
+                    continue;
+                }
+                String key = array[i].substring(0, idx);
+                String value = array[i].substring(idx + 1);
+                map.put(key, value);
+            }
+            return map;
+        }
+    }
 }
index 3ffa265..ed9c0c5 100644 (file)
@@ -16,14 +16,30 @@ public class VideoInfo {
     private final String msgUrl;
     private final String userId;
     private final int videoLength;
+    private final OfficialOption officialOption;
 
-    VideoInfo(String videoTitle, String threadId, String videoUrl, String msgUrl, String userId, int videoLength) {
+    /**
+     *
+     * @param videoTitle
+     * @param threadId
+     * @param videoUrl
+     * @param msgUrl
+     * @param userId
+     * @param videoLength
+     * @param officialOption null\82à\89Â.
+     */
+    VideoInfo(String videoTitle, String threadId, String videoUrl, String msgUrl, String userId, int videoLength,
+            OfficialOption officialOption) {
+        if (videoTitle == null || threadId == null || videoUrl == null || msgUrl == null || userId == null) {
+            throw new IllegalArgumentException("video information\82Ì\8fî\95ñ\82ª\95s\90³\82Å\82·\81B");
+        }
         this.videoTitle = videoTitle;
         this.threadId = threadId;
         this.videoUrl = videoUrl;
         this.msgUrl = msgUrl;
         this.userId = userId;
         this.videoLength = videoLength;
+        this.officialOption = officialOption;
     }
 
     public String getMsgUrl() {
@@ -49,4 +65,30 @@ public class VideoInfo {
     public String getVideoUrl() {
         return videoUrl;
     }
+
+    public OfficialOption getOfficialOption() {
+        return officialOption;
+    }
+
+    public static class OfficialOption {
+
+        private final String threadKey;
+        private final String force184;
+
+        public OfficialOption(String threadKey, String force184) {
+            if (threadKey == null || force184 == null) {
+                throw new IllegalArgumentException("\8cö\8e®\93®\89æ\97p\83L\81[\82ª\95s\90³\82Å\82·");
+            }
+            this.threadKey = threadKey;
+            this.force184 = force184;
+        }
+
+        public String getThreadKey() {
+            return threadKey;
+        }
+
+        public String getForce184() {
+            return force184;
+        }
+    }
 }
index ecbc725..0b2f529 100644 (file)
@@ -69,7 +69,7 @@ public class MovieSetting {
 
         String ffmpeg = prop.getProperty(PROP_FFMPEG_PATH, ".\\bin\\ffmpeg.exe");
         String vhook = prop.getProperty(PROP_VHOOK_PATH, ".\\bin\\nicovideo.dll");
-        String ext = prop.getProperty(PROP_CMDLINE_EXT, "mp4");
+        String ext = prop.getProperty(PROP_CMDLINE_EXT, ".m4v");
         String main = prop.getProperty(PROP_CMDLINE_MAIN, "");
         String in = prop.getProperty(PROP_CMDLINE_IN, "");
         String out = prop.getProperty(PROP_CMDLINE_OUT, "-f ipod");
diff --git a/frontend/src/yukihane/Util.java b/frontend/src/yukihane/Util.java
new file mode 100644 (file)
index 0000000..efff526
--- /dev/null
@@ -0,0 +1,25 @@
+/* $Id$ */
+package yukihane;
+
+/**
+ * nicobrowser.util.Util\82æ\82è, \95K\97v\82È\82à\82Ì\82ð\83s\83b\83N\83A\83b\83v\82µ\82½\83N\83\89\83X.
+ * @author yuki
+ */
+public class Util {
+
+    /**
+     * Content-Type \82©\82ç\8ag\92£\8eq\82ð\8c\88\92è\82·\82é.
+     * @param contentType Content-Type\95\8e\9a\97ñ.
+     * @return \90\84\91ª\82³\82ê\82é\8ag\92£\8eq.
+     */
+    public static String getExtention(String contentType) {
+        if ("video/flv".equals(contentType) || "video/x-flv".equals(contentType)) {
+            return "flv";
+        } else if ("video/mp4".equals(contentType)) {
+            return "mp4";
+        } else if ("application/x-shockwave-flash".equals(contentType)) {
+            return "swf";
+        }
+        return contentType.split("/")[1];
+    }
+}