解析网页m3u8文件地址

解析网页m3u8文件地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
class text{
static String 二级m3u8地址;
static String 解析的url文件地址;
public static String getIndexFile(String urlpath){
try{
URL url = new URL(urlpath);
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(),"UTF-8"));
String content = "" ;
String line;
while ((line = in.readLine()) != null) {
content += line + "\n";
}
in.close();
return content;
}catch (Exception e){
e.printStackTrace();
}
return null;
}
public static List analysisIndex(String content){
String prePath = 二级m3u8地址.substring(0,二级m3u8地址.lastIndexOf("/")+1);
Pattern pattern = Pattern.compile(".*ts");
Matcher ma = pattern.matcher(content);

List<String> list = new ArrayList<String>();
FileOutputStream fs;
try {
fs = new FileOutputStream(new File(解析的url文件地址));
PrintStream p = new PrintStream(fs);
while(ma.find()){
String latePath = ma.group();
list.add(latePath);
p.println(prePath+latePath);
System.out.println(prePath+latePath);
}
p.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return list;
}

public static void openXunlei(){
final Runtime runtime = Runtime.getRuntime();
Process process = null;
final String cmd = "rundll32 url.dll FileProtocolHandler "+解析的url文件地址;//要打开的文件路径。
try {
process = runtime.exec(cmd);
} catch (final Exception e) {
System.out.println("Error exec!");
}
}
}

class Main{
public static void main(String[] args){
String urlPath = "https://kbzy.zxziyuan-yun.com/ppvod/3DAFCB3DCFC52A80A5BBD7C57FC28907.m3u8";
text.二级m3u8地址=urlPath;
text.解析的url文件地址="C:\\Users\\xianyu\\Desktop\\temp.downlist";
//改成下载器相应的格式就能直接打开下载页面
String indexStr = text.getIndexFile(urlPath);
text.analysisIndex(indexStr);
text.openXunlei();
}
}

getIndexFile类用来下载网页视频m3u8文件
analysisIndex类用来解析m3u8文件,改写成url的形式openXunlei类是根据解析好的url地址打开迅雷下载前两个类没什么好说的,第三个类实现原理是把analysisIndex类生成的url存成文本,直接命名为.downlist文件。而.downlist是迅雷存下载地址的文件,存好后用runtime调cmd,直接打开这个文件,就能进下载页面了。所以,没有安装迅雷,第三不就不会执行,不过程序还是能生成一个解析好的url文件的。按需要改相应的参数。主类中urlPath是二级m3u8文件,注意,一级m3u8文件是不行的,因为一级里面是一些适配码率的代码,没有真正的视频地址文件。text.解析的url文件地址是m3u8文件解析好的url地址文件,按那个地址下就行了
另外,上面代码也有一些问题,下载下来的视频全部都是.ts切片文件,下载后需要把他们合成一个整视频我一般用cmd合成copy /b 要合成的.ts文件路径*.ts 生成文件路径\new.mp4*是通配符,具体参见百度还有一个问题,就是代码会在生成url的时候还会在控制台输出,而一旦输出过多,前面一部分就会丢失,所以不要用控制台生成的地址去下载靠谱的还是去生成文件里面去找,因为那样不会溢出。现在遇到的问题是有的视频很长切片太多,而我的迅雷一次最多添加1000个链接,我的想法是每生成1000个url后就重新生成一个文件,然后分开下载。还有一个待解决的问题,就是有些网站会对他的地址进行AES加密,表示暂时看见了没办法。