diff --git a/pom.xml b/pom.xml index 5e967d2a7..3c2655830 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 com.tonikelope MegaBasterd - 7.10 + 7.11 jar diff --git a/src/main/java/com/tonikelope/megabasterd/ChunkDownloader.java b/src/main/java/com/tonikelope/megabasterd/ChunkDownloader.java index b42d73800..8a1830716 100644 --- a/src/main/java/com/tonikelope/megabasterd/ChunkDownloader.java +++ b/src/main/java/com/tonikelope/megabasterd/ChunkDownloader.java @@ -167,6 +167,12 @@ public class ChunkDownloader implements Runnable, SecureSingleThreadNotifiable { String chunk_url = ChunkWriterManager.genChunkUrl(worker_url, _download.getFile_size(), chunk_offset, chunk_size); + if (http_error == 509 && MainPanel.isRun_command()) { + + MainPanel.run_external_command(); + + } + if ((_current_smart_proxy != null || http_error == 509) && MainPanel.isUse_smart_proxy() && !MainPanel.isUse_proxy()) { if (_current_smart_proxy != null && (slow_proxy || chunk_error)) { diff --git a/src/main/java/com/tonikelope/megabasterd/LabelTranslatorSingleton.java b/src/main/java/com/tonikelope/megabasterd/LabelTranslatorSingleton.java index 4b3f4342f..15b46147d 100644 --- a/src/main/java/com/tonikelope/megabasterd/LabelTranslatorSingleton.java +++ b/src/main/java/com/tonikelope/megabasterd/LabelTranslatorSingleton.java @@ -38,6 +38,7 @@ public class LabelTranslatorSingleton { private void Spanish() { + _addTranslation("Execute this command when MEGA download limit is reached:", "Ejecutar este comando cuando se alcance el límite de descarga de MEGA:"); _addTranslation("Use this proxy list (instead of the one included in MegaBasterd) Format is PROXY:PORT", "Usar esta lista de proxys (en vez de la incluida en MegaBasterd) El formato es PROXY:PUERTO"); _addTranslation("Waiting for completion handler ... ***DO NOT EXIT MEGABASTERD NOW***", "Esperando manejador de finalización ... ***NO CIERRES MEGABASTERD EN ESTE MOMENTO***"); _addTranslation("Finishing calculating CBC-MAC code (this could take a while) ... ***DO NOT EXIT MEGABASTERD NOW***", "Terminando de calcular código CBC-MAC (esto podría llevar tiempo) ... ***NO CIERRES MEGABASTERD EN ESTE MOMENTO***"); diff --git a/src/main/java/com/tonikelope/megabasterd/MainPanel.java b/src/main/java/com/tonikelope/megabasterd/MainPanel.java index ccba2eb03..6875c1fed 100644 --- a/src/main/java/com/tonikelope/megabasterd/MainPanel.java +++ b/src/main/java/com/tonikelope/megabasterd/MainPanel.java @@ -55,13 +55,14 @@ import javax.swing.UIManager; */ public final class MainPanel { - public static final String VERSION = "7.10"; + public static final String VERSION = "7.11"; 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; public static final int STREAMER_PORT = 1337; public static final int WATCHDOG_PORT = 1338; public static final int DEFAULT_MEGA_PROXY_PORT = 9999; + public static final int RUN_COMMAND_TIME = 600; public static final String DEFAULT_LANGUAGE = "EN"; public static final boolean DEFAULT_SMART_PROXY = true; public static final double FORCE_GARBAGE_COLLECTION_MAX_MEMORY_PERCENT = 0.7; @@ -77,12 +78,15 @@ public final class MainPanel { private static String _proxy_user; private static String _proxy_pass; private static boolean _use_smart_proxy; + private static boolean _run_command; + private static String _run_command_path; private static String _font; private static SmartMegaProxyManager _proxy_manager; private static String _language; private static String _new_version; private static Boolean _resume_uploads; private static Boolean _resume_downloads; + private static long _last_run_command; private static final Logger LOG = Logger.getLogger(MainPanel.class.getName()); public static void main(String args[]) { @@ -116,6 +120,14 @@ public final class MainPanel { }); } + public static boolean isRun_command() { + return _run_command; + } + + public static String getRun_command_path() { + return _run_command_path; + } + public static Boolean getApp_image() { return _app_image; } @@ -197,6 +209,8 @@ public final class MainPanel { _exit = false; + _last_run_command = -1; + _restart = false; _elc_accounts = new HashMap<>(); @@ -779,6 +793,21 @@ public final class MainPanel { _proxy_pass = DBTools.selectSettingValue("proxy_pass"); } + String run_command_string = DBTools.selectSettingValue("run_command"); + + if (run_command_string != null) { + + _run_command = run_command_string.equals("yes"); + } + + String old_run_command_path = _run_command_path; + + _run_command_path = DBTools.selectSettingValue("run_command_path"); + + if (_run_command && old_run_command_path != null && !old_run_command_path.equals(_run_command_path)) { + _last_run_command = -1; + } + String use_megacrypter_reverse = selectSettingValue("megacrypter_reverse"); if (use_megacrypter_reverse != null) { @@ -809,6 +838,22 @@ public final class MainPanel { } } + public static synchronized void run_external_command() { + + if (_run_command && (_last_run_command == -1 || _last_run_command + RUN_COMMAND_TIME * 1000 < System.currentTimeMillis())) { + + if (_run_command_path != null && !_run_command_path.equals("")) { + try { + Runtime.getRuntime().exec(_run_command_path); + } catch (IOException ex) { + Logger.getLogger(MainPanel.class.getName()).log(Level.SEVERE, ex.getMessage()); + } + + _last_run_command = System.currentTimeMillis(); + } + } + } + public boolean checkByeBye() { boolean exit = true; diff --git a/src/main/java/com/tonikelope/megabasterd/SettingsDialog.form b/src/main/java/com/tonikelope/megabasterd/SettingsDialog.form index d24fbc7bd..4edce6aa2 100644 --- a/src/main/java/com/tonikelope/megabasterd/SettingsDialog.form +++ b/src/main/java/com/tonikelope/megabasterd/SettingsDialog.form @@ -31,7 +31,7 @@ - + @@ -1054,24 +1054,11 @@ - + + - - - - - - - - - - - - - - @@ -1083,7 +1070,7 @@ - + @@ -1101,6 +1088,21 @@ + + + + + + + + + + + + + + + @@ -1142,9 +1144,13 @@ + + + + - + @@ -1524,6 +1530,27 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/java/com/tonikelope/megabasterd/SettingsDialog.java b/src/main/java/com/tonikelope/megabasterd/SettingsDialog.java index 56aeaae5f..9c88baf3f 100644 --- a/src/main/java/com/tonikelope/megabasterd/SettingsDialog.java +++ b/src/main/java/com/tonikelope/megabasterd/SettingsDialog.java @@ -493,6 +493,21 @@ public class SettingsDialog extends javax.swing.JDialog { custom_proxy_list_label.setEnabled(use_smart_proxy); custom_proxy_textarea.setEnabled(use_smart_proxy); + boolean run_command = false; + + String run_command_string = DBTools.selectSettingValue("run_command"); + + if (run_command_string != null) { + + run_command = run_command_string.equals("yes"); + } + + run_command_checkbox.setSelected(run_command); + + run_command_textbox.setEnabled(run_command); + + run_command_textbox.setText(DBTools.selectSettingValue("run_command_path")); + boolean init_paused = false; String init_paused_string = DBTools.selectSettingValue("start_frozen"); @@ -673,6 +688,8 @@ public class SettingsDialog extends javax.swing.JDialog { jSeparator12 = new javax.swing.JSeparator(); start_frozen_checkbox = new javax.swing.JCheckBox(); jSeparator15 = new javax.swing.JSeparator(); + run_command_checkbox = new javax.swing.JCheckBox(); + run_command_textbox = new javax.swing.JTextField(); status = new javax.swing.JLabel(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); @@ -1444,28 +1461,31 @@ public class SettingsDialog extends javax.swing.JDialog { start_frozen_checkbox.setFont(new java.awt.Font("Dialog", 1, 18)); // NOI18N start_frozen_checkbox.setText("Freeze transferences before start"); + run_command_checkbox.setFont(new java.awt.Font("Dialog", 1, 18)); // NOI18N + run_command_checkbox.setText("Execute this command when MEGA download limit is reached:"); + run_command_checkbox.setDoubleBuffered(true); + run_command_checkbox.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + run_command_checkboxActionPerformed(evt); + } + }); + + run_command_textbox.setFont(new java.awt.Font("Dialog", 0, 18)); // NOI18N + run_command_textbox.setDoubleBuffered(true); + run_command_textbox.setEnabled(false); + javax.swing.GroupLayout advanced_panelLayout = new javax.swing.GroupLayout(advanced_panel); advanced_panel.setLayout(advanced_panelLayout); advanced_panelLayout.setHorizontalGroup( advanced_panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, advanced_panelLayout.createSequentialGroup() .addContainerGap() - .addGroup(advanced_panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(jSeparator15, javax.swing.GroupLayout.Alignment.TRAILING) - .addComponent(jSeparator12, javax.swing.GroupLayout.Alignment.TRAILING) - .addComponent(jSeparator1) - .addComponent(proxy_panel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addGroup(advanced_panelLayout.createSequentialGroup() - .addGroup(advanced_panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) - .addComponent(rec_zoom_label, javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(start_frozen_checkbox, javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(custom_chunks_dir_checkbox, javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.LEADING, advanced_panelLayout.createSequentialGroup() - .addComponent(custom_chunks_dir_button) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(custom_chunks_dir_current_label))) - .addGap(0, 0, Short.MAX_VALUE)) - .addGroup(advanced_panelLayout.createSequentialGroup() + .addGroup(advanced_panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(run_command_textbox) + .addComponent(jSeparator15) + .addComponent(jSeparator12) + .addComponent(jSeparator1, javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.LEADING, advanced_panelLayout.createSequentialGroup() .addGroup(advanced_panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(advanced_panelLayout.createSequentialGroup() .addComponent(font_label) @@ -1475,7 +1495,7 @@ public class SettingsDialog extends javax.swing.JDialog { .addComponent(zoom_label) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(zoom_spinner, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(0, 227, Short.MAX_VALUE)) + .addGap(0, 309, Short.MAX_VALUE)) .addGroup(advanced_panelLayout.createSequentialGroup() .addComponent(jLabel2) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) @@ -1486,7 +1506,19 @@ public class SettingsDialog extends javax.swing.JDialog { .addComponent(import_settings_button) .addGap(18, 18, 18) .addComponent(export_settings_button)) - .addComponent(jButton1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))) + .addComponent(jButton1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) + .addComponent(proxy_panel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(javax.swing.GroupLayout.Alignment.LEADING, advanced_panelLayout.createSequentialGroup() + .addGroup(advanced_panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(run_command_checkbox) + .addComponent(start_frozen_checkbox) + .addComponent(custom_chunks_dir_checkbox) + .addGroup(advanced_panelLayout.createSequentialGroup() + .addComponent(custom_chunks_dir_button) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(custom_chunks_dir_current_label)) + .addComponent(rec_zoom_label)) + .addGap(0, 0, Short.MAX_VALUE))) .addContainerGap()) ); advanced_panelLayout.setVerticalGroup( @@ -1521,9 +1553,13 @@ public class SettingsDialog extends javax.swing.JDialog { .addComponent(start_frozen_checkbox) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(jSeparator15, javax.swing.GroupLayout.PREFERRED_SIZE, 8, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(run_command_checkbox) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(run_command_textbox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(proxy_panel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGap(18, 18, 18) .addComponent(rec_zoom_label) .addContainerGap()) ); @@ -1542,7 +1578,7 @@ public class SettingsDialog extends javax.swing.JDialog { .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(jTabbedPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 1071, Short.MAX_VALUE) + .addComponent(jTabbedPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 1153, Short.MAX_VALUE) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addComponent(status, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGap(6, 6, 6) @@ -1606,6 +1642,8 @@ public class SettingsDialog extends javax.swing.JDialog { settings.put("use_custom_chunks_dir", custom_chunks_dir_checkbox.isSelected() ? "yes" : "no"); settings.put("custom_chunks_dir", _custom_chunks_dir); settings.put("custom_proxy_list", custom_proxy_textarea.getText()); + settings.put("run_command", run_command_checkbox.isSelected() ? "yes" : "no"); + settings.put("run_command_path", run_command_textbox.getText()); String old_font = DBTools.selectSettingValue("font"); @@ -2749,6 +2787,13 @@ public class SettingsDialog extends javax.swing.JDialog { } }//GEN-LAST:event_custom_chunks_dir_buttonActionPerformed + private void run_command_checkboxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_run_command_checkboxActionPerformed + // TODO add your handling code here: + + run_command_textbox.setEnabled(run_command_checkbox.isSelected()); + + }//GEN-LAST:event_run_command_checkboxActionPerformed + // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JPanel accounts_panel; private javax.swing.JButton add_elc_account_button; @@ -2833,6 +2878,8 @@ public class SettingsDialog extends javax.swing.JDialog { private javax.swing.JLabel rec_zoom_label; private javax.swing.JButton remove_elc_account_button; private javax.swing.JButton remove_mega_account_button; + private javax.swing.JCheckBox run_command_checkbox; + private javax.swing.JTextField run_command_textbox; private javax.swing.JButton save_button; private javax.swing.JCheckBox smart_proxy_checkbox; private javax.swing.JCheckBox start_frozen_checkbox; diff --git a/src/main/resources/images/mbasterd_screen.png b/src/main/resources/images/mbasterd_screen.png index f45e73736..3518ad652 100644 Binary files a/src/main/resources/images/mbasterd_screen.png and b/src/main/resources/images/mbasterd_screen.png differ