added null-check of base uri,fixed filename comparator
This commit is contained in:
@@ -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<CompletableFuture<Void>> 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<tses.size();++i) {
|
||||
final var ts=tses.get(i);
|
||||
final var filename=i+".ts";
|
||||
futures.add(CompletableFuture.runAsync(() -> {
|
||||
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(() -> {
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user