diff --git a/pom.xml b/pom.xml index 15e8ea137..83afd4cca 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 com.tonikelope MegaBasterd - 7.56 + 7.57 jar diff --git a/src/main/java/com/tonikelope/megabasterd/ClipboardSpy.java b/src/main/java/com/tonikelope/megabasterd/ClipboardSpy.java index 4fe36f77a..68e0b9500 100644 --- a/src/main/java/com/tonikelope/megabasterd/ClipboardSpy.java +++ b/src/main/java/com/tonikelope/megabasterd/ClipboardSpy.java @@ -49,7 +49,15 @@ public class ClipboardSpy implements Runnable, ClipboardOwner, SecureSingleThrea _enabled = enabled; - if (_enabled) { + boolean monitor_clipboard = true; + + String monitor_clipboard_string = DBTools.selectSettingValue("clipboardspy"); + + if (monitor_clipboard_string != null) { + monitor_clipboard = monitor_clipboard_string.equals("yes"); + } + + if (_enabled && monitor_clipboard) { _contents = getClipboardContents(); diff --git a/src/main/java/com/tonikelope/megabasterd/Download.java b/src/main/java/com/tonikelope/megabasterd/Download.java index 3810e3387..726527cf2 100644 --- a/src/main/java/com/tonikelope/megabasterd/Download.java +++ b/src/main/java/com/tonikelope/megabasterd/Download.java @@ -50,6 +50,7 @@ public class Download implements Transference, Runnable, SecureSingleThreadNotif public static final boolean USE_SLOTS_DEFAULT = true; public static final int WORKERS_DEFAULT = 6; public static final boolean USE_MEGA_ACCOUNT_DOWN = false; + public static final boolean DEFAULT_CLIPBOARD_LINK_MONITOR = true; public static final int CHUNK_SIZE_MULTI = 20; private static final Logger LOG = Logger.getLogger(Download.class.getName()); diff --git a/src/main/java/com/tonikelope/megabasterd/MainPanel.java b/src/main/java/com/tonikelope/megabasterd/MainPanel.java index 1bdc0a942..9af4b4168 100644 --- a/src/main/java/com/tonikelope/megabasterd/MainPanel.java +++ b/src/main/java/com/tonikelope/megabasterd/MainPanel.java @@ -58,7 +58,7 @@ import javax.swing.UIManager; */ public final class MainPanel { - public static final String VERSION = "7.56"; + public static final String VERSION = "7.57"; public static final boolean FORCE_SMART_PROXY = false; //TRUE FOR DEBUGING SMART PROXY public static final int THROTTLE_SLICE_SIZE = 16 * 1024; public static final int DEFAULT_BYTE_BUFFER_SIZE = 16 * 1024; diff --git a/src/main/java/com/tonikelope/megabasterd/SettingsDialog.form b/src/main/java/com/tonikelope/megabasterd/SettingsDialog.form index 97cbe6bfd..e15fe5c9b 100644 --- a/src/main/java/com/tonikelope/megabasterd/SettingsDialog.form +++ b/src/main/java/com/tonikelope/megabasterd/SettingsDialog.form @@ -33,7 +33,7 @@ - + @@ -48,7 +48,7 @@ - + @@ -134,6 +134,7 @@ + @@ -143,7 +144,6 @@ - @@ -153,11 +153,6 @@ - - - - - @@ -194,10 +189,17 @@ + + + + + + + + - @@ -226,14 +228,16 @@ - + + + - + @@ -519,6 +523,14 @@ + + + + + + + + @@ -719,6 +731,8 @@ + + @@ -734,7 +748,7 @@ - + @@ -754,16 +768,17 @@ - + + - + @@ -972,6 +987,20 @@ + + + + + + + + + + + + + + diff --git a/src/main/java/com/tonikelope/megabasterd/SettingsDialog.java b/src/main/java/com/tonikelope/megabasterd/SettingsDialog.java index c4ad6a1e2..448967199 100644 --- a/src/main/java/com/tonikelope/megabasterd/SettingsDialog.java +++ b/src/main/java/com/tonikelope/megabasterd/SettingsDialog.java @@ -16,6 +16,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; +import java.nio.file.Files; import java.nio.file.Paths; import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; @@ -25,10 +26,13 @@ import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; +import java.util.stream.Collectors; +import java.util.stream.Stream; import javax.crypto.BadPaddingException; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; @@ -42,6 +46,7 @@ import javax.swing.RowSorter; import javax.swing.SortOrder; import javax.swing.SpinnerNumberModel; import static javax.swing.WindowConstants.DISPOSE_ON_CLOSE; +import javax.swing.filechooser.FileNameExtensionFilter; import javax.swing.table.DefaultTableModel; /** @@ -172,6 +177,16 @@ public class SettingsDialog extends javax.swing.JDialog { custom_chunks_dir_current_label.setEnabled(false); } + boolean monitor_clipboard = Download.DEFAULT_CLIPBOARD_LINK_MONITOR; + + String monitor_clipboard_string = DBTools.selectSettingValue("clipboardspy"); + + if (monitor_clipboard_string != null) { + monitor_clipboard = monitor_clipboard_string.equals("yes"); + } + + clipboardspy_checkbox.setSelected(monitor_clipboard); + String default_download_dir = DBTools.selectSettingValue("default_down_dir"); default_download_dir = Paths.get(default_download_dir == null ? MainPanel.MEGABASTERD_HOME_DIR : default_download_dir).toAbsolutePath().normalize().toString(); @@ -668,6 +683,7 @@ public class SettingsDialog extends javax.swing.JDialog { custom_proxy_textarea = new javax.swing.JTextArea(); custom_proxy_list_label = new javax.swing.JLabel(); rec_smart_proxy_label1 = new javax.swing.JLabel(); + clipboardspy_checkbox = new javax.swing.JCheckBox(); uploads_scrollpane = new javax.swing.JScrollPane(); uploads_panel = new javax.swing.JPanel(); default_slots_up_label = new javax.swing.JLabel(); @@ -693,6 +709,7 @@ public class SettingsDialog extends javax.swing.JDialog { remove_elc_account_button = new javax.swing.JButton(); add_elc_account_button = new javax.swing.JButton(); jLabel1 = new javax.swing.JLabel(); + import_mega_button = new javax.swing.JButton(); advanced_scrollpane = new javax.swing.JScrollPane(); advanced_panel = new javax.swing.JPanel(); proxy_panel = new javax.swing.JPanel(); @@ -882,6 +899,9 @@ public class SettingsDialog extends javax.swing.JDialog { rec_smart_proxy_label1.setFont(new java.awt.Font("Dialog", 1, 14)); // NOI18N rec_smart_proxy_label1.setText("WARNING: Using proxies or VPN to bypass MEGA's daily download limitation may violate its Terms of Use. USE THIS OPTION AT YOUR OWN RISK."); + clipboardspy_checkbox.setFont(new java.awt.Font("Dialog", 1, 18)); // NOI18N + clipboardspy_checkbox.setText("Monitor clipboard looking for new links"); + javax.swing.GroupLayout downloads_panelLayout = new javax.swing.GroupLayout(downloads_panel); downloads_panel.setLayout(downloads_panelLayout); downloads_panelLayout.setHorizontalGroup( @@ -889,6 +909,7 @@ public class SettingsDialog extends javax.swing.JDialog { .addGroup(downloads_panelLayout.createSequentialGroup() .addContainerGap() .addGroup(downloads_panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.TRAILING) .addGroup(downloads_panelLayout.createSequentialGroup() .addGroup(downloads_panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(smart_proxy_checkbox) @@ -897,7 +918,6 @@ public class SettingsDialog extends javax.swing.JDialog { .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(max_downloads_spinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addComponent(multi_slot_down_checkbox) - .addComponent(limit_download_speed_checkbox) .addGroup(downloads_panelLayout.createSequentialGroup() .addGap(21, 21, 21) .addGroup(downloads_panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) @@ -906,10 +926,6 @@ public class SettingsDialog extends javax.swing.JDialog { .addComponent(default_slots_down_label) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(default_slots_down_spinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addGroup(downloads_panelLayout.createSequentialGroup() - .addComponent(max_down_speed_label) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(max_down_speed_spinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(downloads_panelLayout.createSequentialGroup() .addComponent(use_mega_label) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) @@ -936,9 +952,15 @@ public class SettingsDialog extends javax.swing.JDialog { .addGroup(downloads_panelLayout.createSequentialGroup() .addComponent(megacrypter_reverse_port_label) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(megacrypter_reverse_port_spinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))))) - .addGap(0, 132, Short.MAX_VALUE)) - .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.TRAILING)) + .addComponent(megacrypter_reverse_port_spinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))) + .addComponent(limit_download_speed_checkbox) + .addGroup(downloads_panelLayout.createSequentialGroup() + .addGap(21, 21, 21) + .addComponent(max_down_speed_label) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(max_down_speed_spinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(clipboardspy_checkbox)) + .addGap(0, 132, Short.MAX_VALUE))) .addContainerGap()) ); downloads_panelLayout.setVerticalGroup( @@ -961,13 +983,15 @@ public class SettingsDialog extends javax.swing.JDialog { .addComponent(default_slots_down_spinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(rec_download_slots_label) - .addGap(18, 18, 18) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(clipboardspy_checkbox) + .addGap(10, 10, 10) .addComponent(limit_download_speed_checkbox) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(downloads_panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(max_down_speed_spinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(max_down_speed_label)) - .addGap(18, 18, 18) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(verify_file_down_checkbox) .addGap(18, 18, 18) .addComponent(use_mega_account_down_checkbox) @@ -1215,6 +1239,15 @@ public class SettingsDialog extends javax.swing.JDialog { jLabel1.setText("Note: you can use a (optional) alias for your email addresses -> bob@supermail.com#bob_mail (don't forget to save after entering your accounts)."); jLabel1.setDoubleBuffered(true); + import_mega_button.setFont(new java.awt.Font("Dialog", 1, 18)); // NOI18N + import_mega_button.setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/icons8-import-30.png"))); // NOI18N + import_mega_button.setText("IMPORT ACCOUNTS (FILE)"); + import_mega_button.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + import_mega_buttonActionPerformed(evt); + } + }); + javax.swing.GroupLayout accounts_panelLayout = new javax.swing.GroupLayout(accounts_panel); accounts_panel.setLayout(accounts_panelLayout); accounts_panelLayout.setHorizontalGroup( @@ -1232,6 +1265,8 @@ public class SettingsDialog extends javax.swing.JDialog { .addGroup(accounts_panelLayout.createSequentialGroup() .addComponent(remove_mega_account_button) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(import_mega_button) + .addGap(18, 18, 18) .addComponent(add_mega_account_button)) .addComponent(elc_accounts_scrollpane) .addGroup(accounts_panelLayout.createSequentialGroup() @@ -1243,7 +1278,7 @@ public class SettingsDialog extends javax.swing.JDialog { .addComponent(mega_accounts_label) .addComponent(elc_accounts_label)) .addGap(0, 0, Short.MAX_VALUE)) - .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, 1072, Short.MAX_VALUE)) .addContainerGap()) ); accounts_panelLayout.setVerticalGroup( @@ -1259,15 +1294,16 @@ public class SettingsDialog extends javax.swing.JDialog { .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jLabel1) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(mega_accounts_scrollpane, javax.swing.GroupLayout.DEFAULT_SIZE, 26, Short.MAX_VALUE) + .addComponent(mega_accounts_scrollpane, javax.swing.GroupLayout.DEFAULT_SIZE, 154, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(accounts_panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(remove_mega_account_button) - .addComponent(add_mega_account_button)) + .addComponent(add_mega_account_button) + .addComponent(import_mega_button)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(elc_accounts_label) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(elc_accounts_scrollpane, javax.swing.GroupLayout.DEFAULT_SIZE, 26, Short.MAX_VALUE) + .addComponent(elc_accounts_scrollpane, javax.swing.GroupLayout.DEFAULT_SIZE, 154, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(accounts_panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(remove_elc_account_button) @@ -1659,7 +1695,7 @@ public class SettingsDialog extends javax.swing.JDialog { .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(panel_tabs, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE) .addGroup(layout.createSequentialGroup() - .addComponent(status, javax.swing.GroupLayout.DEFAULT_SIZE, 103, Short.MAX_VALUE) + .addComponent(status, javax.swing.GroupLayout.DEFAULT_SIZE, 809, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(save_button) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) @@ -1670,7 +1706,7 @@ public class SettingsDialog extends javax.swing.JDialog { layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addContainerGap() - .addComponent(panel_tabs, javax.swing.GroupLayout.DEFAULT_SIZE, 363, Short.MAX_VALUE) + .addComponent(panel_tabs, javax.swing.GroupLayout.DEFAULT_SIZE, 600, Short.MAX_VALUE) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) @@ -1724,6 +1760,7 @@ public class SettingsDialog extends javax.swing.JDialog { settings.put("run_command", run_command_checkbox.isSelected() ? "yes" : "no"); settings.put("run_command_path", run_command_textbox.getText()); settings.put("mega_api_key", mega_api_key.getText().trim()); + settings.put("clipboardspy", clipboardspy_checkbox.isSelected() ? "yes" : "no"); if (custom_proxy_textarea.getText().trim().length() == 0) { smart_proxy_checkbox.setSelected(false); @@ -2934,6 +2971,55 @@ public class SettingsDialog extends javax.swing.JDialog { mega_api_key_warningMouseClicked(evt); }//GEN-LAST:event_mega_api_key_labelMouseClicked + private void import_mega_buttonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_import_mega_buttonActionPerformed + // TODO add your handling code here: + + if (!unlock_accounts_button.isVisible() || !unlock_accounts_button.isEnabled()) { + + JOptionPane.showMessageDialog(this, LabelTranslatorSingleton.getInstance().translate("EMAIL1\nPASS1\nEMAIL2\nPASS2\nEMAIL3\nPASS3\n"), "TXT FILE FORMAT", JOptionPane.INFORMATION_MESSAGE); + + javax.swing.JFileChooser filechooser = new javax.swing.JFileChooser(); + + updateFonts(filechooser, GUI_FONT, (float) (_main_panel.getZoom_factor() * 1.25)); + + filechooser.setDialogTitle("Select MEGA ACCOUNTS FILE"); + + filechooser.setFileSelectionMode(javax.swing.JFileChooser.FILES_ONLY); + + filechooser.addChoosableFileFilter(new FileNameExtensionFilter("TXT", "txt")); + + filechooser.setAcceptAllFileFilterUsed(false); + + if (filechooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { + + try { + final File file = filechooser.getSelectedFile(); + + Stream filter = Files.lines(file.toPath()).map(s -> s.trim()).filter(s -> !s.isEmpty()); + + List result = filter.collect(Collectors.toList()); + + DefaultTableModel model = (DefaultTableModel) mega_accounts_table.getModel(); + + for (int i = 0; i < result.size() - 1; i += 2) { + System.out.println(result.get(i) + " " + result.get(i + 1)); + + model.addRow(new Object[]{result.get(i), result.get(i + 1)}); + } + + mega_accounts_table.setModel(model); + + } catch (IOException ex) { + Logger.getLogger(SettingsDialog.class.getName()).log(Level.SEVERE, null, ex); + } + + } + } else { + JOptionPane.showMessageDialog(this, LabelTranslatorSingleton.getInstance().translate("MEGA ACCOUNTS ARE LOCKED"), "Mega Accounts Locked", JOptionPane.ERROR_MESSAGE); + + } + }//GEN-LAST:event_import_mega_buttonActionPerformed + // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JPanel accounts_panel; private javax.swing.JButton add_elc_account_button; @@ -2942,6 +3028,7 @@ public class SettingsDialog extends javax.swing.JDialog { private javax.swing.JScrollPane advanced_scrollpane; private javax.swing.JButton cancel_button; private javax.swing.JButton change_download_dir_button; + private javax.swing.JCheckBox clipboardspy_checkbox; private javax.swing.JButton custom_chunks_dir_button; private javax.swing.JCheckBox custom_chunks_dir_checkbox; private javax.swing.JLabel custom_chunks_dir_current_label; @@ -2964,6 +3051,7 @@ public class SettingsDialog extends javax.swing.JDialog { private javax.swing.JButton export_settings_button; private javax.swing.JComboBox font_combo; private javax.swing.JLabel font_label; + private javax.swing.JButton import_mega_button; private javax.swing.JButton import_settings_button; private javax.swing.JButton jButton1; private javax.swing.JLabel jLabel1;