diff --git a/pom.xml b/pom.xml index fac3e3124..7496c64c5 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 com.tonikelope MegaBasterd - 7.41 + 7.42 jar diff --git a/src/main/java/com/tonikelope/megabasterd/Download.java b/src/main/java/com/tonikelope/megabasterd/Download.java index 167dc50eb..892fff91d 100644 --- a/src/main/java/com/tonikelope/megabasterd/Download.java +++ b/src/main/java/com/tonikelope/megabasterd/Download.java @@ -554,258 +554,281 @@ public class Download implements Transference, Runnable, SecureSingleThreadNotif path.mkdirs(); } - if (_file.exists()) { - _file_name = _file_name.replaceFirst("\\..*$", "_" + MiscTools.genID(8) + "_$0"); - - filename = _download_path + "/" + _file_name; - - _file = new File(filename); - } - - getView().printStatusNormal("Starting download (retrieving MEGA temp link), please wait..."); - - _last_download_url = getMegaFileDownloadUrl(_url); - - if (!_exit) { - - String temp_filename = (getCustom_chunks_dir() != null ? getCustom_chunks_dir() : _download_path) + "/" + _file_name + ".mctemp"; - - _file = new File(temp_filename); - - if (_file.getParent() != null) { - File path = new File(_file.getParent()); - - path.mkdirs(); - } + if (!_file.exists() || _file.length() != _file_size) { if (_file.exists()) { - getView().printStatusNormal("File exists, resuming download..."); + _file_name = _file_name.replaceFirst("\\..*$", "_" + MiscTools.genID(8) + "_$0"); - long max_size = calculateMaxTempFileSize(_file.length()); + filename = _download_path + "/" + _file_name; - if (max_size != _file.length()) { - - LOG.log(Level.INFO, "{0} Downloader truncating mctemp file {1} -> {2} ", new Object[]{Thread.currentThread().getName(), _file.length(), max_size}); - - getView().printStatusNormal("Truncating temp file..."); - - try (FileChannel out_truncate = new FileOutputStream(temp_filename, true).getChannel()) { - out_truncate.truncate(max_size); - } - } - - setProgress(_file.length()); - - _last_chunk_id_dispatched = calculateLastWrittenChunk(_progress); - - } else { - setProgress(0); + _file = new File(filename); } - _output_stream = new BufferedOutputStream(new FileOutputStream(_file, (_progress > 0))); + getView().printStatusNormal("Starting download (retrieving MEGA temp link), please wait..."); - _thread_pool.execute(getProgress_meter()); + _last_download_url = getMegaFileDownloadUrl(_url); - getMain_panel().getGlobal_dl_speed().attachTransference(this); + if (!_exit) { - synchronized (_workers_lock) { + String temp_filename = (getCustom_chunks_dir() != null ? getCustom_chunks_dir() : _download_path) + "/" + _file_name + ".mctemp"; - if (_use_slots) { + _file = new File(temp_filename); - _chunkmanager = new ChunkWriterManager(this); + if (_file.getParent() != null) { + File path = new File(_file.getParent()); - _thread_pool.execute(_chunkmanager); + path.mkdirs(); + } - _slots = getMain_panel().getDefault_slots_down(); + if (_file.exists()) { + getView().printStatusNormal("File exists, resuming download..."); - _view.getSlots_spinner().setValue(_slots); + long max_size = calculateMaxTempFileSize(_file.length()); - for (int t = 1; t <= _slots; t++) { - ChunkDownloader c = new ChunkDownloader(t, this); + if (max_size != _file.length()) { + + LOG.log(Level.INFO, "{0} Downloader truncating mctemp file {1} -> {2} ", new Object[]{Thread.currentThread().getName(), _file.length(), max_size}); + + getView().printStatusNormal("Truncating temp file..."); + + try (FileChannel out_truncate = new FileOutputStream(temp_filename, true).getChannel()) { + out_truncate.truncate(max_size); + } + } + + setProgress(_file.length()); + + _last_chunk_id_dispatched = calculateLastWrittenChunk(_progress); + + } else { + setProgress(0); + } + + _output_stream = new BufferedOutputStream(new FileOutputStream(_file, (_progress > 0))); + + _thread_pool.execute(getProgress_meter()); + + getMain_panel().getGlobal_dl_speed().attachTransference(this); + + synchronized (_workers_lock) { + + if (_use_slots) { + + _chunkmanager = new ChunkWriterManager(this); + + _thread_pool.execute(_chunkmanager); + + _slots = getMain_panel().getDefault_slots_down(); + + _view.getSlots_spinner().setValue(_slots); + + for (int t = 1; t <= _slots; t++) { + ChunkDownloader c = new ChunkDownloader(t, this); + + _chunkworkers.add(c); + + _thread_pool.execute(c); + } + + MiscTools.GUIRun(() -> { + for (JComponent c : new JComponent[]{getView().getSlots_label(), getView().getSlots_spinner(), getView().getSlot_status_label()}) { + + c.setVisible(true); + } + }); + + } else { + + ChunkDownloaderMono c = new ChunkDownloaderMono(this); _chunkworkers.add(c); _thread_pool.execute(c); + + MiscTools.GUIRun(() -> { + for (JComponent c1 : new JComponent[]{getView().getSlots_label(), getView().getSlots_spinner(), getView().getSlot_status_label()}) { + c1.setVisible(false); + } + }); } - - MiscTools.GUIRun(() -> { - for (JComponent c : new JComponent[]{getView().getSlots_label(), getView().getSlots_spinner(), getView().getSlot_status_label()}) { - - c.setVisible(true); - } - }); - - } else { - - ChunkDownloaderMono c = new ChunkDownloaderMono(this); - - _chunkworkers.add(c); - - _thread_pool.execute(c); - - MiscTools.GUIRun(() -> { - for (JComponent c1 : new JComponent[]{getView().getSlots_label(), getView().getSlots_spinner(), getView().getSlot_status_label()}) { - c1.setVisible(false); - } - }); } - } - getView().printStatusNormal(LabelTranslatorSingleton.getInstance().translate("Downloading file from mega ") + (_ma.getFull_email() != null ? "(" + _ma.getFull_email() + ")" : "") + " ..."); + getView().printStatusNormal(LabelTranslatorSingleton.getInstance().translate("Downloading file from mega ") + (_ma.getFull_email() != null ? "(" + _ma.getFull_email() + ")" : "") + " ..."); - MiscTools.GUIRun(() -> { - for (JComponent c : new JComponent[]{getView().getPause_button(), getView().getProgress_pbar()}) { + MiscTools.GUIRun(() -> { + for (JComponent c : new JComponent[]{getView().getPause_button(), getView().getProgress_pbar()}) { - c.setVisible(true); - } - }); + c.setVisible(true); + } + }); - THREAD_POOL.execute(() -> { + THREAD_POOL.execute(() -> { - //PROGRESS WATCHDOG If a download remains more than PROGRESS_WATCHDOG_TIMEOUT seconds without receiving data, we force fatal error in order to restart it. - LOG.log(Level.INFO, "{0} PROGRESS WATCHDOG HELLO!", Thread.currentThread().getName()); + //PROGRESS WATCHDOG If a download remains more than PROGRESS_WATCHDOG_TIMEOUT seconds without receiving data, we force fatal error in order to restart it. + LOG.log(Level.INFO, "{0} PROGRESS WATCHDOG HELLO!", Thread.currentThread().getName()); - long last_progress, progress = getProgress(); + long last_progress, progress = getProgress(); - do { - last_progress = progress; + do { + last_progress = progress; - synchronized (_progress_watchdog_lock) { - try { - _progress_watchdog_lock.wait(PROGRESS_WATCHDOG_TIMEOUT * 1000); - progress = getProgress(); - } catch (InterruptedException ex) { - progress = -1; - Logger.getLogger(Download.class.getName()).log(Level.SEVERE, null, ex); + synchronized (_progress_watchdog_lock) { + try { + _progress_watchdog_lock.wait(PROGRESS_WATCHDOG_TIMEOUT * 1000); + progress = getProgress(); + } catch (InterruptedException ex) { + progress = -1; + Logger.getLogger(Download.class.getName()).log(Level.SEVERE, null, ex); + } + } + + } while (!isExit() && !_thread_pool.isShutdown() && progress < getFile_size() && (isPaused() || progress > last_progress)); + + if (!isExit() && !_thread_pool.isShutdown() && _status_error == null && progress < getFile_size() && progress <= last_progress) { + stopDownloader("PROGRESS WATCHDOG TIMEOUT!"); + + if (MainPanel.getProxy_manager() != null) { + MainPanel.getProxy_manager().refreshProxyList(); //Force SmartProxy proxy list refresh } } - } while (!isExit() && !_thread_pool.isShutdown() && progress < getFile_size() && (isPaused() || progress > last_progress)); + LOG.log(Level.INFO, "{0} PROGRESS WATCHDOG BYE BYE!", Thread.currentThread().getName()); - if (!isExit() && !_thread_pool.isShutdown() && _status_error == null && progress < getFile_size() && progress <= last_progress) { - stopDownloader("PROGRESS WATCHDOG TIMEOUT!"); + }); - if (MainPanel.getProxy_manager() != null) { - MainPanel.getProxy_manager().refreshProxyList(); //Force SmartProxy proxy list refresh + secureWait(); + + LOG.log(Level.INFO, "{0} Chunkdownloaders finished!", Thread.currentThread().getName()); + + getProgress_meter().setExit(true); + + getProgress_meter().secureNotify(); + + try { + + _thread_pool.shutdown(); + + LOG.log(Level.INFO, "{0} Waiting all threads to finish...", Thread.currentThread().getName()); + + _thread_pool.awaitTermination(MAX_WAIT_WORKERS_SHUTDOWN, TimeUnit.SECONDS); + + } catch (InterruptedException ex) { + LOG.log(Level.SEVERE, ex.getMessage()); + } + + if (!_thread_pool.isTerminated()) { + + LOG.log(Level.INFO, "{0} Closing thread pool ''mecag\u00fcen'' style...", Thread.currentThread().getName()); + + _thread_pool.shutdownNow(); + } + + LOG.log(Level.INFO, "{0} Downloader thread pool finished!", Thread.currentThread().getName()); + + getMain_panel().getGlobal_dl_speed().detachTransference(this); + + _output_stream.close(); + + MiscTools.GUIRun(() -> { + for (JComponent c : new JComponent[]{getView().getSpeed_label(), getView().getPause_button(), getView().getStop_button(), getView().getSlots_label(), getView().getSlots_spinner(), getView().getKeep_temp_checkbox()}) { + + c.setVisible(false); } - } + }); - LOG.log(Level.INFO, "{0} PROGRESS WATCHDOG BYE BYE!", Thread.currentThread().getName()); + if (_progress == _file_size) { - }); + if (_file.length() != _file_size) { - secureWait(); - - LOG.log(Level.INFO, "{0} Chunkdownloaders finished!", Thread.currentThread().getName()); - - getProgress_meter().setExit(true); - - getProgress_meter().secureNotify(); - - try { - - _thread_pool.shutdown(); - - LOG.log(Level.INFO, "{0} Waiting all threads to finish...", Thread.currentThread().getName()); - - _thread_pool.awaitTermination(MAX_WAIT_WORKERS_SHUTDOWN, TimeUnit.SECONDS); - - } catch (InterruptedException ex) { - LOG.log(Level.SEVERE, ex.getMessage()); - } - - if (!_thread_pool.isTerminated()) { - - LOG.log(Level.INFO, "{0} Closing thread pool ''mecag\u00fcen'' style...", Thread.currentThread().getName()); - - _thread_pool.shutdownNow(); - } - - LOG.log(Level.INFO, "{0} Downloader thread pool finished!", Thread.currentThread().getName()); - - getMain_panel().getGlobal_dl_speed().detachTransference(this); - - _output_stream.close(); - - MiscTools.GUIRun(() -> { - for (JComponent c : new JComponent[]{getView().getSpeed_label(), getView().getPause_button(), getView().getStop_button(), getView().getSlots_label(), getView().getSlots_spinner(), getView().getKeep_temp_checkbox()}) { - - c.setVisible(false); - } - }); - - if (_progress == _file_size) { - - if (_file.length() != _file_size) { - - throw new IOException("El tamaño del fichero es incorrecto!"); - } - - Files.move(Paths.get(_file.getAbsolutePath()), Paths.get(filename), StandardCopyOption.REPLACE_EXISTING); - - if (_custom_chunks_dir != null) { - - File temp_parent_download_dir = new File(temp_filename).getParentFile(); - - while (!temp_parent_download_dir.getAbsolutePath().equals(_custom_chunks_dir) && temp_parent_download_dir.listFiles().length == 0) { - temp_parent_download_dir.delete(); - temp_parent_download_dir = temp_parent_download_dir.getParentFile(); + throw new IOException("El tamaño del fichero es incorrecto!"); } - } + Files.move(Paths.get(_file.getAbsolutePath()), Paths.get(filename), StandardCopyOption.REPLACE_EXISTING); - String verify_file = selectSettingValue("verify_down_file"); + if (_custom_chunks_dir != null) { - if (verify_file != null && verify_file.equals("yes")) { - _checking_cbc = true; + File temp_parent_download_dir = new File(temp_filename).getParentFile(); - getView().printStatusNormal("Waiting to check file integrity..."); + while (!temp_parent_download_dir.getAbsolutePath().equals(_custom_chunks_dir) && temp_parent_download_dir.listFiles().length == 0) { + temp_parent_download_dir.delete(); + temp_parent_download_dir = temp_parent_download_dir.getParentFile(); + } - setProgress(0); + } - getView().printStatusNormal("Checking file integrity, please wait..."); + String verify_file = selectSettingValue("verify_down_file"); - MiscTools.GUIRun(() -> { - getView().getStop_button().setVisible(true); + if (verify_file != null && verify_file.equals("yes")) { + _checking_cbc = true; - getView().getStop_button().setText(LabelTranslatorSingleton.getInstance().translate("CANCEL CHECK")); - }); + getView().printStatusNormal("Waiting to check file integrity..."); - getMain_panel().getDownload_manager().getTransference_running_list().remove(this); + setProgress(0); - getMain_panel().getDownload_manager().secureNotify(); + getView().printStatusNormal("Checking file integrity, please wait..."); - if (verifyFileCBCMAC(filename)) { + MiscTools.GUIRun(() -> { + getView().getStop_button().setVisible(true); - getView().printStatusOK("File successfully downloaded! (Integrity check PASSED)"); + getView().getStop_button().setText(LabelTranslatorSingleton.getInstance().translate("CANCEL CHECK")); + }); - } else if (!_exit) { + getMain_panel().getDownload_manager().getTransference_running_list().remove(this); - _status_error = "BAD NEWS :( File is DAMAGED!"; + getMain_panel().getDownload_manager().secureNotify(); - getView().printStatusError(_status_error); + if (verifyFileCBCMAC(filename)) { + + getView().printStatusOK("File successfully downloaded! (Integrity check PASSED)"); + + } else if (!_exit) { + + _status_error = "BAD NEWS :( File is DAMAGED!"; + + getView().printStatusError(_status_error); + + } else { + + getView().printStatusOK("File successfully downloaded! (but integrity check CANCELED)"); + + } + + MiscTools.GUIRun(() -> { + getView().getStop_button().setVisible(false); + }); } else { - getView().printStatusOK("File successfully downloaded! (but integrity check CANCELED)"); + getView().printStatusOK("File successfully downloaded!"); } - MiscTools.GUIRun(() -> { - getView().getStop_button().setVisible(false); - }); + } else if (_status_error != null) { + + getView().hideAllExceptStatus(); + + getView().printStatusError(_status_error); + + } else if (_canceled) { + + getView().hideAllExceptStatus(); + + getView().printStatusNormal("Download CANCELED!"); } else { - getView().printStatusOK("File successfully downloaded!"); + getView().hideAllExceptStatus(); + _status_error = "UNEXPECTED ERROR!"; + + getView().printStatusError(_status_error); } } else if (_status_error != null) { getView().hideAllExceptStatus(); - getView().printStatusError(_status_error); + getView().printStatusError(_status_error != null ? _status_error : "ERROR"); } else if (_canceled) { @@ -822,23 +845,12 @@ public class Download implements Transference, Runnable, SecureSingleThreadNotif getView().printStatusError(_status_error); } - } else if (_status_error != null) { - - getView().hideAllExceptStatus(); - - getView().printStatusError(_status_error != null ? _status_error : "ERROR"); - - } else if (_canceled) { - - getView().hideAllExceptStatus(); - - getView().printStatusNormal("Download CANCELED!"); - } else { - getView().hideAllExceptStatus(); - _status_error = "UNEXPECTED ERROR!"; + _status_error = "FILE WITH SAME NAME AND SIZE ALREADY EXISTS"; + + _auto_retry_on_error = false; getView().printStatusError(_status_error); } @@ -995,7 +1007,7 @@ public class Download implements Transference, Runnable, SecureSingleThreadNotif File file = new File(filename); - if (file.exists()) { + if (file.exists() && file.length() != _file_size) { _file_name = _file_name.replaceFirst("\\..*$", "_" + MiscTools.genID(8) + "_$0"); } @@ -1019,7 +1031,7 @@ public class Download implements Transference, Runnable, SecureSingleThreadNotif File temp_file = new File(filename + ".mctemp"); - if (file.exists() && !temp_file.exists()) { + if (file.exists() && !temp_file.exists() && file.length() != _file_size) { _file_name = _file_name.replaceFirst("\\..*$", "_" + MiscTools.genID(8) + "_$0"); } diff --git a/src/main/java/com/tonikelope/megabasterd/LabelTranslatorSingleton.java b/src/main/java/com/tonikelope/megabasterd/LabelTranslatorSingleton.java index 24b5080ff..784e6c557 100644 --- a/src/main/java/com/tonikelope/megabasterd/LabelTranslatorSingleton.java +++ b/src/main/java/com/tonikelope/megabasterd/LabelTranslatorSingleton.java @@ -37,7 +37,8 @@ public class LabelTranslatorSingleton { } private void Spanish() { - + + _addTranslation("FILE WITH SAME NAME AND SIZE ALREADY EXISTS", "YA EXISTE UN FICHERO CON EL MISMO NOMBRE Y TAMAÑO"); _addTranslation("WARNING: USING MEGA API WITHOUT API KEY MAY VIOLATE ITS TERM OF USE. YOU SHOULD GET A KEY -> https://mega.nz/sdk", "AVISO: USAR LA API DE MEGA SIN UNA API KEY PUEDE VIOLAR SUS TÉRMINOS DE USO. DEBES CONSEGUIR UNA API KEY -> https://mega.nz/sdk"); _addTranslation("WARNING: USING MEGA API WITHOUT API KEY MAY VIOLATE ITS TERM OF USE.\n\nYOU SHOULD GET A KEY -> https://mega.nz/sdk (and set it in MegaBasterd ADVANCED SETTINGS).\n\nCREATE API KEY NOW?", "AVISO: USAR LA API DE MEGA SIN UNA API KEY PUEDE VIOLAR SUS TÉRMINOS DE USO.\n\nDEBES CONSEGUIR UNA API KEY -> https://mega.nz/sdk (e introducirla en AJUSTES AVANZADOS de MegaBasterd).\n\n¿CREAR AHORA UNA API KEY?"); _addTranslation("WARNING: Using proxies or VPN to bypass MEGA's daily download limitation may violate its Terms of Use. USE THIS OPTION AT YOUR OWN RISK.", "AVISO: El uso de proxies o VPN para saltar el límite diario de descarga de MEGA podría violar sus Términos de Uso. UTILIZA ESTA OPCIÓN BAJO TU RESPONSABILIDAD."); diff --git a/src/main/java/com/tonikelope/megabasterd/MainPanel.java b/src/main/java/com/tonikelope/megabasterd/MainPanel.java index 598f16d2a..bdde4f509 100644 --- a/src/main/java/com/tonikelope/megabasterd/MainPanel.java +++ b/src/main/java/com/tonikelope/megabasterd/MainPanel.java @@ -60,7 +60,7 @@ import javax.swing.UIManager; */ public final class MainPanel { - public static final String VERSION = "7.41"; + public static final String VERSION = "7.42"; 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;