added null-check of base uri,fixed filename comparator

This commit is contained in:
Vologhat
2023-05-05 20:48:39 +03:00
committed by gdlbo
parent c95b4e7f86
commit 683f0346e2
3 changed files with 24 additions and 20 deletions
@@ -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) {