diff --git a/app/src/main/java/ru/vtosters/lite/downloaders/AudioDownloader.java b/app/src/main/java/ru/vtosters/lite/downloaders/AudioDownloader.java index 2e6b92e8e..5a34e2fe9 100644 --- a/app/src/main/java/ru/vtosters/lite/downloaders/AudioDownloader.java +++ b/app/src/main/java/ru/vtosters/lite/downloaders/AudioDownloader.java @@ -1,6 +1,8 @@ package ru.vtosters.lite.downloaders; import android.os.Environment; +import android.os.Handler; +import android.os.Looper; import android.provider.MediaStore; import android.util.Log; import android.widget.Toast; @@ -20,7 +22,7 @@ public class AudioDownloader { return; } Log.v("VTosters Lite", "Downloading audio " + track.D); - downloadAudioAsync(track, Environment.DIRECTORY_MUSIC + File.pathSeparator + "test", new Callback() { + downloadAudioAsync(track, Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC) + "/test", new Callback() { @Override public void onProgress(int progress) { ToastUtils.a("Загружено " + progress + "%"); @@ -44,7 +46,8 @@ public class AudioDownloader { } private static void downloadAudioAsync(MusicTrack track, String path, Callback callback) { - var destTs = path + ".ts"; - new M3UDownloader(track.D, new File(destTs), callback).execute(); + File outDir = new File(path); + if (!outDir.exists()) outDir.mkdirs(); + new M3UDownloader(track.D, outDir, callback).execute(); } } 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 ee9cb5c0d..e9cdca9cf 100644 --- a/app/src/main/java/ru/vtosters/lite/music/M3UDownloader.java +++ b/app/src/main/java/ru/vtosters/lite/music/M3UDownloader.java @@ -1,5 +1,6 @@ package ru.vtosters.lite.music; +import android.os.StrictMode; import android.util.Log; import java.io.File; @@ -12,9 +13,16 @@ import java.util.List; import javax.crypto.NoSuchPaddingException; +import okhttp3.Call; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; import ru.vtosters.lite.utils.StreamUtils; -public class M3UDownloader{ +public class M3UDownloader { + + private OkHttpClient mClient = new OkHttpClient(); + private VKM3UParser mParser; private final String mURL; private final File mOutDir; @@ -27,26 +35,44 @@ public class M3UDownloader{ } public void execute() { - VKM3UParser parser = new VKM3UParser(mURL); - List tses = parser.getTransportStreams(); - mCallback.onProgress(5); - for(TransportStream ts : tses) { - String tsURL = parser.getBaseUrl() + ts.getName(); - Log.d("M3UDownloader", "Downloading " + tsURL); - try { + var request = new Request.a() + .b(mURL) + .a(); + mClient.a(request).a(new okhttp3.Callback() { + @Override + public void a(Call call, IOException e) { + + } + + @Override + public void a(Call call, Response response) throws IOException { + parse(response.a().g()); + } + }); + } + + private void parse(String payload) { + try { + VKM3UParser parser = new VKM3UParser(payload); + List tses = parser.getTransportStreams(); + mCallback.onProgress(5); + for (TransportStream ts : tses) { + String tsURL = parser.getBaseUrl() + ts.getName(); + Log.d("M3UDownloader", "Downloading " + tsURL); InputStream is = StreamUtils.openStream(tsURL); + String key = StreamUtils.readAllLines(StreamUtils.openStream(ts.getKeyURL())); byte[] content = TransportStream.METHOD_AES128.equals(ts.getMethod()) - ? StreamUtils.decodeStream(is, ts.getKeyURL()) + ? StreamUtils.decodeStream(is, key) : StreamUtils.readAllBytes(is); File tsDump = new File(mOutDir, ts.getName()); StreamUtils.writeToFile(tsDump, content); mCallback.onSizeReceived((long) content.length * tses.size(), parser.getHeapSize()); mCallback.onProgress(10 + Math.round(80.0f * tses.indexOf(ts) / tses.size())); - } catch (IOException | NoSuchPaddingException | NoSuchAlgorithmException | InvalidAlgorithmParameterException | InvalidKeyException e) { - e.printStackTrace(); - mCallback.onFailure(); - return; } + } catch (IOException | NoSuchPaddingException | NoSuchAlgorithmException | InvalidAlgorithmParameterException | InvalidKeyException e) { + e.printStackTrace(); + mCallback.onFailure(); + return; } mCallback.onSuccess(); } diff --git a/app/src/main/java/ru/vtosters/lite/music/VKM3UParser.java b/app/src/main/java/ru/vtosters/lite/music/VKM3UParser.java index 2857da95b..599295530 100644 --- a/app/src/main/java/ru/vtosters/lite/music/VKM3UParser.java +++ b/app/src/main/java/ru/vtosters/lite/music/VKM3UParser.java @@ -1,5 +1,7 @@ package ru.vtosters.lite.music; +import android.util.Log; + import java.util.ArrayList; import java.util.List; import java.util.Scanner; diff --git a/app/src/main/java/ru/vtosters/lite/utils/StreamUtils.java b/app/src/main/java/ru/vtosters/lite/utils/StreamUtils.java index 5187c3377..62fa7e379 100644 --- a/app/src/main/java/ru/vtosters/lite/utils/StreamUtils.java +++ b/app/src/main/java/ru/vtosters/lite/utils/StreamUtils.java @@ -28,10 +28,9 @@ public class StreamUtils { return readAllBytes(cip); } - public static Cipher getCipher(String keyURL) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidAlgorithmParameterException, InvalidKeyException, IOException { - String key = new String(readAllBytes(openStream(keyURL))); + public static Cipher getCipher(String key) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidAlgorithmParameterException, InvalidKeyException, IOException { Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); - Key keySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "AES"); + Key keySpec = new SecretKeySpec(key.getBytes(), "AES"); // bypassing ecb byte[] iv = new byte[16]; Arrays.fill(iv, (byte) 0x0); @@ -59,6 +58,7 @@ public class StreamUtils { } public static void writeToFile(File file, byte[] content) throws IOException { + if (!file.exists()) file.createNewFile(); FileOutputStream fos = new FileOutputStream(file); fos.write(content); }