package com.github.catvod.utils; import android.os.SystemClock; import android.text.TextUtils; import com.github.catvod.crawler.SpiderDebug; import com.github.catvod.net.OkHttp; import com.github.catvod.spider.Proxy; import com.google.gson.Gson; import org.apache.commons.lang3.StringUtils; import org.json.JSONObject; import java.net.URLEncoder; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import okhttp3.Response; public class ProxyVideo { private static final String GO_SERVER = "http://127.0.0.1:7777/"; //线程数4 private static final int THREAD_NUM = Runtime.getRuntime().availableProcessors() * 2; private static Map infos = new HashMap<>(); public static String buildCommonProxyUrl(String url, Map headers) { return Proxy.getUrl() + "?do=proxy&url=" + Util.base64Encode(url.getBytes(Charset.defaultCharset())) + "&header=" + Util.base64Encode((new Gson().toJson(headers)).getBytes(Charset.defaultCharset())); } public static void go() { boolean close = OkHttp.string(GO_SERVER).isEmpty(); if (close) OkHttp.string("http://127.0.0.1:" + Proxy.getPort() + "/go"); if (close) while (OkHttp.string(GO_SERVER).isEmpty()) SystemClock.sleep(20); } public static String goVer() { try { go(); String result = OkHttp.string(GO_SERVER + "version"); return new JSONObject(result).optString("version"); } catch (Exception e) { return ""; } } public static String url(String url, int thread) { if (!TextUtils.isEmpty(goVer()) && url.contains("/proxy?")) url += "&response=url"; return String.format(Locale.getDefault(), "%s?url=%s&thread=%d", GO_SERVER, URLEncoder.encode(url), thread); } public static Object[] proxy(String url, Map headers) throws Exception { SpiderDebug.log(" ++start proxy:"); SpiderDebug.log(" ++proxy url:" + url); SpiderDebug.log(" ++proxy header:" + Json.toJson(headers)); Response response = OkHttp.newCall(url, headers); SpiderDebug.log(" ++end proxy:"); SpiderDebug.log(" ++proxy res code:" + response.code()); SpiderDebug.log(" ++proxy res header:" + Json.toJson(response.headers())); // SpiderDebug.log(" ++proxy res data:" + Json.toJson(response.body())); String contentType = StringUtils.isAllBlank(response.headers().get("Content-Type")) ? response.headers().get("content-type") : response.headers().get("Content-Type"); String contentDisposition = response.headers().get("Content-Disposition"); if (contentDisposition != null && StringUtils.isAllBlank(contentType)) { contentType = getMimeType(contentDisposition); } Map respHeaders = new HashMap<>(); /* respHeaders.put("Access-Control-Allow-Credentials", "true"); respHeaders.put("Access-Control-Allow-Origin", "*");*/ for (String key : response.headers().names()) { respHeaders.put(key, response.headers().get(key)); } SpiderDebug.log("++proxy res contentType:" + contentType); // SpiderDebug.log("++proxy res body:" + response.body()); SpiderDebug.log("++proxy res respHeaders:" + Json.toJson(respHeaders)); return new Object[]{response.code(), contentType, response.body().byteStream(), respHeaders}; } public static Object[] getInfo(String url, Map headers) throws Exception { SpiderDebug.log("--proxyMultiThread: start "); Map newHeaders = new HashMap<>(headers); newHeaders.put("range", "bytes=0-0"); newHeaders.put("Range", "bytes=0-0"); Object[] info = proxy(url, newHeaders); return info; } public static Object[] proxyMultiThread(String url, Map headers) { return DownloadMT.INSTANCE.proxyMultiThread(url, headers); } public static Map parseRange(String range) { SpiderDebug.log("parseRange:" + range); if (StringUtils.isNoneBlank(range)) { String[] ranges = StringUtils.split(range.replace("bytes=", ""), "-"); String start = ranges[0]; String end = ranges.length > 1 ? ranges[1] : ""; return Map.of("start", start, "end", end); } return null; } public static String getMimeType(String contentDisposition) { if (contentDisposition.endsWith(".mp4")) { return "video/mp4"; } else if (contentDisposition.endsWith(".webm")) { return "video/webm"; } else if (contentDisposition.endsWith(".avi")) { return "video/x-msvideo"; } else if (contentDisposition.endsWith(".wmv")) { return "video/x-ms-wmv"; } else if (contentDisposition.endsWith(".flv")) { return "video/x-flv"; } else if (contentDisposition.endsWith(".mov")) { return "video/quicktime"; } else if (contentDisposition.endsWith(".mkv")) { return "video/x-matroska"; } else if (contentDisposition.endsWith(".mpeg")) { return "video/mpeg"; } else if (contentDisposition.endsWith(".3gp")) { return "video/3gpp"; } else if (contentDisposition.endsWith(".ts")) { return "video/MP2T"; } else if (contentDisposition.endsWith(".mp3")) { return "audio/mp3"; } else if (contentDisposition.endsWith(".wav")) { return "audio/wav"; } else if (contentDisposition.endsWith(".aac")) { return "audio/aac"; } else { return null; } } /** * 视频range */ }