From 7bb0d69a96b0f163a01a27e56269b793ca1b4953 Mon Sep 17 00:00:00 2001 From: aliveoutside <53598473+aliveoutside@users.noreply.github.com> Date: Thu, 15 Sep 2022 23:43:42 +0300 Subject: [PATCH] parallel .ts downloading --- .../ru/vtosters/lite/music/M3UDownloader.java | 60 +++++++++++-------- 1 file changed, 35 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/ru/vtosters/lite/music/M3UDownloader.java b/app/src/main/java/ru/vtosters/lite/music/M3UDownloader.java index 31a5bb4ac..00f4abc6a 100644 --- a/app/src/main/java/ru/vtosters/lite/music/M3UDownloader.java +++ b/app/src/main/java/ru/vtosters/lite/music/M3UDownloader.java @@ -1,17 +1,18 @@ package ru.vtosters.lite.music; -import android.util.Log; - import java.io.File; import java.io.IOException; import java.io.InputStream; import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; +import java.util.ArrayList; import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; import javax.crypto.NoSuchPaddingException; +import java8.util.concurrent.CompletableFuture; import okhttp3.Call; import okhttp3.OkHttpClient; import okhttp3.Request; @@ -40,31 +41,40 @@ public class M3UDownloader { } private static void parse(String payload, File outDir, Callback callback) { - try { - VKM3UParser parser = new VKM3UParser(payload); - List tses = parser.getTransportStreams(); - callback.onProgress(5); - for (TransportStream ts : tses) { - String tsURL = parser.getBaseUrl() + ts.getName(); - Log.d("M3UDownloader", "Downloading " + tsURL); - InputStream is = IOUtils.openStream(tsURL); - byte[] content; - if (TransportStream.METHOD_AES128.equals(ts.getMethod())) { - String key = IOUtils.readAllLines(IOUtils.openStream(ts.getKeyURL())); - content = IOUtils.decodeStream(is, key); - } else { - content = IOUtils.readAllBytes(is); + VKM3UParser parser = new VKM3UParser(payload); + List tses = parser.getTransportStreams(); + AtomicInteger progress = new AtomicInteger(0); + List> futures = new ArrayList<>(); + + callback.onProgress(5); + for (TransportStream ts : tses) { + String tsURL = parser.getBaseUrl() + ts.getName(); + + futures.add(CompletableFuture.runAsync(() -> { + try { + // Log.d("M3UDownloader", "Downloading " + tsURL); + InputStream is = IOUtils.openStream(tsURL); + byte[] content; + if (TransportStream.METHOD_AES128.equals(ts.getMethod())) { + String key = IOUtils.readAllLines(IOUtils.openStream(ts.getKeyURL())); + content = IOUtils.decodeStream(is, key); + } else { + content = IOUtils.readAllBytes(is); + } + File tsDump = new File(outDir, ts.getName()); + IOUtils.writeToFile(tsDump, content); + callback.onSizeReceived((long) content.length * tses.size(), parser.getHeapSize()); + } catch (IOException | NoSuchPaddingException | NoSuchAlgorithmException | InvalidAlgorithmParameterException | InvalidKeyException e) { + e.printStackTrace(); + callback.onFailure(); } - File tsDump = new File(outDir, ts.getName()); - IOUtils.writeToFile(tsDump, content); - callback.onSizeReceived((long) content.length * tses.size(), parser.getHeapSize()); - callback.onProgress(10 + Math.round(80.0f * tses.indexOf(ts) / tses.size())); - } - } catch (IOException | NoSuchPaddingException | NoSuchAlgorithmException | InvalidAlgorithmParameterException | InvalidKeyException e) { - e.printStackTrace(); - callback.onFailure(); - return; + }).thenRun(() -> callback.onProgress(10 + Math.round(80.0f * progress.addAndGet(1) / tses.size())))); } + // wait for all futures + for (var future: futures) { + future.join(); + } + callback.onSuccess(); } }