diff --git a/app/src/main/java/com/github/catvod/spider/Cloud.java b/app/src/main/java/com/github/catvod/spider/Cloud.java index 0ff435fa..6b4b92bf 100644 --- a/app/src/main/java/com/github/catvod/spider/Cloud.java +++ b/app/src/main/java/com/github/catvod/spider/Cloud.java @@ -9,15 +9,12 @@ import com.github.catvod.utils.Json; import com.github.catvod.utils.Util; import com.google.gson.JsonObject; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.tuple.ImmutablePair; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Objects; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.CopyOnWriteArrayList; +import java.util.*; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.concurrent.Future; import static com.github.catvod.api.TianyiApi.URL_CONTAIN; @@ -32,6 +29,7 @@ public class Cloud extends Spider { private YiDongYun yiDongYun = null; private BaiDuPan baiDuPan = null; private Pan123 pan123 = null; + private static final Map, List>> resultMap = new HashMap<>(); @Override public void init(Context context, String extend) throws Exception { @@ -101,69 +99,92 @@ public class Cloud extends Spider { } protected String detailContentVodPlayFrom(List shareLinks) { - - List from = new ArrayList<>(); - int i = 0; - for (String shareLink : shareLinks) { - i++; - if (shareLink.matches(Util.patternUC)) { - from.add(uc.detailContentVodPlayFrom(List.of(shareLink), i)); - } else if (shareLink.matches(Util.patternQuark)) { - from.add(quark.detailContentVodPlayFrom(List.of(shareLink), i)); - } /*else if (shareLink.matches(Util.patternAli)) { - from.add(ali.detailContentVodPlayFrom(List.of(shareLink), i)); - } */ else if (shareLink.contains(URL_CONTAIN)) { - from.add(tianYi.detailContentVodPlayFrom(List.of(shareLink), i)); - } else if (shareLink.contains(YiDongYun.URL_START)) { - from.add(yiDongYun.detailContentVodPlayFrom(List.of(shareLink), i)); - } else if (shareLink.contains(BaiDuPan.URL_START)) { - from.add(baiDuPan.detailContentVodPlayFrom(List.of(shareLink), i)); - } else if (shareLink.matches(Pan123Api.regex)) { - from.add(pan123.detailContentVodPlayFrom(List.of(shareLink), i)); - } + ImmutablePair, List> pairs = resultMap.get(Util.MD5(Json.toJson(shareLinks))); + if (pairs != null && pairs.left != null && !pairs.left.isEmpty()) { + return TextUtils.join("$$$", pairs.right); } - return TextUtils.join("$$$", from); + getPlayFromAndUrl(shareLinks); + pairs = resultMap.get(Util.MD5(Json.toJson(shareLinks))); + if (pairs != null && pairs.left != null && !pairs.left.isEmpty()) { + return TextUtils.join("$$$", pairs.right); + } + return ""; + } protected String detailContentVodPlayUrl(List shareLinks) { + ImmutablePair, List> pairs = resultMap.get(Util.MD5(Json.toJson(shareLinks))); + if (pairs != null && pairs.left != null && !pairs.left.isEmpty()) { + return TextUtils.join("$$$", pairs.left); + } - List urls = new CopyOnWriteArrayList<>(); + getPlayFromAndUrl(shareLinks); + pairs = resultMap.get(Util.MD5(Json.toJson(shareLinks))); + if (pairs != null && pairs.left != null && !pairs.left.isEmpty()) { + return TextUtils.join("$$$", pairs.left); + } + return ""; + } + + + //同時获取from 和url ,放入缓存,只要一个函数执行就行,避免重复执行 + private void getPlayFromAndUrl(List shareLinks) { + //首先清空缓存,避免太多缓存 + resultMap.clear(); + List urls = new ArrayList<>(); + List froms = new ArrayList<>(); ExecutorService service = Executors.newFixedThreadPool(4); - List> futures = new ArrayList<>(); + List>> futures = new ArrayList<>(); + int i = 0; for (String shareLink : shareLinks) { - futures.add(CompletableFuture.supplyAsync(() -> { + + int finalI = ++i; + futures.add(service.submit(() -> { String url = ""; + String from = ""; if (shareLink.matches(Util.patternUC)) { url = uc.detailContentVodPlayUrl(List.of(shareLink)); + from = uc.detailContentVodPlayFrom(List.of(shareLink), finalI); } else if (shareLink.matches(Util.patternQuark)) { url = quark.detailContentVodPlayUrl(List.of(shareLink)); + from = quark.detailContentVodPlayFrom(List.of(shareLink), finalI); }/* else if (shareLink.matches(Util.patternAli)) { urls.add(ali.detailContentVodPlayUrl(List.of(shareLink))); } */ else if (shareLink.contains(URL_CONTAIN)) { url = tianYi.detailContentVodPlayUrl(List.of(shareLink)); + from = tianYi.detailContentVodPlayFrom(List.of(shareLink), finalI); } else if (shareLink.contains(YiDongYun.URL_START)) { url = yiDongYun.detailContentVodPlayUrl(List.of(shareLink)); + from = yiDongYun.detailContentVodPlayFrom(List.of(shareLink), finalI); } else if (shareLink.contains(BaiDuPan.URL_START)) { url = baiDuPan.detailContentVodPlayUrl(List.of(shareLink)); + from = baiDuPan.detailContentVodPlayFrom(List.of(shareLink), finalI); } else if (shareLink.matches(Pan123Api.regex)) { url = pan123.detailContentVodPlayUrl(List.of(shareLink)); + from = pan123.detailContentVodPlayFrom(List.of(shareLink), finalI); } - return url; - }, service)); + return new ImmutablePair(url, from); + })); } try { - for (CompletableFuture future : futures) { - urls.add(future.get()); + for (Future> future : futures) { + //只有连接不为空才放入进去 + if (StringUtils.isNoneBlank(future.get().left)) { + urls.add(future.get().left); + froms.add(future.get().right); + } + } } catch (Exception e) { SpiderDebug.log("获取异步结果出错:" + e); } + resultMap.put(Util.MD5(Json.toJson(shareLinks)), new ImmutablePair, List>(urls, froms)); SpiderDebug.log("---urls:" + Json.toJson(urls)); + SpiderDebug.log("---froms:" + Json.toJson(froms)); service.shutdown(); - return StringUtils.join(urls, "$$$"); } } diff --git a/app/src/main/java/com/github/catvod/spider/Quark.java b/app/src/main/java/com/github/catvod/spider/Quark.java index 3b489356..d613d244 100644 --- a/app/src/main/java/com/github/catvod/spider/Quark.java +++ b/app/src/main/java/com/github/catvod/spider/Quark.java @@ -75,10 +75,10 @@ public class Quark extends Spider { for (String id : ids) { ShareData shareData = QuarkApi.get().getShareData(id); try { - playUrl.add(QuarkApi.get().getVod(shareData)==null?" $$$ ":QuarkApi.get().getVod(shareData).getVodPlayUrl()); + playUrl.add(QuarkApi.get().getVod(shareData)==null?"":QuarkApi.get().getVod(shareData).getVodPlayUrl()); } catch (Exception e) { SpiderDebug.log("获取播放地址出错:" + e.getMessage()); - playUrl.add(" $$$ "); + playUrl.add(""); } } return TextUtils.join("$$$", playUrl);