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 c3130cf5d..016840576 100644 --- a/app/src/main/java/ru/vtosters/lite/music/M3UDownloader.java +++ b/app/src/main/java/ru/vtosters/lite/music/M3UDownloader.java @@ -19,7 +19,6 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; -import java.net.URLEncoder; import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; @@ -76,6 +75,7 @@ public class M3UDownloader implements ITrackDownloader { List> futures = new ArrayList<>(parser.mTransportStreams.size()); var filesDir = AndroidUtils.getGlobalContext().getFilesDir(); + var tses=parser.mTransportStreams; var tsesDir = new File(filesDir, String.valueOf(track.d)); tsesDir.mkdirs(); var resultTs = new File(tsesDir, "result.ts"); @@ -84,9 +84,9 @@ public class M3UDownloader implements ITrackDownloader { var resultMp3 = new File(outDir, fileName); callback.onProgress(5); - for (int i = 0; i < parser.mTransportStreams.size(); i++) { - var ts=parser.mTransportStreams.get(i); - var index=i; + for (var i=0;i { try { InputStream is = IOUtils.openStream(ts.getMediaSegmentUri()); @@ -97,10 +97,10 @@ public class M3UDownloader implements ITrackDownloader { } else { content = IOUtils.readFully(is); } - File tsDump = new File(tsesDir,index+".ts"); + File tsDump = new File(tsesDir,filename); IOUtils.writeToFile(tsDump, content); - callback.onProgress(10 + Math.round(80.0f * progress.addAndGet(1) / parser.mTransportStreams.size())); - callback.onSizeReceived((long) content.length * parser.mTransportStreams.size(), parser.mHeapSize); + callback.onProgress(10 + Math.round(80.0f * progress.addAndGet(1) / tses.size())); + callback.onSizeReceived((long) content.length * tses.size(), parser.mHeapSize); } catch (IOException | NoSuchPaddingException | NoSuchAlgorithmException | InvalidAlgorithmParameterException | InvalidKeyException e) { callback.onFailure(); @@ -113,9 +113,11 @@ public class M3UDownloader implements ITrackDownloader { future.exceptionally(throwable -> { callback.onFailure(); return null; - }).thenApply(v -> TSMerger.merge(tsesDir, resultTs)).thenApply(mergeResult -> mergeResult && FFMpeg.convert(resultTs, resultMp3.getAbsolutePath(), track)).thenApply(convertResult -> { + }).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) / parser.mTransportStreams.size())); + callback.onProgress(10 + Math.round(80.0f * progress.addAndGet(1) / tses.size())); else callback.onFailure(); return convertResult; }).thenRun(() -> IOUtils.deleteRecursive(tsesDir)).thenRun(() -> { 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 8393c86eb..9db34884f 100644 --- a/app/src/main/java/ru/vtosters/lite/music/VKM3UParser.java +++ b/app/src/main/java/ru/vtosters/lite/music/VKM3UParser.java @@ -59,13 +59,12 @@ public class VKM3UParser { } public static boolean isTS(String str) { - return str.endsWith(".ts") || str.endsWith(".tp") || str.endsWith(".mpeg-ts") || str.endsWith(".m2ts"); + return str.endsWith(".ts")||str.endsWith(".tp")||str.endsWith(".mpeg-ts")||str.endsWith(".m2ts"); } private void init() { if(TextUtils.isEmpty(mData))throw new NullPointerException("mData==null"); - Log.e("Parser",mData); final var scanner=new Scanner(mData); var line=scanner.nextLine(); if(!"#EXTM3U".equals(line))throw new IllegalStateException(String.format("Unknown initial M3U tag: %s",line)); @@ -106,12 +105,12 @@ public class VKM3UParser { else if(line.startsWith("#EXT-X-KEY:")) { var substr=line.substring(11); - if((aes128 = substr.startsWith("METHOD=AES-128"))) + if((aes128=substr.startsWith("METHOD=AES-128"))) { substr=substr.substring(20,substr.length()-1); if(!substr.startsWith("http"))throw new IllegalStateException(String.format("Failed to parse URI: %s",substr)); keyUri=substr; - baseUri=substr.substring(0,substr.lastIndexOf("/")+1); + baseUri=substr.substring(0,substr.lastIndexOf('/')+1); } } else if(line.startsWith("#EXTINF")) @@ -119,15 +118,15 @@ public class VKM3UParser { } else if(extinf&&isTS(line)) { - var ts=aes128 + final var ts=aes128 ?new TransportStream(keyUri,baseUri,line) :new TransportStream(baseUri,line); mTransportStreams.add(ts); - + aes128=extinf=false; } else throw new RuntimeException(String.format("Failed to parse: %s",line)); mHeapSize+=line.getBytes().length; } - for(var ts:mTransportStreams)Log.e("Parser",String.format("Added segment:\n method: %s,\n key_uri: %s,\n segment_uri: %s", ts.needDecoding(),ts.getKeyURL(),ts.getMediaSegmentUri())); + if(baseUri.isEmpty())throw new NullPointerException("baseUri==null"); } } diff --git a/app/src/main/java/ru/vtosters/lite/music/converter/ts/TSMerger.java b/app/src/main/java/ru/vtosters/lite/music/converter/ts/TSMerger.java index 1bac714f9..a05b8d2a5 100644 --- a/app/src/main/java/ru/vtosters/lite/music/converter/ts/TSMerger.java +++ b/app/src/main/java/ru/vtosters/lite/music/converter/ts/TSMerger.java @@ -26,10 +26,13 @@ public class TSMerger { var mergedByteArrayStream = new ByteArrayOutputStream(); - Arrays.sort(tsesList, (o1, o2) -> { - var index1 = Integer.parseInt(o1.getName().split("-")[1]); - var index2 = Integer.parseInt(o2.getName().split("-")[1]); - return index1 - index2; + //0.ts,1.ts,... + Arrays.sort(tsesList, (ts1,ts2) -> { + final var ts1Name=ts1.getName(); + final var ts2Name=ts2.getName(); + final var i1=Integer.parseInt(ts1Name.substring(0,ts1Name.indexOf('.',1))); + final var i2=Integer.parseInt(ts2Name.substring(0,ts2Name.indexOf('.',1))); + return Integer.compare(i1,i2); }); for (var file : tsesList) {