diff --git a/app/src/main/java/com/github/catvod/spider/Bili.java b/app/src/main/java/com/github/catvod/spider/Bili.java index 6acc6de7..877ab112 100644 --- a/app/src/main/java/com/github/catvod/spider/Bili.java +++ b/app/src/main/java/com/github/catvod/spider/Bili.java @@ -7,6 +7,7 @@ import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.net.Uri; import android.text.TextUtils; +import android.util.Base64; import android.view.Gravity; import android.widget.FrameLayout; import android.widget.ImageView; @@ -47,7 +48,8 @@ public class Bili extends Spider { private String getCookie() { String cache = Prefers.getString("BiliCookie"); if (!TextUtils.isEmpty(cache)) return cache; - if (ext.optString("cookie").startsWith("http")) return OkHttp.string(ext.optString("cookie")).replace("\n", "").trim(); + if (ext.optString("cookie").startsWith("http")) + return OkHttp.string(ext.optString("cookie")).replace("\n", "").trim(); return ext.optString("cookie", "buvid3=84B0395D-C9F2-C490-E92E-A09AB48FE26E71636infoc"); } @@ -164,10 +166,82 @@ public class Bili extends Spider { String[] ids = id.split("\\+"); String aid = ids[0]; String cid = ids[1]; - String url = "https://api.bilibili.com/x/player/playurl?avid=" + aid + "&cid=" + cid + "&qn=120&fourk=1"; + String url = "https://api.bilibili.com/x/player/playurl?avid=" + aid + "&cid=" + cid + "&qn=120&fnval=4048&fourk=1"; JSONObject resp = new JSONObject(OkHttp.string(url, header)); - url = resp.getJSONObject("data").getJSONArray("durl").getJSONObject(0).getString("url"); - return Result.get().url(url).header(header).string(); + JSONObject dash = resp.optJSONObject("data").optJSONObject("dash"); + JSONArray video = dash.optJSONArray("video"); + JSONArray audio = dash.optJSONArray("audio"); + StringBuilder videoList = new StringBuilder(); + StringBuilder audioList = new StringBuilder(); + for (int i = 0; i < video.length(); i++) { + JSONObject vjson = video.getJSONObject(i); + videoList.append(getDashMedia(vjson)); + } + for (int i = 0; i < audio.length(); i++) { + JSONObject ajson = audio.getJSONObject(i); + audioList.append(getDashMedia(ajson)); + } + String mpd = getDash(dash, videoList.toString(), audioList.toString()); + String dashUrl = "data:application/dash+xml;base64," + Base64.encodeToString(mpd.getBytes(), 0); + return Result.get().url(dashUrl).header(header).string(); + } + + public static String getDashMedia(JSONObject dash) throws Exception { + JSONObject vod_audio_id = new JSONObject(); + vod_audio_id.put("30280", "192000"); + vod_audio_id.put("30232", "132000"); + vod_audio_id.put("30216", "64000"); + String qnid = dash.getString("id"); + int codecid = dash.getInt("codecid"); + String media_codecs = dash.getString("codecs"); + Integer media_bandwidth = dash.getInt("bandwidth"); + String media_startWithSAP = dash.getString("startWithSap"); + String media_mimeType = dash.getString("mimeType"); + String media_BaseURL = dash.getString("baseUrl").replace("&", "&"); + String media_SegmentBase_indexRange = dash.getJSONObject("SegmentBase").getString("indexRange"); + String media_SegmentBase_Initialization = dash.getJSONObject("SegmentBase").getString("Initialization"); + String mediaType = media_mimeType.split("/")[0]; + String media_type_params = ""; + + if (mediaType.equals("video")) { + Integer media_frameRate = dash.getInt("frameRate"); + String media_sar = dash.getString("sar"); + Integer media_width = dash.getInt("width"); + Integer media_height = dash.getInt("height"); + media_type_params = String.format("height='%d' width='%d' frameRate='%d' sar='%s'", media_height, media_width, media_frameRate, media_sar); + } else if (mediaType.equals("audio")) { + String audioSamplingRate = vod_audio_id.getString(qnid); + media_type_params = String.format("numChannels='2' sampleRate='%s'", audioSamplingRate); + } + + qnid += "_" + codecid; + + return String.format( + "\n" + + " \n" + + " \n" + + " %s\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " ", + mediaType, qnid, media_bandwidth, media_codecs, media_mimeType, media_type_params, media_startWithSAP, media_BaseURL, + media_SegmentBase_indexRange, media_SegmentBase_Initialization); + } + + + public static String getDash(JSONObject ja, String videoList, String audioList) throws Exception { + Integer duration = ja.getInt("duration"); + Integer minBufferTime = ja.getInt("minBufferTime"); + return String.format( + "\n" + + " \n" + + " %s\n" + + " %s\n" + + " \n" + + "", + duration, minBufferTime, duration, videoList, audioList); } private void checkLogin() throws Exception {