diff --git a/app/src/main/java/com/github/catvod/api/QuarkApi.java b/app/src/main/java/com/github/catvod/api/QuarkApi.java index be038aae..f364f499 100644 --- a/app/src/main/java/com/github/catvod/api/QuarkApi.java +++ b/app/src/main/java/com/github/catvod/api/QuarkApi.java @@ -37,6 +37,7 @@ import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Collectors; public class QuarkApi { private String apiUrl = "https://drive-pc.quark.cn/1/clouddrive/"; @@ -60,11 +61,54 @@ public class QuarkApi { String url = Util.base64Decode(params.get("url")); Map header = new Gson().fromJson(Util.base64Decode(params.get("header")), Map.class); if (header == null) header = new HashMap<>(); - List keys = Arrays.asList("referer", "icy-metadata", "range", "connection", "accept-encoding", "user-agent"); - for (String key : params.keySet()) if (keys.contains(key)) header.put(key, params.get(key)); + List arr = List.of("Accept", "Accept-Encoding", "Accept-Language", "Cookie", "Origin", "Referer", "Sec-Ch-Ua", "Sec-Ch-Ua-Mobile", "Sec-Ch-Ua-Platform", "Sec-Fetch-Dest", "Sec-Fetch-Mode", "Sec-Fetch-Site", "User-Agent"); + for (String key : params.keySet()) { + for (String s : arr) { + if (s.toLowerCase().equals(key)) { + header.put(key, params.get(key)); + } + } + + } + if (Util.getExt(url).contains("m3u8")) { + return getM3u8(url, header); + } return ProxyVideo.proxy(url, header); } + /** + * 代理m3u8 + * + * @param url + * @param header + * @return + */ + private Object[] getM3u8(String url, Map header) { + + OkResult result = OkHttp.get(url, new HashMap<>(), header); + String[] m3u8Arr = result.getBody().split("\n"); + List listM3u8 = new ArrayList<>(); + + String site = url.substring(0, url.lastIndexOf("/")) + "/"; + int mediaId = 0; + for (String oneLine : m3u8Arr) { + String thisOne = oneLine; + if (oneLine.contains(".ts")) { + thisOne = proxyVideoUrl(site + thisOne, header); + mediaId++; + } + listM3u8.add(thisOne); + } + String m3u8Str = TextUtils.join("\n", listM3u8); + String contentType = result.getResp().get("Content-Type").get(0); + + Map respHeaders = new HashMap<>(); + for (String key : result.getResp().keySet()) { + respHeaders.put(key, result.getResp().get(key).get(0)); + } + return new Object[]{result.getCode(), contentType, new ByteArrayInputStream(m3u8Str.getBytes(Charset.forName("UTF-8"))), respHeaders}; + } + private static class Loader { static volatile QuarkApi INSTANCE = new QuarkApi(); } @@ -201,6 +245,7 @@ public class QuarkApi { } if (okResult.getCode() != 200 && leftRetry > 0) { + SpiderDebug.log("api error code:" + okResult.getCode()); Thread.sleep(1000); return api(url, params, data, leftRetry - 1, method); } diff --git a/app/src/main/java/com/github/catvod/spider/Proxy.java b/app/src/main/java/com/github/catvod/spider/Proxy.java index a049aabd..b3b60630 100644 --- a/app/src/main/java/com/github/catvod/spider/Proxy.java +++ b/app/src/main/java/com/github/catvod/spider/Proxy.java @@ -47,11 +47,11 @@ public class Proxy extends Spider { String url = Util.base64Decode(params.get("url")); Map header = new Gson().fromJson(Util.base64Decode(params.get("header")), Map.class); if (header == null) header = new HashMap<>(); - List keys = Arrays.asList("referer", "range", "connection", "accept-encoding"); - for (String key : params.keySet()) if (keys.contains(key)) header.put(key, params.get(key)); - /* for (Map.Entry entry : params.entrySet()) { + /* List keys = Arrays.asList("referer", "range", "connection", "accept-encoding"); + for (String key : params.keySet()) if (keys.contains(key)) header.put(key, params.get(key));*/ + for (Map.Entry entry : params.entrySet()) { if (!keys.contains(entry.getKey())) header.put(entry.getKey(), entry.getValue()); - }*/ + } return ProxyVideo.proxy(url, header); } 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 0562c63d..357e3fae 100644 --- a/app/src/main/java/com/github/catvod/utils/ProxyVideo.java +++ b/app/src/main/java/com/github/catvod/utils/ProxyVideo.java @@ -57,17 +57,21 @@ public class ProxyVideo { SpiderDebug.log(" ++end proxy:"); SpiderDebug.log(" ++proxy res code:" + response.code()); SpiderDebug.log(" ++proxy res header:" + Json.toJson(headers)); - // SpiderDebug.log(" ++proxy res data:" + Json.toJson(response.body())); + // SpiderDebug.log(" ++proxy res data:" + Json.toJson(response.body())); String contentType = response.headers().get("Content-Type"); String contentDisposition = response.headers().get("Content-Disposition"); if (contentDisposition != null) contentType = getMimeType(contentDisposition); Map respHeaders = new HashMap<>(); - for (String key : response.headers().names()) + /* 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 body:" + response.body()); SpiderDebug.log("++proxy res respHeaders:" + Json.toJson(respHeaders)); - return new Object[]{206, contentType, response.body().byteStream(), respHeaders}; + return new Object[]{response.code(), contentType, response.body().byteStream(), respHeaders}; } private static String getMimeType(String contentDisposition) { diff --git a/app/src/test/java/QuarkTest.java b/app/src/test/java/QuarkTest.java index 8bac3025..3e2773c5 100644 --- a/app/src/test/java/QuarkTest.java +++ b/app/src/test/java/QuarkTest.java @@ -28,7 +28,7 @@ public class QuarkTest { Init.init(mockContext); spider = new Quark(); // spider.init(mockContext, "b-user-id=89ede34e-0efc-e1dd-c997-f16aaa792d0c; _UP_A4A_11_=wb9661c6dfb642f88f73d8e0c7edd398; b-user-id=89ede34e-0efc-e1dd-c997-f16aaa792d0c; ctoken=wla6p3EUOLyn1FSB8IKp1SEW; grey-id=5583e32b-39df-4bf0-f39f-1adf83f604a2; grey-id.sig=p8ReBIMG2BeZu1sYvsuOAZxYbx-MVrsfKEiCv87MsTM; isQuark=true; isQuark.sig=hUgqObykqFom5Y09bll94T1sS9abT1X-4Df_lzgl8nM; _UP_F7E_8D_=ZkyvVHnrBLp1A1NFJIjWi0PwKLOVbxJPcg0RzQPI6KmBtV6ZMgPh38l93pgubgHDQqhaZ2Sfc0qv%2BRantbfg1mWGAUpRMP4RqXP78Wvu%2FCfvkWWGc5NhCTV71tGOIGgDBR3%2Bu6%2Fjj44KlE5biSNDOWW7Bigcz27lvOTidzNw8s%2FWtKAIxWbnCzZn4%2FJMBUub1SIMcW89g57k4mfPmDlCgpZKzxwl6beSfdtZ4RUWXmZOn5v5NkxVKhU4wR0Pq7NklczEGdRq2nIAcu7v22Uw2o%2FxMY0xBdeC9Korm5%2FNHnxl6K%2Bd6FXSoT9a3XIMQO359auZPiZWzrNlZe%2BqnOahXcx7KAhQIRqSOapSmL4ygJor4r5isJhRuDoXy7vJAVuH%2FRDtEJJ8rZTq0BdC23Bz%2B0MrsdgbK%2BiW; _UP_D_=pc; __wpkreporterwid_=3d3f74a7-99b7-4916-3f78-911fc2eb9d87; tfstk=fIoZNxjnbhKwPOu0TWZ4LsaRqirTcudSSmNbnxD0C5VgClMm8xMyB-GsnSu4tjpOflAOmSD-9PNiGl120XrgkVNb1SrqHbJBN3tSBAEYoQOWVUUg9qZ8n1bGGkD3CqGYINKSBABhjnXgp3_Vywz6gSc0Syj3BWf0mr2DLW24eZfiiovEKWefj1q0swq3E82iNEMinMy7SLrcpA4Fh3z_ZAViCfih3PbtdW5N_DuU77AaTijmYRkL2Wq54ENoy5a7ZXxCbok33XzS7QSZgxD-oyoVsdGotql0p2dVu7umC4nLStbiLmParc4FELHrI-c0u2dPVRrs8zoZWKCnIbNZrlHfUCMUz2z8KyXVSlgSFmUojh58OzeqTzgwaGll4YCYKwctDV5coP2LL79eKHxpNTXHmre1kZU32JPWCR_AkP2LL79eLZQY-WeUNdw1.; __pus=2051c82285199d8be553be41dd5a2100AAQ+mmv35G4FDDZ5x+3Mhe2OMbNgweQ1ODbW8zDt9YuP1LQVqHUuAAz9KWLsPjpNtim0AVGHusN4MCosTmbq/khM; __kp=e6604120-6051-11ef-bfe4-c31b6cdd0766; __kps=AATcZArVgS76EPn0FMaV4HEj; __ktd=sii/iz4ePzEaoVirXul7QQ==; __uid=AATcZArVgS76EPn0FMaV4HEj; __itrace_wid=5829b95d-dac1-48d3-bfd5-f60cd9462786; __puus=7da0b96cb710fa1b376934485f977e05AATp/q8/QupT7IiBR1GWqZhxlIRT677smMvoHlLxQA0Lk6CkP0YJBOTl+p9DZgzlMz6w4hPXPgWsokukk8PW7ZfhFfPmv8tKMgLpCGLW+tk57luhNghmSdTeVPkAF59STtyCPBEtiNzNAd/zZJ6qILJDi5ywEBAAAg+gOyWHoLHNUR+QxeHRuQa8g5WWA95J8jebIlrr8rCvI1vjTbtiYktT"); - spider.init(mockContext, "_UP_A4A_11_=wb9681fbaed6454a8112f31e53b5c0be; __pus=45beefa93e8775c9211487d0c8ddd2b1AASCmV5S7LY0dfX90N3p4wU/G4f/oS0gZK6cpxZMZiDtXt9s7KiSs3tVZOXnIDel69C9KaQ61IQlnLYH2rS4NGjO; __kp=fe663a90-68d5-11ef-8b23-e77b0eaa352c; __kps=AAT32Fob+vq66znO5UHSHAPi; __ktd=39oXE+BT53YlFgUfFVq9kw==; __uid=AAT32Fob+vq66znO5UHSHAPi; __puus=e9bde845408e93af1466983e6b7bb77eAASV1aKJKLRXGjvHRfwQJ5gum8y8i9CLDg/1kYtsXwaDklrMDOpCfXVExH7eX4QNuVG1SuHST0ZtZaxbtu50l4sqUzmPKVAMMJEGs+9LhaK77A1oR6EKxF0KU3xDtZqXuzLq1F6rTp4c6FxCAI88Pn2cAyfjRUKXgWa0rayxqa05xpMb8j2TozOp32D57rY1VlMZ5cIey07SBkUKhEu3wWCb"); + spider.init(mockContext, "_UP_A4A_11_=wb9681fbaed6454a8112f31e53b5c0be; __pus=45beefa93e8775c9211487d0c8ddd2b1AASCmV5S7LY0dfX90N3p4wU/G4f/oS0gZK6cpxZMZiDtXt9s7KiSs3tVZOXnIDel69C9KaQ61IQlnLYH2rS4NGjO; __kp=fe663a90-68d5-11ef-8b23-e77b0eaa352c; __kps=AAT32Fob+vq66znO5UHSHAPi; __ktd=39oXE+BT53YlFgUfFVq9kw==; __uid=AAT32Fob+vq66znO5UHSHAPi; xlly_s=1; b-user-id=91d551ad-db9e-f092-2b42-aa4db35b8ed0; isg=BNXVFRgkH_dXwTuJ8PizGl2W5NGP0onkjXrhLld60cybrvegHyMutYcsfLIYrqGc; tfstk=fNlSqGqmrgj57RpyCwL4hfk8bfFCODOw9waKS2CPJ7F-JWib0zWyEJ-IhDn42_P82ZEQ7caRpHf8M9aTxuFEUuzKc2nJry8uwiCY7PzLvzeLHsUUP6Ud9WQoncuOabJuT6NutWKwbCRZz4V39rUtZ-SukyUWT_U8JbtmmvxwbCR2eZFBVhkeml_RcyqYyzEdwENYSyFdv_nLD-UT7gFKvWLbHy4G2aCLJoUYJoEL9WnKkjXR5y97q4TY2O9qutVEyo1soja-eT0zc6CKGxw7XBrf96hbPqfsiZf6LlHg4RrtDI57OqUIcRkWf_iIJVDLhXsJzcnxdDUmnH6Qfv3rIj2RJT3jOuwtw-_9SVg8JDeInh1aP7kbCbMk-i3-buMTZ2764qwshR4YHw68aAuZtRhJNGq4IyibQYt1NcIzH1r_KcBClRfQll8Xl9Xh_6YQJFIaDQy8ozw2lEs-K8U0ll8Xl9X3er477ETf2vf..; __puus=514ad4334da84f912529719d557085b2AASV1aKJKLRXGjvHRfwQJ5gupjOzlxgeAImozKKYdppZduMrKS7Q5+3hUZZ0f6zk7YpAGu7p0GVPYojTpZdhvnamXzCBLryM3ULhlqkw9yR6oVeTr3b1MituYgqfeFM4jHi4ASNiLk22pCNKteAtD6aowAM0K1ZFVc7j7xlpxLEgS1CoNSttupAb56Zf+ruuTkDPsjZPiRW1S4yM/kduA247"); Server.get().start(); } @@ -52,7 +52,7 @@ public class QuarkTest { @org.junit.Test public void playerContent() throws Exception { - String content = spider.playerContent("普画","41ea9a50cbdd4e50b019bcd78687ebc1++3c38f4a8b87188d81633c55aef00747a++38c5e16d71f7++ReE6ClCfgTBsiAAzpjRF2pYcFyLTDPIqiGt/PvBsJcw=",new ArrayList<>()); + String content = spider.playerContent("普画","41ea9a50cbdd4e50b019bcd78687ebc1++22fc6fa8350d22e0eaecc49035368e81++38c5e16d71f7++WFcYTmRhjJpKTui56aleYdzBZi9R203GERBVzYNxDxI=",new ArrayList<>()); System.out.println("playerContent--" + content); JsonObject map = Json.safeObject(content); Gson gson = new GsonBuilder().setPrettyPrinting().create(); diff --git a/jar/custom_spider.jar b/jar/custom_spider.jar index 8a48fb83..cb689401 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 cb0d60fd..5db772ca 100644 --- a/jar/custom_spider.jar.md5 +++ b/jar/custom_spider.jar.md5 @@ -1 +1 @@ -07c518ab9e85fa73e318af38b8486a93 +8d6adb1f27ff7b40e75af17dc25b782d diff --git a/json/index.json b/json/index.json index 52e63485..150e029e 100644 --- a/json/index.json +++ b/json/index.json @@ -1,5 +1,5 @@ { - "spider": "https://androidcatvodspider.pages.dev/jar/custom_spider.jar;md5;07c518ab9e85fa73e318af38b8486a93", + "spider": "https://androidcatvodspider.pages.dev/jar/custom_spider.jar;md5;8d6adb1f27ff7b40e75af17dc25b782d", "lives": [ { "name": "直播ipv6", diff --git a/json/index1.json b/json/index1.json index 09739dfa..ef1f192c 100644 --- a/json/index1.json +++ b/json/index1.json @@ -1,5 +1,5 @@ { - "spider": "https://androidcatvodspider.pages.dev/jar/custom_spider.jar;md5;07c518ab9e85fa73e318af38b8486a93", + "spider": "https://androidcatvodspider.pages.dev/jar/custom_spider.jar;md5;8d6adb1f27ff7b40e75af17dc25b782d", "lives": [ { "name": "直播ipv6", diff --git a/json/index2.json b/json/index2.json index 1934a42b..e12a72fb 100644 --- a/json/index2.json +++ b/json/index2.json @@ -1,5 +1,5 @@ { - "spider": "https://androidcatvodspider.pages.dev/jar/custom_spider.jar;md5;07c518ab9e85fa73e318af38b8486a93", + "spider": "https://androidcatvodspider.pages.dev/jar/custom_spider.jar;md5;8d6adb1f27ff7b40e75af17dc25b782d", "lives": [ { "name": "直播ipv6",