OSDN Git Service

merge
authoryuki <yuki@c066991c-cf13-ec4a-a49a-846e61667af5>
Sat, 1 May 2010 07:17:25 +0000 (07:17 +0000)
committeryuki <yuki@c066991c-cf13-ec4a-a49a-846e61667af5>
Sat, 1 May 2010 07:17:25 +0000 (07:17 +0000)
20100413_frontend_linux

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

frontend/README.html
frontend/src/saccubus/MainFrame.java
frontend/src/saccubus/OptionComboBoxModel.java
frontend/src/saccubus/converter/FfmpegCommand.java
frontend/src/saccubus/converter/profile/SFile.java
frontend/src/saccubus/properties/ConvertSetting.java
frontend/src/saccubus/properties/InputCommentSetting.java
frontend/src/saccubus/properties/InputTcommentSetting.java
frontend/src/saccubus/properties/InputVideoSetting.java
frontend/src/saccubus/properties/MovieSetting.java
frontend/src/saccubus/properties/OutputVideoSetting.java

index 06a3433..1cc1324 100644 (file)
 <p>本プログラムは、<a\r
  href="http://feather.cocolog-nifty.com/weblog/2009/11/nicobrowser---f.html">NicoBrowser</a>で\r
 ダウンロードしたコンテンツを<a href="http://saccubus.sourceforge.jp/">さきゅばす</a>ver.1.22r\r
\81«å\87¦ç\90\86ã\81\95ã\81\9bã\82\8bã\81\93ã\81¨ã\81\8cã\81§ã\81\8dã\82\8bã\82\88ã\81\86æ\8b¡å¼µã\81\97ã\81\9fã\82\82ã\81®ã\81§ã\81\82ã\82\8b。</p>\r
\81«å\87¦ç\90\86ã\81\95ã\81\9bã\82\8bã\81\93ã\81¨ã\81\8cã\81§ã\81\8dã\82\8bã\82\88ã\81\86æ\8b¡å¼µã\81\97ã\81\9fã\82\82ã\81®ã\81§ã\81\99。</p>\r
 <h3>&nbsp;改正著作権法に関して留意事項<br>\r
 </h3>\r
-<p>2010年1月1日より著作権法が改正される。これに伴い、本プログラムの使用用途によっては改正著作権法に抵触する恐れがある。詳細は以下のペー\r
-ジ、及びこのページのリンク先文化庁サイトを参照のこと。<br>\r
+<p>2010年1月1日より著作権法が改正されました。これに伴い、本プログラムの使用用途によっては改正著作権法に抵触する恐れがあります。詳細は以\r
+下のペー\r
+ジ、及びこのページのリンク先文化庁サイトを参照してください。<br>\r
 <a href="http://feather.cocolog-nifty.com/weblog/2009/12/post-b7a9.html">http://feather.cocolog-nifty.com/weblog/2009/12/post-b7a9.html</a></p>\r
 <h3>機能</h3>\r
 <h4>基本機能</h4>\r
   <li>nmから始まる動画(swf動画)のダウンロード。\r
     <ul>\r
       <li>ただし、変換自体を正しく行えるものは少ないはず(<a href="http://www5.ssw.co.jp/nmm/">ニ\r
\82³ã\83\8bã\82³ã\83 ã\83¼ã\83\93ã\83¼ã\83¡ã\83¼ã\82«ã\83¼</a>ã\81§ä½\9cæ\88\90ã\81\97ã\81\9fã\82\82ã\81®ã\81¯ã\81\8aã\81\9dã\82\89ã\81\8f正常å¤\89æ\8f\9bã\81§ã\81\8dã\81ªã\81\84ã\81 ã\82\8dう)</li>\r
\82³ã\83\8bã\82³ã\83 ã\83¼ã\83\93ã\83¼ã\83¡ã\83¼ã\82«ã\83¼</a>ã\81§ä½\9cæ\88\90ã\81\97ã\81\9fã\82\82ã\81®ã\81¯ã\81\8aã\81\9dã\82\89ã\81\8f正常å¤\89æ\8f\9bã\81§ã\81\8dã\81ªã\81\84ã\81§ã\81\97ã\82\87う)</li>\r
     </ul>\r
   </li>\r
+  <li>Linuxでの動作。ただしこれは実験的です。<br>\r
+  </li>\r
   <li>動画によって(動画名によって)変換処理が上手くいかない状況がある問題の改善。</li>\r
   <li>ダウンロードファイル拡張子の正しい設定。<br>\r
   </li>\r
 </ul>\r
 <p>&nbsp;</p>\r
 <h3>動作環境</h3>\r
-<p><a href="http://www.vector.co.jp/soft/win95/net/se439180.html"></a><a\r
- href="http://java.com/ja/">Java6実行環境</a>が導入されたWindows。</p>\r
-<p>NicoBrowser拡張機能を使用する場合、NicoBrowser ver.0.1.1以降がセットアップされている必要がある。</p>\r
-<p>Windows VistaやWindows7では<a\r
- href="http://pc12.2ch.net/test/read.cgi/software/1235626069/">さきゅばす\r
-ver.1.22rが動作できない事象もにちゃんねるで報告されている</a>。この場合、<a\r
- href="http://pc12.2ch.net/test/read.cgi/software/1235626069/57n">該当スレッド\r
\81\8bã\82\89ã\83ªã\83³ã\82¯ã\81\95ã\82\8cã\81¦ã\81\84ã\82\8bã\83¢ã\82¸ã\83¥ã\83¼ã\83«</a>ã\82\92ã\81\95ã\81\8dã\82\85ã\81°ã\81\99ver.1.22rã\81«å°\8eå\85¥ã\81\99ã\82\8cã\81°è§£æ¶\88ã\81§ã\81\8dã\82\8bå ´å\90\88ã\82\82ã\81\82ã\82\8bã\82\89ã\81\97い。</p>\r
+<p><a href="http://java.com/ja/">Java6実行環境</a>が導入されたWindowsもしくはLinux。<br>\r
+</p>\r
+<p>また、Linuxで動作させる場合には、上記以外にSDL, SDL_ttf, SDL_gfxの導入が必要です。<br>\r
+</p>\r
+<p>NicoBrowser拡張機能を使用する場合、NicoBrowser ver.0.1.1以降がセットアップされている必要があります。</p>\r
+<p>Windows VistaやWindows7ではDEP機能によってffmpegが正常に動作しないようです。この場合は、<a\r
+ href="http://windows.microsoft.com/ja-JP/windows-vista/Change-Data-Execution-Prevention-settings">こ\r
\81¡ã\82\89</a>ã\82\92å\8f\82è\80\83ã\81«ã\81\97ã\81¦ã\80\81binã\83\87ã\82£ã\83¬ã\82¯ã\83\88ã\83ªã\81«ã\81\82ã\82\8bffmpeg.exeã\82\92DEP対象ã\81\8bã\82\89å¤\96ã\81\97ã\81¦ä¸\8bã\81\95い。</p>\r
 <p>&nbsp;</p>\r
 <h3>本プログラムの導入方法</h3>\r
-<p>é\81©å½\93ã\81ªã\83\87ã\82£ã\83¬ã\82¯ã\83\88ã\83ªã\81¸å±\95é\96\8bã\81\97ã\80\81Saccubus.exeã\82\92å®\9fè¡\8cã\81\99ã\82\8b。<br>\r
+<p>é\81©å½\93ã\81ªã\83\87ã\82£ã\83¬ã\82¯ã\83\88ã\83ªã\81¸å±\95é\96\8bã\81\97ã\80\81Saccubus.exeã\82\92å®\9fè¡\8cã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84。<br>\r
 </p>\r
+<p>Linuxの場合は、当ディレクトリへ移動し、下記コマンドを実行して下さい。<br>\r
+</p>\r
+<div style="margin-left: 40px;">java -jar Saccubus.jar<br>\r
+</div>\r
+<p></p>\r
 <p>&nbsp;</p>\r
 <h3>拡張機能の使い方</h3>\r
 <p><a\r
@@ -80,6 +88,12 @@ ver.1.22rが動作できない事象もにちゃんねるで報告されてい
 <p><br>\r
 </p>\r
 <h3>&nbsp;更新履歴</h3>\r
+<p>2010/05/01 ver.1.4.1<br>\r
+同梱ライブラリが不足しCUI実行が例外終了していた問題を修正。<br>\r
+</p>\r
+<p>2010/04/13 ver.1.4.0<br>\r
+Linux対応。<br>\r
+</p>\r
 <p>2010/01/20 ver.1.3.5<br>\r
 ライセンスをGPLv3に戻す。<br>\r
 1.22rへの上書きでなく、本プログラム単体で動作するよう、配布ファイルに必要なバイナリを追加。<br>\r
index 556b6e7..68a06dc 100644 (file)
@@ -77,7 +77,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.3.5";
+    public static final String VERSION = "1.22r NicoBrowser\8ag\92£ 1.4.1";
     public static final Image WinIcon = Toolkit.getDefaultToolkit().createImage(saccubus.MainFrame.class.getResource(
             "icon32.png"));
     // TODO GUI\82ª\96³\82¢\82½\82ß\83t\83B\81[\83\8b\83h\82É\95Û\8e\9d.
@@ -817,6 +817,7 @@ public class MainFrame extends JFrame {
                 if (StringUtils.isEmpty(text)) {
                     text = "\97\\8aú\82µ\82È\82¢\83G\83\89\81[\82Ì\82½\82ß\92\86\92f\82µ\82Ü\82µ\82½\81B";
                 }
+                ex.printStackTrace();
                 statusBar.setText(text);
             }
         } else { /* \8aJ\8en\82µ\82Ä\82¢\82é\82Ì\82Å\81A\83X\83g\83b\83v\82·\82é\81B */
index 8b755d7..b75a2ee 100644 (file)
@@ -33,7 +33,7 @@ public class OptionComboBoxModel extends DefaultComboBoxModel {
        /**
         * \83t\83@\83C\83\8b\93Ç\82Ý\8d\9e\82Ý\82»\82Ì\91¼\82ð\8ds\82¤
         */
-       private static final File OPTION_FOLDER = new File(".\\option\\");
+    private static final File OPTION_FOLDER = new File("option");
 
        private static final FFmpegSelectedItem DEFAULT_ITEM = new FFmpegSelectedItem(
                        0, null, "\8aO\95\94\83t\83@\83C\83\8b\82ð\97p\82¢\82¸\81A\89º\82É\92¼\90Ú\93ü\97Í\82·\82é\81B");
index 115cde7..9819c3c 100644 (file)
@@ -7,6 +7,9 @@ import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.UnsupportedEncodingException;
 import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.commons.lang.StringUtils;
 import saccubus.ConvertStopFlag;
 import saccubus.conv.ConvertToVideoHook;
 import saccubus.converter.profile.Ffmpeg;
@@ -32,7 +35,7 @@ public class FfmpegCommand extends AbstractCommand {
     private final Ffmpeg ffmpeg;
 
     FfmpegCommand(TextProgressListener listener, ConvertStopFlag flag, File commentFile, File tcommFile,
-            File videoFile, File convertedVideoFile, Ffmpeg ffmpeg,GeneralSetting general) throws IOException {
+            File videoFile, File convertedVideoFile, Ffmpeg ffmpeg, GeneralSetting general) throws IOException {
         super(listener, flag);
         this.commentFile = commentFile;
         this.tcommFile = tcommFile;
@@ -99,37 +102,50 @@ public class FfmpegCommand extends AbstractCommand {
             boolean addTcomment, String tcommPath, FfmpegOption ov) throws InterruptedException, IOException {
         File fwsFile = Cws2Fws.createFws(videoFile, TMP_CWS);
 
-        StringBuffer sb = new StringBuffer();
-        sb.append("\"");
-        sb.append(getFfmpeg().getFfmpeg().getPath().replace("\\", "\\\\"));
-        sb.append("\"");
-        sb.append(" -y ");
-        sb.append(ov.getMainOption());
-        sb.append(" ");
-        sb.append(ov.getInOption());
-        sb.append(" -i ");
+        List<String> cmdList = new ArrayList<String>();
+        cmdList.add(getFfmpeg().getFfmpeg().getPath());
+        cmdList.add("-y");
+        String[] mainOptions = ov.getMainOption().split(" +");
+        for (String opt : mainOptions) {
+            if (StringUtils.isNotBlank(opt)) {
+                cmdList.add(opt);
+            }
+        }
+        String[] inOptions = ov.getInOption().split(" +");
+        for (String opt : inOptions) {
+            if (StringUtils.isNotBlank(opt)) {
+                cmdList.add(opt);
+            }
+        }
+        cmdList.add("-i");
+
         if (fwsFile == null) {
-            sb.append("\"");
-            sb.append(videoFile.getPath().replace("\\", "\\\\"));
-            sb.append("\"");
+            cmdList.add(videoFile.getPath());
         } else {
-            sb.append(fwsFile.getPath().replace("\\", "\\\\"));
+            cmdList.add(fwsFile.getPath());
+        }
+        String[] outOptions = ov.getOutOption().split(" +");
+        for (String opt : outOptions) {
+            if (StringUtils.isNotBlank(opt)) {
+                cmdList.add(opt);
+            }
         }
-        sb.append(" ");
-        sb.append(ov.getOutOption());
-        sb.append(" \"");
-        sb.append(convertedVideoFile.getPath().replace("\\", "\\\\"));
-        sb.append("\"");
         if (!getFfmpeg().isVhookDisabled()) {
-            if (!addVhookSetting(sb, addComment, vhook_path, addTcomment, tcommPath)) {
+            if (!addVhookSetting(cmdList, addComment, vhook_path, addTcomment, tcommPath)) {
                 return -1;
             }
         }
-        String cmd = sb.substring(0);
-        System.out.println("arg:" + cmd);
+        cmdList.add(convertedVideoFile.getPath());
+
+        System.out.print("arg:");
+        for (String s : cmdList) {
+            System.out.print(" " + s);
+        }
+        System.out.println();
+
         try {
             System.out.println("\n\n----\nProcessing FFmpeg...\n----\n\n");
-            Process process = Runtime.getRuntime().exec(cmd);
+            Process process = Runtime.getRuntime().exec(cmdList.toArray(new String[0]));
             BufferedReader ebr = new BufferedReader(new InputStreamReader(
                     process.getErrorStream()));
             String e;
@@ -158,10 +174,12 @@ public class FfmpegCommand extends AbstractCommand {
         }
     }
 
-    private boolean addVhookSetting(StringBuffer sb, boolean addComment, String vhook_path, boolean addTcomment,
+    private boolean addVhookSetting(List cmdList, boolean addComment, String vhook_path, boolean addTcomment,
             String tcommPath) {
         try {
-            sb.append(" -vfilters \"vhext=");
+            cmdList.add("-vfilters");
+            StringBuffer sb = new StringBuffer();
+            sb.append("vhext=");
             sb.append(getFfmpeg().getVhook().getPath().replace("\\", "/"));
             if (addComment) {
                 sb.append("|");
@@ -198,7 +216,7 @@ public class FfmpegCommand extends AbstractCommand {
             if (getFfmpeg().isCommentOpaque()) {
                 sb.append("--enable-opaque-comment");
             }
-            sb.append("\"");
+            cmdList.add(sb.toString());
             return true;
         } catch (UnsupportedEncodingException e) {
             e.printStackTrace();
index b3cd02e..20763be 100644 (file)
@@ -24,7 +24,7 @@ public class SFile {
 
         File dir;
         if (isFile) {
-            dir = file.getParentFile();
+            dir = file.getAbsoluteFile().getParentFile();
         } else {
             dir = file;
         }
index 070bcb8..379fdd6 100644 (file)
@@ -94,14 +94,16 @@ public class ConvertSetting {
     }
 
     public static ConvertSetting load(Properties prop) {
+        String defaultFont = "";
         String win_dir = System.getenv("windir");
-        if (!win_dir.endsWith("\\")) {
-            win_dir = win_dir + "\\";
+        if (win_dir != null) {
+            //windows \82Ì\8fê\8d\87\82Ì\83f\83t\83H\83\8b\83g\83t\83H\83\93\83g\83p\83X
+            defaultFont = new File(win_dir, "Fonts" + File.separator + "msgothic.ttc").getPath();
         }
 
 
         int maxComment = Integer.parseInt(prop.getProperty(PROP_SHOW_COMMENT, "30"));
-        String font = prop.getProperty(PROP_FONT_PATH, win_dir + "Fonts\\msgothic.ttc");
+        String font = prop.getProperty(PROP_FONT_PATH, defaultFont);
         int fontIndex = Integer.parseInt(prop.getProperty(PROP_FONT_INDEX, "1"));
         boolean showConv = Boolean.parseBoolean(prop.getProperty(PROP_SHOW_VIDEO, "true"));
         String ngWord = prop.getProperty(PROP_NG_WORD, "");
index f19d5fb..d6b1e01 100644 (file)
@@ -40,11 +40,11 @@ public class InputCommentSetting extends InputFileSetting<Boolean> {
 
     public static InputCommentSetting load(Properties prop) {
 
-        String file = prop.getProperty(PROP_COMMENT_FILE, ".\\comment.xml");
+        String file = prop.getProperty(PROP_COMMENT_FILE, "comment.xml");
         String numOfComment = prop.getProperty(PROP_BACK_COMMENT, "500");
         boolean delete = Boolean.parseBoolean(prop.getProperty(PROP_DEL_COMMENT_AFTER_CONV, "false"));
         boolean adjustNumOfComment = Boolean.parseBoolean(prop.getProperty(PROP_COMMENT_FIX_FILE_NAME, "true"));
-        String folder = prop.getProperty(PROP_COMMENT_FIX_FILE_NAME_FOLDER, ".\\[out]comment\\");
+        String folder = prop.getProperty(PROP_COMMENT_FIX_FILE_NAME_FOLDER, "[out]comment");
         boolean autoNaming = Boolean.parseBoolean(prop.getProperty(PROP_FIX_COMMENT_NUM, "true"));
         boolean download = Boolean.parseBoolean(prop.getProperty(PROP_SAVE_COMMENT, "true"));
 
index be54731..305ec77 100644 (file)
@@ -30,8 +30,8 @@ public class InputTcommentSetting extends InputFileSetting<Boolean> {
         boolean del = Boolean.valueOf(str);
         str = prop.getProperty(PROP_AUTOFILENAME, Boolean.toString(true));
         boolean naming = Boolean.valueOf(str);
-        String dir = prop.getProperty(PROP_DIRECTORYNAME, ".\\[out]tcomment");
-        String f = prop.getProperty(PROP_FILENAME, ".\\tcomment.xml");
+        String dir = prop.getProperty(PROP_DIRECTORYNAME, "[out]tcomment");
+        String f = prop.getProperty(PROP_FILENAME, "tcomment.xml");
         return new InputTcommentSetting(down, naming, dir, f, del);
     }
 
index e21e87e..02c4e1c 100644 (file)
@@ -37,8 +37,8 @@ public class InputVideoSetting extends InputFileSetting<VideoSaveKind> {
     public static InputVideoSetting load(Properties prop) {
         final VideoSaveKind kind = convertVideoSaveKind(prop);
         boolean autoNaming = Boolean.parseBoolean(prop.getProperty(PROP_VIDEO_FIX_FILE_NAME, "true"));
-        String folder = prop.getProperty(PROP_VIDEO_FIX_FILE_NAME_FOLDER, ".\\[out]video\\");
-        String file = prop.getProperty(PROP_VIDEO_FILE, ".\\video.flv");
+        String folder = prop.getProperty(PROP_VIDEO_FIX_FILE_NAME_FOLDER, "[out]video");
+        String file = prop.getProperty(PROP_VIDEO_FILE, "video.flv");
         boolean delete = Boolean.parseBoolean(prop.getProperty(PROP_DEL_VIDEO_AFTER_CONV, "false"));
         String nibrFile = prop.getProperty(PROP_NICO_BROWSER_FILE_NAME, "");
 
index 215d0b4..ef1f28a 100644 (file)
@@ -67,12 +67,13 @@ public class MovieSetting {
             optionFile = new File(name);
         }
 
-        String ffmpeg = prop.getProperty(PROP_FFMPEG_PATH, ".\\bin\\ffmpeg.exe");
-        String vhook = prop.getProperty(PROP_VHOOK_PATH, ".\\bin\\nicovideo.dll");
+        String ffmpeg = prop.getProperty(PROP_FFMPEG_PATH, new File("bin", "ffmpeg.exe").getPath());
+        String vhook = prop.getProperty(PROP_VHOOK_PATH, new File("bin", "nicovideo.dll").getPath());
         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 -g 150 -qcomp 0.7 -qmin 20 -qmax 30 -qdiff 4 -subq 6 -me_range 16 -i_qfactor 0.714286");
+        String out = prop.getProperty(PROP_CMDLINE_OUT,
+                "-f ipod -g 150 -qcomp 0.7 -qmin 20 -qmax 30 -qdiff 4 -subq 6 -me_range 16 -i_qfactor 0.714286");
         FfmpegOption opt = new FfmpegOption(ext, main, in, out);
 
         return new MovieSetting(new File(ffmpeg), new File(vhook), optionFile, opt);
index d6c56e4..23ff7aa 100644 (file)
@@ -53,10 +53,10 @@ public class OutputVideoSetting extends ProcessFileSetting<Boolean> {
         boolean process = Boolean.parseBoolean(prop.getProperty(PROP_SAVE_CONVERTED, "true"));
         boolean addComment = Boolean.valueOf(prop.getProperty(PROP_ADD_COMMENT, "true"));
         boolean addTcomment = Boolean.valueOf(prop.getProperty(PROP_ADD_TCOMMENT, "true"));
-        String file = prop.getProperty(PROP_CONVERTED_FILE, ".\\video.avi");
+        String file = prop.getProperty(PROP_CONVERTED_FILE, "video.avi");
         boolean cutId = Boolean.parseBoolean(prop.getProperty(PROP_NOT_ADD_VIDEOID_CONV, "false"));
         boolean autoNaming = Boolean.parseBoolean(prop.getProperty(PROP_CONV_FIX_FILE_NAME, "true"));
-        String folder = prop.getProperty(PROP_CONV_FIX_FILE_NAME_FOLDER, ".\\[out]converted\\");
+        String folder = prop.getProperty(PROP_CONV_FIX_FILE_NAME_FOLDER, "[out]converted");
 
         return new OutputVideoSetting(process, autoNaming, new File(folder), new File(file), cutId, addComment,
                 addTcomment);