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