diff --git a/app/src/main/java/com/github/catvod/bean/alist/Drive.java b/app/src/main/java/com/github/catvod/bean/alist/Drive.java index ed276861..d184f866 100644 --- a/app/src/main/java/com/github/catvod/bean/alist/Drive.java +++ b/app/src/main/java/com/github/catvod/bean/alist/Drive.java @@ -136,6 +136,10 @@ public class Drive { return getHost() + (isNew() ? "/api/fs/search" : "/api/public/search"); } + public String searchApi(String param) { + return getHost() + "/search?box=" + param + "&url=&type=video"; + } + public Drive check() { if (path == null) setPath(Uri.parse(getServer()).getPath()); if (version == 0) setVersion(OkHttp.string(settingsApi()).contains("v2.") ? 2 : 3); diff --git a/app/src/main/java/com/github/catvod/bean/alist/Item.java b/app/src/main/java/com/github/catvod/bean/alist/Item.java index 1e542e5e..bed9c54e 100644 --- a/app/src/main/java/com/github/catvod/bean/alist/Item.java +++ b/app/src/main/java/com/github/catvod/bean/alist/Item.java @@ -72,6 +72,10 @@ public class Item { return TextUtils.isEmpty(thumb) ? "" : thumb; } + public void setThumb(String thumb) { + this.thumb = thumb; + } + public String getUrl() { return TextUtils.isEmpty(url) ? "" : url.startsWith("//") ? "http:" + url : url; } diff --git a/app/src/main/java/com/github/catvod/spider/AList.java b/app/src/main/java/com/github/catvod/spider/AList.java index b9abb826..106cd0c7 100644 --- a/app/src/main/java/com/github/catvod/spider/AList.java +++ b/app/src/main/java/com/github/catvod/spider/AList.java @@ -17,6 +17,9 @@ import com.github.catvod.net.OkHttp; import com.github.catvod.utils.Utils; import org.json.JSONObject; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; import java.util.ArrayList; import java.util.Arrays; @@ -250,12 +253,39 @@ public class AList extends Spider { } @Override - public List call() throws Exception { + public List call() { + List alist = alist(); + return alist.size() > 0 ? alist : xiaoya(); + } + + private List xiaoya() { List list = new ArrayList<>(); - String response = post(drive, drive.searchApi(), drive.params(keyword)); - List items = Item.arrayFrom(getSearchJson(drive.isNew(), response)); - for (Item item : items) if (!item.ignore(drive.isNew())) list.add(item.getVod(drive, vodPic)); + Document doc = Jsoup.parse(OkHttp.string(drive.searchApi(keyword))); + for (Element a : doc.select("ul > a")) { + String[] splits = a.text().split("#"); + if (!splits[0].contains("/")) continue; + int index = splits[0].lastIndexOf("/"); + boolean file = Utils.isMedia(splits[0]); + Item item = new Item(); + item.setType(file ? 0 : 1); + item.setThumb(splits.length > 3 ? splits[4] : ""); + item.setPath("/" + splits[0].substring(0, index)); + item.setName(splits[0].substring(index + 1)); + list.add(item.getVod(drive, vodPic)); + } return list; } + + private List alist() { + try { + List list = new ArrayList<>(); + String response = post(drive, drive.searchApi(), drive.params(keyword)); + List items = Item.arrayFrom(getSearchJson(drive.isNew(), response)); + for (Item item : items) if (!item.ignore(drive.isNew())) list.add(item.getVod(drive, vodPic)); + return list; + } catch (Exception e) { + return Collections.emptyList(); + } + } } } \ No newline at end of file diff --git a/app/src/main/java/com/github/catvod/spider/Doll.java b/app/src/main/java/com/github/catvod/spider/Doll.java index b8d717e8..e70f8ef6 100644 --- a/app/src/main/java/com/github/catvod/spider/Doll.java +++ b/app/src/main/java/com/github/catvod/spider/Doll.java @@ -1,5 +1,6 @@ package com.github.catvod.spider; +import android.text.TextUtils; import android.util.Base64; import com.github.catvod.bean.Class; @@ -7,7 +8,6 @@ import com.github.catvod.bean.Result; import com.github.catvod.bean.Vod; import com.github.catvod.crawler.Spider; import com.github.catvod.net.OkHttp; -import com.github.catvod.utils.Utils; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; @@ -17,6 +17,8 @@ import java.net.URLDecoder; import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; public class Doll extends Spider { @@ -61,24 +63,41 @@ public class Doll extends Spider { public String detailContent(List ids) throws Exception { String html = OkHttp.string(url + ids.get(0)); Document doc = Jsoup.parse(html); - StringBuilder sb = new StringBuilder(); - String videoId = ids.get(0).split("/")[1].split("\\.")[0]; String pic = doc.select("meta[property=og:image]").attr("content"); String name = doc.select("meta[property=og:title]").attr("content"); - String voteTag = new String(Base64.decode(Utils.getVar(html, "voteTag").getBytes(), 0)); - for (int i = 0; i < voteTag.length(); i++) sb.append(Character.toChars(voteTag.charAt(i) ^ videoId.charAt(i % videoId.length()))); - String playUrl = URLDecoder.decode(new String(Base64.decode(sb.toString().getBytes(), 0))); Vod vod = new Vod(); vod.setVodId(ids.get(0)); vod.setVodPic(pic); vod.setVodName(name); vod.setVodPlayFrom("玩偶姐姐"); - vod.setVodPlayUrl("播放$" + playUrl); + vod.setVodPlayUrl("播放$" + url + ids.get(0)); return Result.string(vod); } @Override public String playerContent(String flag, String id, List vipFlags) throws Exception { - return Result.get().url(id).string(); + String key = ""; + String voteTag = ""; + StringBuilder code = new StringBuilder(); + String html = OkHttp.string(id); + Document doc = Jsoup.parse(html); + Matcher m = Pattern.compile("/video/(\\w+).html").matcher(id); + if (m.find()) key = m.group(1); + for (Element a : doc.select("script")) { + if (a.html().startsWith("var voteTag")) { + Pattern pattern = Pattern.compile("voteTag=\"([^&]+)\""); + Matcher matcher = pattern.matcher(a.html()); + if (matcher.find()) voteTag = matcher.group(1); + break; + } + } + if (TextUtils.isEmpty(voteTag)) return Result.get().url(id).parse().string(); + voteTag = new String(Base64.decode(voteTag, 0)); + for (int i = 0; i < voteTag.length(); i++) { + int k = i % key.length(); + code.append((char) (voteTag.charAt(i) ^ key.charAt(k))); + } + String playUrl = URLDecoder.decode(new String(Base64.decode(code.toString(), 0))); + return Result.get().url(playUrl).string(); } } diff --git a/app/src/main/java/com/github/catvod/spider/Local.java b/app/src/main/java/com/github/catvod/spider/Local.java index 9c171580..c8cb7574 100644 --- a/app/src/main/java/com/github/catvod/spider/Local.java +++ b/app/src/main/java/com/github/catvod/spider/Local.java @@ -54,7 +54,7 @@ public class Local extends Spider { for (File file : files) { if (file.getName().startsWith(".")) continue; if (file.isDirectory()) folders.add(create(file)); - else if (Utils.MEDIA.contains(Utils.getExt(file.getName()))) media.add(create(file)); + else if (Utils.isMedia(file.getName())) media.add(create(file)); } items.addAll(folders); items.addAll(media); diff --git a/app/src/main/java/com/github/catvod/spider/WebDAV.java b/app/src/main/java/com/github/catvod/spider/WebDAV.java index f976b32e..c7d625e9 100644 --- a/app/src/main/java/com/github/catvod/spider/WebDAV.java +++ b/app/src/main/java/com/github/catvod/spider/WebDAV.java @@ -110,7 +110,7 @@ public class WebDAV extends Spider { Sorter.sort("name", "asc", parents); List playUrls = new ArrayList<>(); for (DavResource item : parents) { - if (Utils.MEDIA.contains(getExt(item))) { + if (Utils.isMedia(item.getName())) { playUrls.add(item.getName() + "$" + drive.getName() + item.getPath() + findSubs(drive, item, subs)); } } diff --git a/app/src/main/java/com/github/catvod/utils/Utils.java b/app/src/main/java/com/github/catvod/utils/Utils.java index f64ab713..ed6762e2 100644 --- a/app/src/main/java/com/github/catvod/utils/Utils.java +++ b/app/src/main/java/com/github/catvod/utils/Utils.java @@ -25,10 +25,11 @@ import java.util.regex.Pattern; public class Utils { + public static final Pattern RULE = Pattern.compile("http((?!http).){12,}?\\.(m3u8|mp4|flv|avi|mkv|rm|wmv|mpg|m4a|mp3)\\?.*|http((?!http).){12,}\\.(m3u8|mp4|flv|avi|mkv|rm|wmv|mpg|m4a|mp3)|http((?!http).)*?video/tos*"); public static final String CHROME = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36"; public static final String ACCEPT = "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7"; - public static final List MEDIA = Arrays.asList("mp4", "mkv", "wmv", "flv", "avi", "mp3", "aac", "flac", "m4a", "ape", "ogg"); - public static final Pattern RULE = Pattern.compile("http((?!http).){12,}?\\.(m3u8|mp4|flv|avi|mkv|rm|wmv|mpg|m4a|mp3)\\?.*|" + "http((?!http).){12,}\\.(m3u8|mp4|flv|avi|mkv|rm|wmv|mpg|m4a|mp3)|" + "http((?!http).)*?video/tos*"); + public static final List MEDIA = Arrays.asList("mp4", "mkv", "wmv", "flv", "avi", "iso", "mpg", "ts", "mp3", "aac", "flac", "m4a", "ape", "ogg"); + public static final List SUB = Arrays.asList("srt", "ass", "ssa", "vtt"); public static boolean isVip(String url) { List hosts = Arrays.asList("iqiyi.com", "v.qq.com", "youku.com", "le.com", "tudou.com", "mgtv.com", "sohu.com", "acfun.cn", "bilibili.com", "baofeng.com", "pptv.com"); @@ -59,11 +60,15 @@ public class Utils { } public static boolean isSub(String ext) { - return ext.equals("srt") || ext.equals("ass") || ext.equals("ssa") || ext.equals("vtt"); + return SUB.contains(ext); + } + + public static boolean isMedia(String text) { + return MEDIA.contains(getExt(text)); } public static String getExt(String name) { - return name.substring(name.lastIndexOf(".") + 1); + return name.contains(".") ? name.substring(name.lastIndexOf(".") + 1) : name; } public static String getSize(double size) { diff --git a/jar/custom_spider.jar b/jar/custom_spider.jar index 7efda2b3..b0c812a7 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 b3b9fd25..90a113b4 100644 --- a/jar/custom_spider.jar.md5 +++ b/jar/custom_spider.jar.md5 @@ -1 +1 @@ -da248d3decd2fb6776b2ce39013c3e6e +08e60753eb29394b75c088e1f06dfb17 diff --git a/json/adult.json b/json/adult.json index 7db0ad97..d66faa30 100644 --- a/json/adult.json +++ b/json/adult.json @@ -1,5 +1,5 @@ { - "spider": "https://fongmi.cachefly.net/FongMi/CatVodSpider/main/jar/custom_spider.jar;md5;da248d3decd2fb6776b2ce39013c3e6e", + "spider": "https://fongmi.cachefly.net/FongMi/CatVodSpider/main/jar/custom_spider.jar;md5;08e60753eb29394b75c088e1f06dfb17", "wallpaper": "https://gao.chuqiuyu.tk", "sites": [ { diff --git a/json/config.json b/json/config.json index 1bea20ae..3e1ee452 100644 --- a/json/config.json +++ b/json/config.json @@ -1,5 +1,5 @@ { - "spider": "https://fongmi.cachefly.net/FongMi/CatVodSpider/main/jar/custom_spider.jar;md5;da248d3decd2fb6776b2ce39013c3e6e", + "spider": "https://fongmi.cachefly.net/FongMi/CatVodSpider/main/jar/custom_spider.jar;md5;08e60753eb29394b75c088e1f06dfb17", "wallpaper": "http://饭太硬.top/深色壁纸/api.php", "sites": [ { @@ -65,6 +65,15 @@ "searchable": 1, "changeable": 1 }, + { + "key": "haiwaikan", + "name": "海外看", + "type": 1, + "api": "https://haiwaikan.com/api.php/provide/vod", + "searchable": 1, + "changeable": 1, + "proxy": true + }, { "key": "暴風", "name": "暴風",