diff --git a/pom.xml b/pom.xml
index edac7b492..f38d87e0f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
4.0.0
com.tonikelope
MegaBasterd
- 7.30
+ 7.31
jar
diff --git a/src/main/java/com/tonikelope/megabasterd/BoundedExecutor.java b/src/main/java/com/tonikelope/megabasterd/BoundedExecutor.java
new file mode 100644
index 000000000..75257ed42
--- /dev/null
+++ b/src/main/java/com/tonikelope/megabasterd/BoundedExecutor.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2020 tonikelope
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package com.tonikelope.megabasterd;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.RejectedExecutionException;
+import java.util.concurrent.Semaphore;
+
+/**
+ *
+ * @author tonikelope
+ */
+public class BoundedExecutor {
+
+ private final ExecutorService exec;
+ private final Semaphore semaphore;
+
+ public BoundedExecutor(ExecutorService exec, int bound) {
+ this.exec = exec;
+ this.semaphore = new Semaphore(bound);
+ }
+
+ public void submitTask(final Runnable command)
+ throws InterruptedException {
+
+ semaphore.acquire();
+ try {
+ exec.execute(new Runnable() {
+ public void run() {
+ try {
+ command.run();
+ } finally {
+ semaphore.release();
+ }
+ }
+ });
+ } catch (RejectedExecutionException e) {
+
+ semaphore.release();
+
+ }
+
+ }
+}
diff --git a/src/main/java/com/tonikelope/megabasterd/MainPanel.java b/src/main/java/com/tonikelope/megabasterd/MainPanel.java
index 4c19e531f..417aa5855 100644
--- a/src/main/java/com/tonikelope/megabasterd/MainPanel.java
+++ b/src/main/java/com/tonikelope/megabasterd/MainPanel.java
@@ -60,7 +60,7 @@ import javax.swing.UIManager;
*/
public final class MainPanel {
- public static final String VERSION = "7.30";
+ public static final String VERSION = "7.31";
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;
@@ -101,20 +101,6 @@ public final class MainPanel {
UIDefaults defaults = UIManager.getLookAndFeelDefaults();
defaults.put("nimbusOrange", defaults.get("nimbusFocus"));
- PrintStream fileOut;
-
- try {
- fileOut = new PrintStream(new FileOutputStream(System.getProperty("user.home") + "/.MEGABASTERD_DEBUG.log"));
-
- System.setOut(fileOut);
- System.setErr(fileOut);
-
- } catch (FileNotFoundException ex) {
- Logger.getLogger(MainPanel.class.getName()).log(Level.SEVERE, null, ex);
- }
-
- System.out.println(System.getProperty("os.name") + "" + System.getProperty("java.vm.name") + " " + System.getProperty("java.version") + " " + System.getProperty("java.home"));
-
_app_image = false;
if (args.length > 0) {
@@ -201,7 +187,7 @@ public final class MainPanel {
private final UploadManager _upload_manager;
private final StreamThrottlerSupervisor _stream_supervisor;
private int _max_dl, _max_ul, _default_slots_down, _default_slots_up, _max_dl_speed, _max_up_speed;
- private boolean _use_slots_down, _limit_download_speed, _limit_upload_speed, _use_mega_account_down, _init_paused;
+ private boolean _use_slots_down, _limit_download_speed, _limit_upload_speed, _use_mega_account_down, _init_paused, _debug_file;
private String _mega_account_down;
private String _default_download_path;
private boolean _use_custom_chunks_dir;
@@ -266,6 +252,23 @@ public final class MainPanel {
loadUserSettings();
+ if (_debug_file) {
+
+ PrintStream fileOut;
+
+ try {
+ fileOut = new PrintStream(new FileOutputStream(System.getProperty("user.home") + "/.MEGABASTERD_DEBUG.log"));
+
+ System.setOut(fileOut);
+ System.setErr(fileOut);
+
+ } catch (FileNotFoundException ex) {
+ Logger.getLogger(MainPanel.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ }
+
+ System.out.println(System.getProperty("os.name") + "" + System.getProperty("java.vm.name") + " " + System.getProperty("java.version") + " " + System.getProperty("java.home"));
+
UIManager.put("OptionPane.messageFont", GUI_FONT.deriveFont(15f * getZoom_factor()));
UIManager.put("OptionPane.buttonFont", GUI_FONT.deriveFont(15f * getZoom_factor()));
@@ -857,6 +860,15 @@ public final class MainPanel {
if (_language == null) {
_language = DEFAULT_LANGUAGE;
}
+
+ String debug_file = selectSettingValue("debug_file");
+
+ if (debug_file != null) {
+ _debug_file = debug_file.equals("yes");
+ } else {
+ _debug_file = false;
+ }
+
}
public static synchronized void run_external_command() {
diff --git a/src/main/java/com/tonikelope/megabasterd/MiscTools.java b/src/main/java/com/tonikelope/megabasterd/MiscTools.java
index f4366ca17..cd6c4b079 100644
--- a/src/main/java/com/tonikelope/megabasterd/MiscTools.java
+++ b/src/main/java/com/tonikelope/megabasterd/MiscTools.java
@@ -790,41 +790,41 @@ public class MiscTools {
data = extensionURL2NormalLink(data);
}
+ ArrayList links = new ArrayList<>();
+ String url_decoded;
try {
-
- ArrayList links = new ArrayList<>();
-
- ArrayList base64_chunks = findAllRegex("[A-Za-z0-9+/_-]+=*", URLDecoder.decode(data, "UTF-8"), 0);
-
- if (!base64_chunks.isEmpty()) {
-
- for (String chunk : base64_chunks) {
-
- try {
-
- String clean_data = MiscTools.newMegaLinks2Legacy(new String(Base64.getDecoder().decode(chunk)));
-
- String decoded = MiscTools.findFirstRegex("(?:https?|mega)://[^\r\n]+(#[^\r\n!]*?)?![^\r\n!]+![^\\?\r\n]+", clean_data, 0);
-
- if (decoded != null) {
- links.add(decoded);
- }
-
- } catch (Exception e) {
- };
- }
- }
-
- String clean_data = MiscTools.newMegaLinks2Legacy(URLDecoder.decode(data, "UTF-8"));
-
- links.addAll(findAllRegex("(?:https?|mega)://[^\r\n]+(#[^\r\n!]*?)?![^\r\n!]+![^\\?\r\n]+", clean_data, 0));
-
- links.addAll(findAllRegex("mega://e(n|l)c[^\r\n]+", clean_data, 0));
-
- res = links.stream().map((s) -> s + "\n").reduce(res, String::concat);
- } catch (UnsupportedEncodingException ex) {
- Logger.getLogger(MiscTools.class.getName()).log(Level.SEVERE, ex.getMessage());
+ url_decoded = URLDecoder.decode(data, "UTF-8");
+ } catch (Exception ex) {
+ url_decoded = data;
}
+ ArrayList base64_chunks = findAllRegex("[A-Za-z0-9+/_-]+=*", url_decoded, 0);
+ if (!base64_chunks.isEmpty()) {
+
+ for (String chunk : base64_chunks) {
+
+ try {
+
+ String clean_data = MiscTools.newMegaLinks2Legacy(new String(Base64.getDecoder().decode(chunk)));
+
+ String decoded = MiscTools.findFirstRegex("(?:https?|mega)://[^\r\n]+(#[^\r\n!]*?)?![^\r\n!]+![^\\?\r\n]+", clean_data, 0);
+
+ if (decoded != null) {
+ links.add(decoded);
+ }
+
+ } catch (Exception e) {
+ };
+ }
+ }
+ try {
+ url_decoded = URLDecoder.decode(data, "UTF-8");
+ } catch (Exception ex) {
+ url_decoded = data;
+ }
+ String clean_data = MiscTools.newMegaLinks2Legacy(url_decoded);
+ links.addAll(findAllRegex("(?:https?|mega)://[^\r\n]+(#[^\r\n!]*?)?![^\r\n!]+![^\\?\r\n]+", clean_data, 0));
+ links.addAll(findAllRegex("mega://e(n|l)c[^\r\n]+", clean_data, 0));
+ res = links.stream().map((s) -> s + "\n").reduce(res, String::concat);
}
return res.trim();
diff --git a/src/main/java/com/tonikelope/megabasterd/SettingsDialog.form b/src/main/java/com/tonikelope/megabasterd/SettingsDialog.form
index c21874963..8034f5643 100644
--- a/src/main/java/com/tonikelope/megabasterd/SettingsDialog.form
+++ b/src/main/java/com/tonikelope/megabasterd/SettingsDialog.form
@@ -48,7 +48,7 @@
-
+
@@ -799,7 +799,7 @@
-
+
@@ -808,7 +808,7 @@
-
+
@@ -1047,10 +1047,9 @@
-
+
-
-
+
@@ -1083,9 +1082,11 @@
+
-
-
+
+
+
@@ -1102,6 +1103,7 @@
+
@@ -1144,6 +1146,10 @@
+
+
+
+
@@ -1154,7 +1160,7 @@
-
+
@@ -1565,6 +1571,16 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main/java/com/tonikelope/megabasterd/SettingsDialog.java b/src/main/java/com/tonikelope/megabasterd/SettingsDialog.java
index 3b1ade731..c8b2d8505 100644
--- a/src/main/java/com/tonikelope/megabasterd/SettingsDialog.java
+++ b/src/main/java/com/tonikelope/megabasterd/SettingsDialog.java
@@ -547,6 +547,16 @@ public class SettingsDialog extends javax.swing.JDialog {
proxy_pass_textfield.setText(DBTools.selectSettingValue("proxy_pass"));
+ boolean debug_file = false;
+
+ String debug_file_val = DBTools.selectSettingValue("debug_file");
+
+ if (debug_file_val != null) {
+ debug_file = (debug_file_val.equals("yes"));
+ }
+
+ debug_file_checkbox.setSelected(debug_file);
+
String font = DBTools.selectSettingValue("font");
this.font_combo.addItem(LabelTranslatorSingleton.getInstance().translate("DEFAULT"));
@@ -696,6 +706,8 @@ public class SettingsDialog extends javax.swing.JDialog {
run_command_textbox = new javax.swing.JTextField();
run_command_textbox.addMouseListener(new ContextMenuMouseListener());
run_command_test_button = new javax.swing.JButton();
+ debug_file_checkbox = new javax.swing.JCheckBox();
+ jSeparator2 = new javax.swing.JSeparator();
status = new javax.swing.JLabel();
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
@@ -1251,7 +1263,7 @@ 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, 89, Short.MAX_VALUE)
+ .addComponent(mega_accounts_scrollpane, javax.swing.GroupLayout.DEFAULT_SIZE, 254, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(accounts_panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(remove_mega_account_button)
@@ -1259,7 +1271,7 @@ public class SettingsDialog extends javax.swing.JDialog {
.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, 89, Short.MAX_VALUE)
+ .addComponent(elc_accounts_scrollpane, javax.swing.GroupLayout.DEFAULT_SIZE, 255, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(accounts_panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(remove_elc_account_button)
@@ -1491,18 +1503,20 @@ public class SettingsDialog extends javax.swing.JDialog {
}
});
+ debug_file_checkbox.setFont(new java.awt.Font("Dialog", 1, 18)); // NOI18N
+ debug_file_checkbox.setText("Save debug info to file");
+
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()
+ .addGroup(advanced_panelLayout.createSequentialGroup()
.addContainerGap()
- .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)
+ .addComponent(jSeparator15, javax.swing.GroupLayout.Alignment.TRAILING)
+ .addComponent(jSeparator12, javax.swing.GroupLayout.Alignment.TRAILING)
+ .addComponent(jSeparator1)
+ .addGroup(advanced_panelLayout.createSequentialGroup()
.addGroup(advanced_panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(advanced_panelLayout.createSequentialGroup()
.addComponent(font_label)
@@ -1524,21 +1538,24 @@ public class SettingsDialog extends javax.swing.JDialog {
.addGap(18, 18, 18)
.addComponent(export_settings_button))
.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.TRAILING)
- .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(run_command_textbox, javax.swing.GroupLayout.Alignment.TRAILING)
+ .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.LEADING)
+ .addComponent(debug_file_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, javax.swing.GroupLayout.Alignment.LEADING)
- .addGroup(javax.swing.GroupLayout.Alignment.LEADING, advanced_panelLayout.createSequentialGroup()
+ .addComponent(rec_zoom_label)
+ .addGroup(advanced_panelLayout.createSequentialGroup()
.addComponent(run_command_checkbox)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(run_command_test_button)))
- .addGap(0, 0, Short.MAX_VALUE)))
+ .addGap(0, 0, Short.MAX_VALUE))
+ .addComponent(jSeparator2))
.addContainerGap())
);
advanced_panelLayout.setVerticalGroup(
@@ -1574,6 +1591,10 @@ public class SettingsDialog extends javax.swing.JDialog {
.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(debug_file_checkbox)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+ .addComponent(jSeparator2, javax.swing.GroupLayout.PREFERRED_SIZE, 10, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(advanced_panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(run_command_checkbox)
.addComponent(run_command_test_button))
@@ -1583,7 +1604,7 @@ public class SettingsDialog extends javax.swing.JDialog {
.addComponent(proxy_panel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(18, 18, 18)
.addComponent(rec_zoom_label)
- .addContainerGap())
+ .addGap(34, 34, 34))
);
advanced_scrollpane.setViewportView(advanced_panel);
@@ -1613,7 +1634,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, 474, Short.MAX_VALUE)
+ .addComponent(panel_tabs, javax.swing.GroupLayout.DEFAULT_SIZE, 805, Short.MAX_VALUE)
.addGap(18, 18, 18)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
@@ -1664,6 +1685,7 @@ public class SettingsDialog extends javax.swing.JDialog {
settings.put("smart_proxy", smart_proxy_checkbox.isSelected() ? "yes" : "no");
settings.put("start_frozen", start_frozen_checkbox.isSelected() ? "yes" : "no");
settings.put("use_custom_chunks_dir", custom_chunks_dir_checkbox.isSelected() ? "yes" : "no");
+ settings.put("debug_file", debug_file_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");
@@ -1705,7 +1727,7 @@ public class SettingsDialog extends javax.swing.JDialog {
if (old_zoom == null) {
- old_zoom = "100";
+ old_zoom = String.valueOf(Math.round(100 * MainPanel.ZOOM_FACTOR));
}
String zoom = String.valueOf(zoom_spinner.getValue());
@@ -1765,7 +1787,9 @@ public class SettingsDialog extends javax.swing.JDialog {
insertSettingsValues(settings);
- if (!font.equals(old_font) || !language.equals(old_language) || !zoom.equals(old_zoom)
+ if (!font.equals(old_font)
+ || !language.equals(old_language)
+ || !zoom.equals(old_zoom)
|| use_proxy != old_use_proxy
|| !proxy_host.equals(old_proxy_host)
|| !proxy_port.equals(old_proxy_port)
@@ -2857,6 +2881,7 @@ public class SettingsDialog extends javax.swing.JDialog {
private javax.swing.JLabel custom_chunks_dir_current_label;
private javax.swing.JLabel custom_proxy_list_label;
private javax.swing.JTextArea custom_proxy_textarea;
+ private javax.swing.JCheckBox debug_file_checkbox;
private javax.swing.JLabel default_dir_label;
private javax.swing.JLabel default_slots_down_label;
private javax.swing.JSpinner default_slots_down_spinner;
@@ -2884,6 +2909,7 @@ public class SettingsDialog extends javax.swing.JDialog {
private javax.swing.JSeparator jSeparator11;
private javax.swing.JSeparator jSeparator12;
private javax.swing.JSeparator jSeparator15;
+ private javax.swing.JSeparator jSeparator2;
private javax.swing.JSeparator jSeparator3;
private javax.swing.JSeparator jSeparator4;
private javax.swing.JSeparator jSeparator5;
diff --git a/src/main/java/com/tonikelope/megabasterd/TransferenceManager.java b/src/main/java/com/tonikelope/megabasterd/TransferenceManager.java
index a22607394..310417d9f 100644
--- a/src/main/java/com/tonikelope/megabasterd/TransferenceManager.java
+++ b/src/main/java/com/tonikelope/megabasterd/TransferenceManager.java
@@ -6,6 +6,8 @@ import java.awt.TrayIcon;
import java.util.ArrayList;
import java.util.Collections;
import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
import java.util.logging.Level;
import static java.util.logging.Level.SEVERE;
import java.util.logging.Logger;
@@ -18,6 +20,7 @@ import javax.swing.JPanel;
abstract public class TransferenceManager implements Runnable, SecureSingleThreadNotifiable {
public static final int MAX_WAIT_QUEUE = 1000;
+ public static final int MAX_PROVISION_WORKERS = 50;
private static final Logger LOG = Logger.getLogger(TransferenceManager.class.getName());
private final ConcurrentLinkedQueue