import java.io.*;
import java.net.*;
import java.nio.channels.*;
import java.security.spec.*;
import java.util.*;
import javax.crypto.*;
import javax.crypto.spec.*;
public class Main
{
public static void main(String[] args)
{
try{
System.out.println("输入.m3u8结尾的下载链接");
Scanner scanner=new Scanner(System.in);
String string=scanner.nextLine();
System.out.println("输入保存的路径,以\"/\"结尾");
String path=scanner.nextLine();
System.out.println("输入文件名,不要加后缀");
String temp_name=scanner.nextLine();
String name=temp_name;
File file=new File(path+name);
int i=1;//防止路径下的文件名重复
while(file.exists()){
i++;
name=temp_name+"-"+i;
file=new File(path+name);
}
file.mkdirs();
file=new File(path+name+"/未解密片段/");
file.mkdir();
file=new File(path+name+"/片段/");
file.mkdir();
String key=null;
i=0;//i置0,在for循环中自增,用于命名ts片段
System.out.println("下载中,离开此界面将中断");
boolean b=true;
while(b){
b= false;
URL url=new URL(string);
HttpURLConnection httpURLConnection=(HttpURLConnection)url.openConnection();
InputStream inputStream=httpURLConnection.getInputStream();
InputStreamReader inputStreamReader=new InputStreamReader(inputStream,"UTF-8");
BufferedReader bufferedReader=new BufferedReader(inputStreamReader);
for(String line=bufferedReader.readLine();line!=null;line=bufferedReader.readLine()){
if(line.endsWith(".ts")){
if(i>2){break;}
if(line.startsWith("http")){
}else if(line.startsWith("/")){
line.substring(0,string.indexOf("/",10));
}else{
line=string.substring(0,string.lastIndexOf("/")+1)+line;
}
if(key==null){
inputStream=new URL(line).openStream();
ReadableByteChannel readableByteChannel = Channels.newChannel(inputStream);
FileOutputStream fileOutputStream=new FileOutputStream(path+name+"/片段/"+i);
fileOutputStream.getChannel().transferFrom(readableByteChannel, 0, Long.MAX_VALUE);
readableByteChannel.close();
fileOutputStream.close();
fileOutputStream.getChannel().close();
inputStream.close();
}else{
inputStream=new URL(line).openStream();
ReadableByteChannel readableByteChannel = Channels.newChannel(inputStream);
FileOutputStream fileOutputStream=new FileOutputStream(path+name+"/未解密片段/"+i);
fileOutputStream.getChannel().transferFrom(readableByteChannel, 0, Long.MAX_VALUE);
readableByteChannel.close();
fileOutputStream.close();
fileOutputStream.getChannel().close();
inputStream.close();
FileInputStream input = new FileInputStream(path+name+"/未解密片段/"+i);
byte[] byt = new byte[input.available()];
input.read(byt);
FileOutputStream outputStream= new FileOutputStream(path+name+"/片段/"+i);
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
SecretKeySpec keySpec = new SecretKeySpec(key.getBytes("utf-8"), "AES");
AlgorithmParameterSpec paramSpec = new IvParameterSpec(new byte[16]);
cipher.init(Cipher.DECRYPT_MODE, keySpec, paramSpec);
byt= cipher.doFinal(byt);
outputStream.write(byt);
outputStream.close();
input.close();
}
System.out.println(i+line);
i++;
}else if(line.startsWith("#EXT-X-KEY")){
line=line.substring(line.indexOf("\"")+1,line.lastIndexOf("\""));
if(line.contains("http")){
}else if(line.startsWith("/")){
string.substring(0,string.indexOf("/",10));
}else{
line=string.substring(0,string.lastIndexOf("/")+1)+line;
}
URL keyUrl=new URL(line);
HttpURLConnection keyHttpURLConnection=(HttpURLConnection)keyUrl.openConnection();
InputStreamReader keyInputStreamReader = new InputStreamReader(keyHttpURLConnection.getInputStream(), "UTF-8");
BufferedReader keyBufferedReader = new BufferedReader(keyInputStreamReader);
line=keyBufferedReader.readLine();
key=line.trim();
}else if(line.endsWith(".m3u8")){
if(line.startsWith("http")){
}else if(line.startsWith("/")){
string.substring(0,string.indexOf("/",10));
}else{
string=string.substring(0,string.lastIndexOf("/")+1)+line;
}
b=true;
break;//提前结束for循环,回到while循环
}
}
}
FileInputStream fileInputStream;
FileOutputStream fileOutputStream = new FileOutputStream(path+name+"/"+name+".ts");
byte by[] = new byte[1024 * 10];
int len;
file = new File(path+name+"/片段/");
if(file.isDirectory()) {
String[] fileNames = file.list();
int lenth=fileNames.length;
i=0;
while(i<lenth){
fileInputStream=new FileInputStream(path+name+"/片段/"+i);
len = 0;
while ((len = fileInputStream.read(by))!=-1) {
fileOutputStream.write(by, 0, len);
}
fileInputStream.close();
i++;
}
}
fileOutputStream.flush();
fileOutputStream.close();
System.out.println("合并完成!");
}catch (Exception e){
System.out.println("出错了"+e.toString());
}
}
}