diff --git a/app/src/main/java/com/github/catvod/bean/Result.java b/app/src/main/java/com/github/catvod/bean/Result.java index 79a20659..eb5c2cb4 100644 --- a/app/src/main/java/com/github/catvod/bean/Result.java +++ b/app/src/main/java/com/github/catvod/bean/Result.java @@ -17,6 +17,8 @@ public class Result { private List list; @SerializedName("filters") private JSONObject filters; + @SerializedName("header") + private String header; @SerializedName("parse") private String parse; @SerializedName("url") @@ -40,6 +42,10 @@ public class Result { this.filters = filters; } + public void setHeader(String header) { + this.header = header; + } + public void setParse(String parse) { this.parse = parse; } diff --git a/app/src/main/java/com/github/catvod/spider/Dm84.java b/app/src/main/java/com/github/catvod/spider/Dm84.java new file mode 100644 index 00000000..3da7d730 --- /dev/null +++ b/app/src/main/java/com/github/catvod/spider/Dm84.java @@ -0,0 +1,204 @@ +package com.github.catvod.spider; + +import android.text.TextUtils; + +import com.github.catvod.bean.Class; +import com.github.catvod.bean.Result; +import com.github.catvod.bean.Vod; +import com.github.catvod.crawler.Spider; +import com.github.catvod.net.OkHttpUtil; +import com.github.catvod.utils.Misc; +import com.google.gson.Gson; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * @author FongMi + */ +public class Dm84 extends Spider { + + private static final String siteUrl = "https://dm84.tv"; + + private HashMap getHeaders() { + HashMap headers = new HashMap<>(); + headers.put("User-Agent", Misc.CHROME); + return headers; + } + + private JSONObject addFilter(String name, String key, List texts) throws JSONException { + JSONObject object = new JSONObject(); + JSONArray array = new JSONArray(); + for (String text : texts) { + if (text.isEmpty()) continue; + JSONObject o = new JSONObject(); + o.put("n", text.replace("按", ""))); + o.put("v", key.equals("by") ? replaceBy(text) : text); + array.put(o); + } + object.put("key", key); + object.put("name", name); + object.put("value", array); + return object; + } + + private String replaceBy(String text) { + return text.replace("按时间", "time").replace("按人气", "hist").replace("按评分", "score"); + } + + @Override + public String homeContent(boolean filter) { + List classes = new ArrayList<>(); + List videos = new ArrayList<>(); + JSONObject filters = new JSONObject(); + Document doc = Jsoup.parse(OkHttpUtil.string(siteUrl, getHeaders())); + for (Element element : doc.select("ul.nav_row > li > a")) { + if (element.attr("href").startsWith("/list")) { + String id = element.attr("href").split("-")[1].substring(0, 1); + String name = element.text().substring(0, 2); + classes.add(new Class(id, name)); + } + } + for (Class item : classes) { + try { + JSONArray array = new JSONArray(); + doc = Jsoup.parse(OkHttpUtil.string(siteUrl + "/list-" + item.getTypeId() + ".html", getHeaders())); + Elements elements = doc.select("ul.list_filter > li > div"); + array.put(addFilter("類型", "type", elements.get(0).select("a").eachText())); + array.put(addFilter("時間", "year", elements.get(1).select("a").eachText())); + array.put(addFilter("排序", "by", elements.get(2).select("a").eachText())); + filters.put(item.getTypeId(), array); + } catch (Exception ignored) { + } + } + for (Element element : doc.select("div.item")) { + String img = element.select("a.cover").attr("data-bg"); + String url = element.select("a.title").attr("href"); + String name = element.select("a.title").text(); + String remark = element.select("span.desc").text(); + String id = url.split("/")[2]; + videos.add(new Vod(id, name, img, remark)); + } + Result result = new Result(); + result.setFilters(filters); + result.setClasses(classes); + result.setList(videos); + return result.toString(); + } + + @Override + public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { + Result result = new Result(); + List videos = new ArrayList<>(); + if (extend.get("type") == null) extend.put("type", ""); + if (extend.get("year") == null) extend.put("year", ""); + if (extend.get("by") == null) extend.put("by", "time"); + String by = extend.get("by"); + String type = Misc.encode(extend.get("type")); + String year = extend.get("year"); + String target = siteUrl + String.format("/show-%s--%s-%s--%s-%s.html", tid, by, type, year, pg); + Document doc = Jsoup.parse(OkHttpUtil.string(target, getHeaders())); + for (Element element : doc.select("div.item")) { + String img = element.select("a.cover").attr("data-bg"); + String url = element.select("a.title").attr("href"); + String name = element.select("a.title").text(); + String remark = element.select("span.desc").text(); + String id = url.split("/")[2]; + videos.add(new Vod(id, name, img, remark)); + } + result.setList(videos); + return result.toString(); + } + + @Override + public String detailContent(List ids) { + Vod vod = new Vod(); + Result result = new Result(); + Map sites = new LinkedHashMap<>(); + + Document doc = Jsoup.parse(OkHttpUtil.string(siteUrl.concat("/v/").concat(ids.get(0)), getHeaders())); + String name = doc.select("h1.v_title").text(); + String remarks = doc.select("p.v_desc > span.desc").text(); + String img = doc.select("meta[property=og:image]").attr("content"); + String area = doc.select("meta[name=og:video:area]").attr("content"); + String type = doc.select("meta[name=og:video:class]").attr("content"); + String actor = doc.select("meta[name=og:video:actor]").attr("content"); + String content = doc.select("meta[property=og:description]").attr("content"); + String year = doc.select("meta[name=og:video:release_date]").attr("content"); + String director = doc.select("meta[name=og:video:director]").attr("content"); + + vod.setVodId(ids.get(0)); + vod.setVodPic(img); + vod.setVodYear(year); + vod.setVodName(name); + vod.setVodArea(area); + vod.setVodActor(actor); + vod.setVodRemarks(remarks); + vod.setVodContent(content); + vod.setVodDirector(director); + vod.setTypeName(type); + + Elements sources = doc.select("ul.tab_control > li"); + Elements sourceList = doc.select("ul.play_list"); + for (int i = 0; i < sources.size(); i++) { + Element source = sources.get(i); + String sourceName = source.text(); + Elements playList = sourceList.get(i).select("a"); + List vodItems = new ArrayList<>(); + for (int j = 0; j < playList.size(); j++) { + Element e = playList.get(j); + vodItems.add(e.text() + "$" + e.attr("href")); + } + if (vodItems.size() > 0) { + sites.put(sourceName, TextUtils.join("#", vodItems)); + } + } + if (sites.size() > 0) { + vod.setVodPlayFrom(TextUtils.join("$$$", sites.keySet()))); + vod.setVodPlayUrl(TextUtils.join("$$$", sites.values())); + } + result.setList(Arrays.asList(vod)); + return result.toString(); + } + + @Override + public String searchContent(String key, boolean quick) { + Result result = new Result(); + List videos = new ArrayList<>(); + String target = siteUrl.concat("/s----------.html?wd=").concat(key); + Document doc = Jsoup.parse(OkHttpUtil.string(target, getHeaders())); + for (Element element : doc.select("div.item")) { + String img = element.select("a.cover").attr("data-bg"); + String url = element.select("a.title").attr("href"); + String name = element.select("a.title").text(); + String remark = element.select("span.desc").text(); + String id = url.split("/")[2]; + videos.add(new Vod(id, name, img, remark)); + } + result.setList(videos); + return result.toString(); + } + + @Override + public String playerContent(String flag, String id, List vipFlags) { + Document doc = Jsoup.parse(OkHttpUtil.string(siteUrl.concat(id), getHeaders())); + String url = doc.select("iframe").attr("src"); + Result result = new Result(); + result.setUrl(url); + result.setParse("1"); + result.setHeader(new Gson().toJson(getHeaders())); + return result.toString(); + } +} diff --git a/app/src/main/java/com/github/catvod/utils/Misc.java b/app/src/main/java/com/github/catvod/utils/Misc.java index c279f933..48e9e80e 100644 --- a/app/src/main/java/com/github/catvod/utils/Misc.java +++ b/app/src/main/java/com/github/catvod/utils/Misc.java @@ -8,6 +8,7 @@ import org.json.JSONException; import org.json.JSONObject; import java.math.BigInteger; +import java.net.URLEncoder; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; @@ -109,6 +110,14 @@ public class Misc { return taskResult; } + public static String encode(String s) { + try { + return URLEncoder.encode(s, "UTF-8"); + } catch (Exception e) { + return ""; + } + } + public static String MD5(String src) { return MD5(src, StandardCharsets.UTF_8); }