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.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.beans.PropertyChangeEvent;
import java.util.List;
import java.util.Set;
import java.util.SortedSet;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import java.util.regex.Pattern;
import javax.swing.BorderFactory;
import javax.swing.DefaultComboBoxModel;
import javax.swing.DropMode;
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 javax.swing.table.TableModel;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.lang.builder.ToStringBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import saccubus.MainFrame_AboutBox;
import saccubus.util.WayBackTimeParser;
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 yukihane.inqubus.manager.TaskStatus;
import yukihane.inqubus.model.Target;
import yukihane.inqubus.model.TargetsTableModel;
+import yukihane.inqubus.thumbnail.Repository;
+import yukihane.inqubus.thumbnail.Thumbnail;
/**
*
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
- = "<html>ダウンロードする場合はチェックを外します。<br/>ローカルファイルを使用する場合はチェックを入れます。</html>";
- private static final String FILE_INPUTFIELD_TOOLTIP
- = "<html>ダウンロードする場合はファイル命名規則を入力します。<br/>"
- + "ローカルファイルを使用する場合はパスを含むファイル名を入力します。</html>";
- private static final String FILE_OUTPUTFIELD_TOOLTIP
- = "ファイル命名規則入力します。";
+ private static final Logger logger = LoggerFactory.getLogger(MainFrame.class);
+ private final Repository thumbRepository = new Repository();
private final TargetsTableModel targetModel = new TargetsTableModel();
private final TaskManage taskManager;
private final Thread videoFileWatcherThread;
public MainFrame() {
super();
addWindowListener(new MainFrameWindowListener());
+ setTitle(MainFrame_AboutBox.VERSION);
final Config p = Config.INSTANCE;
final JPanel pnlMain = new JPanel();
final JScrollPane scrDisplay = new JScrollPane();
- tblDisplay = new JTable(targetModel, new TargetsColumnModel());
+ tblDisplay = new JTable(targetModel, new TargetsColumnModel()) {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public String getToolTipText(MouseEvent e) {
+ int row = convertRowIndexToModel(rowAtPoint(e.getPoint()));
+ TableModel m = getModel();
+ final String videoId = (String) m.getValueAt(row, 0);
+ try {
+ final Thumbnail thumbnail = thumbRepository.getThumnail(videoId);
+ if (thumbnail == null) {
+ return videoId + ": 動画情報未取得";
+ }
+
+ final URL imageUrl = thumbnail.getImageFile().toURI().toURL();
+
+ return "<html>" + videoId + ": " + thumbnail.getTitle()
+ + " (" + thumbnail.getLength() + ")" + "<br/>"
+ + "<img src=\"" + imageUrl + "\"/>"
+ + "</html>";
+ } catch (Throwable ex) {
+ logger.warn(null, ex);
+ return videoId + ": 情報取得できません";
+ }
+ }
+ };
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);
- cmbVideo.setToolTipText(FILE_INPUTFIELD_TOOLTIP);
btnVideo.addActionListener(
new FileChooseActionListener(MainFrame.this, JFileChooser.FILES_ONLY, fldVideo));
+ fldVideo.setTransferHandler(new ContentTransferHandler(fldVideo.getTransferHandler(), cbVideoLocal));
final JLabel lblComment = new JLabel();
fldBackLog.setToolTipText("YYYY/MM/DD hh:mm:ss形式、あるいは1970/01/01からの経過秒を入力します。");
cbBackLogReduce.setToolTipText("「コメントの量を減らす」場合はチェックを付けます。");
cbCommentLocal = new JCheckBox();
- cbCommentLocal.setToolTipText(FILE_LOCALBUTTON_TOOLTIP);
- cbCommentLocal.addItemListener(new ItemListener() {
+ cbOwnerComment = new JCheckBox();
- @Override
- public void itemStateChanged(ItemEvent e) {
- final boolean selected = (e.getStateChange() == ItemEvent.SELECTED);
- cbBackLogReduce.setEnabled(!selected);
- cbBackLog.setEnabled(!selected);
- }
- });
- cmbComment.setToolTipText(FILE_INPUTFIELD_TOOLTIP);
btnComment.addActionListener(
new FileChooseActionListener(MainFrame.this, JFileChooser.FILES_ONLY, fldComment));
+ fldComment.setTransferHandler(new ContentTransferHandler(fldComment.getTransferHandler(), cbCommentLocal));
+
final JLabel lblOutput = new JLabel();
cbOutputEnable = new JCheckBox();
fldOutput = new JTextField();
- fldOutput.setToolTipText(FILE_OUTPUTFIELD_TOOLTIP);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
cmbId = new IdComboBox(videoFileWatcher);
- cmbId.setToolTipText(ID_FIELD_TOOLTIP);
cmbId.getEditorComponent().addActionListener(applyListener);
cmbId.getEditorComponent().addFocusListener(new java.awt.event.FocusAdapter() {
+ @Override
public void focusLost(java.awt.event.FocusEvent evt) {
idFieldFocusLost(evt);
}
cbVideoLocal.setText("local");
cbVideoLocal.addItemListener(new java.awt.event.ItemListener() {
+ @Override
public void itemStateChanged(java.awt.event.ItemEvent evt) {
useMovieLocalCheckBoxItemStateChanged(evt);
}
lblComment.setText("コメント");
cbCommentLocal.setText("local");
- cbCommentLocal.addItemListener(new java.awt.event.ItemListener() {
+ cbCommentLocal.addItemListener(new ItemListener() {
- public void itemStateChanged(java.awt.event.ItemEvent evt) {
- useMovieLocalCheckBoxItemStateChanged(evt);
+ @Override
+ public void itemStateChanged(ItemEvent e) {
+ useMovieLocalCheckBoxItemStateChanged(e);
+ final boolean selected = (e.getStateChange() == ItemEvent.SELECTED);
+ cbBackLogReduce.setEnabled(!selected);
+ cbBackLog.setEnabled(!selected);
+ cbOwnerComment.setEnabled(!selected);
}
});
+ cbOwnerComment.setText("投コメのみ");
+
lblOutput.setText("出力");
cbOutputEnable.setText("変換");
cbOutputEnable.addItemListener(new java.awt.event.ItemListener() {
+ @Override
public void itemStateChanged(java.awt.event.ItemEvent evt) {
outputConvertCheckBoxItemStateChanged(evt);
}
.addComponent(lblId)
.addPreferredGap(ComponentPlacement.RELATED)
.addComponent(cmbId, 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()
)
.addPreferredGap(ComponentPlacement.RELATED)
.addGroup(glInputMain.createParallelGroup(Alignment.LEADING)
- .addComponent(cbVideoLocal)
- .addComponent(cbCommentLocal)
- .addComponent(cbOutputEnable)
- )
- .addPreferredGap(ComponentPlacement.RELATED)
- .addGroup(glInputMain.createParallelGroup(Alignment.LEADING)
- .addComponent(cmbVideo, 300, 300, Short.MAX_VALUE)
- .addComponent(cmbComment, 300, 300, Short.MAX_VALUE)
- .addComponent(fldOutput, 300, 300, Short.MAX_VALUE)
- )
- .addGroup(glInputMain.createParallelGroup()
- .addComponent(btnVideo)
- .addComponent(btnComment)
+ .addGroup(glInputMain.createSequentialGroup()
+ .addGroup(glInputMain.createParallelGroup(Alignment.LEADING)
+ .addComponent(cbVideoLocal)
+ .addComponent(cbCommentLocal)
+ .addComponent(cbOutputEnable)
+ )
+ .addPreferredGap(ComponentPlacement.RELATED)
+ .addGroup(glInputMain.createParallelGroup(Alignment.LEADING)
+ .addComponent(cmbVideo, 300, 300, Short.MAX_VALUE)
+ .addComponent(cmbComment, 300, 300, Short.MAX_VALUE)
+ .addComponent(fldOutput, 300, 300, Short.MAX_VALUE)
+ )
+ .addGroup(glInputMain.createParallelGroup()
+ .addComponent(btnVideo)
+ .addComponent(btnComment)
+ )
+ .addContainerGap()
+ )
+ .addGroup(glInputMain.createSequentialGroup()
+ .addComponent(cbOwnerComment)
+ .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.createParallelGroup(Alignment.BASELINE)
.addComponent(cmbId, 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)
)
.addPreferredGap(ComponentPlacement.RELATED)
.addGroup(glInputMain.createParallelGroup(Alignment.BASELINE)
+ .addComponent(cbOwnerComment)
+ .addComponent(cbBackLogReduce)
+ .addComponent(cbBackLog)
+ .addComponent(fldBackLog)
+ )
+ .addPreferredGap(ComponentPlacement.RELATED)
+ .addGroup(glInputMain.createParallelGroup(Alignment.BASELINE)
.addComponent(lblOutput)
.addComponent(fldOutput, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
.addComponent(cbOutputEnable)
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});
+ logger.debug("停止: {} {}", t.getVideoId(), res);
if (res) {
targetModel.setStatus(t.getRowId(), null, TaskStatus.CANCELLED, -1.0, "キャンセル");
}
final DownloadProfile downProf = new InqubusDownloadProfile();
final String id = Util.getVideoId(cmbId.getText());
final InqubusConvertProfile convProf = new InqubusConvertProfile();
- logger.log(Level.INFO, downProf.toString());
- logger.log(Level.INFO, convProf.toString());
+ logger.debug(downProf.toString());
+ logger.debug(convProf.toString());
+
+ final File tempDir = new File(Config.INSTANCE.getSystemTempDir());
+ thumbRepository.request(downProf.getProxyProfile(), tempDir, id);
+
final RequestProcess rp = new RequestProcess(downProf, id, convProf);
- taskManager.add(rp);
- targetModel.addTarget(new Target(rp));
- initInputPanel();
+ final boolean res = taskManager.add(rp);
+ if (res) {
+ targetModel.addTarget(new Target(rp));
+ initInputPanel();
+ } else {
+ fldInputMessage.setText("行うべき処理がありません");
+ }
} catch (Throwable th) {
- logger.log(Level.SEVERE, null, th);
+ logger.error(null, th);
JOptionPane.showMessageDialog(MainFrame.this, th.getMessage(), "中断しました", JOptionPane.ERROR_MESSAGE);
}
}
private final FileComboBox cmbComment = new FileComboBox();
private final JTextField fldComment = cmbComment.getEditorComponent();
private final JButton btnComment = new JButton("...");
+ private final JCheckBox cbOwnerComment;
private final JCheckBox cbOutputEnable;
private final JTextField fldOutput;
// 入力領域 - ffmpeg
// End of variables declaration//GEN-END:variables
private void initInputPanel() {
+ fldInputMessage.setText("");
initMainTab();
initFfmpegTab();
tbpInput.setSelectedIndex(0);
cmbId.setText("");
cbBackLogReduce.setSelected(p.getCommentMinDisabled());
cbBackLog.setEnabled(true);
+ cbBackLog.setSelected(false);
fldBackLog.setEnabled(false);
+ fldBackLog.setText("");
final boolean videoLocal = p.getVideoUseLocal();
cbVideoLocal.setSelected(videoLocal);
try {
p.save();
} catch (ConfigurationException ex) {
- logger.log(Level.SEVERE, "コンフィグ保存失敗", ex);
+ logger.error("コンフィグ保存失敗", ex);
}
}
}
private class InqubusCommentProfile extends ConfigCommentProfile {
private final boolean download;
+ private final boolean ownerCommentOnly;
private final File dir;
private final String fileName;
private final File localFile;
this.dir = new File(p.getCommentDir());
this.fileName = fldComment.getText();
this.localFile = null;
+ this.ownerCommentOnly = cbOwnerComment.isSelected();
} else {
this.dir = null;
this.fileName = null;
this.localFile = new File(fldComment.getText());
+ this.ownerCommentOnly = false;
}
if(cbBackLog.isSelected()) {
}
@Override
+ public boolean isOwnerCommentOnly(){
+ return this.ownerCommentOnly;
+ }
+
+ @Override
public File getDir() {
return this.dir;
}
private final boolean convert;
private InqubusConvertProfile() throws IOException {
- final Config p = Config.INSTANCE;
this.outputProfile = new InqubusOutputProfile();
this.generalProfile = new ConfigGeneralProfile();
private InqubusOutputProfile() {
- final Config p = Config.INSTANCE;
this.fileName = fldOutput.getText();
// TODO この時点でのID/Titleはどうするか…
this.videoId = "";
private final boolean adjustRatio;
private InqubusFfmpegProfile() throws IOException {
- this.extOption = pnlInputFfmpeg.fldFfmpegOptionExtension.getText();
+ String ext = pnlInputFfmpeg.fldFfmpegOptionExtension.getText();
+ if (!ext.startsWith(".")) {
+ ext = "." + ext;
+ }
+ this.extOption = ext;
this.inOption = pnlInputFfmpeg.fldFfmpegOptionIn.getText();
this.mainOption = pnlInputFfmpeg.fldFfmpegOptionMain.getText();
this.outOption = pnlInputFfmpeg.fldFfmpegOptionOut.getText();