X-Git-Url: http://git.sourceforge.jp/view?p=coroid%2Finqubus.git;a=blobdiff_plain;f=frontend%2Fsrc%2Fyukihane%2Finqubus%2Fgui%2FMainFrame.java;h=23a2fa0cb9db0ace32ac163ea232c9a92b9bab84;hp=409d1242abd271a0289846b1f99200219d0ee579;hb=b8b947f2c2832b2f4b788142cbea2f5850914c38;hpb=a2bb54b816e80ea54e412950178037816da38063 diff --git a/frontend/src/yukihane/inqubus/gui/MainFrame.java b/frontend/src/yukihane/inqubus/gui/MainFrame.java index 409d124..23a2fa0 100644 --- a/frontend/src/yukihane/inqubus/gui/MainFrame.java +++ b/frontend/src/yukihane/inqubus/gui/MainFrame.java @@ -5,34 +5,87 @@ */ package yukihane.inqubus.gui; +import java.awt.Dimension; import java.awt.Image; import java.awt.ItemSelectable; +import java.awt.Point; import java.awt.Toolkit; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; import java.awt.event.KeyEvent; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; import java.io.File; import java.io.FilenameFilter; +import java.io.IOException; import java.net.URL; +import java.nio.file.FileSystem; +import java.nio.file.FileSystems; +import java.nio.file.Path; import java.util.ArrayList; -import java.util.Collection; +import java.util.HashSet; import java.util.List; +import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; -import java.util.regex.Matcher; import java.util.regex.Pattern; +import javax.swing.BorderFactory; +import javax.swing.DropMode; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JFrame; +import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTabbedPane; +import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.KeyStroke; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.SwingUtilities; import javax.swing.TransferHandler; +import javax.swing.WindowConstants; +import javax.swing.border.BevelBorder; +import org.apache.commons.configuration.ConfigurationException; +import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang.builder.ToStringBuilder; +import saccubus.FfmpegOption; import saccubus.MainFrame_AboutBox; -import yukihane.inqubus.config.Properties; +import saccubus.util.WayBackTimeParser; +import saccubus.worker.impl.convert.ConvertProgress; +import saccubus.worker.impl.download.DownloadProgress; +import saccubus.worker.WorkerListener; +import saccubus.worker.impl.convert.ConvertResult; +import saccubus.worker.impl.download.DownloadResult; +import saccubus.worker.profile.CommentProfile; +import saccubus.worker.profile.ConvertProfile; +import saccubus.worker.profile.DownloadProfile; +import saccubus.worker.profile.FfmpegProfile; +import saccubus.worker.profile.GeneralProfile; +import saccubus.worker.profile.LoginProfile; +import saccubus.worker.profile.OutputProfile; +import saccubus.worker.profile.ProxyProfile; +import saccubus.worker.profile.VideoProfile; +import yukihane.Util; +import yukihane.inqubus.Config; +import yukihane.inqubus.filewatch.FileWatch; +import yukihane.inqubus.manager.RequestProcess; +import yukihane.inqubus.manager.TaskKind; +import yukihane.inqubus.manager.TaskManage; +import yukihane.inqubus.manager.TaskManageListener; +import yukihane.inqubus.manager.TaskStatus; import yukihane.inqubus.model.Target; import yukihane.inqubus.model.TargetsTableModel; @@ -40,256 +93,470 @@ import yukihane.inqubus.model.TargetsTableModel; * * @author yuki */ -public class MainFrame extends javax.swing.JFrame { +public class MainFrame extends JFrame { private static final long serialVersionUID = 1L; private static final Logger logger = Logger.getLogger(MainFrame.class.getName()); + private static final String ID_FIELD_TOOLTIP = "動画のIDまたはURLを入力します。"; + private static final String FILE_LOCALBUTTON_TOOLTIP + = "ダウンロードする場合はチェックを外します。
ローカルファイルを使用する場合はチェックを入れます。"; + private static final String FILE_INPUTFIELD_TOOLTIP + = "ダウンロードする場合はファイル命名規則を入力します。
" + + "ローカルファイルを使用する場合はパスを含むファイル名を入力します。"; + private static final String FILE_OUTPUTFIELD_TOOLTIP + = "ファイル命名規則入力します。"; private final TargetsTableModel targetModel = new TargetsTableModel(); + private final TaskManage taskManager; + private final Thread videoFileWatcherThread; + private final FileWatch videoFileWatcher; /** Creates new form MainFrame */ public MainFrame() { - initComponents(); - initInputPanel(); - jPanel1.setTransferHandler(new DownloadListTransferHandler()); - jTable1.setTransferHandler(new TableTransferHandler()); - } + super(); + addWindowListener(new MainFrameWindowListener()); + + final Config p = Config.INSTANCE; + + // ワーカスレッド生成 + final int thDownload = p.getSystemDownloadThread(); + final int secDownload = p.getSystemDownloadWait(); + final int thConvert = p.getSystemConvertThread(); + taskManager = new TaskManage(thDownload, secDownload, thConvert, new GuiTaskManageListener()); + + // TODO ディレクトリ監視スレッド生成 + final List videoSearchDirs = p.getSearchVideoDirs(); + videoSearchDirs.add(p.getVideoDir()); + final FileSystem fs = FileSystems.getDefault(); + final Set videoPaths = new HashSet<>(videoSearchDirs.size()); + for (String s : videoSearchDirs) { + videoPaths.add(fs.getPath(s)); + } + videoFileWatcher = new FileWatch(videoPaths); + this.videoFileWatcherThread = new Thread(videoFileWatcher); + this.videoFileWatcherThread.setDaemon(true); - /** This method is called from within the constructor to - * initialize the form. - * WARNING: Do NOT modify this code. The content of this method is - * always regenerated by the Form Editor. - */ - @SuppressWarnings("unchecked") - // //GEN-BEGIN:initComponents - private void initComponents() { final URL url = MainFrame_AboutBox.class.getResource("icon.png"); final Image icon1 = Toolkit.getDefaultToolkit().createImage(url); final URL url32 = MainFrame_AboutBox.class.getResource("icon32.png"); final Image icon2 = Toolkit.getDefaultToolkit().createImage(url32); - final List images = new ArrayList(2); + final List images = new ArrayList<>(2); images.add(icon1); images.add(icon2); setIconImages(images); - jPanel1 = new javax.swing.JPanel(); - jScrollPane1 = new javax.swing.JScrollPane(); - jTable1 = new javax.swing.JTable(); - jPanel2 = new javax.swing.JPanel(); - jButton2 = new javax.swing.JButton(); - jButton3 = new javax.swing.JButton(); - jButton4 = new javax.swing.JButton(); - jPanel3 = new javax.swing.JPanel(); - idLabel = new javax.swing.JLabel(); - idField = new javax.swing.JTextField(); - movieLabel = new javax.swing.JLabel(); - useMovieLocalCheckBox = new javax.swing.JCheckBox(); - movieFileField = new javax.swing.JTextField(); - movieFileSelectButton = new javax.swing.JButton(); - commentLabel = new javax.swing.JLabel(); - useCommentLocalCheckBox = new javax.swing.JCheckBox(); - commentFileField = new javax.swing.JTextField(); - commentFileSelectButton = new javax.swing.JButton(); - outputLabel = new javax.swing.JLabel(); - outputConvertCheckBox = new javax.swing.JCheckBox(); - outputFileField = new javax.swing.JTextField(); - applyButton = new javax.swing.JButton(); - - setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); - - jPanel1.setBorder(javax.swing.BorderFactory.createEtchedBorder()); - - jTable1.setModel(targetModel); - jTable1.setDropMode(javax.swing.DropMode.INSERT_ROWS); - jScrollPane1.setViewportView(jTable1); - - jPanel2.setBorder(javax.swing.BorderFactory.createEtchedBorder()); - - jButton2.setText("開始"); - - jButton3.setText("停止"); - - jButton4.setText("選択解除"); - - javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2); - jPanel2.setLayout(jPanel2Layout); - jPanel2Layout.setHorizontalGroup( - jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanel2Layout.createSequentialGroup() + final JPanel pnlMain = new JPanel(); + final JScrollPane scrDisplay = new JScrollPane(); + tblDisplay = new JTable(targetModel, new TargetsColumnModel()); + tblDisplay.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); + final JPanel pnlButton = new JPanel(); + final JPanel pnlInputMain = new JPanel(); + final JLabel lblId = new JLabel(); + final JLabel lblVideo = new JLabel(); + cbVideoLocal = new JCheckBox(); + cbVideoLocal.setToolTipText(FILE_LOCALBUTTON_TOOLTIP); + fldVideo = new JTextField(); + fldVideo.setToolTipText(FILE_INPUTFIELD_TOOLTIP); + final JLabel lblComment = new JLabel(); + + fldBackLog.setToolTipText("YYYY/MM/DD hh:mm:ss形式、あるいは1970/01/01からの経過秒を入力します。"); + cbBackLog.addItemListener(new ItemListener() { + + @Override + public void itemStateChanged(ItemEvent e) { + final boolean selected = (e.getStateChange() == ItemEvent.SELECTED); + fldBackLog.setEnabled(selected); + } + }); + cbBackLog.addPropertyChangeListener("enabled", new PropertyChangeListener() { + + @Override + public void propertyChange(PropertyChangeEvent evt) { + final boolean enabled = ((Boolean) evt.getNewValue()).booleanValue(); + final boolean fldEnabled = enabled ? cbBackLog.isSelected() : false; + fldBackLog.setEnabled(fldEnabled); + } + }); + cbBackLogReduce.setToolTipText("「コメントの量を減らす」場合はチェックを付けます。"); + + cbCommentLocal = new JCheckBox(); + cbCommentLocal.setToolTipText(FILE_LOCALBUTTON_TOOLTIP); + cbCommentLocal.addItemListener(new ItemListener() { + + @Override + public void itemStateChanged(ItemEvent e) { + final boolean selected = (e.getStateChange() == ItemEvent.SELECTED); + cbBackLogReduce.setEnabled(!selected); + cbBackLog.setEnabled(!selected); + } + }); + fldComment = new JTextField(); + fldComment.setToolTipText(FILE_INPUTFIELD_TOOLTIP); + final JLabel lblOutput = new JLabel(); + cbOutputEnable = new JCheckBox(); + fldOutput = new JTextField(); + fldOutput.setToolTipText(FILE_OUTPUTFIELD_TOOLTIP); + + setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); + + btnStop.addActionListener(new StopActionListener()); + final ApplyActionListener applyListener = new ApplyActionListener(); + btnApply.addActionListener(applyListener); + + pnlMain.setBorder(BorderFactory.createEtchedBorder()); + + tblDisplay.setDropMode(DropMode.INSERT_ROWS); + scrDisplay.setViewportView(tblDisplay); + + pnlButton.setBorder(BorderFactory.createEtchedBorder()); + + GroupLayout gl_pnlButton = new GroupLayout(pnlButton); + pnlButton.setLayout(gl_pnlButton); + gl_pnlButton.setHorizontalGroup( + gl_pnlButton.createParallelGroup(Alignment.LEADING) + .addGroup(gl_pnlButton.createSequentialGroup() .addContainerGap() - .addComponent(jButton2) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(jButton3) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 250, Short.MAX_VALUE) - .addComponent(jButton4) + .addComponent(btnStart) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(btnStop) + .addPreferredGap(ComponentPlacement.RELATED, 250, Short.MAX_VALUE) + .addComponent(btnDeselect) .addContainerGap()) ); - jPanel2Layout.setVerticalGroup( - jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanel2Layout.createSequentialGroup() + gl_pnlButton.setVerticalGroup( + gl_pnlButton.createParallelGroup(Alignment.LEADING) + .addGroup(gl_pnlButton.createSequentialGroup() .addContainerGap() - .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(jButton2) - .addComponent(jButton3) - .addComponent(jButton4)) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addGroup(gl_pnlButton.createParallelGroup(Alignment.BASELINE) + .addComponent(btnStart) + .addComponent(btnStop) + .addComponent(btnDeselect)) + .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); - jPanel3.setBorder(javax.swing.BorderFactory.createEtchedBorder()); + lblId.setText("ID"); - idLabel.setText("ID"); - idField.addFocusListener(new java.awt.event.FocusAdapter() { + fldId = new IdComboBox(videoFileWatcher); + fldId.setToolTipText(ID_FIELD_TOOLTIP); + fldId.getEditorComponent().addActionListener(applyListener); + fldId.addFocusListener(new java.awt.event.FocusAdapter() { public void focusLost(java.awt.event.FocusEvent evt) { idFieldFocusLost(evt); } }); - movieLabel.setText("動画"); + lblVideo.setText("動画"); - useMovieLocalCheckBox.setText("local"); - useMovieLocalCheckBox.addItemListener(new java.awt.event.ItemListener() { + cbVideoLocal.setText("local"); + cbVideoLocal.addItemListener(new java.awt.event.ItemListener() { public void itemStateChanged(java.awt.event.ItemEvent evt) { useMovieLocalCheckBoxItemStateChanged(evt); } }); - movieFileSelectButton.setText("..."); - - commentLabel.setText("コメント"); + lblComment.setText("コメント"); - useCommentLocalCheckBox.setText("local"); - useCommentLocalCheckBox.addItemListener(new java.awt.event.ItemListener() { + cbCommentLocal.setText("local"); + cbCommentLocal.addItemListener(new java.awt.event.ItemListener() { public void itemStateChanged(java.awt.event.ItemEvent evt) { useMovieLocalCheckBoxItemStateChanged(evt); } }); - commentFileSelectButton.setText("..."); + lblOutput.setText("出力"); - outputLabel.setText("出力"); - - outputConvertCheckBox.setText("変換"); - outputConvertCheckBox.addItemListener(new java.awt.event.ItemListener() { + cbOutputEnable.setText("変換"); + cbOutputEnable.addItemListener(new java.awt.event.ItemListener() { public void itemStateChanged(java.awt.event.ItemEvent evt) { outputConvertCheckBoxItemStateChanged(evt); } }); - applyButton.setText("適用"); - javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3); - jPanel3.setLayout(jPanel3Layout); - jPanel3Layout.setHorizontalGroup( - jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanel3Layout.createSequentialGroup() + final GroupLayout glInputMain = new GroupLayout(pnlInputMain); + pnlInputMain.setLayout(glInputMain); + glInputMain.setHorizontalGroup( + glInputMain.createParallelGroup(Alignment.LEADING) + .addGroup(glInputMain.createSequentialGroup() .addContainerGap() - .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanel3Layout.createSequentialGroup() - .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(commentLabel) - .addComponent(movieLabel) - .addComponent(idLabel) - .addComponent(outputLabel)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanel3Layout.createSequentialGroup() - .addComponent(useMovieLocalCheckBox) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(movieFileField, javax.swing.GroupLayout.DEFAULT_SIZE, 317, Short.MAX_VALUE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(movieFileSelectButton)) - .addComponent(idField, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel3Layout.createSequentialGroup() - .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) - .addGroup(javax.swing.GroupLayout.Alignment.LEADING, jPanel3Layout.createSequentialGroup() - .addComponent(outputConvertCheckBox) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(outputFileField, javax.swing.GroupLayout.DEFAULT_SIZE, 317, Short.MAX_VALUE)) - .addGroup(jPanel3Layout.createSequentialGroup() - .addComponent(useCommentLocalCheckBox) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(commentFileField, javax.swing.GroupLayout.DEFAULT_SIZE, 317, Short.MAX_VALUE))) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(commentFileSelectButton)))) - .addComponent(applyButton, javax.swing.GroupLayout.Alignment.TRAILING)) - .addContainerGap()) + .addComponent(lblId) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(fldId, GroupLayout.PREFERRED_SIZE, 100, Short.MAX_VALUE) + .addPreferredGap(ComponentPlacement.UNRELATED) + .addComponent(cbBackLogReduce) + .addPreferredGap(ComponentPlacement.UNRELATED) + .addComponent(cbBackLog) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(fldBackLog, GroupLayout.PREFERRED_SIZE, 150, GroupLayout.PREFERRED_SIZE) + .addContainerGap() + ) + .addGroup(glInputMain.createSequentialGroup() + .addContainerGap() + .addGroup(glInputMain.createParallelGroup(Alignment.LEADING) + .addComponent(lblVideo) + .addComponent(lblComment) + .addComponent(lblOutput) + ) + .addPreferredGap(ComponentPlacement.RELATED) + .addGroup(glInputMain.createParallelGroup(Alignment.LEADING) + .addComponent(cbVideoLocal) + .addComponent(cbCommentLocal) + .addComponent(cbOutputEnable) + ) + .addPreferredGap(ComponentPlacement.RELATED) + .addGroup(glInputMain.createParallelGroup(Alignment.LEADING) + .addComponent(fldVideo, GroupLayout.DEFAULT_SIZE, 300, Short.MAX_VALUE) + .addComponent(fldComment, GroupLayout.DEFAULT_SIZE, 300, Short.MAX_VALUE) + .addComponent(fldOutput, GroupLayout.DEFAULT_SIZE, 300, Short.MAX_VALUE) + ) + .addContainerGap() + ) ); - jPanel3Layout.setVerticalGroup( - jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanel3Layout.createSequentialGroup() + + glInputMain.setVerticalGroup( + glInputMain.createParallelGroup(Alignment.LEADING) + .addGroup(glInputMain.createSequentialGroup() .addContainerGap() - .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(idField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(idLabel)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(movieLabel) - .addComponent(movieFileField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(movieFileSelectButton) - .addComponent(useMovieLocalCheckBox)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(commentLabel) - .addComponent(commentFileField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(commentFileSelectButton) - .addComponent(useCommentLocalCheckBox)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(outputLabel) - .addComponent(outputFileField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(outputConvertCheckBox)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(applyButton) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addGroup(glInputMain.createParallelGroup(Alignment.BASELINE) + .addComponent(fldId, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) + .addComponent(lblId) + .addComponent(cbBackLogReduce) + .addComponent(cbBackLog) + .addComponent(fldBackLog) + ) + .addPreferredGap(ComponentPlacement.RELATED) + .addGroup(glInputMain.createParallelGroup(Alignment.BASELINE) + .addComponent(lblVideo) + .addComponent(fldVideo, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) + .addComponent(cbVideoLocal)) + .addPreferredGap(ComponentPlacement.RELATED) + .addGroup(glInputMain.createParallelGroup(Alignment.BASELINE) + .addComponent(lblComment) + .addComponent(fldComment, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) + .addComponent(cbCommentLocal)) + .addPreferredGap(ComponentPlacement.RELATED) + .addGroup(glInputMain.createParallelGroup(Alignment.BASELINE) + .addComponent(lblOutput) + .addComponent(fldOutput, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) + .addComponent(cbOutputEnable) + ) + ) ); - javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); - jPanel1.setLayout(jPanel1Layout); - jPanel1Layout.setHorizontalGroup( - jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup() + // ffmpeg入力パネル + pnlInputFfmpeg.fldFfmpegOptionResizeWidth.setEnabled(false); + pnlInputFfmpeg.fldFfmpegOptionResizeHeight.setEnabled(false); + pnlInputFfmpeg.cbFfmpegOptionKeepAspect.setEnabled(false); + pnlInputFfmpeg.cmbFfmpegOptionFile.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + final boolean notFile = !pnlInputFfmpeg.mdlFfmpegOption.isFile(); + pnlInputFfmpeg.fldFfmpegOptionExtension.setEnabled(notFile); + pnlInputFfmpeg.fldFfmpegOptionMain.setEnabled(notFile); + pnlInputFfmpeg.fldFfmpegOptionIn.setEnabled(notFile); + pnlInputFfmpeg.fldFfmpegOptionOut.setEnabled(notFile); + pnlInputFfmpeg.fldFfmpegOptionAv.setEnabled(notFile); + pnlInputFfmpeg.cbFfmpegOptionResize.setEnabled(notFile); + } + }); + pnlInputFfmpeg.cbFfmpegOptionResize.addItemListener(new ItemListener() { + + @Override + public void itemStateChanged(ItemEvent e) { + final boolean selected = (e.getStateChange() == ItemEvent.SELECTED); + pnlInputFfmpeg.fldFfmpegOptionResizeWidth.setEnabled(selected); + pnlInputFfmpeg.fldFfmpegOptionResizeHeight.setEnabled(selected); + pnlInputFfmpeg.cbFfmpegOptionKeepAspect.setEnabled(selected); + } + }); + pnlInputFfmpeg.cbFfmpegOptionResize.addPropertyChangeListener("enabled", new PropertyChangeListener() { + + @Override + public void propertyChange(PropertyChangeEvent evt) { + final boolean enabled = ((Boolean) evt.getNewValue()).booleanValue(); + final boolean fldEnabled = enabled ? pnlInputFfmpeg.cbFfmpegOptionResize.isSelected() : false; + pnlInputFfmpeg.fldFfmpegOptionResizeWidth.setEnabled(fldEnabled); + pnlInputFfmpeg.fldFfmpegOptionResizeHeight.setEnabled(fldEnabled); + pnlInputFfmpeg.cbFfmpegOptionKeepAspect.setEnabled(fldEnabled); + } + }); + + + tbpInput.add("メイン", pnlInputMain); + tbpInput.add("ffmpeg", pnlInputFfmpeg); + + // 入力部のボタンやメッセージ表示部 + fldInputMessage.setEditable(false); + fldInputMessage.setEnabled(false); + fldInputMessage.setBorder(BorderFactory.createEmptyBorder()); + + final JPanel pnlInputButton = new JPanel(); + final GroupLayout glInputButton = new GroupLayout(pnlInputButton); + pnlInputButton.setLayout(glInputButton); + glInputButton.setHorizontalGroup(glInputButton.createSequentialGroup() + .addContainerGap() + .addComponent(fldInputMessage, GroupLayout.DEFAULT_SIZE, 300, Short.MAX_VALUE) + .addPreferredGap(ComponentPlacement.UNRELATED) + .addComponent(btnApply) + .addContainerGap() + ); + glInputButton.setVerticalGroup(glInputButton.createSequentialGroup() + .addContainerGap() + .addGroup(glInputButton.createParallelGroup(Alignment.BASELINE) + .addComponent(fldInputMessage, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) + .addComponent(btnApply) + ) + .addContainerGap() + ); + + // 画面下半分の入力部分 + final JPanel pnlInputAll = new JPanel(); + pnlInputAll.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED)); + final GroupLayout glInputAll = new GroupLayout(pnlInputAll); + pnlInputAll.setLayout(glInputAll); + glInputAll.setHorizontalGroup(glInputAll.createParallelGroup() + .addComponent(tbpInput) + .addComponent(pnlInputButton) + ); + glInputAll.setVerticalGroup(glInputAll.createSequentialGroup() + .addComponent(tbpInput) + .addComponent(pnlInputButton) + ); + + GroupLayout gl_pnlMain = new GroupLayout(pnlMain); + pnlMain.setLayout(gl_pnlMain); + gl_pnlMain.setHorizontalGroup( + gl_pnlMain.createParallelGroup(Alignment.LEADING) + .addGroup(Alignment.TRAILING, gl_pnlMain.createSequentialGroup() .addContainerGap() - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) - .addComponent(jPanel3, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 480, Short.MAX_VALUE) - .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addGroup(gl_pnlMain.createParallelGroup(Alignment.TRAILING) + .addComponent(scrDisplay, Alignment.LEADING, GroupLayout.DEFAULT_SIZE, 480, Short.MAX_VALUE) + .addComponent(pnlButton, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(pnlInputAll, Alignment.LEADING, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + ) .addContainerGap()) ); - jPanel1Layout.setVerticalGroup( - jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup() + gl_pnlMain.setVerticalGroup( + gl_pnlMain.createParallelGroup(Alignment.LEADING) + .addGroup(Alignment.TRAILING, gl_pnlMain.createSequentialGroup() + .addContainerGap() + .addComponent(scrDisplay, GroupLayout.DEFAULT_SIZE, 197, Short.MAX_VALUE) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(pnlButton, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(pnlInputAll, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addContainerGap() - .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 197, Short.MAX_VALUE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(24, 24, 24)) + ) ); JMenuBar menuBar = initMenuBar(); setJMenuBar(menuBar); - javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + GroupLayout layout = new GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + layout.createParallelGroup(Alignment.LEADING) + .addComponent(pnlMain, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) ); layout.setVerticalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + layout.createParallelGroup(Alignment.LEADING) + .addComponent(pnlMain, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) ); pack(); - }// //GEN-END:initComponents - private File searchFileMatchId(final File dir, final String id) throws UnsupportedOperationException { + /* + * 画面のサイズや位置を前回終了時のものに設定する + */ + final int windowWidth = p.getSystemWindowWidth(); + final int windowHeight = p.getSystemWindowHeight(); + if (windowWidth > 0 && windowHeight > 0) { + setSize(windowWidth, windowHeight); + } + + final int windowPosX = p.getSystemWindowPosX(); + final int windowPosY = p.getSystemWindowPosY(); + if (windowPosX > 0 && windowPosY > 0) { + setLocation(windowPosX, windowPosY); + } else { + setLocationByPlatform(true); + } + + final int colId = p.getSystemColumnId(); + if(colId > 0) { + tblDisplay.getColumnModel().getColumn(0).setPreferredWidth(colId); + } + final int colStatus = p.getSystemColumnStatus(); + if(colStatus > 0) { + tblDisplay.getColumnModel().getColumn(4).setPreferredWidth(colStatus); + } + + initInputPanel(); + pnlMain.setTransferHandler(new DownloadListTransferHandler()); + tblDisplay.setTransferHandler(new TableTransferHandler()); + } + + public void startWatcher() { + videoFileWatcherThread.start(); + } + + private class GuiTaskManageListener implements TaskManageListener { + + @Override + public void process(final int id, final TaskKind kind, final TaskStatus status, final double percentage, + final String message) { + SwingUtilities.invokeLater(new Runnable() { + + @Override + public void run() { + targetModel.setStatus(id, kind, status, percentage, message); + } + }); + } + } + + private class StopActionListener implements ActionListener { + + @Override + public void actionPerformed(ActionEvent e) { + final int row = tblDisplay.getSelectedRow(); + final Target t = targetModel.getTarget(row); + final boolean res = taskManager.cancel(t.getRowId()); + logger.log(Level.FINE, "停止: {0} {1}", new Object[]{t.getVideoId(), res}); + if (res) { + targetModel.setStatus(t.getRowId(), null, TaskStatus.CANCELLED, -1.0, "キャンセル"); + } + } + } + + private class ApplyActionListener implements ActionListener { + + @Override + public void actionPerformed(ActionEvent e) { + try { + final DownloadProfile downProf = new InqubusDownloadProfile(); + final String id = Util.getVideoId(fldId.getText()); + final InqubusConvertProfile convProf = new InqubusConvertProfile(); + logger.log(Level.INFO, downProf.toString()); + logger.log(Level.INFO, convProf.toString()); + final RequestProcess rp = new RequestProcess(downProf, id, convProf); + taskManager.add(rp); + targetModel.addTarget(new Target(rp)); + initInputPanel(); + } catch (Throwable th) { + logger.log(Level.SEVERE, null, th); + JOptionPane.showMessageDialog(MainFrame.this, th.getMessage(), "中断しました", JOptionPane.ERROR_MESSAGE); + } + } + } + + private File searchFileMatchId(final File dir, final String id) { // TODO 候補は複数返すようにして、その後の対処は呼び出しもとで行ってもらった方が良いかも if (id.isEmpty()) { return null; @@ -314,30 +581,29 @@ public class MainFrame extends javax.swing.JFrame { } } + /** + * 動画, コメントの"local"チェックボックス更新時の処理. + */ private void useMovieLocalCheckBoxItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_useMovieLocalCheckBoxItemStateChanged - final Properties p = Properties.INSTANCE; + final Config p = Config.INSTANCE; final ItemSelectable source = evt.getItemSelectable(); - JButton btn; JTextField field; File dir; - if (source == useMovieLocalCheckBox) { - btn = movieFileSelectButton; - field = movieFileField; + if (source == cbVideoLocal) { + field = fldVideo; dir = new File(p.getVideoDir()); } else { - btn = commentFileSelectButton; - field = commentFileField; + field = fldComment; dir = new File(p.getCommentDir()); } final boolean useLocal = (evt.getStateChange() == ItemEvent.SELECTED); - btn.setEnabled(useLocal); String text; if (useLocal) { - final File f = searchFileMatchId(dir, idField.getText()); + final File f = searchFileMatchId(dir, fldId.getText()); if (f != null) { text = f.getPath(); } else { @@ -347,86 +613,98 @@ public class MainFrame extends javax.swing.JFrame { text = p.getVideoFileNamePattern(); } field.setText(text); + }//GEN-LAST:event_useMovieLocalCheckBoxItemStateChanged private void outputConvertCheckBoxItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_outputConvertCheckBoxItemStateChanged final boolean convert = (evt.getStateChange() == ItemEvent.SELECTED); - outputFileField.setEnabled(convert); + fldOutput.setEnabled(convert); }//GEN-LAST:event_outputConvertCheckBoxItemStateChanged private void idFieldFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_idFieldFocusLost - final Properties p = Properties.INSTANCE; - final String id = idField.getText(); + final Config p = Config.INSTANCE; + final String id = fldId.getText(); if (id.isEmpty()) { return; } - if (useMovieLocalCheckBox.isSelected() && movieFileField.getText().isEmpty()) { + if (cbVideoLocal.isSelected() && fldVideo.getText().isEmpty()) { final File dir = new File(p.getVideoDir()); final File file = searchFileMatchId(dir, id); if (file != null) { - movieFileField.setText(file.getPath()); + fldVideo.setText(file.getPath()); } } - if (useCommentLocalCheckBox.isSelected() && commentFileField.getText().isEmpty()) { + if (cbCommentLocal.isSelected() && fldComment.getText().isEmpty()) { final File dir = new File(p.getCommentDir()); final File file = searchFileMatchId(dir, id); if (file != null) { - commentFileField.setText(file.getPath()); + fldComment.setText(file.getPath()); } } }//GEN-LAST:event_idFieldFocusLost // Variables declaration - do not modify//GEN-BEGIN:variables - private javax.swing.JButton applyButton; - private javax.swing.JTextField commentFileField; - private javax.swing.JButton commentFileSelectButton; - private javax.swing.JLabel commentLabel; - private javax.swing.JTextField idField; - private javax.swing.JLabel idLabel; - private javax.swing.JButton jButton2; - private javax.swing.JButton jButton3; - private javax.swing.JButton jButton4; - private javax.swing.JPanel jPanel1; - private javax.swing.JPanel jPanel2; - private javax.swing.JPanel jPanel3; - private javax.swing.JScrollPane jScrollPane1; - private javax.swing.JTable jTable1; - private javax.swing.JTextField movieFileField; - private javax.swing.JButton movieFileSelectButton; - private javax.swing.JLabel movieLabel; - private javax.swing.JCheckBox outputConvertCheckBox; - private javax.swing.JTextField outputFileField; - private javax.swing.JLabel outputLabel; - private javax.swing.JCheckBox useCommentLocalCheckBox; - private javax.swing.JCheckBox useMovieLocalCheckBox; + private final JTable tblDisplay; + // ボタン領域 + private final JButton btnStart = new JButton("開始"); + private final JButton btnStop = new JButton("停止"); + private final JButton btnDeselect = new JButton("選択解除"); + // 入力領域 + private final JTabbedPane tbpInput = new JTabbedPane(JTabbedPane.BOTTOM); + // 入力領域 - メイン + private final IdComboBox fldId; + private final JCheckBox cbBackLogReduce = new JCheckBox("少コメ"); + private final JCheckBox cbBackLog = new JCheckBox("過去ログ"); + private final JTextField fldBackLog = new JTextField(); + private final JCheckBox cbVideoLocal; + private final JTextField fldVideo; + private final JCheckBox cbCommentLocal; + private final JTextField fldComment; + private final JCheckBox cbOutputEnable; + private final JTextField fldOutput; + // 入力領域 - ffmpeg + private final FfmpegParamPanel pnlInputFfmpeg = new FfmpegParamPanel(); + // 適用 + private final JTextField fldInputMessage = new JTextField(); + private final JButton btnApply = new JButton("適用"); // End of variables declaration//GEN-END:variables private void initInputPanel() { - idField.setText(""); + initMainTab(); + initFfmpegTab(); + tbpInput.setSelectedIndex(0); + fldId.requestFocus(); + } - final Properties p = Properties.INSTANCE; + private void initMainTab() { + final Config p = Config.INSTANCE; + + fldId.setText(""); + fldBackLog.setEnabled(false); + cbBackLog.setEnabled(true); final boolean movieLocal = p.getVideoUseLocal(); - useMovieLocalCheckBox.setSelected(movieLocal); - movieFileSelectButton.setEnabled(movieLocal); + cbVideoLocal.setSelected(movieLocal); if (!movieLocal) { - movieFileField.setText(p.getVideoFileNamePattern()); + fldVideo.setText(p.getVideoFileNamePattern()); } final boolean commentLocal = p.getCommentUseLocal(); - useCommentLocalCheckBox.setSelected(commentLocal); - commentFileSelectButton.setEnabled(commentLocal); + cbCommentLocal.setSelected(commentLocal); if (!commentLocal) { - commentFileField.setText(p.getCommentFileNamePattern()); + fldComment.setText(p.getCommentFileNamePattern()); } final boolean convert = p.getOutputEnable(); - outputConvertCheckBox.setSelected(convert); - outputFileField.setEnabled(convert); - outputFileField.setText(p.getOutputFileNamePattern()); + cbOutputEnable.setSelected(convert); + fldOutput.setEnabled(convert); + fldOutput.setText(p.getOutputFileNamePattern()); + } + private void initFfmpegTab() { + pnlInputFfmpeg.init(Config.INSTANCE); } private JMenuBar initMenuBar() { @@ -455,7 +733,7 @@ public class MainFrame extends javax.swing.JFrame { @Override public void actionPerformed(ActionEvent e) { - final yukihane.inqubus.gui.Properties dlg = new yukihane.inqubus.gui.Properties(MainFrame.this); + final yukihane.inqubus.gui.ConfigDialog dlg = new yukihane.inqubus.gui.ConfigDialog(MainFrame.this); dlg.setLocationRelativeTo(MainFrame.this); dlg.setModal(true); dlg.setVisible(true); @@ -483,6 +761,54 @@ public class MainFrame extends javax.swing.JFrame { return menuBar; } + private class DownloadProgressListener implements WorkerListener { + + @Override + public void process(DownloadProgress progress) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void cancelled() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void done(DownloadResult result) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void error(Throwable th) { + throw new UnsupportedOperationException("Not supported yet."); + } + } + + private class ConvertProgressListener implements WorkerListener { + + @Override + public void process(ConvertProgress progress) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void cancelled() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void done(ConvertResult result) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void error(Throwable th) { + throw new UnsupportedOperationException("Not supported yet."); + } + } + + + private class DownloadListTransferHandler extends TransferHandler { private static final long serialVersionUID = 1L; @@ -500,30 +826,32 @@ public class MainFrame extends javax.swing.JFrame { @Override public boolean importData(TransferHandler.TransferSupport support) { - try { - Transferable transferable = support.getTransferable(); - if (transferable.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { - @SuppressWarnings("unchecked") - final List data = (List) transferable.getTransferData(DataFlavor.javaFileListFlavor); - Collection targets = Target.from(data); - targetModel.addTarget(targets); - } else if (transferable.isDataFlavorSupported(DataFlavor.stringFlavor)) { - String data = (String) transferable.getTransferData(DataFlavor.stringFlavor); - Matcher matcher = movieIdPattern.matcher(data); - if (matcher.find()) { - String movieId = matcher.group(1); - Target target = Target.fromId(movieId); - targetModel.addTarget(target); - } else { - return false; - } - - } - return false; - } catch (Exception e) { - logger.log(Level.SEVERE, null, e); - return false; - } +// try { +// Transferable transferable = support.getTransferable(); +// if (transferable.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { +// @SuppressWarnings("unchecked") +// final List data = (List) transferable.getTransferData(DataFlavor.javaFileListFlavor); +// Collection targets = Target.from(data); +// targetModel.addTarget(targets); +// } else if (transferable.isDataFlavorSupported(DataFlavor.stringFlavor)) { +// String data = (String) transferable.getTransferData(DataFlavor.stringFlavor); +// Matcher matcher = movieIdPattern.matcher(data); +// if (matcher.find()) { +// String movieId = matcher.group(1); +// Target target = Target.fromId(movieId); +// targetModel.addTarget(target); +// } else { +// return false; +// } +// +// } +// return false; +// } catch (Exception e) { +// logger.log(Level.SEVERE, null, e); +// return false; +// } + // TODO 上記実装見直し(Locationは削除された) + return false; } } @@ -541,4 +869,585 @@ public class MainFrame extends javax.swing.JFrame { return super.importData(support); } } + + private class MainFrameWindowListener extends WindowAdapter { + @Override + public void windowClosing(WindowEvent e) { + final Config p = Config.INSTANCE; + + final Dimension size = getSize(); + p.setSystemWindowWidth(size.width); + p.setSystemWindowHeight(size.height); + + final Point pos = getLocation(); + p.setSystemWindowPosX(pos.x); + p.setSystemWindowPosY(pos.y); + + p.setSystemColumnId(tblDisplay.getColumnModel().getColumn(0).getWidth()); + p.setSystemColumnVideo(tblDisplay.getColumnModel().getColumn(1).getWidth()); + p.setSystemColumnComment(tblDisplay.getColumnModel().getColumn(2).getWidth()); + p.setSystemColumnConvert(tblDisplay.getColumnModel().getColumn(3).getWidth()); + p.setSystemColumnStatus(tblDisplay.getColumnModel().getColumn(4).getWidth()); + try { + p.save(); + } catch (ConfigurationException ex) { + logger.log(Level.SEVERE, "コンフィグ保存失敗", ex); + } + } + } + + /* + * ここからDownloadProfile作成用クラスの定義 + */ + + private class InqubusDownloadProfile implements DownloadProfile { + + private final LoginProfile loginProfile; + private final ProxyProfile proxyProfile; + private final VideoProfile videoProfile; + private final CommentProfile commentProfile; + private final GeneralProfile generalProfile; + + private InqubusDownloadProfile() { + this.loginProfile = new InqubusLoginProfile(); + this.proxyProfile = new InqubusProxyProfile(); + this.videoProfile = new InqubusVideoProfile(); + this.commentProfile = new InqubusCommentProfile(); + this.generalProfile = new InqubusGeneralProfile(); + } + + @Override + public LoginProfile getLoginInfo() { + return this.loginProfile; + } + + @Override + public ProxyProfile getProxyProfile() { + return this.proxyProfile; + } + + @Override + public VideoProfile getVideoProfile() { + return this.videoProfile; + } + + @Override + public CommentProfile getCommentProfile() { + return this.commentProfile; + } + + @Override + public GeneralProfile getGeneralProfile() { + return this.generalProfile; + } + + @Override + public String toString(){ + return ToStringBuilder.reflectionToString(this); + } + } + + private class InqubusLoginProfile implements LoginProfile { + private final String mail; + private final String password; + + private InqubusLoginProfile(){ + final Config p = Config.INSTANCE; + this.mail = p.getId(); + this.password = p.getPassword(); + } + + @Override + public String getMail() { + return this.mail; + } + + @Override + public String getPassword() { + return this.password; + } + + @Override + public String toString(){ + return ToStringBuilder.reflectionToString(this); + } + } + + private class InqubusProxyProfile implements ProxyProfile { + private final boolean use; + private final String host; + private final int port; + + private InqubusProxyProfile(){ + final Config p = Config.INSTANCE; + this.use = p.getProxyUse(); + this.host = p.getProxyHost(); + final String pp = p.getProxyPort(); + this.port = StringUtils.isBlank(pp) ? -1 : Integer.parseInt(pp); + } + + @Override + public boolean use() { + return this.use; + } + + @Override + public String getHost() { + return this.host; + } + + @Override + public int getPort() { + return this.port; + } + + @Override + public String toString(){ + return ToStringBuilder.reflectionToString(this); + } + } + + private class InqubusVideoProfile implements VideoProfile { + private final boolean download; + private final File dir; + private final String fileName; + private final File localFile; + + private InqubusVideoProfile(){ + final Config p = Config.INSTANCE; + this.download = !cbVideoLocal.isSelected(); + if (this.download) { + this.dir = new File(p.getVideoDir()); + this.fileName = fldVideo.getText(); + this.localFile = null; + } else { + this.dir = null; + this.fileName = null; + this.localFile = new File(fldVideo.getText()); + } + } + + @Override + public boolean isDownload() { + return this.download; + } + + @Override + public File getDir() { + return this.dir; + } + + @Override + public String getFileName() { + return this.fileName; + } + + @Override + public File getLocalFile() { + return this.localFile; + } + + @Override + public String toString(){ + return ToStringBuilder.reflectionToString(this); + } + } + + private class InqubusCommentProfile implements CommentProfile { + private final boolean download; + private final File dir; + private final String fileName; + private final File localFile; + private final int lengthRelatedCommentSize; + private final boolean disablePerMinComment; + private final int perMinCommentSize; + private final long backLogPoint; + + private InqubusCommentProfile() { + final Config p = Config.INSTANCE; + this.download = !cbCommentLocal.isSelected(); + if (this.download) { + this.dir = new File(p.getCommentDir()); + this.fileName = fldComment.getText(); + this.localFile = null; + } else { + this.dir = null; + this.fileName = null; + this.localFile = new File(fldComment.getText()); + } + + if(cbBackLog.isSelected()) { + try { + this.backLogPoint = WayBackTimeParser.parse(fldBackLog.getText()); + } catch (IOException ex) { + throw new IllegalArgumentException("過去ログ時刻指定が誤っています。", ex); + } + } else { + this.backLogPoint = -1L; + } + + this.disablePerMinComment = cbBackLogReduce.isSelected(); + this.lengthRelatedCommentSize + = (p.getCommentSizeAutosize()) ? -1 : Integer.parseInt(p.getCommentSizeManual()); + this.perMinCommentSize + = (p.getCommentMinSizeAutosize()) ? -1 : Integer.parseInt(p.getCommentMinSizeManual()); + } + + @Override + public boolean isDownload() { + return this.download; + } + + @Override + public File getDir() { + return this.dir; + } + + @Override + public String getFileName() { + return this.fileName; + } + + @Override + public File getLocalFile() { + return this.localFile; + } + + @Override + public int getLengthRelatedCommentSize() { + return this.lengthRelatedCommentSize; + } + + @Override + public boolean isDisablePerMinComment() { + return this.disablePerMinComment; + } + + @Override + public int getPerMinCommentSize() { + return this.perMinCommentSize; + } + + @Override + public long getBackLogPoint() { + return this.backLogPoint; + } + + @Override + public String toString(){ + return ToStringBuilder.reflectionToString(this); + } + } + + private class InqubusGeneralProfile implements GeneralProfile { + private final String replaceFrom; + private final String replaceTo; + private InqubusGeneralProfile() { + final Config p = Config.INSTANCE; + this.replaceFrom = p.getReplaceFrom(); + this.replaceTo = p.getReplaceTo(); + } + + @Override + public String getReplaceFrom() { + return this.replaceFrom; + } + + @Override + public String getReplaceTo() { + return this.replaceTo; + } + + @Override + public String toString(){ + return ToStringBuilder.reflectionToString(this); + } + } + + /* + * ここからConvertProfile作成用クラスの定義 + */ + private class InqubusConvertProfile implements ConvertProfile { + private final OutputProfile outputProfile; + private final GeneralProfile generalProfile; + private final FfmpegProfile ffmpegProfile; + private final boolean convert; + private final File ffmpeg; + private final boolean vhookDisabled; + private final boolean commentOverlay; + private final File vhook; + private final File tmpDir; + private final File font; + private final int fontIndex; + private final boolean commentOpaque; + private final boolean disableFontSizeArrange; + private final int shadowIndex; + private final boolean showConvrting; + private final int maxNumOfComment; + private final HideCondition ngSetting; + + private InqubusConvertProfile() throws IOException { + final Config p = Config.INSTANCE; + this.outputProfile = new InqubusOutputProfile(); + this.generalProfile = new InqubusGeneralProfile(); + this.ffmpegProfile = new InqubusFfmpegProfile(); + this.convert = cbOutputEnable.isSelected(); + this.ffmpeg = new File(p.getFfmpegPath()); + // TODO コンフィグに設定なし + this.vhookDisabled = false; + this.commentOverlay = p.getOutputCommentOverlay(); + this.vhook = new File(p.getFfmpegDllPath()); + this.tmpDir = new File(p.getSystemTempDir()); + this.font = new File(p.getFontPath()); + this.fontIndex = Integer.parseInt(p.getFontIndex()); + this.commentOpaque = p.getCommentOpaque(); + this.disableFontSizeArrange = p.getFontSizeArrangeDisable(); + this.shadowIndex = p.getFontShadow(); + // TODO コンフィグに設定なし + this.showConvrting = true; + this.maxNumOfComment = (p.getCommentDisplaySizeDefault()) ? -1 : Integer.parseInt(p. + getCommentDisplaySizeManual()); + this.ngSetting = new InqubusHideCondition(); + } + + @Override + public OutputProfile getOutputProfile() { + return this.outputProfile; + } + + @Override + public GeneralProfile getGeneralProfile() { + return this.generalProfile; + } + + @Override + public FfmpegProfile getFfmpegOption() { + return this.ffmpegProfile; + } + + @Override + public boolean isConvert() { + return this.convert; + } + + @Override + public File getFfmpeg() { + return this.ffmpeg; + } + + @Override + public boolean isVhookDisabled() { + return this.vhookDisabled; + } + + @Override + public boolean isCommentOverlay() { + return this.commentOverlay; + } + + @Override + public File getVhook() { + return this.vhook; + } + + @Override + public File getTempDir() { + return this.tmpDir; + } + + @Override + public File getFont() { + return this.font; + } + + @Override + public int getFontIndex() { + return this.fontIndex; + } + + @Override + public boolean isCommentOpaque() { + return this.commentOpaque; + } + + @Override + public boolean isDisableFontSizeArrange() { + return this.disableFontSizeArrange; + } + + @Override + public int getShadowIndex() { + return this.shadowIndex; + } + + @Override + public boolean isShowConverting() { + return this.showConvrting; + } + + @Override + public int getMaxNumOfComment() { + return this.maxNumOfComment; + } + + @Override + public HideCondition getNgSetting() { + return this.ngSetting; + } + + @Override + public String toString(){ + return ToStringBuilder.reflectionToString(this); + } + } + + private class InqubusOutputProfile implements OutputProfile { + private final File dir; + private final String fileName; + private final String videoId; + private final String title; + + + private InqubusOutputProfile(){ + final Config p = Config.INSTANCE; + this.dir = new File(p.getOutputDir()); + this.fileName = fldOutput.getText(); + // TODO この時点でのID/Titleはどうするか… + this.videoId = ""; + this.title = ""; + } + + @Override + public File getDir() { + return this.dir; + } + + @Override + public String getFileName() { + return this.fileName; + } + + @Override + public String getVideoId() { + return this.videoId; + } + + @Override + public String getTitile() { + return this.title; + } + + @Override + public String toString(){ + return ToStringBuilder.reflectionToString(this); + } + } + + private class InqubusFfmpegProfile implements FfmpegProfile { + private final String extOption; + private final String inOption; + private final String mainOption; + private final String outOption; + private final String avOption; + private final boolean resize; + private final int resizeWidth; + private final int resizeHeight; + private final boolean adjustRatio; + + private InqubusFfmpegProfile() throws IOException { + final File file = pnlInputFfmpeg.mdlFfmpegOption.getSelectedFile(); + if (file != null) { + final FfmpegOption ffop = FfmpegOption.load(file); + this.extOption = ffop.getExtOption(); + this.inOption = ffop.getInOption(); + this.mainOption = ffop.getMainOption(); + this.outOption = ffop.getMainOption(); + this.avOption = ffop.getAvfilterOption(); + this.resize = ffop.isResize(); + this.resizeWidth = ffop.getResizeWidth(); + this.resizeHeight = ffop.getResizeHeight(); + this.adjustRatio = ffop.isAdjustRatio(); + } else { + this.extOption = pnlInputFfmpeg.fldFfmpegOptionExtension.getText(); + this.inOption = pnlInputFfmpeg.fldFfmpegOptionIn.getText(); + this.mainOption = pnlInputFfmpeg.fldFfmpegOptionMain.getText(); + this.outOption = pnlInputFfmpeg.fldFfmpegOptionOut.getText(); + this.avOption = pnlInputFfmpeg.fldFfmpegOptionAv.getText(); + this.resize = pnlInputFfmpeg.cbFfmpegOptionResize.isSelected(); + this.resizeWidth = Integer.parseInt(pnlInputFfmpeg.fldFfmpegOptionResizeWidth.getText()); + this.resizeHeight = Integer.parseInt(pnlInputFfmpeg.fldFfmpegOptionResizeHeight.getText()); + this.adjustRatio = pnlInputFfmpeg.cbFfmpegOptionKeepAspect.isSelected(); + } + } + + @Override + public String getExtOption() { + return this.extOption; + } + + @Override + public String getInOption() { + return this.inOption; + } + + @Override + public String getMainOption() { + return this.mainOption; + } + + @Override + public String getOutOption() { + return this.outOption; + } + + @Override + public String getAvfilterOption() { + return this.avOption; + } + + @Override + public boolean isResize() { + return this.resize; + } + + @Override + public int getResizeWidth() { + return this.resizeWidth; + } + + @Override + public int getResizeHeight() { + return this.resizeHeight; + } + + @Override + public boolean isAdjustRatio() { + return this.adjustRatio; + } + + @Override + public String toString(){ + return ToStringBuilder.reflectionToString(this); + } + } + + private class InqubusHideCondition implements ConvertProfile.HideCondition{ + + @Override + public String getWord() { + // TODO + return ""; + } + + @Override + public String getId() { + // TODO + return ""; + } + + @Override + public String toString(){ + return ToStringBuilder.reflectionToString(this); + } + } }