diff --git a/pom.xml b/pom.xml
index 5c78159d6..d080ced12 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
4.0.0
com.tonikelope
MegaBasterd
- 8.5
+ 8.6
jar
diff --git a/src/main/java/com/tonikelope/megabasterd/FolderLinkDialog.java b/src/main/java/com/tonikelope/megabasterd/FolderLinkDialog.java
index d5924fc52..94940a912 100644
--- a/src/main/java/com/tonikelope/megabasterd/FolderLinkDialog.java
+++ b/src/main/java/com/tonikelope/megabasterd/FolderLinkDialog.java
@@ -430,6 +430,19 @@ public class FolderLinkDialog extends javax.swing.JDialog {
String folder_id = findFirstRegex("#F!([^!]+)", _link, 1);
+ int r = -1;
+
+ if (ma.existsCachedFolderNodes(folder_id)) {
+ r = JOptionPane.showConfirmDialog(this, "Do you want to use FOLDER CACHED VERSION?\n\n(It could speed up the loading of very large folders)", "FOLDER CACHE", JOptionPane.YES_NO_OPTION);
+
+ }
+
+ if (r == 0) {
+ MiscTools.GUIRun(() -> {
+ folder_link_label.setText(_link + " (CACHED VERSION)");
+ });
+ }
+
String subfolder_id = null;
if (folder_id.contains("@")) {
@@ -443,7 +456,7 @@ public class FolderLinkDialog extends javax.swing.JDialog {
String folder_key = findFirstRegex("#F![^!]+!(.+)", _link, 1);
- folder_nodes = ma.getFolderNodes(folder_id, folder_key, node_bar);
+ folder_nodes = ma.getFolderNodes(folder_id, folder_key, node_bar, (r == 0));
MegaMutableTreeNode root = null;
diff --git a/src/main/java/com/tonikelope/megabasterd/MainPanel.java b/src/main/java/com/tonikelope/megabasterd/MainPanel.java
index fb21352dd..ce41d0f71 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.5";
+ public static final String VERSION = "8.6";
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;
@@ -924,6 +924,8 @@ public final class MainPanel {
public void byebyenow(boolean restart) {
+ MiscTools.purgeFolderCache();
+
synchronized (DBTools.class) {
try {
diff --git a/src/main/java/com/tonikelope/megabasterd/MegaAPI.java b/src/main/java/com/tonikelope/megabasterd/MegaAPI.java
index a960d87e7..6d5cec899 100644
--- a/src/main/java/com/tonikelope/megabasterd/MegaAPI.java
+++ b/src/main/java/com/tonikelope/megabasterd/MegaAPI.java
@@ -26,6 +26,7 @@ import java.net.MalformedURLException;
import java.net.Proxy;
import java.net.URL;
import java.nio.file.Files;
+import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
@@ -1049,15 +1050,62 @@ public class MegaAPI implements Serializable {
return ch;
}
- public HashMap getFolderNodes(String folder_id, String folder_key, JProgressBar bar) throws Exception {
+ public boolean existsCachedFolderNodes(String folder_id) {
+ return Files.exists(Path.of(System.getProperty("java.io.tmpdir") + File.separator + "megabasterd_folder_cache_" + folder_id));
+ }
+
+ private String getCachedFolderNodes(String folder_id) {
+
+ String file_path = System.getProperty("java.io.tmpdir") + File.separator + "megabasterd_folder_cache_" + folder_id;
+
+ if (Files.exists(Path.of(file_path))) {
+
+ LOG.log(Level.INFO, "MEGA FOLDER {0} USING CACHED JSON FILE TREE", new Object[]{folder_id});
+
+ try {
+ return Files.readString(Path.of(file_path));
+ } catch (IOException ex) {
+ Logger.getLogger(MegaAPI.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ }
+
+ return null;
+ }
+
+ private void writeCachedFolderNodes(String folder_id, String res) {
+ String file_path = System.getProperty("java.io.tmpdir") + File.separator + "megabasterd_folder_cache_" + folder_id;
+
+ try {
+ Files.writeString(Path.of(file_path), res);
+ } catch (IOException ex) {
+ Logger.getLogger(MegaAPI.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ }
+
+ public HashMap getFolderNodes(String folder_id, String folder_key, JProgressBar bar, boolean cache) throws Exception {
HashMap folder_nodes = null;
- String request = "[{\"a\":\"f\", \"c\":\"1\", \"r\":\"1\", \"ca\":\"1\"}]";
+ String res = null;
- URL url_api = new URL(API_URL + "/cs?id=" + String.valueOf(_seqno) + "&n=" + folder_id);
+ if (cache) {
+ res = getCachedFolderNodes(folder_id);
+ }
- String res = RAW_REQUEST(request, url_api);
+ if (res == null) {
+
+ String request = "[{\"a\":\"f\", \"c\":\"1\", \"r\":\"1\", \"ca\":\"1\"}]";
+
+ URL url_api = new URL(API_URL + "/cs?id=" + String.valueOf(_seqno) + "&n=" + folder_id);
+
+ res = RAW_REQUEST(request, url_api);
+
+ if (res != null) {
+ writeCachedFolderNodes(folder_id, res);
+ }
+ }
+
+ LOG.log(Level.INFO, "MEGA FOLDER {0} JSON FILE TREE SIZE -> {1}", new Object[]{folder_id, MiscTools.formatBytes((long) res.length())});
if (res != null) {
diff --git a/src/main/java/com/tonikelope/megabasterd/MiscTools.java b/src/main/java/com/tonikelope/megabasterd/MiscTools.java
index 300b57108..b67a088ad 100644
--- a/src/main/java/com/tonikelope/megabasterd/MiscTools.java
+++ b/src/main/java/com/tonikelope/megabasterd/MiscTools.java
@@ -156,6 +156,17 @@ public class MiscTools {
return null;
}
+ public static void purgeFolderCache() {
+ File directory = new File(System.getProperty("java.io.tmpdir"));
+
+ for (File f : directory.listFiles()) {
+ if (f.isFile() && f.getName().startsWith("megabasterd_folder_cache_")) {
+ f.delete();
+ Logger.getLogger(MiscTools.class.getName()).log(Level.INFO, "REMOVING FOLDER CACHE FILE {0}", f.getAbsolutePath());
+ }
+ }
+ }
+
public static void containerSetEnabled(Container panel, boolean enabled) {
for (Component cp : panel.getComponents()) {
diff --git a/src/main/resources/images/mbasterd_screen.png b/src/main/resources/images/mbasterd_screen.png
index 5c0c9cb3b..68ccb6197 100644
Binary files a/src/main/resources/images/mbasterd_screen.png and b/src/main/resources/images/mbasterd_screen.png differ