This commit is contained in:
唐三 2023-07-07 15:10:11 +08:00
parent dc1fed1e6f
commit 7cf962d0d0
1 changed files with 89 additions and 20 deletions

View File

@ -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();
} }