diff --git a/pom.xml b/pom.xml
index 77e766ec6..2ea48a73b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
4.0.0
com.tonikelope
MegaBasterd
- 7.91
+ 7.92
jar
diff --git a/src/main/java/com/tonikelope/megabasterd/ChunkDownloader.java b/src/main/java/com/tonikelope/megabasterd/ChunkDownloader.java
index 7e942cd6c..48cfa237d 100644
--- a/src/main/java/com/tonikelope/megabasterd/ChunkDownloader.java
+++ b/src/main/java/com/tonikelope/megabasterd/ChunkDownloader.java
@@ -292,11 +292,11 @@ public class ChunkDownloader implements Runnable, SecureSingleThreadNotifiable {
} else {
- chunk_file = new File(_download.getChunkmanager().getChunks_dir() + "/" + new File(_download.getFile_name()).getName() + ".chunk" + chunk_id);
+ chunk_file = new File(_download.getChunkmanager().getChunks_dir() + "/" + MiscTools.HashString("sha1", _download.getUrl()) + ".chunk" + chunk_id);
if (!chunk_file.exists() || chunk_file.length() != chunk_size) {
- tmp_chunk_file = new File(_download.getChunkmanager().getChunks_dir() + "/" + new File(_download.getFile_name()).getName() + ".chunk" + chunk_id + ".tmp");
+ tmp_chunk_file = new File(_download.getChunkmanager().getChunks_dir() + "/" + MiscTools.HashString("sha1", _download.getUrl()) + ".chunk" + chunk_id + ".tmp");
_chunk_inputstream = new ThrottledInputStream(con.getInputStream(), _download.getMain_panel().getStream_supervisor());
diff --git a/src/main/java/com/tonikelope/megabasterd/ChunkWriterManager.java b/src/main/java/com/tonikelope/megabasterd/ChunkWriterManager.java
index a4b24e933..dc29bc555 100644
--- a/src/main/java/com/tonikelope/megabasterd/ChunkWriterManager.java
+++ b/src/main/java/com/tonikelope/megabasterd/ChunkWriterManager.java
@@ -191,7 +191,7 @@ public class ChunkWriterManager implements Runnable, SecureSingleThreadNotifiabl
try {
- File chunk_file = new File(getChunks_dir() + "/" + new File(_download.getFile_name()).getName() + ".chunk" + String.valueOf(_last_chunk_id_written + 1));
+ File chunk_file = new File(getChunks_dir() + "/" + MiscTools.HashString("sha1", _download.getUrl()) + ".chunk" + String.valueOf(_last_chunk_id_written + 1));
while (chunk_file.exists() && chunk_file.canRead() && chunk_file.canWrite() && chunk_file.length() > 0) {
@@ -251,7 +251,7 @@ public class ChunkWriterManager implements Runnable, SecureSingleThreadNotifiabl
}
- if (_bytes_written == _file_size) {
+ if (_bytes_written == _file_size && MiscTools.isDirEmpty(Paths.get(getChunks_dir()))) {
delete_chunks_temp_dir();
}
}
diff --git a/src/main/java/com/tonikelope/megabasterd/FileGrabberDialog.form b/src/main/java/com/tonikelope/megabasterd/FileGrabberDialog.form
index ffc10c15c..25d57f527 100644
--- a/src/main/java/com/tonikelope/megabasterd/FileGrabberDialog.form
+++ b/src/main/java/com/tonikelope/megabasterd/FileGrabberDialog.form
@@ -86,7 +86,7 @@
-
+
diff --git a/src/main/java/com/tonikelope/megabasterd/FileGrabberDialog.java b/src/main/java/com/tonikelope/megabasterd/FileGrabberDialog.java
index 0722b6331..6f3d95ba5 100644
--- a/src/main/java/com/tonikelope/megabasterd/FileGrabberDialog.java
+++ b/src/main/java/com/tonikelope/megabasterd/FileGrabberDialog.java
@@ -287,7 +287,7 @@ public class FileGrabberDialog extends javax.swing.JDialog {
);
jPanel1Layout.setVerticalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addComponent(file_tree_scrollpane, javax.swing.GroupLayout.DEFAULT_SIZE, 310, Short.MAX_VALUE)
+ .addComponent(file_tree_scrollpane, javax.swing.GroupLayout.DEFAULT_SIZE, 176, Short.MAX_VALUE)
);
jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder("Upload info"));
@@ -822,7 +822,7 @@ public class FileGrabberDialog extends javax.swing.JDialog {
private void skip_rest_buttonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_skip_rest_buttonActionPerformed
- if (deleteAllExceptSelectedTreeItems(file_tree)) {
+ if (deleteAllExceptSelectedTreeItems(file_tree, null)) {
_genFileList();
diff --git a/src/main/java/com/tonikelope/megabasterd/FolderLinkDialog.java b/src/main/java/com/tonikelope/megabasterd/FolderLinkDialog.java
index 5c3859911..6c0bb8de7 100644
--- a/src/main/java/com/tonikelope/megabasterd/FolderLinkDialog.java
+++ b/src/main/java/com/tonikelope/megabasterd/FolderLinkDialog.java
@@ -26,7 +26,6 @@ import javax.swing.JOptionPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeNode;
-import javax.swing.tree.TreePath;
/**
*
@@ -50,8 +49,6 @@ public class FolderLinkDialog extends javax.swing.JDialog {
private volatile MegaMutableTreeNode _subfolder_node = null;
- private volatile boolean _subfolder_finish = false;
-
public List getDownload_links() {
return Collections.unmodifiableList(_download_links);
}
@@ -326,7 +323,7 @@ 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)) {
+ if (deleteAllExceptSelectedTreeItems(file_tree, _subfolder_node)) {
file_tree.setEnabled(false);
node_bar.setVisible(true);
skip_rest_button.setEnabled(false);
@@ -482,11 +479,13 @@ public class FolderLinkDialog extends javax.swing.JDialog {
String parent_id = (String) current_hashmap_node.get("parent");
- root = null;
+ String current_id = (String) current_hashmap_node.get("h");
+
+ boolean ignore_node = false;
do {
- if (folder_nodes.get(parent_id) != null) {
+ if ((subfolder_id == null && folder_nodes.get(parent_id) != null) || (subfolder_id != null && !subfolder_id.equals(current_id) && folder_nodes.get(parent_id) != null)) {
HashMap parent_hashmap_node = (HashMap) folder_nodes.get(parent_id);
@@ -509,12 +508,20 @@ public class FolderLinkDialog extends javax.swing.JDialog {
current_node = parent_node;
- } else {
+ } else if (subfolder_id != null && subfolder_id.equals(current_id)) {
+
+ root = current_node;
+
+ } else if (subfolder_id != null && folder_nodes.get(parent_id) == null) {
+
+ ignore_node = true;
+
+ } else if (subfolder_id == null && folder_nodes.get(parent_id) == null) {
root = current_node;
}
- } while (current_node != root);
+ } while (current_node != root && !ignore_node);
}
MiscTools.GUIRun(() -> {
@@ -522,9 +529,11 @@ public class FolderLinkDialog extends javax.swing.JDialog {
node_bar.setIndeterminate(true);
});
- MiscTools.sortTree(root);
+ if (root != null) {
+ MiscTools.sortTree(root);
- MiscTools.calculateTreeFolderSizes(root);
+ MiscTools.calculateTreeFolderSizes(root);
+ }
if (root == null) {
LOG.log(SEVERE, null, "MEGA FOLDER ERROR (EMPTY?)");
@@ -536,8 +545,6 @@ public class FolderLinkDialog extends javax.swing.JDialog {
final MegaMutableTreeNode roott = root;
- final String ssubfolder_id = subfolder_id;
-
MiscTools.GUIRunAndWait(() -> {
node_bar.setIndeterminate(true);
@@ -549,12 +556,6 @@ public class FolderLinkDialog extends javax.swing.JDialog {
ftree.setEnabled(true);
});
- if (ssubfolder_id != null) {
-
- _subfolder_node = MiscTools.findMegaTreeNodeByID(roott, ssubfolder_id);
-
- }
-
}
} catch (MegaAPIException mex) {
@@ -581,8 +582,6 @@ public class FolderLinkDialog extends javax.swing.JDialog {
MiscTools.GUIRun(() -> {
working = true;
- String folder_id = findFirstRegex("#F!([^!]+)", _link, 1);
-
_download_links.clear();
MegaMutableTreeNode root = (MegaMutableTreeNode) file_tree.getModel().getRoot();
@@ -591,6 +590,15 @@ public class FolderLinkDialog extends javax.swing.JDialog {
THREAD_POOL.execute(() -> {
+ String folder_id = findFirstRegex("#F!([^!]+)", _link, 1);
+
+ if (folder_id.contains("@")) {
+
+ String[] fids = folder_id.split("@");
+
+ folder_id = fids[0];
+ }
+
_total_space = 0L;
while (files_tree.hasMoreElements()) {
@@ -599,6 +607,8 @@ public class FolderLinkDialog extends javax.swing.JDialog {
if (node.isLeaf() && node != root && ((HashMap) node.getUserObject()).get("size") != null) {
+ System.out.println(((HashMap) node.getUserObject()).get("name"));
+
String path = "";
Object[] object_path = node.getUserObjectPath();
@@ -610,6 +620,8 @@ public class FolderLinkDialog extends javax.swing.JDialog {
path = path.replaceAll("^/+", "").replaceAll("^\\+", "").trim();
+ System.out.println(path);
+
String url = "https://mega.nz/#N!" + ((Map) node.getUserObject()).get("h") + "!" + ((Map) node.getUserObject()).get("key") + "###n=" + folder_id;
HashMap download_link = new HashMap<>();
@@ -663,28 +675,6 @@ public class FolderLinkDialog extends javax.swing.JDialog {
working = false;
});
- if (_subfolder_node != null && !_subfolder_finish) {
-
- MiscTools.GUIRunAndWait(() -> {
-
- file_tree.setSelectionPath(new TreePath(_subfolder_node.getPath()));
-
- });
-
- _subfolder_finish = true;
-
- MiscTools.GUIRun(() -> {
- skip_rest_button.setEnabled(true);
- skip_rest_button.doClick();
- });
-
- } else if (_subfolder_node != null && _subfolder_finish) {
- MiscTools.GUIRunAndWait(() -> {
-
- file_tree.setSelectionPath(new TreePath(_subfolder_node.getPath()));
-
- });
- }
});
});
}
diff --git a/src/main/java/com/tonikelope/megabasterd/MainPanel.java b/src/main/java/com/tonikelope/megabasterd/MainPanel.java
index 207470fc5..e2646278f 100644
--- a/src/main/java/com/tonikelope/megabasterd/MainPanel.java
+++ b/src/main/java/com/tonikelope/megabasterd/MainPanel.java
@@ -69,7 +69,7 @@ import javax.swing.UIManager;
*/
public final class MainPanel {
- public static final String VERSION = "7.91";
+ public static final String VERSION = "7.92";
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/MiscTools.java b/src/main/java/com/tonikelope/megabasterd/MiscTools.java
index 4aae15070..7c15d6c1c 100644
--- a/src/main/java/com/tonikelope/megabasterd/MiscTools.java
+++ b/src/main/java/com/tonikelope/megabasterd/MiscTools.java
@@ -491,12 +491,20 @@ public class MiscTools {
border.setTitleFont(new_title_font);
}
- public static String HashString(String algo, String data) throws NoSuchAlgorithmException, UnsupportedEncodingException {
- MessageDigest md = MessageDigest.getInstance(algo);
+ public static String HashString(String algo, String data) {
+ try {
+ MessageDigest md = MessageDigest.getInstance(algo);
- byte[] thedigest = md.digest(data.getBytes("UTF-8"));
+ byte[] thedigest = md.digest(data.getBytes("UTF-8"));
- return bin2hex(thedigest);
+ return bin2hex(thedigest);
+ } catch (NoSuchAlgorithmException ex) {
+ Logger.getLogger(MiscTools.class.getName()).log(Level.SEVERE, null, ex);
+ } catch (UnsupportedEncodingException ex) {
+ Logger.getLogger(MiscTools.class.getName()).log(Level.SEVERE, null, ex);
+ }
+
+ return null;
}
public static String HashString(String algo, byte[] data) throws NoSuchAlgorithmException {
@@ -787,7 +795,19 @@ public class MiscTools {
return false;
}
- public static boolean deleteAllExceptSelectedTreeItems(JTree tree) {
+ public static boolean isDirEmpty(Path path) {
+ if (Files.isDirectory(path)) {
+ try (DirectoryStream directory = Files.newDirectoryStream(path)) {
+ return !directory.iterator().hasNext();
+ } catch (IOException ex) {
+ Logger.getLogger(MiscTools.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ }
+
+ return false;
+ }
+
+ public static boolean deleteAllExceptSelectedTreeItems(JTree tree, DefaultMutableTreeNode custom_root) {
TreePath[] paths = tree.getSelectionPaths();
@@ -866,6 +886,10 @@ public class MiscTools {
}
}
+ if (custom_root != null) {
+ new_root = custom_root;
+ }
+
tree.setModel(new DefaultTreeModel(sortTree((DefaultMutableTreeNode) new_root)));
tree.setRootVisible(new_root != null ? ((TreeNode) new_root).getChildCount() > 0 : false);
diff --git a/src/main/resources/images/mbasterd_screen.png b/src/main/resources/images/mbasterd_screen.png
index 7880a136b..0ee431eb8 100644
Binary files a/src/main/resources/images/mbasterd_screen.png and b/src/main/resources/images/mbasterd_screen.png differ