From baba2c000955d121dfe8037f11e0caf10970d1d5 Mon Sep 17 00:00:00 2001 From: aliveoutside <53598473+aliveoutside@users.noreply.github.com> Date: Sat, 8 Oct 2022 17:45:29 +0300 Subject: [PATCH] [music] download playlist synchronously --- .../ru/vtosters/lite/music/M3UDownloader.java | 62 ++++++++----------- 1 file changed, 25 insertions(+), 37 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 15e234f72..c05748152 100644 --- a/app/src/main/java/ru/vtosters/lite/music/M3UDownloader.java +++ b/app/src/main/java/ru/vtosters/lite/music/M3UDownloader.java @@ -10,15 +10,15 @@ import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicInteger; import javax.crypto.NoSuchPaddingException; import java8.util.concurrent.CompletableFuture; -import okhttp3.Call; import okhttp3.OkHttpClient; import okhttp3.Request; -import okhttp3.Response; import ru.vtosters.lite.music.converter.ts.FFMpeg; import ru.vtosters.lite.music.converter.ts.TSMerger; import ru.vtosters.lite.music.downloader.ThumbnailDownloader; @@ -28,35 +28,29 @@ import ru.vtosters.lite.utils.IOUtils; public class M3UDownloader implements ITrackDownloader { private static final OkHttpClient client = new OkHttpClient(); + private ExecutorService executorService = Executors.newSingleThreadExecutor(); public static M3UDownloader getInstance() { return Holder.INSTANCE; } public void downloadTrack(MusicTrack track, File outDir, Callback callback, boolean cache) { - var request = new Request.a() - .b(track.D) - .a(); - client.a(request).a(new okhttp3.Callback() { - @Override - public void a(Call call, IOException e) { - callback.onFailure(); - } - - @Override - public void a(Call call, Response response) throws IOException { - parse(response.a().g(), outDir, callback, track, cache); - } - }); + var request = new Request.a().b(track.D).a(); + try { + var response = client.a(request).execute().a().g(); + parse(response, outDir, callback, track, cache); + } catch (IOException e) { + e.printStackTrace(); + callback.onFailure(); + } } private void parse(String payload, File outDir, Callback callback, MusicTrack track, boolean cache) { - if (cache) - try { - ThumbnailDownloader.downloadThumbnails(track); - } catch (IOException e) { - e.printStackTrace(); - } + if (cache) try { + ThumbnailDownloader.downloadThumbnails(track); + } catch (IOException e) { + e.printStackTrace(); + } VKM3UParser parser = new VKM3UParser(payload); List tses = parser.getTransportStreams(); @@ -98,8 +92,7 @@ public class M3UDownloader implements ITrackDownloader { IOUtils.writeToFile(tsDump, content); callback.onProgress(10 + Math.round(80.0f * progress.addAndGet(1) / tses.size())); callback.onSizeReceived((long) content.length * tses.size(), parser.getHeapSize()); - } catch (IOException | NoSuchPaddingException | NoSuchAlgorithmException | - InvalidAlgorithmParameterException | InvalidKeyException e) { + } catch (IOException | NoSuchPaddingException | NoSuchAlgorithmException | InvalidAlgorithmParameterException | InvalidKeyException e) { callback.onFailure(); throw new RuntimeException(e); } @@ -107,19 +100,14 @@ public class M3UDownloader implements ITrackDownloader { } var future = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])); future.exceptionally(throwable -> { - callback.onFailure(); - return null; - }) - .thenApply(v -> TSMerger.merge(tsesDir, resultTs)) - .thenApply(mergeResult -> mergeResult && FFMpeg.convert(resultTs, resultMp3.getAbsolutePath(), track)) - .thenApply(convertResult -> { - if (convertResult) - callback.onProgress(10 + Math.round(80.0f * progress.addAndGet(1) / tses.size())); - else callback.onFailure(); - return convertResult; - }) - .thenRun(() -> IOUtils.deleteRecursive(tsesDir)) - .thenRun(callback::onSuccess); + callback.onFailure(); + return null; + }).thenApply(v -> TSMerger.merge(tsesDir, resultTs)).thenApply(mergeResult -> mergeResult && FFMpeg.convert(resultTs, resultMp3.getAbsolutePath(), track)).thenApply(convertResult -> { + if (convertResult) + callback.onProgress(10 + Math.round(80.0f * progress.addAndGet(1) / tses.size())); + else callback.onFailure(); + return convertResult; + }).thenRun(() -> IOUtils.deleteRecursive(tsesDir)).thenRun(callback::onSuccess); } // Initialization-on-demand