diff --git a/pom.xml b/pom.xml index d80be9755..d618a8abd 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 com.tonikelope MegaBasterd - 7.77 + 7.78 jar diff --git a/src/main/java/com/tonikelope/megabasterd/ChunkDownloader.java b/src/main/java/com/tonikelope/megabasterd/ChunkDownloader.java index 4cce36a0f..e945c3737 100644 --- a/src/main/java/com/tonikelope/megabasterd/ChunkDownloader.java +++ b/src/main/java/com/tonikelope/megabasterd/ChunkDownloader.java @@ -31,7 +31,6 @@ import java.util.logging.Logger; */ public class ChunkDownloader implements Runnable, SecureSingleThreadNotifiable { - public static final double SLOW_PROXY_PERC = 0.5; private static final Logger LOG = Logger.getLogger(ChunkDownloader.class.getName()); private final int _id; private final Download _download; @@ -184,6 +183,8 @@ public class ChunkDownloader implements Runnable, SecureSingleThreadNotifiable { MainPanel.run_external_command(); + } else if (http_error != 509 && MainPanel.isRun_command() && MainPanel.LAST_TIMESTAMP_EXTERNAL_COMMAND != -1) { + MainPanel.LAST_TIMESTAMP_EXTERNAL_COMMAND = -1; } if ((_current_smart_proxy != null || http_error == 509) && MainPanel.isUse_smart_proxy() && !MainPanel.isUse_proxy()) { diff --git a/src/main/java/com/tonikelope/megabasterd/Download.java b/src/main/java/com/tonikelope/megabasterd/Download.java index 0946b13fc..0b61d56be 100644 --- a/src/main/java/com/tonikelope/megabasterd/Download.java +++ b/src/main/java/com/tonikelope/megabasterd/Download.java @@ -1512,6 +1512,10 @@ public class Download implements Transference, Runnable, SecureSingleThreadNotif error_code = ex.getCode(); + if (error_code == -11) { + _status_error = "ERROR: MEGA LINK BLOCKED/DELETED!"; + } + if (Arrays.asList(FATAL_API_ERROR_CODES).contains(error_code)) { _auto_retry_on_error = Arrays.asList(FATAL_API_ERROR_CODES_WITH_RETRY).contains(error_code); diff --git a/src/main/java/com/tonikelope/megabasterd/MainPanel.java b/src/main/java/com/tonikelope/megabasterd/MainPanel.java index cf786d85b..8d364eb6c 100644 --- a/src/main/java/com/tonikelope/megabasterd/MainPanel.java +++ b/src/main/java/com/tonikelope/megabasterd/MainPanel.java @@ -18,13 +18,12 @@ import java.awt.Color; import static java.awt.EventQueue.invokeLater; import java.awt.Font; import static java.awt.Frame.NORMAL; -import java.awt.MenuItem; -import java.awt.PopupMenu; import static java.awt.SystemTray.getSystemTray; import static java.awt.Toolkit.getDefaultToolkit; import java.awt.TrayIcon; import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; import java.awt.event.WindowEvent; import static java.awt.event.WindowEvent.WINDOW_CLOSING; import java.io.File; @@ -53,11 +52,14 @@ import static java.util.concurrent.Executors.newCachedThreadPool; import java.util.logging.Level; import static java.util.logging.Level.SEVERE; import java.util.logging.Logger; +import javax.swing.JMenuItem; import javax.swing.JOptionPane; import static javax.swing.JOptionPane.QUESTION_MESSAGE; import static javax.swing.JOptionPane.WARNING_MESSAGE; import static javax.swing.JOptionPane.YES_NO_CANCEL_OPTION; import static javax.swing.JOptionPane.showOptionDialog; +import javax.swing.JPopupMenu; +import javax.swing.SwingUtilities; import javax.swing.UIDefaults; import javax.swing.UIManager; @@ -67,14 +69,14 @@ import javax.swing.UIManager; */ public final class MainPanel { - public static final String VERSION = "7.77"; + public static final String VERSION = "7.78"; 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; public static final int STREAMER_PORT = 1337; public static final int WATCHDOG_PORT = 1338; public static final int DEFAULT_MEGA_PROXY_PORT = 9999; - public static final int RUN_COMMAND_TIME = 600; + public static final int RUN_COMMAND_TIME = 120; public static final String DEFAULT_LANGUAGE = "EN"; public static final boolean DEFAULT_SMART_PROXY = false; public static final double FORCE_GARBAGE_COLLECTION_MAX_MEMORY_PERCENT = 0.7; @@ -98,7 +100,7 @@ public final class MainPanel { private static String _new_version; private static Boolean _resume_uploads; private static Boolean _resume_downloads; - private static long _last_run_command; + public static volatile long LAST_TIMESTAMP_EXTERNAL_COMMAND; private static final Logger LOG = Logger.getLogger(MainPanel.class.getName()); private static volatile boolean CHECK_RUNNING = true; @@ -225,7 +227,7 @@ public final class MainPanel { _exit = false; - _last_run_command = -1; + LAST_TIMESTAMP_EXTERNAL_COMMAND = -1; _restart = false; @@ -812,7 +814,7 @@ public final class MainPanel { _run_command_path = DBTools.selectSettingValue("run_command_path"); if (_run_command && old_run_command_path != null && !old_run_command_path.equals(_run_command_path)) { - _last_run_command = -1; + LAST_TIMESTAMP_EXTERNAL_COMMAND = -1; } String use_megacrypter_reverse = selectSettingValue("megacrypter_reverse"); @@ -866,7 +868,7 @@ public final class MainPanel { public static synchronized void run_external_command() { - if (_run_command && (_last_run_command == -1 || _last_run_command + RUN_COMMAND_TIME * 1000 < System.currentTimeMillis())) { + if (_run_command && (LAST_TIMESTAMP_EXTERNAL_COMMAND == -1 || LAST_TIMESTAMP_EXTERNAL_COMMAND + RUN_COMMAND_TIME * 1000 < System.currentTimeMillis())) { if (_run_command_path != null && !_run_command_path.equals("")) { try { @@ -875,7 +877,7 @@ public final class MainPanel { Logger.getLogger(MainPanel.class.getName()).log(Level.SEVERE, ex.getMessage()); } - _last_run_command = System.currentTimeMillis(); + LAST_TIMESTAMP_EXTERNAL_COMMAND = System.currentTimeMillis(); } } } @@ -1355,29 +1357,29 @@ public final class MainPanel { if (java.awt.SystemTray.isSupported()) { - PopupMenu menu = new PopupMenu(); + JPopupMenu menu = new JPopupMenu(); Font new_font = GUI_FONT; menu.setFont(new_font.deriveFont(Font.BOLD, Math.round(14 * ZOOM_FACTOR))); - MenuItem messageItem = new MenuItem(LabelTranslatorSingleton.getInstance().translate("Restore window")); + JMenuItem messageItem = new JMenuItem(LabelTranslatorSingleton.getInstance().translate("Restore window")); messageItem.addActionListener((ActionEvent e) -> { - MiscTools.GUIRun(() -> { - getView().setExtendedState(NORMAL); - getView().setVisible(true); + getView().setExtendedState(NORMAL); - getView().revalidate(); + getView().setVisible(true); + + getView().revalidate(); + + getView().repaint(); - getView().repaint(); - }); }); menu.add(messageItem); - MenuItem closeItem = new MenuItem(LabelTranslatorSingleton.getInstance().translate("EXIT")); + JMenuItem closeItem = new JMenuItem(LabelTranslatorSingleton.getInstance().translate("EXIT")); closeItem.addActionListener((ActionEvent e) -> { if (!getView().isVisible()) { @@ -1394,28 +1396,34 @@ public final class MainPanel { menu.add(closeItem); - ActionListener actionListener = (ActionEvent e) -> { - MiscTools.GUIRun(() -> { - if (!getView().isVisible()) { - getView().setExtendedState(NORMAL); - getView().setVisible(true); - getView().revalidate(); - getView().repaint(); - - } else { - - getView().dispatchEvent(new WindowEvent(getView(), WINDOW_CLOSING)); - } - }); - }; - - _trayicon = new TrayIcon(getDefaultToolkit().getImage(getClass().getResource(ICON_FILE)), "MegaBasterd", menu); + _trayicon = new TrayIcon(getDefaultToolkit().getImage(getClass().getResource(ICON_FILE)), "MegaBasterd", null); _trayicon.setToolTip("MegaBasterd " + VERSION); _trayicon.setImageAutoSize(true); - _trayicon.addActionListener(actionListener); + _trayicon.addMouseListener(new MouseAdapter() { + public void mouseReleased(MouseEvent e) { + + if (SwingUtilities.isRightMouseButton(e)) { + menu.setLocation(e.getX(), e.getY()); + menu.setInvoker(menu); + menu.setVisible(true); + } else { + if (!getView().isVisible()) { + getView().setExtendedState(NORMAL); + getView().setVisible(true); + getView().revalidate(); + getView().repaint(); + + } else { + + getView().dispatchEvent(new WindowEvent(getView(), WINDOW_CLOSING)); + } + } + + } + }); getSystemTray().add(_trayicon); diff --git a/src/main/java/com/tonikelope/megabasterd/MainPanelView.java b/src/main/java/com/tonikelope/megabasterd/MainPanelView.java index 82b4ef915..2c3be27a6 100644 --- a/src/main/java/com/tonikelope/megabasterd/MainPanelView.java +++ b/src/main/java/com/tonikelope/megabasterd/MainPanelView.java @@ -60,205 +60,205 @@ import javax.swing.JTabbedPane; * @author tonikelope */ public final class MainPanelView extends javax.swing.JFrame { - + private final MainPanel _main_panel; - + public JMenuItem getMerge_file_menu() { return merge_file_menu; } - + public JMenuItem getSplit_file_menu() { return split_file_menu; } - + public JLabel getKiss_server_status() { return kiss_server_status; } - + public JMenuItem getClean_all_down_menu() { return clean_all_down_menu; } - + public JMenuItem getClean_all_up_menu() { return clean_all_up_menu; } - + public JButton getClose_all_finished_down_button() { return close_all_finished_down_button; } - + public JButton getClose_all_finished_up_button() { return close_all_finished_up_button; } - + public JLabel getMemory_status() { return memory_status; } - + public JLabel getGlobal_speed_down_label() { return global_speed_down_label; } - + public JLabel getDown_remtime_label() { return down_remtime_label; } - + public JLabel getUp_remtime_label() { return up_remtime_label; } - + public JLabel getGlobal_speed_up_label() { return global_speed_up_label; } - + public JPanel getjPanel_scroll_down() { return jPanel_scroll_down; } - + public JPanel getjPanel_scroll_up() { return jPanel_scroll_up; } - + public JMenuItem getNew_download_menu() { return new_download_menu; } - + public JMenuItem getNew_upload_menu() { return new_upload_menu; } - + public JButton getPause_all_down_button() { return pause_all_down_button; } - + public JButton getPause_all_up_button() { return pause_all_up_button; } - + public JLabel getStatus_down_label() { return status_down_label; } - + public JLabel getStatus_up_label() { return status_up_label; } - + public JButton getUnfreeze_transferences_button() { return unfreeze_transferences_button; } - + public MainPanel getMain_panel() { return _main_panel; } - + public JTabbedPane getjTabbedPane1() { return jTabbedPane1; } - + public JLabel getSmart_proxy_status() { return smart_proxy_status; } - + public JLabel getMc_reverse_status() { return mc_reverse_status; } - + public JCheckBoxMenuItem getAuto_close_menu() { return auto_close_menu; } - + public void updateKissStreamServerStatus(final String status) { - + MiscTools.GUIRun(() -> { String old_status = getKiss_server_status().getText(); - + if (!old_status.equals(status + " ")) { Dimension frame_size = this.getSize(); - + getKiss_server_status().setText(status + " "); - + pack(); setSize(frame_size); - + } }); } - + public void updateSmartProxyStatus(final String status) { - + MiscTools.GUIRun(() -> { String old_status = getSmart_proxy_status().getText(); - + if (!old_status.equals(status + " ")) { Dimension frame_size = this.getSize(); - + getSmart_proxy_status().setText(status + " "); - + pack(); setSize(frame_size); - + } }); } - + public void updateMCReverseStatus(final String status) { - + MiscTools.GUIRun(() -> { - + String old_status = getMc_reverse_status().getText(); - + if (!old_status.equals(status + " ")) { Dimension frame_size = this.getSize(); - + getMc_reverse_status().setText(status + " "); - + pack(); setSize(frame_size); - + } }); } - + private void _new_upload_dialog(FileGrabberDialog dialog) { - + try { - + dialog.setLocationRelativeTo(this); - + dialog.setVisible(true); - + if (dialog.isUpload() && dialog.getFiles().size() > 0) { - + getMain_panel().resumeUploads(); - + getMain_panel().getUpload_manager().getTransference_preprocess_global_queue().addAll(dialog.getFiles()); - + getMain_panel().getUpload_manager().secureNotify(); - + final String mega_account = (String) dialog.getAccount_combobox().getSelectedItem(); - + final String base_path = dialog.getBase_path(); - + final String dir_name = dialog.getDir_name_textfield().getText(); - + jTabbedPane1.setSelectedIndex(1); - + Runnable run = () -> { - + Thread.currentThread().setPriority(Thread.MIN_PRIORITY); - + MegaAPI ma = getMain_panel().getMega_active_accounts().get(mega_account); - + try { - + byte[] parent_key = ma.genFolderKey(); - + byte[] share_key = ma.genShareKey(); - + HashMap res = ma.createDir(dir_name != null ? dir_name : dialog.getFiles().get(0).getName() + "_" + genID(10), ma.getRoot_id(), parent_key, i32a2bin(ma.getMaster_key())); - + String parent_node = (String) ((Map) ((List) res.get("f")).get(0)).get("h"); - + LOG.log(Level.INFO, "{0} Dir {1} created", new Object[]{Thread.currentThread().getName(), parent_node}); //ma.shareFolder(parent_node, parent_key, share_key); //DE MOMENTO NO HAY OTRA @@ -266,10 +266,10 @@ public final class MainPanelView extends javax.swing.JFrame { String folder_link = null; //No hay otra if (dialog.getUpload_log_checkbox().isSelected()) { - + File upload_log = new File(MainPanel.MEGABASTERD_HOME_DIR + "/megabasterd_upload_" + parent_node + ".log"); upload_log.createNewFile(); - + FileWriter fr; try { fr = new FileWriter(upload_log, true); @@ -282,133 +282,133 @@ public final class MainPanelView extends javax.swing.JFrame { Logger.getLogger(Upload.class.getName()).log(Level.SEVERE, ex.getMessage()); } } - + MegaDirNode file_paths = new MegaDirNode(parent_node); - + for (File f : dialog.getFiles()) { - + String file_path = f.getParentFile().getAbsolutePath().replace(base_path, ""); - + try { - + LOG.log(Level.INFO, "{0} FILE_PATH -> {1}", new Object[]{Thread.currentThread().getName(), file_path}); - + String[] dirs = file_path.split("\\" + File.separator); - + MegaDirNode current_node = file_paths; - + String file_parent = current_node.getNode_id(); - + for (String d : dirs) { - + LOG.log(Level.INFO, "{0} DIR -> {1}", new Object[]{Thread.currentThread().getName(), d}); - + if (!d.isEmpty()) { - + if (current_node.getChildren().get(d) != null) { - + current_node = current_node.getChildren().get(d); - + file_parent = current_node.getNode_id(); - + } else { - + res = ma.createDirInsideAnotherSharedDir(d, current_node.getNode_id(), ma.genFolderKey(), i32a2bin(ma.getMaster_key()), parent_node, share_key); - + file_parent = (String) ((Map) ((List) res.get("f")).get(0)).get("h"); - + current_node.getChildren().put(d, new MegaDirNode(file_parent)); - + current_node = current_node.getChildren().get(d); } } } - + while (getMain_panel().getUpload_manager().getTransference_waitstart_queue().size() >= TransferenceManager.MAX_WAIT_QUEUE || getMain_panel().getUpload_manager().getTransference_waitstart_aux_queue().size() >= TransferenceManager.MAX_WAIT_QUEUE) { - + synchronized (getMain_panel().getUpload_manager().getWait_queue_lock()) { getMain_panel().getUpload_manager().getWait_queue_lock().wait(1000); } } - + if (!getMain_panel().getUpload_manager().getTransference_preprocess_global_queue().isEmpty()) { - + Upload upload = new Upload(getMain_panel(), ma, f.getAbsolutePath(), file_parent, null, null, parent_node, share_key, folder_link, dialog.getPriority_checkbox().isSelected()); - + getMain_panel().getUpload_manager().getTransference_provision_queue().add(upload); - + getMain_panel().getUpload_manager().getTransference_preprocess_global_queue().remove(f); - + getMain_panel().getUpload_manager().secureNotify(); - + } - + } catch (Exception ex) { - + if (!getMain_panel().getUpload_manager().getTransference_preprocess_global_queue().isEmpty()) { - + getMain_panel().getUpload_manager().getTransference_preprocess_global_queue().remove(f); - + getMain_panel().getUpload_manager().secureNotify(); - + } - + LOG.log(SEVERE, null, ex); } - + } - + } catch (Exception ex) { - + LOG.log(SEVERE, null, ex); } - + }; - + getMain_panel().getUpload_manager().getTransference_preprocess_queue().add(run); - + getMain_panel().getUpload_manager().secureNotify(); - + } - + } catch (Exception ex) { } - + if (!dialog.isRemember_master_pass()) { - + _main_panel.setMaster_pass(null); } - + dialog.dispose(); - + } - + private void _file_drop_notify(List files) { - + final MainPanelView tthis = this; - + THREAD_POOL.execute(() -> { int n; - + if (files.size() > 1) { - + Object[] options = {LabelTranslatorSingleton.getInstance().translate("Split content in different uploads"), LabelTranslatorSingleton.getInstance().translate("Merge content in the same upload")}; - + n = showOptionDialog(_main_panel.getView(), LabelTranslatorSingleton.getInstance().translate("How do you want to proceed?"), LabelTranslatorSingleton.getInstance().translate("File Grabber"), DEFAULT_OPTION, INFORMATION_MESSAGE, null, options, null); - + } else { - + n = 1; - + } - + if (n == 0) { - + files.stream().map((file) -> { List aux = new ArrayList<>(); aux.add(file); @@ -416,44 +416,46 @@ public final class MainPanelView extends javax.swing.JFrame { }).map((aux) -> new FileGrabberDialog(tthis, true, aux)).forEachOrdered((dialog) -> { _new_upload_dialog(dialog); }); - + } else if (n == 1) { - + final FileGrabberDialog dialog = new FileGrabberDialog(tthis, true, files); - + _new_upload_dialog(dialog); - + } }); } - + public MainPanelView(MainPanel main_panel) { - + _main_panel = main_panel; - + MiscTools.GUIRunAndWait(() -> { - + initComponents(); - + + unfreeze_transferences_button.setBackground(Color.WHITE); + updateFonts(this, GUI_FONT, _main_panel.getZoom_factor()); - + translateLabels(this); - + for (JComponent c : new JComponent[]{unfreeze_transferences_button, global_speed_down_label, global_speed_up_label, down_remtime_label, up_remtime_label, close_all_finished_down_button, close_all_finished_up_button, pause_all_down_button, pause_all_up_button}) { - + c.setVisible(false); } - + clean_all_down_menu.setEnabled(false); clean_all_up_menu.setEnabled(false); - + jScrollPane_down.getVerticalScrollBar().setUnitIncrement(20); jScrollPane_up.getVerticalScrollBar().setUnitIncrement(20); - + jTabbedPane1.setTitleAt(0, LabelTranslatorSingleton.getInstance().translate("Downloads")); jTabbedPane1.setTitleAt(1, LabelTranslatorSingleton.getInstance().translate("Uploads")); jTabbedPane1.setDropTarget(new DropTarget() { - + public boolean canImport(DataFlavor[] flavors) { for (DataFlavor flavor : flavors) { if (flavor.isFlavorJavaFileListType()) { @@ -462,62 +464,62 @@ public final class MainPanelView extends javax.swing.JFrame { } return false; } - + @Override public synchronized void drop(DropTargetDropEvent dtde) { changeToNormal(); dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE); - + List files; - + try { - + if (canImport(dtde.getTransferable().getTransferDataFlavors())) { files = (List) dtde.getTransferable().getTransferData(DataFlavor.javaFileListFlavor); - + THREAD_POOL.execute(() -> { _file_drop_notify(files); }); } - + } catch (Exception ex) { JOptionPane.showMessageDialog(main_panel.getView(), LabelTranslatorSingleton.getInstance().translate("ERROR DOING DRAG AND DROP WITH THIS FILE (use button method)"), "Error", JOptionPane.ERROR_MESSAGE); - + } } - + @Override public synchronized void dragEnter(DropTargetDragEvent dtde) { changeToDrop(); } - + @Override public synchronized void dragExit(DropTargetEvent dtde) { changeToNormal(); } - + private void changeToDrop() { jTabbedPane1.setBorder(BorderFactory.createLineBorder(Color.green, 5)); - + } - + private void changeToNormal() { jTabbedPane1.setBorder(null); } } ); - + String auto_close = selectSettingValue("auto_close"); - + if (auto_close != null) { getAuto_close_menu().setSelected(auto_close.equals("yes")); } else { getAuto_close_menu().setSelected(false); } - + pack(); }); - + } /** @@ -963,178 +965,178 @@ public final class MainPanelView extends javax.swing.JFrame { }// //GEN-END:initComponents private void new_download_menuActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_new_download_menuActionPerformed - + new_download_menu.setEnabled(false); - + final LinkGrabberDialog dialog = new LinkGrabberDialog(this, true, _main_panel.getDefault_download_path(), _main_panel.getClipboardspy()); - + _main_panel.getClipboardspy().attachObserver(dialog); - + dialog.setLocationRelativeTo(this); - + dialog.setVisible(true); - + _main_panel.getClipboardspy().detachObserver(dialog); - + final String dl_path = dialog.getDownload_path(); - + final MegaAPI ma; - + if (getMain_panel().isUse_mega_account_down()) { final String mega_account = (String) dialog.getUse_mega_account_down_combobox().getSelectedItem(); - + if ("".equals(mega_account)) { - + ma = new MegaAPI(); - + } else { - + ma = getMain_panel().getMega_active_accounts().get(mega_account); } - + } else { - + ma = new MegaAPI(); } - + jTabbedPane1.setSelectedIndex(0); - + if (dialog.isDownload()) { - + getMain_panel().resumeDownloads(); - + final MainPanelView tthis = this; - + Runnable run = () -> { - + Thread.currentThread().setPriority(Thread.MIN_PRIORITY); //Convert to legacy link format String link_data = MiscTools.newMegaLinks2Legacy(dialog.getLinks_textarea().getText()); - + Set urls = new HashSet(findAllRegex("(?:https?|mega)://[^\r\n]+(#[^\r\n!]*?)?![^\r\n!]+![^\\?\r\n/]+", link_data, 0)); - + Set megadownloader = new HashSet(findAllRegex("mega://enc[^\r\n]+", link_data, 0)); - + megadownloader.forEach((link) -> { try { - + urls.add(decryptMegaDownloaderLink(link)); - + } catch (Exception ex) { LOG.log(SEVERE, null, ex); } }); - + Set elc = new HashSet(findAllRegex("mega://elc[^\r\n]+", link_data, 0)); - + elc.forEach((link) -> { try { - + urls.addAll(CryptTools.decryptELC(link, getMain_panel())); - + } catch (Exception ex) { LOG.log(SEVERE, null, ex); } }); - + Set dlc = new HashSet(findAllRegex("dlc://([^\r\n]+)", link_data, 1)); - + dlc.stream().map((d) -> CryptTools.decryptDLC(d, _main_panel)).forEachOrdered((links) -> { links.stream().filter((link) -> (findFirstRegex("(?:https?|mega)://[^\r\n](#[^\r\n!]*?)?![^\r\n!]+![^\\?\r\n/]+", link, 0) != null)).forEachOrdered((link) -> { urls.add(link); }); }); - + if (!urls.isEmpty()) { - + Set folder_file_links = new HashSet(findAllRegex("(?:https?|mega)://[^\r\n]+#F\\*[^\r\n!]*?![^\r\n!]+![^\\?\r\n/]+", link_data, 0)); - + if (!folder_file_links.isEmpty()) { ArrayList nlinks = ma.getNlinks(folder_file_links); - + urls.removeAll(folder_file_links); - + urls.addAll(nlinks); } - + getMain_panel().getDownload_manager().getTransference_preprocess_global_queue().addAll(urls); - + getMain_panel().getDownload_manager().secureNotify(); - + MiscTools.GUIRun(() -> { new_download_menu.setEnabled(true); }); - + boolean link_warning; - + for (String url : urls) { - + try { - + link_warning = false; - + url = URLDecoder.decode(url, "UTF-8").replaceAll("^mega://", "https://mega.nz").trim(); - + Download download; - + if (findFirstRegex("#F!", url, 0) != null) { - + FolderLinkDialog fdialog = new FolderLinkDialog(_main_panel.getView(), true, url); - + if (fdialog.isMega_error() == 0) { - + fdialog.setLocationRelativeTo(_main_panel.getView()); - + fdialog.setVisible(true); - + if (fdialog.isDownload()) { - + List folder_links = fdialog.getDownload_links(); - + fdialog.dispose(); - + for (HashMap folder_link : folder_links) { - + while (getMain_panel().getDownload_manager().getTransference_waitstart_queue().size() >= TransferenceManager.MAX_WAIT_QUEUE || getMain_panel().getDownload_manager().getTransference_waitstart_aux_queue().size() >= TransferenceManager.MAX_WAIT_QUEUE) { - + if (!link_warning) { link_warning = true; - + JOptionPane.showMessageDialog(tthis, LabelTranslatorSingleton.getInstance().translate("There are a lot of files in this folder.\nNot all links will be provisioned at once to avoid saturating MegaBasterd"), "Warning", JOptionPane.WARNING_MESSAGE); } - + synchronized (getMain_panel().getDownload_manager().getWait_queue_lock()) { getMain_panel().getDownload_manager().getWait_queue_lock().wait(1000); } } - + if (!getMain_panel().getDownload_manager().getTransference_preprocess_global_queue().isEmpty()) { - + if (!((String) folder_link.get("url")).equals("*")) { - + download = new Download(getMain_panel(), ma, (String) folder_link.get("url"), dl_path, (String) folder_link.get("filename"), (String) folder_link.get("filekey"), (long) folder_link.get("filesize"), null, null, getMain_panel().isUse_slots_down(), false, getMain_panel().isUse_custom_chunks_dir() ? getMain_panel().getCustom_chunks_dir() : null, dialog.getPriority_checkbox().isSelected()); - + getMain_panel().getDownload_manager().getTransference_provision_queue().add(download); - + getMain_panel().getDownload_manager().secureNotify(); - + } else { //Directorio vacĂ­o String filename = dl_path + "/" + (String) folder_link.get("filename"); - + File file = new File(filename); - + if (file.getParent() != null) { File path = new File(file.getParent()); - + path.mkdirs(); } - + if (((int) folder_link.get("type")) == 1) { - + file.mkdir(); - + } else { try { file.createNewFile(); @@ -1148,38 +1150,38 @@ public final class MainPanelView extends javax.swing.JFrame { } } } - + } - + fdialog.dispose(); - + } else { - + while (getMain_panel().getDownload_manager().getTransference_waitstart_queue().size() >= TransferenceManager.MAX_WAIT_QUEUE || getMain_panel().getDownload_manager().getTransference_waitstart_aux_queue().size() >= TransferenceManager.MAX_WAIT_QUEUE) { - + synchronized (getMain_panel().getDownload_manager().getWait_queue_lock()) { getMain_panel().getDownload_manager().getWait_queue_lock().wait(1000); } } - + download = new Download(getMain_panel(), ma, url, dl_path, null, null, null, null, null, getMain_panel().isUse_slots_down(), false, getMain_panel().isUse_custom_chunks_dir() ? getMain_panel().getCustom_chunks_dir() : null, dialog.getPriority_checkbox().isSelected()); - + getMain_panel().getDownload_manager().getTransference_provision_queue().add(download); - + getMain_panel().getDownload_manager().secureNotify(); - + } - + getMain_panel().getDownload_manager().getTransference_preprocess_global_queue().remove(url); - + getMain_panel().getDownload_manager().secureNotify(); - + } catch (UnsupportedEncodingException ex) { LOG.log(Level.SEVERE, ex.getMessage()); } catch (InterruptedException ex) { Logger.getLogger(MainPanelView.class.getName()).log(Level.SEVERE, ex.getMessage()); } - + } } else { MiscTools.GUIRun(() -> { @@ -1187,30 +1189,30 @@ public final class MainPanelView extends javax.swing.JFrame { }); } }; - + getMain_panel().getDownload_manager().getTransference_preprocess_queue().add(run); - + getMain_panel().getDownload_manager().secureNotify(); - + } else { - + new_download_menu.setEnabled(true); } - + dialog.dispose(); - + }//GEN-LAST:event_new_download_menuActionPerformed - + private void settings_menuActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_settings_menuActionPerformed - + SettingsDialog dialog = new SettingsDialog(this, true); - + dialog.setLocationRelativeTo(this); - + dialog.setVisible(true); - + if (dialog.isSettings_ok()) { - + dialog.getDeleted_mega_accounts().stream().map((email) -> { try { deleteMegaAccount(email); @@ -1234,247 +1236,247 @@ public final class MainPanelView extends javax.swing.JFrame { }).forEachOrdered((host) -> { _main_panel.getElc_accounts().remove(host); }); - + if (_main_panel.isRestart()) { - + _main_panel.byebye(true); } else { _main_panel.loadUserSettings(); - + if (_main_panel.isLimit_download_speed()) { - + _main_panel.getStream_supervisor().setMaxBytesPerSecInput(_main_panel.getMax_dl_speed() * 1024); - + global_speed_down_label.setForeground(new Color(255, 0, 0)); - + } else { - + _main_panel.getStream_supervisor().setMaxBytesPerSecInput(0); - + global_speed_down_label.setForeground(new Color(0, 128, 255)); - + } - + if (_main_panel.isLimit_upload_speed()) { - + _main_panel.getStream_supervisor().setMaxBytesPerSecOutput(_main_panel.getMax_up_speed() * 1024); - + global_speed_up_label.setForeground(new Color(255, 0, 0)); - + } else { - + _main_panel.getStream_supervisor().setMaxBytesPerSecOutput(0); - + global_speed_up_label.setForeground(new Color(0, 128, 255)); - + } - + _main_panel.getDownload_manager().setMax_running_trans(_main_panel.getMax_dl()); - + _main_panel.getUpload_manager().setMax_running_trans(_main_panel.getMax_ul()); - + _main_panel.getDownload_manager().secureNotify(); - + _main_panel.getUpload_manager().secureNotify(); - + if (_main_panel.isMegacrypter_reverse()) { - + if (_main_panel.getMega_proxy_server() == null) { - + _main_panel.setMega_proxy_server(new MegaProxyServer(_main_panel, UUID.randomUUID().toString(), _main_panel.getMegacrypter_reverse_port())); - + THREAD_POOL.execute(_main_panel.getMega_proxy_server()); - + } else if (_main_panel.getMega_proxy_server().getPort() != _main_panel.getMegacrypter_reverse_port()) { - + try { - + _main_panel.getMega_proxy_server().stopServer(); _main_panel.setMega_proxy_server(new MegaProxyServer(_main_panel, UUID.randomUUID().toString(), _main_panel.getMegacrypter_reverse_port())); THREAD_POOL.execute(_main_panel.getMega_proxy_server()); - + } catch (IOException ex) { LOG.log(Level.SEVERE, ex.getMessage()); } } - + } else { - + if (_main_panel.getMega_proxy_server() != null) { - + try { _main_panel.getMega_proxy_server().stopServer(); } catch (IOException ex) { LOG.log(Level.SEVERE, ex.getMessage()); } } - + _main_panel.setMega_proxy_server(null); } - + if (MainPanel.isUse_smart_proxy()) { - + if (MainPanel.getProxy_manager() == null) { - + String lista_proxy = DBTools.selectSettingValue("custom_proxy_list"); - + String url_list = MiscTools.findFirstRegex("^#(http.+)$", lista_proxy.trim(), 1); - + MainPanel.setProxy_manager(new SmartMegaProxyManager(url_list, _main_panel)); } else { String lista_proxy = DBTools.selectSettingValue("custom_proxy_list"); - + String url_list = MiscTools.findFirstRegex("^#(http.+)$", lista_proxy.trim(), 1); MainPanel.getProxy_manager().refreshProxyList(url_list); } - + } else { - + updateSmartProxyStatus("SmartProxy: OFF"); } } - + if (!dialog.isRemember_master_pass()) { - + _main_panel.setMaster_pass(null); } - + dialog.dispose(); - + } }//GEN-LAST:event_settings_menuActionPerformed - + private void hide_tray_menuActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_hide_tray_menuActionPerformed - + dispatchEvent(new WindowEvent(this, WINDOW_CLOSING)); }//GEN-LAST:event_hide_tray_menuActionPerformed - + private void about_menuActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_about_menuActionPerformed - + AboutDialog dialog = new AboutDialog(this, true); - + dialog.setLocationRelativeTo(this); - + dialog.setVisible(true); }//GEN-LAST:event_about_menuActionPerformed - + private void exit_menuActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_exit_menuActionPerformed - + _main_panel.byebye(false); }//GEN-LAST:event_exit_menuActionPerformed - + private void close_all_finished_down_buttonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_close_all_finished_down_buttonActionPerformed - + _main_panel.getDownload_manager().closeAllFinished(); }//GEN-LAST:event_close_all_finished_down_buttonActionPerformed - + private void clean_all_down_menuActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_clean_all_down_menuActionPerformed - + Object[] options = {"No", LabelTranslatorSingleton.getInstance().translate("Yes")}; - + int n = showOptionDialog(_main_panel.getView(), LabelTranslatorSingleton.getInstance().translate("Remove all no running downloads?"), LabelTranslatorSingleton.getInstance().translate("Warning!"), YES_NO_CANCEL_OPTION, QUESTION_MESSAGE, null, options, options[0]); - + if (n == 1) { _main_panel.getDownload_manager().closeAllPreProWaiting(); } }//GEN-LAST:event_clean_all_down_menuActionPerformed - + private void pause_all_down_buttonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_pause_all_down_buttonActionPerformed - + pause_all_down_button.setEnabled(false); - + if (!_main_panel.getDownload_manager().isPaused_all()) { - + _main_panel.getDownload_manager().pauseAll(); - + } else { - + _main_panel.getDownload_manager().resumeAll(); } - + }//GEN-LAST:event_pause_all_down_buttonActionPerformed - + private void new_stream_menuActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_new_stream_menuActionPerformed - + StreamerDialog dialog = new StreamerDialog(this, true, _main_panel.getClipboardspy()); - + _main_panel.getClipboardspy().attachObserver(dialog); - + dialog.setLocationRelativeTo(this); - + dialog.setVisible(true); - + _main_panel.getClipboardspy().detachObserver(dialog); }//GEN-LAST:event_new_stream_menuActionPerformed - + private void new_upload_menuActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_new_upload_menuActionPerformed - + final FileGrabberDialog dialog = new FileGrabberDialog(this, true, null); - + _new_upload_dialog(dialog); }//GEN-LAST:event_new_upload_menuActionPerformed - + private void close_all_finished_up_buttonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_close_all_finished_up_buttonActionPerformed - + _main_panel.getUpload_manager().closeAllFinished(); }//GEN-LAST:event_close_all_finished_up_buttonActionPerformed - + private void pause_all_up_buttonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_pause_all_up_buttonActionPerformed - + pause_all_up_button.setEnabled(false); - + if (!_main_panel.getUpload_manager().isPaused_all()) { - + _main_panel.getUpload_manager().pauseAll(); - + } else { - + _main_panel.getUpload_manager().resumeAll(); } }//GEN-LAST:event_pause_all_up_buttonActionPerformed - + private void clean_all_up_menuActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_clean_all_up_menuActionPerformed - + Object[] options = {"No", LabelTranslatorSingleton.getInstance().translate("Yes")}; - + int n = showOptionDialog(_main_panel.getView(), LabelTranslatorSingleton.getInstance().translate("Remove all no running uploads?"), LabelTranslatorSingleton.getInstance().translate("Warning!"), YES_NO_CANCEL_OPTION, QUESTION_MESSAGE, null, options, options[0]); - + if (n == 1) { _main_panel.getUpload_manager().closeAllPreProWaiting(); } }//GEN-LAST:event_clean_all_up_menuActionPerformed - + private void split_file_menuActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_split_file_menuActionPerformed // TODO add your handling code here: FileSplitterDialog dialog = new FileSplitterDialog(this, true); - + dialog.setLocationRelativeTo(this); - + dialog.setVisible(true); }//GEN-LAST:event_split_file_menuActionPerformed - + private void merge_file_menuActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_merge_file_menuActionPerformed // TODO add your handling code here: FileMergerDialog dialog = new FileMergerDialog(this, true); - + dialog.setLocationRelativeTo(this); - + dialog.setVisible(true); }//GEN-LAST:event_merge_file_menuActionPerformed - + private void auto_close_menuActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_auto_close_menuActionPerformed try { DBTools.insertSettingValue("auto_close", getAuto_close_menu().isSelected() ? "yes" : "no"); @@ -1482,37 +1484,37 @@ public final class MainPanelView extends javax.swing.JFrame { Logger.getLogger(MainPanelView.class.getName()).log(Level.SEVERE, ex.getMessage()); } }//GEN-LAST:event_auto_close_menuActionPerformed - + private void unfreeze_transferences_buttonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_unfreeze_transferences_buttonActionPerformed // TODO add your handling code here: unfreeze_transferences_button.setVisible(false); - + THREAD_POOL.execute(_main_panel.getDownload_manager()::unfreezeTransferenceWaitStartQueue); - + THREAD_POOL.execute(_main_panel.getUpload_manager()::unfreezeTransferenceWaitStartQueue); }//GEN-LAST:event_unfreeze_transferences_buttonActionPerformed - + private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed // TODO add your handling code here: _main_panel.getDownload_manager().copyAllLinksToClipboard(); - + JOptionPane.showMessageDialog(this, LabelTranslatorSingleton.getInstance().translate("ALL COPIED!")); }//GEN-LAST:event_jButton1ActionPerformed - + private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem1ActionPerformed // TODO add your handling code here: Object[] options = {"No", LabelTranslatorSingleton.getInstance().translate("Yes")}; - + int n = showOptionDialog(_main_panel.getView(), LabelTranslatorSingleton.getInstance().translate("CANCEL ALL DOWNLOADS?"), LabelTranslatorSingleton.getInstance().translate("Warning!"), YES_NO_CANCEL_OPTION, QUESTION_MESSAGE, null, options, options[0]); - + if (n == 1) { _main_panel.getDownload_manager().closeAllPreProWaiting(); _main_panel.getDownload_manager().cancelAllTransferences(); @@ -1566,5 +1568,5 @@ public final class MainPanelView extends javax.swing.JFrame { private javax.swing.JPanel uploads_panel; // End of variables declaration//GEN-END:variables private static final Logger LOG = Logger.getLogger(MainPanelView.class.getName()); - + } diff --git a/src/main/java/com/tonikelope/megabasterd/Transference.java b/src/main/java/com/tonikelope/megabasterd/Transference.java index 134dfd578..29ee5ae22 100644 --- a/src/main/java/com/tonikelope/megabasterd/Transference.java +++ b/src/main/java/com/tonikelope/megabasterd/Transference.java @@ -18,14 +18,14 @@ import java.util.concurrent.ConcurrentLinkedQueue; public interface Transference { int MIN_WORKERS = 1; - int MAX_WORKERS = 20; + int MAX_WORKERS = 30; int HTTP_PROXY_CONNECT_TIMEOUT = 20000; int HTTP_PROXY_READ_TIMEOUT = 20000; int HTTP_CONNECT_TIMEOUT = 60000; int HTTP_READ_TIMEOUT = 60000; int MAX_SIM_TRANSFERENCES = 50; int SIM_TRANSFERENCES_DEFAULT = 4; - int PROGRESS_WATCHDOG_TIMEOUT = 600; + int PROGRESS_WATCHDOG_TIMEOUT = 300; boolean LIMIT_TRANSFERENCE_SPEED_DEFAULT = false; int MAX_TRANSFERENCE_SPEED_DEFAULT = 5; int MAX_WAIT_WORKERS_SHUTDOWN = 15;