bili mpd
This commit is contained in:
parent
dc1fed1e6f
commit
7cf962d0d0
|
|
@ -28,6 +28,7 @@ import org.jsoup.Jsoup;
|
||||||
import java.net.URLEncoder;
|
import java.net.URLEncoder;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.Executors;
|
import java.util.concurrent.Executors;
|
||||||
import java.util.concurrent.ScheduledExecutorService;
|
import java.util.concurrent.ScheduledExecutorService;
|
||||||
|
|
@ -40,10 +41,12 @@ public class Bili extends Spider {
|
||||||
|
|
||||||
private ScheduledExecutorService service;
|
private ScheduledExecutorService service;
|
||||||
private HashMap<String, String> header;
|
private HashMap<String, String> header;
|
||||||
|
private static JSONObject vod_audio_id = new JSONObject();
|
||||||
private AlertDialog dialog;
|
private AlertDialog dialog;
|
||||||
private JSONObject ext;
|
private JSONObject ext;
|
||||||
private String extend;
|
private String extend;
|
||||||
private boolean login;
|
private boolean login;
|
||||||
|
private static int vip = 0;
|
||||||
|
|
||||||
private String getCookie() {
|
private String getCookie() {
|
||||||
String cache = Prefers.getString("BiliCookie");
|
String cache = Prefers.getString("BiliCookie");
|
||||||
|
|
@ -89,6 +92,9 @@ public class Bili extends Spider {
|
||||||
this.extend = extend;
|
this.extend = extend;
|
||||||
this.header = new HashMap<>();
|
this.header = new HashMap<>();
|
||||||
fetchRule();
|
fetchRule();
|
||||||
|
vod_audio_id.put("30280", "192000");
|
||||||
|
vod_audio_id.put("30232", "132000");
|
||||||
|
vod_audio_id.put("30216", "64000");
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|
@ -137,13 +143,65 @@ public class Bili extends Spider {
|
||||||
String detailUrl = "https://api.bilibili.com/x/web-interface/view?aid=" + aid;
|
String detailUrl = "https://api.bilibili.com/x/web-interface/view?aid=" + aid;
|
||||||
JSONObject detailResp = new JSONObject(OkHttp.string(detailUrl, header));
|
JSONObject detailResp = new JSONObject(OkHttp.string(detailUrl, header));
|
||||||
JSONObject detailData = detailResp.getJSONObject("data");
|
JSONObject detailData = detailResp.getJSONObject("data");
|
||||||
List<String> playlist = new ArrayList<>();
|
|
||||||
JSONArray pages = detailData.getJSONArray("pages");
|
String defaultQn = "120";
|
||||||
for (int i = 0; i < pages.length(); ++i) {
|
/*
|
||||||
JSONObject page = pages.getJSONObject(i);
|
6 240P 极速 仅mp4方式支持
|
||||||
String title = page.getString("part").replace("$", "_").replace("#", "_");
|
16 360P 流畅
|
||||||
playlist.add(title + "$" + aid + "+" + page.getLong("cid"));
|
32 480P 清晰
|
||||||
|
64 720P 高清 web端默认值
|
||||||
|
B站前端需要登录才能选择,但是直接发送请求可以不登录就拿到720P的取流地址
|
||||||
|
无720P时则为720P60
|
||||||
|
74 720P60 高帧率 需要认证登录账号
|
||||||
|
80 1080P 高清 TV端与APP端默认值
|
||||||
|
需要认证登录账号
|
||||||
|
112 1080P+ 高码率 大多情况需求认证大会员账号
|
||||||
|
116 1080P60 高帧率 大多情况需求认证大会员账号
|
||||||
|
120 4K 超清 需要fnval&128=128且fourk=1
|
||||||
|
大多情况需求认证大会员账号
|
||||||
|
125 HDR 真彩色 仅支持dash方式
|
||||||
|
需要fnval&64=64
|
||||||
|
大多情况需求认证大会员账号
|
||||||
|
126 杜比视界 仅支持dash方式
|
||||||
|
需要fnval&512=512
|
||||||
|
大多情况需求认证大会员账号
|
||||||
|
127 8K 超高清 仅支持dash方式
|
||||||
|
需要fnval&1024=1024
|
||||||
|
大多情况需求认证大会员账号
|
||||||
|
*/
|
||||||
|
|
||||||
|
String playurldata = "https://api.bilibili.com/x/player/playurl?avid=" + aid + "&cid=" + detailData.getString("cid") + "&qn=" + defaultQn + "&fnval=4048&fourk=1";
|
||||||
|
JSONObject response = new JSONObject(OkHttp.string(playurldata, header));
|
||||||
|
JSONObject data = response.getJSONObject("data");
|
||||||
|
JSONArray acceptDescription = data.getJSONArray("accept_description");
|
||||||
|
JSONArray acceptQuality = data.getJSONArray("accept_quality");
|
||||||
|
ArrayList<String> tempQuality = new ArrayList<>();
|
||||||
|
ArrayList<String> playFrom = new ArrayList<>();
|
||||||
|
for (int i = 0; i < acceptQuality.length(); i++) {
|
||||||
|
if (!login) { // Check login and set up quality
|
||||||
|
if (acceptQuality.optInt(i) > 32)
|
||||||
|
continue;
|
||||||
|
} else if (vip == 0) { // Check vip and set up quality
|
||||||
|
if (acceptQuality.optInt(i) > 80)
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
playFrom.add(acceptDescription.getString(i));
|
||||||
|
tempQuality.add(acceptQuality.getString(i));
|
||||||
|
}
|
||||||
|
StringBuilder plist = new StringBuilder();
|
||||||
|
for (String Quality : tempQuality) {
|
||||||
|
ArrayList<String> playList = new ArrayList<>();
|
||||||
|
JSONArray pages = detailData.getJSONArray("pages");
|
||||||
|
int length = pages.length();
|
||||||
|
for (int i = 0; i < length; i++) {
|
||||||
|
JSONObject page = pages.getJSONObject(i);
|
||||||
|
long cid = page.getLong("cid");
|
||||||
|
String playUrl = i + "$" + aid + "+" + cid + "+" + Quality;
|
||||||
|
playList.add(playUrl);
|
||||||
|
}
|
||||||
|
plist.append(TextUtils.join("#", playList)).append("$$$");
|
||||||
|
}
|
||||||
|
|
||||||
Vod vod = new Vod();
|
Vod vod = new Vod();
|
||||||
vod.setVodId(bvid);
|
vod.setVodId(bvid);
|
||||||
vod.setVodName(detailData.getString("title"));
|
vod.setVodName(detailData.getString("title"));
|
||||||
|
|
@ -151,8 +209,8 @@ public class Bili extends Spider {
|
||||||
vod.setTypeName(detailData.getString("tname"));
|
vod.setTypeName(detailData.getString("tname"));
|
||||||
vod.setVodRemarks(detailData.getLong("duration") / 60 + "分鐘");
|
vod.setVodRemarks(detailData.getLong("duration") / 60 + "分鐘");
|
||||||
vod.setVodContent(detailData.getString("desc"));
|
vod.setVodContent(detailData.getString("desc"));
|
||||||
vod.setVodPlayFrom("B站");
|
vod.setVodPlayFrom(TextUtils.join("$$$", playFrom));
|
||||||
vod.setVodPlayUrl(TextUtils.join("#", playlist));
|
vod.setVodPlayUrl(plist.toString());
|
||||||
return Result.string(vod);
|
return Result.string(vod);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -166,22 +224,33 @@ public class Bili extends Spider {
|
||||||
String[] ids = id.split("\\+");
|
String[] ids = id.split("\\+");
|
||||||
String aid = ids[0];
|
String aid = ids[0];
|
||||||
String cid = ids[1];
|
String cid = ids[1];
|
||||||
String url = "https://api.bilibili.com/x/player/playurl?avid=" + aid + "&cid=" + cid + "&qn=120&fnval=4048&fourk=1";
|
String Qn = ids[2];
|
||||||
JSONObject resp = new JSONObject(OkHttp.string(url, header));
|
String urls = "https://api.bilibili.com/x/player/playurl?avid=" + aid + "&cid=" + cid + "&qn=" + Qn + "&fnval=4048&fourk=1";
|
||||||
JSONObject dash = resp.optJSONObject("data").optJSONObject("dash");
|
// 视频链接时效性限制 2 小时, 得重新请求,暂不处理1
|
||||||
JSONArray video = dash.optJSONArray("video");
|
|
||||||
JSONArray audio = dash.optJSONArray("audio");
|
String videoList = "", audioList = "";
|
||||||
StringBuilder videoList = new StringBuilder();
|
JSONObject resp = new JSONObject(OkHttp.string(urls, header)).optJSONObject("data").optJSONObject("dash");
|
||||||
StringBuilder audioList = new StringBuilder();
|
JSONArray video = resp.optJSONArray("video");
|
||||||
|
JSONArray audio = resp.optJSONArray("audio");
|
||||||
for (int i = 0; i < video.length(); i++) {
|
for (int i = 0; i < video.length(); i++) {
|
||||||
JSONObject vjson = video.getJSONObject(i);
|
JSONObject videoDash = video.getJSONObject(i);
|
||||||
videoList.append(getDashMedia(vjson));
|
if (videoDash.getString("id").equals(Qn)) {
|
||||||
|
videoList = getDashMedia(videoDash);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
for (int i = 0; i < audio.length(); i++) {
|
for (int i = 0; i < audio.length(); i++) {
|
||||||
JSONObject ajson = audio.getJSONObject(i);
|
JSONObject audioDash = audio.getJSONObject(i);
|
||||||
audioList.append(getDashMedia(ajson));
|
Iterator<String> keys = vod_audio_id.keys();
|
||||||
|
while (keys.hasNext()) {
|
||||||
|
String key = keys.next();
|
||||||
|
if (audioDash.getString("id").equals(key)) {
|
||||||
|
audioList = getDashMedia(audioDash);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
String mpd = getDash(dash, videoList.toString(), audioList.toString());
|
}
|
||||||
|
}
|
||||||
|
String mpd = getDash(resp, videoList, audioList);
|
||||||
String dashUrl = "data:application/dash+xml;base64," + Base64.encodeToString(mpd.getBytes(), 0);
|
String dashUrl = "data:application/dash+xml;base64," + Base64.encodeToString(mpd.getBytes(), 0);
|
||||||
return Result.get().url(dashUrl).header(header).string();
|
return Result.get().url(dashUrl).header(header).string();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue