diff --git a/pom.xml b/pom.xml index 585362be2..0f35e2e9c 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 com.tonikelope MegaBasterd - 5.62 + 5.63 jar diff --git a/src/main/java/com/tonikelope/megabasterd/ChunkUploader.java b/src/main/java/com/tonikelope/megabasterd/ChunkUploader.java index 9ebd7f6e7..ee4e2703e 100644 --- a/src/main/java/com/tonikelope/megabasterd/ChunkUploader.java +++ b/src/main/java/com/tonikelope/megabasterd/ChunkUploader.java @@ -106,7 +106,7 @@ public class ChunkUploader implements Runnable, SecureSingleThreadNotifiable { String worker_url = _upload.getUl_url(); - int reads, http_status; + int reads = 0, http_status; long tot_bytes_up; @@ -201,7 +201,7 @@ public class ChunkUploader implements Runnable, SecureSingleThreadNotifiable { Logger.getLogger(getClass().getName()).log(Level.INFO, "{0} Failed : HTTP error code : {1}", new Object[]{Thread.currentThread().getName(), http_status}); - } else if (tot_bytes_up == chunk_size) { + } else if (tot_bytes_up == chunk_size || reads == -1) { String httpresponse; diff --git a/src/main/java/com/tonikelope/megabasterd/MainPanel.java b/src/main/java/com/tonikelope/megabasterd/MainPanel.java index ed753e4bc..54c5056b0 100644 --- a/src/main/java/com/tonikelope/megabasterd/MainPanel.java +++ b/src/main/java/com/tonikelope/megabasterd/MainPanel.java @@ -47,7 +47,7 @@ import javax.swing.UIManager; */ public final class MainPanel { - public static final String VERSION = "5.62"; + public static final String VERSION = "5.63"; 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; diff --git a/src/main/java/com/tonikelope/megabasterd/StreamChunkDownloader.java b/src/main/java/com/tonikelope/megabasterd/StreamChunkDownloader.java index f074c130a..59fe798c3 100644 --- a/src/main/java/com/tonikelope/megabasterd/StreamChunkDownloader.java +++ b/src/main/java/com/tonikelope/megabasterd/StreamChunkDownloader.java @@ -18,13 +18,13 @@ import java.util.logging.Logger; public class StreamChunkDownloader implements Runnable { private final int _id; - private final StreamChunkManager _chunkwriter; + private final StreamChunkManager _chunkmanager; private volatile boolean _exit; private SmartMegaProxyManager _proxy_manager; - public StreamChunkDownloader(int id, StreamChunkManager chunkwriter) { + public StreamChunkDownloader(int id, StreamChunkManager chunkmanager) { _id = id; - _chunkwriter = chunkwriter; + _chunkmanager = chunkmanager; _proxy_manager = null; _exit = false; } @@ -42,15 +42,15 @@ public class StreamChunkDownloader implements Runnable { try { - String url = _chunkwriter.getUrl(); + String url = _chunkmanager.getUrl(); int http_error = 0; - String current_proxy = null; + String current_smart_proxy = null; long offset = -1; - while (!_exit && !_chunkwriter.isExit()) { + while (!_exit && !_chunkmanager.isExit()) { if (MainPanel.isUse_smart_proxy() && _proxy_manager == null) { @@ -58,70 +58,67 @@ public class StreamChunkDownloader implements Runnable { } - while (!_exit && !_chunkwriter.isExit() && _chunkwriter.getChunk_queue().size() >= StreamChunkManager.BUFFER_CHUNKS_SIZE) { + while (!_exit && !_chunkmanager.isExit() && _chunkmanager.getChunk_queue().size() >= StreamChunkManager.BUFFER_CHUNKS_SIZE) { Logger.getLogger(getClass().getName()).log(Level.INFO, "{0} Worker [{1}]: Chunk buffer is full. I pause myself.", new Object[]{Thread.currentThread().getName(), _id}); - _chunkwriter.secureWait(); + _chunkmanager.secureWait(); } if (http_error == 0) { - offset = _chunkwriter.nextOffset(); + offset = _chunkmanager.nextOffset(); } else if (http_error == 403) { - url = _chunkwriter.getUrl(); + url = _chunkmanager.getUrl(); } if (offset >= 0) { - StreamChunk chunk_stream = new StreamChunk(offset, _chunkwriter.calculateChunkSize(offset), url); + StreamChunk chunk_stream = new StreamChunk(offset, _chunkmanager.calculateChunkSize(offset), url); - if (con == null || http_error != 0) { + if (http_error == 509 && MainPanel.isUse_smart_proxy() && !MainPanel.isUse_proxy()) { - if (http_error == 509 && MainPanel.isUse_smart_proxy() && !MainPanel.isUse_proxy()) { + if (current_smart_proxy != null) { - if (http_error != 0 && current_proxy != null) { + _proxy_manager.blockProxy(current_smart_proxy); + } - _proxy_manager.blockProxy(current_proxy); - } + current_smart_proxy = _proxy_manager.getFastestProxy(); - current_proxy = _proxy_manager.getFastestProxy(); + if (current_smart_proxy != null) { - if (current_proxy != null) { + String[] proxy_info = current_smart_proxy.split(":"); - String[] proxy_info = current_proxy.split(":"); + Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxy_info[0], Integer.parseInt(proxy_info[1]))); - Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxy_info[0], Integer.parseInt(proxy_info[1]))); + URL chunk_url = new URL(chunk_stream.getUrl()); - URL chunk_url = new URL(chunk_stream.getUrl()); - - con = (HttpURLConnection) chunk_url.openConnection(proxy); - - } else { - - URL chunk_url = new URL(chunk_stream.getUrl()); - - con = (HttpURLConnection) chunk_url.openConnection(); - } + con = (HttpURLConnection) chunk_url.openConnection(proxy); } else { URL chunk_url = new URL(chunk_stream.getUrl()); - if (MainPanel.isUse_proxy()) { + con = (HttpURLConnection) chunk_url.openConnection(); + } - con = (HttpURLConnection) chunk_url.openConnection(new Proxy(Proxy.Type.HTTP, new InetSocketAddress(MainPanel.getProxy_host(), MainPanel.getProxy_port()))); + } else { - if (MainPanel.getProxy_user() != null && !"".equals(MainPanel.getProxy_user())) { + URL chunk_url = new URL(chunk_stream.getUrl()); - con.setRequestProperty("Proxy-Authorization", "Basic " + MiscTools.Bin2BASE64((MainPanel.getProxy_user() + ":" + MainPanel.getProxy_pass()).getBytes())); - } - } else { + if (MainPanel.isUse_proxy()) { - con = (HttpURLConnection) chunk_url.openConnection(); + con = (HttpURLConnection) chunk_url.openConnection(new Proxy(Proxy.Type.HTTP, new InetSocketAddress(MainPanel.getProxy_host(), MainPanel.getProxy_port()))); + + if (MainPanel.getProxy_user() != null && !"".equals(MainPanel.getProxy_user())) { + + con.setRequestProperty("Proxy-Authorization", "Basic " + MiscTools.Bin2BASE64((MainPanel.getProxy_user() + ":" + MainPanel.getProxy_pass()).getBytes())); } + } else { + + con = (HttpURLConnection) chunk_url.openConnection(); } } @@ -153,25 +150,25 @@ public class StreamChunkDownloader implements Runnable { } else { - InputStream is = con.getInputStream(); + try (InputStream is = con.getInputStream()) { - while (!_exit && !_chunkwriter.isExit() && (reads = is.read(buffer)) != -1) { + int chunk_writes = 0; - chunk_stream.getOutputStream().write(buffer, 0, reads); - } + while (!_exit && !_chunkmanager.isExit() && (reads = is.read(buffer)) != -1) { - is.close(); + chunk_stream.getOutputStream().write(buffer, 0, reads); - if (chunk_stream.getSize() == chunk_stream.getOutputStream().size()) { + chunk_writes += reads; + } - Logger.getLogger(getClass().getName()).log(Level.INFO, "{0} Worker [{1}] has downloaded chunk [{2}]!", new Object[]{Thread.currentThread().getName(), _id, chunk_stream.getOffset()}); + if (chunk_stream.getSize() == chunk_writes) { - _chunkwriter.getChunk_queue().put(chunk_stream.getOffset(), chunk_stream); + Logger.getLogger(getClass().getName()).log(Level.INFO, "{0} Worker [{1}] has downloaded chunk [{2}]!", new Object[]{Thread.currentThread().getName(), _id, chunk_stream.getOffset()}); - _chunkwriter.secureNotifyAll(); - - http_error = 0; + _chunkmanager.getChunk_queue().put(chunk_stream.getOffset(), chunk_stream); + _chunkmanager.secureNotifyAll(); + } } } } @@ -179,10 +176,7 @@ public class StreamChunkDownloader implements Runnable { } catch (IOException ex) { Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex); } finally { - if (con != null) { - con.disconnect(); - con = null; - } + con.disconnect(); } } else { @@ -197,7 +191,7 @@ public class StreamChunkDownloader implements Runnable { Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex); } - _chunkwriter.secureNotifyAll(); + _chunkmanager.secureNotifyAll(); Logger.getLogger(getClass().getName()).log(Level.INFO, "{0} Worker [{1}]: bye bye", new Object[]{Thread.currentThread().getName(), _id}); } diff --git a/src/main/resources/images/mbasterd_screen.png b/src/main/resources/images/mbasterd_screen.png index b6ca35f11..7187f112f 100644 Binary files a/src/main/resources/images/mbasterd_screen.png and b/src/main/resources/images/mbasterd_screen.png differ