diff --git a/pom.xml b/pom.xml index 9dee32ed9..cbab8c64f 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 com.tonikelope MegaBasterd - 7.51 + 7.52 jar @@ -15,13 +15,13 @@ com.fasterxml.jackson.core jackson-core - 2.9.6 + 2.12.6 jar com.fasterxml.jackson.core jackson-annotations - 2.9.9 + 2.12.6 jar diff --git a/src/main/java/com/tonikelope/megabasterd/FolderLinkDialog.form b/src/main/java/com/tonikelope/megabasterd/FolderLinkDialog.form index e47fd2881..c6ed18372 100644 --- a/src/main/java/com/tonikelope/megabasterd/FolderLinkDialog.form +++ b/src/main/java/com/tonikelope/megabasterd/FolderLinkDialog.form @@ -24,11 +24,12 @@ - + - - - + + + + @@ -52,25 +53,24 @@ - - - - - - - - + + + + + + + + + + + + + + + + - - - - - - - - - - + @@ -214,5 +214,7 @@ + + diff --git a/src/main/java/com/tonikelope/megabasterd/FolderLinkDialog.java b/src/main/java/com/tonikelope/megabasterd/FolderLinkDialog.java index bf7f8856d..696332cac 100644 --- a/src/main/java/com/tonikelope/megabasterd/FolderLinkDialog.java +++ b/src/main/java/com/tonikelope/megabasterd/FolderLinkDialog.java @@ -72,6 +72,8 @@ public class FolderLinkDialog extends javax.swing.JDialog { translateLabels(this); + node_bar.setIndeterminate(true); + folder_link_label.setText(link); restore_button.setVisible(false); @@ -133,6 +135,7 @@ public class FolderLinkDialog extends javax.swing.JDialog { skip_rest_button = new javax.swing.JButton(); restore_button = new javax.swing.JButton(); total_space_label = new javax.swing.JLabel(); + node_bar = new javax.swing.JProgressBar(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); setTitle("FolderLink"); @@ -211,20 +214,21 @@ public class FolderLinkDialog extends javax.swing.JDialog { getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addContainerGap() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(link_detected_label, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(file_tree_scrollpane) - .addComponent(total_space_label, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(warning_label, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(node_bar, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(link_detected_label, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(file_tree_scrollpane, javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(total_space_label, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(warning_label, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() .addComponent(skip_rest_button) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(skip_button) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(dance_button)) - .addGroup(layout.createSequentialGroup() + .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() .addComponent(folder_link_label, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(restore_button))) @@ -234,22 +238,22 @@ public class FolderLinkDialog extends javax.swing.JDialog { layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addContainerGap() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) - .addGroup(layout.createSequentialGroup() - .addGap(0, 0, Short.MAX_VALUE) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(skip_rest_button) - .addComponent(skip_button) - .addComponent(dance_button))) - .addGroup(layout.createSequentialGroup() - .addComponent(link_detected_label) - .addGap(8, 8, 8) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(folder_link_label) - .addComponent(restore_button)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(file_tree_scrollpane, javax.swing.GroupLayout.DEFAULT_SIZE, 315, Short.MAX_VALUE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(link_detected_label) + .addGap(8, 8, 8) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(folder_link_label) + .addComponent(restore_button)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(file_tree_scrollpane, javax.swing.GroupLayout.DEFAULT_SIZE, 295, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(node_bar, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(skip_rest_button) + .addComponent(skip_button) + .addComponent(dance_button)) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addComponent(total_space_label) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(warning_label) @@ -263,18 +267,24 @@ public class FolderLinkDialog extends javax.swing.JDialog { private void skip_buttonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_skip_buttonActionPerformed if (deleteSelectedTreeItems(file_tree)) { + node_bar.setVisible(true); + skip_rest_button.setEnabled(false); + skip_button.setEnabled(false); + THREAD_POOL.execute(() -> { - _genDownloadLiks(); + _genDownloadLiks(); + MiscTools.GUIRun(() -> { + restore_button.setVisible(true); - restore_button.setVisible(true); + boolean root_childs = ((TreeNode) file_tree.getModel().getRoot()).getChildCount() > 0; - boolean root_childs = ((TreeNode) file_tree.getModel().getRoot()).getChildCount() > 0; + dance_button.setEnabled(root_childs); - dance_button.setEnabled(root_childs); + skip_button.setEnabled(root_childs); - skip_button.setEnabled(root_childs); - - skip_rest_button.setEnabled(root_childs); + skip_rest_button.setEnabled(root_childs); + }); + }); } @@ -290,18 +300,23 @@ public class FolderLinkDialog extends javax.swing.JDialog { private void skip_rest_buttonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_skip_rest_buttonActionPerformed if (deleteAllExceptSelectedTreeItems(file_tree)) { + node_bar.setVisible(true); + skip_rest_button.setEnabled(false); + skip_button.setEnabled(false); + THREAD_POOL.execute(() -> { + _genDownloadLiks(); + MiscTools.GUIRun(() -> { + restore_button.setVisible(true); - _genDownloadLiks(); + boolean root_childs = ((TreeNode) file_tree.getModel().getRoot()).getChildCount() > 0; - restore_button.setVisible(true); + dance_button.setEnabled(root_childs); - boolean root_childs = ((TreeNode) file_tree.getModel().getRoot()).getChildCount() > 0; + skip_button.setEnabled(root_childs); - dance_button.setEnabled(root_childs); - - skip_button.setEnabled(root_childs); - - skip_rest_button.setEnabled(root_childs); + skip_rest_button.setEnabled(root_childs); + }); + }); } }//GEN-LAST:event_skip_rest_buttonActionPerformed @@ -316,6 +331,10 @@ public class FolderLinkDialog extends javax.swing.JDialog { dance_button.setEnabled(false); + node_bar.setVisible(true); + + node_bar.setIndeterminate(true); + THREAD_POOL.execute(() -> { _loadMegaDirTree(); _genDownloadLiks(); @@ -348,12 +367,30 @@ public class FolderLinkDialog extends javax.swing.JDialog { String folder_key = findFirstRegex("#F![^!]+!(.+)", _link, 1); - folder_nodes = ma.getFolderNodes(folder_id, folder_key); + folder_nodes = ma.getFolderNodes(folder_id, folder_key, node_bar); MegaMutableTreeNode root = null; + final int nodos_totales = folder_nodes.size(); + + MiscTools.GUIRun(() -> { + node_bar.setIndeterminate(false); + node_bar.setMaximum(nodos_totales); + node_bar.setValue(0); + }); + + int conta_nodo = 0; + for (Object o : folder_nodes.values()) { + conta_nodo++; + + int c = conta_nodo; + MiscTools.GUIRun(() -> { + + node_bar.setValue(c); + }); + HashMap current_hashmap_node = (HashMap) o; MegaMutableTreeNode current_node; @@ -406,6 +443,15 @@ public class FolderLinkDialog extends javax.swing.JDialog { } while (current_node != root); } + MiscTools.GUIRun(() -> { + + node_bar.setIndeterminate(true); + }); + + MiscTools.sortTree(root); + + MiscTools.calculateTreeFolderSizes(root); + if (root == null) { LOG.log(SEVERE, null, "MEGA FOLDER ERROR (EMPTY?)"); @@ -417,7 +463,10 @@ public class FolderLinkDialog extends javax.swing.JDialog { final MegaMutableTreeNode roott = root; MiscTools.GUIRun(() -> { - ftree.setModel(new DefaultTreeModel(sortTree(roott))); + + node_bar.setIndeterminate(true); + + ftree.setModel(new DefaultTreeModel(roott)); ftree.setRootVisible(roott != null ? roott.getChildCount() > 0 : false); @@ -447,74 +496,77 @@ public class FolderLinkDialog extends javax.swing.JDialog { private void _genDownloadLiks() { - MiscTools.GUIRunAndWait(() -> { + MiscTools.GUIRun(() -> { setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); + }); - String folder_id = findFirstRegex("#F!([^!]+)", _link, 1); + String folder_id = findFirstRegex("#F!([^!]+)", _link, 1); - _download_links.clear(); + _download_links.clear(); - MegaMutableTreeNode root = (MegaMutableTreeNode) file_tree.getModel().getRoot(); + MegaMutableTreeNode root = (MegaMutableTreeNode) file_tree.getModel().getRoot(); - Enumeration files_tree = root.depthFirstEnumeration(); + Enumeration files_tree = root.depthFirstEnumeration(); - _total_space = 0L; + _total_space = 0L; - while (files_tree.hasMoreElements()) { + while (files_tree.hasMoreElements()) { - MegaMutableTreeNode node = (MegaMutableTreeNode) files_tree.nextElement(); + MegaMutableTreeNode node = (MegaMutableTreeNode) files_tree.nextElement(); - if (node.isLeaf() && node != root && ((HashMap) node.getUserObject()).get("size") != null) { + if (node.isLeaf() && node != root && ((HashMap) node.getUserObject()).get("size") != null) { - String path = ""; + String path = ""; - Object[] object_path = node.getUserObjectPath(); + Object[] object_path = node.getUserObjectPath(); - for (Object p : object_path) { + for (Object p : object_path) { - path += File.separator + ((Map) p).get("name"); - } - - path = path.replaceAll("^/+", "").replaceAll("^\\+", "").trim(); - - String url = "https://mega.nz/#N!" + ((Map) node.getUserObject()).get("h") + "!" + ((Map) node.getUserObject()).get("key") + "###n=" + folder_id; - - HashMap download_link = new HashMap<>(); - - download_link.put("url", url); - - download_link.put("filename", cleanFilePath(path)); - - download_link.put("filekey", ((Map) node.getUserObject()).get("key")); - - download_link.put("filesize", ((Map) node.getUserObject()).get("size")); - - _total_space += (long) download_link.get("filesize"); - - _download_links.add(download_link); - } else if (node.isLeaf() && node != root) { - String path = ""; - - Object[] object_path = node.getUserObjectPath(); - - for (Object p : object_path) { - - path += File.separator + ((Map) p).get("name"); - } - - path = path.replaceAll("^/+", "").replaceAll("^\\+", "").trim(); - - HashMap download_link = new HashMap<>(); - - download_link.put("url", "*"); - - download_link.put("filename", cleanFilePath(path)); - - download_link.put("type", ((HashMap) node.getUserObject()).get("type")); - - _download_links.add(download_link); + path += File.separator + ((Map) p).get("name"); } + + path = path.replaceAll("^/+", "").replaceAll("^\\+", "").trim(); + + String url = "https://mega.nz/#N!" + ((Map) node.getUserObject()).get("h") + "!" + ((Map) node.getUserObject()).get("key") + "###n=" + folder_id; + + HashMap download_link = new HashMap<>(); + + download_link.put("url", url); + + download_link.put("filename", cleanFilePath(path)); + + download_link.put("filekey", ((Map) node.getUserObject()).get("key")); + + download_link.put("filesize", ((Map) node.getUserObject()).get("size")); + + _total_space += (long) download_link.get("filesize"); + + _download_links.add(download_link); + } else if (node.isLeaf() && node != root) { + String path = ""; + + Object[] object_path = node.getUserObjectPath(); + + for (Object p : object_path) { + + path += File.separator + ((Map) p).get("name"); + } + + path = path.replaceAll("^/+", "").replaceAll("^\\+", "").trim(); + + HashMap download_link = new HashMap<>(); + + download_link.put("url", "*"); + + download_link.put("filename", cleanFilePath(path)); + + download_link.put("type", ((HashMap) node.getUserObject()).get("type")); + + _download_links.add(download_link); } + } + + MiscTools.GUIRun(() -> { total_space_label.setText("[" + formatBytes(_total_space) + "]"); @@ -523,6 +575,8 @@ public class FolderLinkDialog extends javax.swing.JDialog { c.setEnabled(root.getChildCount() > 0); } + node_bar.setVisible(false); + setDefaultCloseOperation(DISPOSE_ON_CLOSE); }); } @@ -533,6 +587,7 @@ public class FolderLinkDialog extends javax.swing.JDialog { private javax.swing.JScrollPane file_tree_scrollpane; private javax.swing.JLabel folder_link_label; private javax.swing.JLabel link_detected_label; + private javax.swing.JProgressBar node_bar; private javax.swing.JButton restore_button; private javax.swing.JButton skip_button; private javax.swing.JButton skip_rest_button; diff --git a/src/main/java/com/tonikelope/megabasterd/MainPanel.java b/src/main/java/com/tonikelope/megabasterd/MainPanel.java index 16f8153f2..884ec55a2 100644 --- a/src/main/java/com/tonikelope/megabasterd/MainPanel.java +++ b/src/main/java/com/tonikelope/megabasterd/MainPanel.java @@ -58,7 +58,7 @@ import javax.swing.UIManager; */ public final class MainPanel { - public static final String VERSION = "7.51"; + public static final String VERSION = "7.52"; 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/MegaAPI.java b/src/main/java/com/tonikelope/megabasterd/MegaAPI.java index 6cf899d7f..4aa149bf7 100644 --- a/src/main/java/com/tonikelope/megabasterd/MegaAPI.java +++ b/src/main/java/com/tonikelope/megabasterd/MegaAPI.java @@ -25,6 +25,7 @@ import java.util.logging.Level; import java.util.logging.Logger; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLException; +import javax.swing.JProgressBar; /** * @@ -932,7 +933,7 @@ public class MegaAPI implements Serializable { return ch; } - public HashMap getFolderNodes(String folder_id, String folder_key) throws Exception { + public HashMap getFolderNodes(String folder_id, String folder_key, JProgressBar bar) throws Exception { HashMap folder_nodes = null; @@ -950,8 +951,27 @@ public class MegaAPI implements Serializable { folder_nodes = new HashMap<>(); + int s = ((List) res_map[0].get("f")).size(); + + MiscTools.GUIRun(() -> { + bar.setIndeterminate(false); + bar.setMaximum(s); + bar.setValue(0); + }); + + int conta_nodo = 0; + for (Object o : (Iterable) res_map[0].get("f")) { + conta_nodo++; + + int c = conta_nodo; + + MiscTools.GUIRun(() -> { + + bar.setValue(c); + }); + HashMap node = (HashMap) o; String[] node_k = ((String) node.get("k")).split(":"); @@ -984,6 +1004,8 @@ public class MegaAPI implements Serializable { long size = (Long) node.get("s"); the_node.put("size", size); } + } else { + the_node.put("size", 0L); } the_node.put("name", at.get("n")); diff --git a/src/main/java/com/tonikelope/megabasterd/MegaMutableTreeNode.java b/src/main/java/com/tonikelope/megabasterd/MegaMutableTreeNode.java index 0d6d9c2a3..5b8b7d534 100644 --- a/src/main/java/com/tonikelope/megabasterd/MegaMutableTreeNode.java +++ b/src/main/java/com/tonikelope/megabasterd/MegaMutableTreeNode.java @@ -1,7 +1,6 @@ package com.tonikelope.megabasterd; import static com.tonikelope.megabasterd.MiscTools.*; -import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.logging.Logger; @@ -15,6 +14,9 @@ import javax.swing.tree.MutableTreeNode; public class MegaMutableTreeNode extends DefaultMutableTreeNode { private static final Logger LOG = Logger.getLogger(MegaMutableTreeNode.class.getName()); + + protected long mega_node_size = 0L; + protected Comparator nodeComparator = new Comparator() { @Override public int compare(Object o1, Object o2) { @@ -29,12 +31,21 @@ public class MegaMutableTreeNode extends DefaultMutableTreeNode { } }; + public void setMega_node_size(long mega_node_size) { + this.mega_node_size = mega_node_size; + } + + public long getMega_node_size() { + return mega_node_size; + } + public MegaMutableTreeNode() { super(); } public MegaMutableTreeNode(Object o) { super(o); + this.mega_node_size = (long) ((HashMap) o).get("size"); } @Override @@ -44,7 +55,7 @@ public class MegaMutableTreeNode extends DefaultMutableTreeNode { HashMap user_object = (HashMap) userObject; - return user_object.get("name") + ((isLeaf() && user_object.get("size") != null) ? " [" + formatBytes((long) user_object.get("size")) + "]" : ""); + return user_object.get("name") + " [" + formatBytes(mega_node_size) + "]"; } else if (userObject instanceof Object) { @@ -64,7 +75,6 @@ public class MegaMutableTreeNode extends DefaultMutableTreeNode { @Override public void insert(MutableTreeNode newChild, int childIndex) { super.insert(newChild, childIndex); - Collections.sort(this.children, nodeComparator); } } diff --git a/src/main/java/com/tonikelope/megabasterd/MiscTools.java b/src/main/java/com/tonikelope/megabasterd/MiscTools.java index 2ef328b61..ca96c3972 100644 --- a/src/main/java/com/tonikelope/megabasterd/MiscTools.java +++ b/src/main/java/com/tonikelope/megabasterd/MiscTools.java @@ -499,6 +499,24 @@ public class MiscTools { return df.format(bytes_double) + ' ' + units[pow]; } + public static MegaMutableTreeNode calculateTreeFolderSizes(MegaMutableTreeNode node) { + + int n = node.getChildCount(); + + for (int i = 0; i < n; i++) { + + if (node.getChildAt(i).isLeaf()) { + node.setMega_node_size(node.getMega_node_size() + ((MegaMutableTreeNode) node.getChildAt(i)).getMega_node_size()); + } else { + calculateTreeFolderSizes((MegaMutableTreeNode) node.getChildAt(i)); + node.setMega_node_size(node.getMega_node_size() + ((MegaMutableTreeNode) node.getChildAt(i)).getMega_node_size()); + } + } + + return node; + + } + public static DefaultMutableTreeNode sortTree(DefaultMutableTreeNode root) { Enumeration e = root.depthFirstEnumeration(); diff --git a/src/main/resources/images/mbasterd_screen.png b/src/main/resources/images/mbasterd_screen.png index 323756404..e0928708a 100644 Binary files a/src/main/resources/images/mbasterd_screen.png and b/src/main/resources/images/mbasterd_screen.png differ