diff --git a/pom.xml b/pom.xml index 231090d5b..eef29f82c 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 com.tonikelope MegaBasterd - 8.13 + 8.14 jar diff --git a/src/main/java/com/tonikelope/megabasterd/FileGrabberDialog.java b/src/main/java/com/tonikelope/megabasterd/FileGrabberDialog.java index f170a0924..d14a4fdde 100644 --- a/src/main/java/com/tonikelope/megabasterd/FileGrabberDialog.java +++ b/src/main/java/com/tonikelope/megabasterd/FileGrabberDialog.java @@ -537,7 +537,7 @@ public class FileGrabberDialog extends javax.swing.JDialog { _base_path = files_selected[0].getParentFile().getAbsolutePath(); - dir_name_textfield.setText(files_selected[0].getParentFile().getName() + "_" + String.valueOf(System.currentTimeMillis() / 1000)); + dir_name_textfield.setText(files_selected[0].getParentFile().getName()); dir_name_textfield.setEnabled(true); @@ -639,7 +639,7 @@ public class FileGrabberDialog extends javax.swing.JDialog { _base_path = filechooser.getSelectedFile().getAbsolutePath(); - dir_name_textfield.setText(filechooser.getSelectedFile().getName() + "_" + String.valueOf(System.currentTimeMillis() / 1000)); + dir_name_textfield.setText(filechooser.getSelectedFile().getName()); dir_name_textfield.setEnabled(true); @@ -1022,7 +1022,7 @@ public class FileGrabberDialog extends javax.swing.JDialog { _base_path = (files.size() == 1 && files.get(0).isDirectory()) ? files.get(0).getAbsolutePath() : files.get(0).getParentFile().getAbsolutePath(); MiscTools.GUIRunAndWait(() -> { - dir_name_textfield.setText(((files.size() == 1 && files.get(0).isDirectory()) ? files.get(0).getName() : files.get(0).getParentFile().getName()) + "_" + String.valueOf(System.currentTimeMillis() / 1000)); + dir_name_textfield.setText(((files.size() == 1 && files.get(0).isDirectory()) ? files.get(0).getName() : files.get(0).getParentFile().getName())); dir_name_textfield.setEnabled(true); diff --git a/src/main/java/com/tonikelope/megabasterd/MainPanel.java b/src/main/java/com/tonikelope/megabasterd/MainPanel.java index ab06bac2c..ded9452f5 100644 --- a/src/main/java/com/tonikelope/megabasterd/MainPanel.java +++ b/src/main/java/com/tonikelope/megabasterd/MainPanel.java @@ -70,7 +70,7 @@ import javax.swing.UIManager; */ public final class MainPanel { - public static final String VERSION = "8.13"; + public static final String VERSION = "8.14"; 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/MainPanelView.java b/src/main/java/com/tonikelope/megabasterd/MainPanelView.java index 54c4369e7..1f7cbdb42 100644 --- a/src/main/java/com/tonikelope/megabasterd/MainPanelView.java +++ b/src/main/java/com/tonikelope/megabasterd/MainPanelView.java @@ -252,7 +252,9 @@ public final class MainPanelView extends javax.swing.JFrame { byte[] share_key = ma.genShareKey(); - HashMap res = ma.createDir(dir_name != null ? dir_name : dialog.getFiles().get(0).getName() + "_" + genID(10), ma.getRoot_id(), parent_key, i32a2bin(ma.getMaster_key())); + String root_name = dir_name != null ? dir_name : dialog.getFiles().get(0).getName() + "_" + genID(10); + + HashMap res = ma.createDir(root_name, ma.getRoot_id(), parent_key, i32a2bin(ma.getMaster_key())); String parent_node = (String) ((Map) ((List) res.get("f")).get(0)).get("h"); @@ -291,9 +293,9 @@ public final class MainPanelView extends javax.swing.JFrame { } if (folder_share) { - res = ma.createDirInsideAnotherSharedDir("MEGABASTERD", parent_node, ma.genFolderKey(), i32a2bin(ma.getMaster_key()), parent_node, share_key); + res = ma.createDirInsideAnotherSharedDir(root_name, parent_node, ma.genFolderKey(), i32a2bin(ma.getMaster_key()), parent_node, share_key); } else { - res = ma.createDir("MEGABASTERD", parent_node, ma.genFolderKey(), i32a2bin(ma.getMaster_key())); + res = ma.createDir(root_name, parent_node, ma.genFolderKey(), i32a2bin(ma.getMaster_key())); } @@ -303,7 +305,7 @@ public final class MainPanelView extends javax.swing.JFrame { MegaDirNode file_paths_2 = new MegaDirNode(file_paths_2_node); - file_paths.getChildren().put("MEGABASTERD", file_paths_2); + file_paths.getChildren().put(root_name, file_paths_2); file_paths = file_paths_2; diff --git a/src/main/java/com/tonikelope/megabasterd/SettingsDialog.form b/src/main/java/com/tonikelope/megabasterd/SettingsDialog.form index 9450d0f9b..46744a079 100644 --- a/src/main/java/com/tonikelope/megabasterd/SettingsDialog.form +++ b/src/main/java/com/tonikelope/megabasterd/SettingsDialog.form @@ -486,14 +486,16 @@ - - - - + + + + + - - + + + @@ -526,6 +528,11 @@ + + + + + @@ -684,6 +691,24 @@ + + + + + + + + + + + + + + + + + + @@ -908,7 +933,7 @@ - + @@ -1265,31 +1290,26 @@ - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/java/com/tonikelope/megabasterd/SettingsDialog.java b/src/main/java/com/tonikelope/megabasterd/SettingsDialog.java index 493130a64..038a90857 100644 --- a/src/main/java/com/tonikelope/megabasterd/SettingsDialog.java +++ b/src/main/java/com/tonikelope/megabasterd/SettingsDialog.java @@ -12,6 +12,7 @@ package com.tonikelope.megabasterd; import static com.tonikelope.megabasterd.DBTools.*; import static com.tonikelope.megabasterd.MainPanel.*; import static com.tonikelope.megabasterd.MiscTools.*; +import static com.tonikelope.megabasterd.SmartMegaProxyManager.PROXY_AUTO_REFRESH_TIME; import static com.tonikelope.megabasterd.SmartMegaProxyManager.PROXY_BLOCK_TIME; import java.awt.Dialog; import java.awt.Frame; @@ -324,6 +325,18 @@ public class SettingsDialog extends javax.swing.JDialog { max_up_speed_spinner.setEnabled(limit_ul_speed); + String smartproxy_auto_refresh = DBTools.selectSettingValue("smartproxy_autorefresh_time"); + + int smartproxy_auto_refresh_int = PROXY_AUTO_REFRESH_TIME; + + if (smartproxy_auto_refresh != null) { + smartproxy_auto_refresh_int = Integer.parseInt(smartproxy_auto_refresh); + } + + auto_refresh_proxy_time_spinner.setModel(new SpinnerNumberModel(smartproxy_auto_refresh_int, 1, Integer.MAX_VALUE, 1)); + + ((JSpinner.DefaultEditor) auto_refresh_proxy_time_spinner.getEditor()).getTextField().setEditable(true); + String smartproxy_ban_time = DBTools.selectSettingValue("smartproxy_ban_time"); int smartproxy_ban_time_int = PROXY_BLOCK_TIME; @@ -346,7 +359,7 @@ public class SettingsDialog extends javax.swing.JDialog { proxy_timeout_spinner.setModel(new SpinnerNumberModel(smartproxy_timeout_int, 1, Integer.MAX_VALUE, 1)); - ((JSpinner.DefaultEditor) bad_proxy_time_spinner.getEditor()).getTextField().setEditable(true); + ((JSpinner.DefaultEditor) proxy_timeout_spinner.getEditor()).getTextField().setEditable(true); String max_ul_speed = DBTools.selectSettingValue("max_upload_speed"); @@ -771,6 +784,8 @@ public class SettingsDialog extends javax.swing.JDialog { proxy_timeout_spinner = new javax.swing.JSpinner(); force_smart_proxy_checkbox = new javax.swing.JCheckBox(); jLabel7 = new javax.swing.JLabel(); + jLabel8 = new javax.swing.JLabel(); + auto_refresh_proxy_time_spinner = new javax.swing.JSpinner(); uploads_scrollpane = new javax.swing.JScrollPane(); uploads_panel = new javax.swing.JPanel(); default_slots_up_label = new javax.swing.JLabel(); @@ -1035,6 +1050,12 @@ public class SettingsDialog extends javax.swing.JDialog { jLabel7.setFont(new java.awt.Font("Noto Sans", 2, 16)); // NOI18N jLabel7.setText("Forces the use of smart proxy even if we still have direct bandwidth available (useful to test proxies)."); + jLabel8.setFont(new java.awt.Font("Noto Sans", 1, 16)); // NOI18N + jLabel8.setText("Proxy list refresh (minutes):"); + + auto_refresh_proxy_time_spinner.setFont(new java.awt.Font("Noto Sans", 0, 16)); // NOI18N + auto_refresh_proxy_time_spinner.setModel(new javax.swing.SpinnerNumberModel(60, 1, null, 1)); + javax.swing.GroupLayout smart_proxy_settingsLayout = new javax.swing.GroupLayout(smart_proxy_settings); smart_proxy_settings.setLayout(smart_proxy_settingsLayout); smart_proxy_settingsLayout.setHorizontalGroup( @@ -1048,12 +1069,14 @@ public class SettingsDialog extends javax.swing.JDialog { .addComponent(rec_smart_proxy_label) .addComponent(rec_smart_proxy_label2) .addGroup(smart_proxy_settingsLayout.createSequentialGroup() - .addGroup(smart_proxy_settingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(jLabel3) - .addComponent(jLabel5)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(smart_proxy_settingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addComponent(bad_proxy_time_spinner) + .addComponent(jLabel5, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(jLabel3, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(jLabel8, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(smart_proxy_settingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) + .addComponent(bad_proxy_time_spinner, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 150, Short.MAX_VALUE) + .addComponent(auto_refresh_proxy_time_spinner, javax.swing.GroupLayout.Alignment.LEADING) .addComponent(proxy_timeout_spinner)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(smart_proxy_settingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) @@ -1077,6 +1100,10 @@ public class SettingsDialog extends javax.swing.JDialog { .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(rec_smart_proxy_label1) .addGap(18, 18, 18) + .addGroup(smart_proxy_settingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel8) + .addComponent(auto_refresh_proxy_time_spinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(smart_proxy_settingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel3) .addComponent(bad_proxy_time_spinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) @@ -1259,7 +1286,7 @@ public class SettingsDialog extends javax.swing.JDialog { public_folder_warning.setFont(new java.awt.Font("Noto Sans", 1, 18)); // NOI18N public_folder_warning.setLineWrap(true); public_folder_warning.setRows(5); - public_folder_warning.setText("THIS OPTION IS NOT RECOMMENDED. Using this will cause MegaBasterd uploaded folder to appear in your account as NOT DECRYPTABLE. \n\nAt the time of writing there is a method to FIX IT:\n\n1) Move \"MEGABASTERD\" FOLDER (first \"child\" folder of the upload folder) to the ROOT (cloud) folder of your account. \n\n2) Then go to account settings and RELOAD ACCOUNT. \n\nI don't know how long this method will last. USE THIS OPTION AT YOUR OWN RISK."); + public_folder_warning.setText("THIS OPTION IS NOT RECOMMENDED. Using this will cause MegaBasterd uploaded folder to appear in your account as NOT DECRYPTABLE. \n\nAt the time of writing this text, there is a method to FIX IT:\n\n1) Move first upload subfolder to the ROOT (CLOUD) folder of your account. \n\n2) Go to account settings and click RELOAD ACCOUNT. \n\nI don't know how long this method will last. USE THIS OPTION AT YOUR OWN RISK."); public_folder_warning.setWrapStyleWord(true); public_folder_panel.setViewportView(public_folder_warning); @@ -1836,26 +1863,23 @@ public class SettingsDialog extends javax.swing.JDialog { .addComponent(run_command_test_button) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(run_command_textbox)) + .addComponent(start_frozen_checkbox) .addGroup(advanced_panelLayout.createSequentialGroup() - .addGroup(advanced_panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(start_frozen_checkbox) - .addGroup(advanced_panelLayout.createSequentialGroup() - .addComponent(debug_file_checkbox) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(debug_file_path)) - .addGroup(advanced_panelLayout.createSequentialGroup() - .addGap(165, 165, 165) - .addComponent(custom_chunks_dir_current_label)) - .addComponent(rec_zoom_label) - .addComponent(run_command_checkbox) - .addGroup(advanced_panelLayout.createSequentialGroup() - .addComponent(custom_chunks_dir_checkbox) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(custom_chunks_dir_button)) - .addGroup(advanced_panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) - .addComponent(jPanel1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(jPanel2, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) - .addGap(0, 0, 0))) + .addComponent(debug_file_checkbox) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(debug_file_path)) + .addGroup(advanced_panelLayout.createSequentialGroup() + .addGap(165, 165, 165) + .addComponent(custom_chunks_dir_current_label)) + .addComponent(rec_zoom_label) + .addComponent(run_command_checkbox) + .addGroup(advanced_panelLayout.createSequentialGroup() + .addComponent(custom_chunks_dir_checkbox) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(custom_chunks_dir_button)) + .addGroup(advanced_panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) + .addComponent(jPanel1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(jPanel2, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) .addContainerGap()) ); advanced_panelLayout.setVerticalGroup( @@ -1999,6 +2023,7 @@ public class SettingsDialog extends javax.swing.JDialog { settings.put("upload_public_folder", upload_public_folder_checkbox.isSelected() ? "yes" : "no"); settings.put("smartproxy_ban_time", String.valueOf(bad_proxy_time_spinner.getValue())); settings.put("smartproxy_timeout", String.valueOf(proxy_timeout_spinner.getValue())); + settings.put("smartproxy_autorefresh_time", String.valueOf(auto_refresh_proxy_time_spinner.getValue())); if (custom_proxy_textarea.getText().trim().length() == 0) { smart_proxy_checkbox.setSelected(false); @@ -3285,6 +3310,7 @@ public class SettingsDialog extends javax.swing.JDialog { private javax.swing.JButton add_mega_account_button; private javax.swing.JPanel advanced_panel; private javax.swing.JScrollPane advanced_scrollpane; + private javax.swing.JSpinner auto_refresh_proxy_time_spinner; private javax.swing.JSpinner bad_proxy_time_spinner; private javax.swing.JButton cancel_button; private javax.swing.JButton change_download_dir_button; @@ -3323,6 +3349,7 @@ public class SettingsDialog extends javax.swing.JDialog { private javax.swing.JLabel jLabel5; private javax.swing.JLabel jLabel6; private javax.swing.JLabel jLabel7; + private javax.swing.JLabel jLabel8; private javax.swing.JPanel jPanel1; private javax.swing.JPanel jPanel2; private javax.swing.JProgressBar jProgressBar1; diff --git a/src/main/java/com/tonikelope/megabasterd/SmartMegaProxyManager.java b/src/main/java/com/tonikelope/megabasterd/SmartMegaProxyManager.java index 62d14e541..63e3ca5ab 100644 --- a/src/main/java/com/tonikelope/megabasterd/SmartMegaProxyManager.java +++ b/src/main/java/com/tonikelope/megabasterd/SmartMegaProxyManager.java @@ -39,6 +39,7 @@ public final class SmartMegaProxyManager { public static String DEFAULT_SMART_PROXY_URL = null; public static final int PROXY_BLOCK_TIME = 300; + public static final int PROXY_AUTO_REFRESH_TIME = 60; public static final int PROXY_AUTO_REFRESH_SLEEP_TIME = 30; private static final Logger LOG = Logger.getLogger(SmartMegaProxyManager.class.getName()); @@ -49,6 +50,8 @@ public final class SmartMegaProxyManager { private volatile int _ban_time; private volatile int _proxy_timeout; private volatile boolean _force_smart_proxy; + private volatile int _autorefresh_time; + private volatile long _last_refresh_timestamp; public int getProxy_timeout() { return _proxy_timeout; @@ -67,6 +70,22 @@ public final class SmartMegaProxyManager { THREAD_POOL.execute(() -> { refreshProxyList(); + + while (true) { + + while (System.currentTimeMillis() < _last_refresh_timestamp + _autorefresh_time * 60 * 1000) { + try { + Thread.sleep(1000); + } catch (InterruptedException ex) { + Logger.getLogger(SmartMegaProxyManager.class.getName()).log(Level.SEVERE, null, ex); + } + } + + if (MainPanel.isUse_smart_proxy()) { + + refreshProxyList(); + } + } }); } @@ -114,7 +133,15 @@ public final class SmartMegaProxyManager { _force_smart_proxy = MainPanel.FORCE_SMART_PROXY; } - LOG.log(Level.INFO, "SmartProxy BAN_TIME: " + String.valueOf(_ban_time) + " TIMEOUT: " + String.valueOf(_proxy_timeout / 1000) + " FORCE: " + String.valueOf(_force_smart_proxy)); + String autorefresh_smart_proxy_string = DBTools.selectSettingValue("smartproxy_autorefresh_time"); + + if (autorefresh_smart_proxy_string != null) { + _autorefresh_time = Integer.parseInt(autorefresh_smart_proxy_string); + } else { + _autorefresh_time = PROXY_AUTO_REFRESH_TIME; + } + + LOG.log(Level.INFO, "SmartProxy BAN_TIME: " + String.valueOf(_ban_time) + " TIMEOUT: " + String.valueOf(_proxy_timeout / 1000) + " REFRESH: " + String.valueOf(_autorefresh_time) + " FORCE: " + String.valueOf(_force_smart_proxy)); } public synchronized int getProxyCount() { @@ -345,6 +372,8 @@ public final class SmartMegaProxyManager { } + _last_refresh_timestamp = System.currentTimeMillis(); + } public static class SmartProxyAuthenticator extends Authenticator { diff --git a/src/main/resources/images/mbasterd_screen.png b/src/main/resources/images/mbasterd_screen.png index 18f43c6df..a586b4b37 100644 Binary files a/src/main/resources/images/mbasterd_screen.png and b/src/main/resources/images/mbasterd_screen.png differ