diff --git a/app/src/main/java/com/github/catvod/utils/ProxyVideo.java b/app/src/main/java/com/github/catvod/utils/ProxyVideo.java index 3c943373..bf860e74 100644 --- a/app/src/main/java/com/github/catvod/utils/ProxyVideo.java +++ b/app/src/main/java/com/github/catvod/utils/ProxyVideo.java @@ -11,8 +11,6 @@ import com.google.gson.Gson; import org.apache.commons.lang3.StringUtils; import org.json.JSONObject; -import java.io.InputStream; -import java.io.SequenceInputStream; import java.net.URLEncoder; import java.nio.charset.Charset; import java.util.ArrayList; @@ -20,10 +18,6 @@ import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; -import java.util.Vector; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Future; import okhttp3.Response; @@ -103,113 +97,7 @@ public class ProxyVideo { } public static Object[] proxyMultiThread(String url, Map headers) { - ExecutorService service = Executors.newFixedThreadPool(THREAD_NUM); - SpiderDebug.log("--proxyMultiThread: THREAD_NUM " + THREAD_NUM); - - SequenceInputStream in = null; - try { - - - //缓存,避免每次都请求total等信息 - Object[] info = infos.get(url); - if (info == null) { - infos.clear(); - info = getInfo(url, headers); - infos.put(url, info); - } - - int code = (int) info[0]; - if (code != 206) { - return proxy(url, headers); - } - Map resHeader = (Map) info[3]; - String contentRange = StringUtils.isAllBlank(resHeader.get("Content-Range")) ? resHeader.get("content-range") : resHeader.get("Content-Range"); - SpiderDebug.log("--contentRange:" + contentRange); - //文件总大小 - String total = StringUtils.split(contentRange, "/")[1]; - SpiderDebug.log("--文件总大小:" + total); - - //如果文件太小,也不走代理 - if (Long.parseLong(total) < 1024 * 1024 * 100) { - return proxy(url, headers); - } - String range = StringUtils.isAllBlank(headers.get("range")) ? headers.get("Range") : headers.get("range"); - SpiderDebug.log("---proxyMultiThread,Range:" + range); - - //没有range,强行给他一个range,让他去分片 - if (StringUtils.isAllBlank(range)) { - range = "bytes=0-"; - } - - Map rangeObj = parseRange(range); - List partList = generatePart(rangeObj, total); - - // 存储执行结果的List - List> results = new ArrayList<>(); - for (long[] part : partList) { - - String newRange = "bytes=" + part[0] + "-" + part[1]; - SpiderDebug.log("下载开始" + ";newRange:" + newRange); - - Map headerNew = new HashMap<>(headers); - - headerNew.put("range", newRange); - headerNew.put("Range", newRange); - Future result = service.submit(() -> { - try { - - return OkHttp.newCall(url, headerNew); - } catch (Exception e) { - throw new RuntimeException(e); - } - }); - results.add(result); - } - List inputStreams = new ArrayList<>(); - - for (int i = 0; i < THREAD_NUM; i++) { - // 获取包含返回结果的future对象 - Future future = results.get(i); - // 从future中取出执行结果(若尚未返回结果,则get方法被阻塞,直到结果被返回为止) - Response response = future.get(); - okhttp3.ResponseBody body = response.body(); - /* int bytesRead; - while ((bytesRead = body.byteStream().read(bytes)) != -1) { - out.write(bytes, 0, bytesRead); - }*/ - inputStreams.add(body.byteStream()); - - - SpiderDebug.log("---第" + i + "块下载完成" + ";Content-Range:" + response.headers().get("Content-Range")); - SpiderDebug.log("---第" + i + "块下载完成" + ";content-range:" + response.headers().get("content-range")); - - } - in = new SequenceInputStream(new Vector<>(inputStreams).elements()); - service.shutdown(); - String contentType = StringUtils.isAllBlank(resHeader.get("Content-Type")) ? resHeader.get("content-type") : resHeader.get("Content-Type"); - String contentDisposition = resHeader.get("Content-Disposition"); - if (contentDisposition != null && StringUtils.isAllBlank(contentType)) { - contentType = getMimeType(contentDisposition); - } - /* respHeaders.put("Access-Control-Allow-Credentials", "true"); - respHeaders.put("Access-Control-Allow-Origin", "*");*/ - - - resHeader.put("Content-Length", String.valueOf(partList.get(THREAD_NUM - 1)[1] - partList.get(0)[0] + 1)); - // respHeaders.put("content-length", String.valueOf(bytes.length)); - resHeader.put("Content-Range", String.format("bytes %s-%s/%s", partList.get(0)[0], partList.get(THREAD_NUM - 1)[1], total)); - // respHeaders.put("content-range", String.format("bytes %s-%s/%s", partList.get(0)[0], partList.get(THREAD_NUM - 1)[1], total)); - SpiderDebug.log("++proxy res contentType:" + contentType); - // SpiderDebug.log("++proxy res body:" + response.body()); - SpiderDebug.log("++proxy res respHeaders:" + Json.toJson(resHeader)); - return new Object[]{206, contentType, in, resHeader}; - - - } catch (Exception e) { - SpiderDebug.log("proxyMultiThread error:" + e.getMessage()); - e.printStackTrace(); - return null; - } + return DownloadMT.INSTANCE.proxyMultiThread(url, headers); } public static List generatePart(Map rangeObj, String total) { diff --git a/jar/custom_spider.jar b/jar/custom_spider.jar index 3c465208..e4245e10 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 95bd9ff8..be1bea08 100644 --- a/jar/custom_spider.jar.md5 +++ b/jar/custom_spider.jar.md5 @@ -1 +1 @@ -0cab1186330902b80785825911735a7d +860afdcd1a39fd5c0bcfae2b0652ec7c diff --git a/json/test.json b/json/test.json index 02bde962..29f7033f 100644 --- a/json/test.json +++ b/json/test.json @@ -1,5 +1,5 @@ { - "spider": "https://gh-proxy.com/https://raw.githubusercontent.com/lushunming/AndroidCatVodSpider/multiThread/jar/custom_spider.jar;md5;2f2f43db60e7493b3af54c85a8172218", + "spider": "https://gh-proxy.com/https://raw.githubusercontent.com/lushunming/AndroidCatVodSpider/multiThreadkt/jar/custom_spider.jar;md5;860afdcd1a39fd5c0bcfae2b0652ec7c", "lives": [ { "name": "电视直播",