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 org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import javax.swing.BorderFactory;
import javax.swing.DefaultComboBoxModel;
import javax.swing.DropMode;
import javax.swing.SwingUtilities;
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 yukihane.inqubus.manager.TaskStatus;
import yukihane.inqubus.model.Target;
import yukihane.inqubus.model.TargetsTableModel;
+import yukihane.inqubus.thumbnail.Repository;
+import yukihane.inqubus.thumbnail.Thumbnail;
/**
*
private static final long serialVersionUID = 1L;
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();
cbBackLogReduce.setToolTipText("「コメントの量を減らす」場合はチェックを付けます。");
cbCommentLocal = new JCheckBox();
- 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);
- }
- });
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();
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.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)
+ )
)
- .addGroup(glInputMain.createParallelGroup()
- .addComponent(btnVideo)
- .addComponent(btnComment)
- )
- .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 InqubusConvertProfile convProf = new InqubusConvertProfile();
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.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);
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 = "";