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.beans.PropertyChangeListener;
import java.io.File;
import java.io.IOException;
+import java.net.MalformedURLException;
import java.net.URL;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.util.List;
import java.util.Set;
import java.util.SortedSet;
-import java.util.logging.Level;
-import java.util.logging.Logger;
+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 saccubus.MainFrame_AboutBox;
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));
cbBackLogReduce.setToolTipText("「コメントの量を減らす」場合はチェックを付けます。");
cbCommentLocal = new JCheckBox();
- cbCommentLocal.setToolTipText(FILE_LOCALBUTTON_TOOLTIP);
cbCommentLocal.addItemListener(new ItemListener() {
@Override
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);
}
cbCommentLocal.setText("local");
cbCommentLocal.addItemListener(new java.awt.event.ItemListener() {
+ @Override
public void itemStateChanged(java.awt.event.ItemEvent evt) {
useMovieLocalCheckBoxItemStateChanged(evt);
}
cbOutputEnable.setText("変換");
cbOutputEnable.addItemListener(new java.awt.event.ItemListener() {
+ @Override
public void itemStateChanged(java.awt.event.ItemEvent evt) {
outputConvertCheckBoxItemStateChanged(evt);
}
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();
} catch (Throwable th) {
- logger.log(Level.SEVERE, null, th);
+ logger.error(null, th);
JOptionPane.showMessageDialog(MainFrame.this, th.getMessage(), "中断しました", JOptionPane.ERROR_MESSAGE);
}
}
try {
p.save();
} catch (ConfigurationException ex) {
- logger.log(Level.SEVERE, "コンフィグ保存失敗", ex);
+ logger.error("コンフィグ保存失敗", ex);
}
}
}
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();