diff --git a/app/src/main/java/com/github/catvod/bean/bili/Data.java b/app/src/main/java/com/github/catvod/bean/bili/Data.java index bb77c19b..076abe93 100644 --- a/app/src/main/java/com/github/catvod/bean/bili/Data.java +++ b/app/src/main/java/com/github/catvod/bean/bili/Data.java @@ -44,6 +44,10 @@ public class Data { private List pages; @SerializedName("dash") private Dash dash; + @SerializedName("owner") + private Owner owner; + @SerializedName("wbi_img") + private Wbi wbi; public JsonElement getResult() { return result; @@ -116,4 +120,12 @@ public class Data { public Dash getDash() { return dash == null ? new Dash() : dash; } + + public Owner getOwner() { + return owner == null ? new Owner() : owner; + } + + public Wbi getWbi() { + return wbi == null ? new Wbi() : wbi; + } } diff --git a/app/src/main/java/com/github/catvod/bean/bili/Owner.java b/app/src/main/java/com/github/catvod/bean/bili/Owner.java new file mode 100644 index 00000000..68cd6c64 --- /dev/null +++ b/app/src/main/java/com/github/catvod/bean/bili/Owner.java @@ -0,0 +1,25 @@ +package com.github.catvod.bean.bili; + +import android.text.TextUtils; + +import com.google.gson.annotations.SerializedName; + +public class Owner { + + @SerializedName("mid") + private int mid; + @SerializedName("name") + private String name; + + public int getMid() { + return mid; + } + + public String getName() { + return TextUtils.isEmpty(name) ? "" : name; + } + + public String getFormat() { + return String.format("[a=cr:{\"id\":\"%s\",\"name\":\"%s\"}/]%s[/a]", getMid() + "/{pg}", getName(), getName()); + } +} diff --git a/app/src/main/java/com/github/catvod/bean/bili/Resp.java b/app/src/main/java/com/github/catvod/bean/bili/Resp.java index f3ef36be..37d5774b 100644 --- a/app/src/main/java/com/github/catvod/bean/bili/Resp.java +++ b/app/src/main/java/com/github/catvod/bean/bili/Resp.java @@ -42,6 +42,8 @@ public class Resp { private String pic; @SerializedName("duration") private String duration; + @SerializedName("length") + private String length; public static List arrayFrom(JsonElement str) { Type listType = new TypeToken>() {}.getType(); @@ -61,7 +63,11 @@ public class Resp { } public String getDuration() { - return TextUtils.isEmpty(duration) ? "" : duration; + return TextUtils.isEmpty(duration) ? getLength() : duration.split(":")[0] + "分鐘"; + } + + public String getLength() { + return TextUtils.isEmpty(length) ? "" : length; } public String getPic() { @@ -72,8 +78,8 @@ public class Resp { Vod vod = new Vod(); vod.setVodId(getBvId() + "@" + getAid()); vod.setVodName(Jsoup.parse(getTitle()).text()); - vod.setVodRemarks(getDuration().split(":")[0] + "分鐘"); vod.setVodPic(getPic().startsWith("//") ? "https:" + getPic() : getPic()); + vod.setVodRemarks(getDuration()); return vod; } } diff --git a/app/src/main/java/com/github/catvod/bean/bili/Wbi.java b/app/src/main/java/com/github/catvod/bean/bili/Wbi.java new file mode 100644 index 00000000..9791fa8d --- /dev/null +++ b/app/src/main/java/com/github/catvod/bean/bili/Wbi.java @@ -0,0 +1,47 @@ +package com.github.catvod.bean.bili; + +import android.net.Uri; +import android.text.TextUtils; + +import com.github.catvod.utils.Utils; +import com.google.gson.annotations.SerializedName; + +import java.net.URLEncoder; +import java.util.LinkedHashMap; + +public class Wbi { + + private final int[] mixinKeyEncTab = new int[]{46, 47, 18, 2, 53, 8, 23, 32, 15, 50, 10, 31, 58, 3, 45, 35, 27, 43, 5, 49, 33, 9, 42, 19, 29, 28, 14, 39, 12, 38, 41, 13, 37, 48, 7, 16, 24, 55, 40, 61, 26, 17, 0, 1, 60, 51, 30, 4, 22, 25, 54, 21, 56, 59, 6, 63, 57, 62, 11, 36, 20, 34, 44, 52}; + + @SerializedName("img_url") + private String imgUrl; + @SerializedName("sub_url") + private String subUrl; + + public String getImgUrl() { + return TextUtils.isEmpty(imgUrl) ? "" : imgUrl; + } + + public String getSubUrl() { + return TextUtils.isEmpty(subUrl) ? "" : subUrl; + } + + private String getMixinKey(String imgKey, String subKey) { + String s = imgKey + subKey; + StringBuilder key = new StringBuilder(); + for (int i = 0; i < 32; i++) key.append(s.charAt(mixinKeyEncTab[i])); + return key.toString(); + } + + public String getParam(LinkedHashMap params) { + String imgKey = Uri.parse(getImgUrl()).getLastPathSegment().split("\\.")[0]; + String subKey = Uri.parse(getSubUrl()).getLastPathSegment().split("\\.")[0]; + String mixinKey = getMixinKey(imgKey, subKey); + StringBuilder sb = new StringBuilder(); + params.put("wts", System.currentTimeMillis() / 1000); + for (String key : params.keySet()) sb.append(key).append("=").append(URLEncoder.encode(params.get(key).toString())).append("&"); + String param = Utils.substring(sb.toString()); + String wbiSign = Utils.MD5(param + mixinKey); + return param + "&w_rid=" + wbiSign; + } +} 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 a2407058..27f6896f 100644 --- a/app/src/main/java/com/github/catvod/spider/Bili.java +++ b/app/src/main/java/com/github/catvod/spider/Bili.java @@ -113,15 +113,23 @@ public class Bili extends Spider { @Override public String categoryContent(String tid, String pg, boolean filter, HashMap extend) throws Exception { - String order = extend.containsKey("order") ? extend.get("order") : "totalrank"; - String duration = extend.containsKey("duration") ? extend.get("duration") : "0"; - if (extend.containsKey("tid")) tid = tid + " " + extend.get("tid"); - String api = "https://api.bilibili.com/x/web-interface/search/type?search_type=video&keyword=" + URLEncoder.encode(tid) + "&order=" + order + "&duration=" + duration + "&page=" + pg; - String json = OkHttp.string(api, getHeader()); - Resp resp = Resp.objectFrom(json); - List list = new ArrayList<>(); - for (Resp.Result item : Resp.Result.arrayFrom(resp.getData().getResult())) list.add(item.getVod()); - return Result.string(list); + if (tid.endsWith("/{pg}")) { + String mid = tid.split("/")[0]; + List list = new ArrayList<>(); + String json = OkHttp.string("https://api.bilibili.com/x/space/wbi/arc/search?mid=" + mid + "&pn=" + pg, getHeader()); + for (Resp.Result item : Resp.Result.arrayFrom(Resp.objectFrom(json).getData().getList().getAsJsonObject().get("vlist"))) list.add(item.getVod()); + return Result.string(list); + } else { + String order = extend.containsKey("order") ? extend.get("order") : "totalrank"; + String duration = extend.containsKey("duration") ? extend.get("duration") : "0"; + if (extend.containsKey("tid")) tid = tid + " " + extend.get("tid"); + String api = "https://api.bilibili.com/x/web-interface/search/type?search_type=video&keyword=" + URLEncoder.encode(tid) + "&order=" + order + "&duration=" + duration + "&page=" + pg; + String json = OkHttp.string(api, getHeader()); + Resp resp = Resp.objectFrom(json); + List list = new ArrayList<>(); + for (Resp.Result item : Resp.Result.arrayFrom(resp.getData().getResult())) list.add(item.getVod()); + return Result.string(list); + } } @Override @@ -141,6 +149,7 @@ public class Bili extends Spider { vod.setVodName(detail.getTitle()); vod.setTypeName(detail.getType()); vod.setVodContent(detail.getDesc()); + vod.setVodDirector(detail.getOwner().getFormat()); vod.setVodRemarks(detail.getDuration() / 60 + "分鐘"); List acceptDesc = new ArrayList<>(); diff --git a/jar/custom_spider.jar b/jar/custom_spider.jar index d201c531..9aa87875 100644 Binary files a/jar/custom_spider.jar and b/jar/custom_spider.jar differ diff --git a/jar/custom_spider.jar.md5 b/jar/custom_spider.jar.md5 index 092a12aa..e43977d8 100644 --- a/jar/custom_spider.jar.md5 +++ b/jar/custom_spider.jar.md5 @@ -1 +1 @@ -77f83df61dccdda0e660148285fcc94a +447dbd3dd81f649465abb48b68deb958