From 1564523fcd94155d92c6e21d0f1ff565dbc4281a Mon Sep 17 00:00:00 2001 From: FongMi Date: Tue, 16 Apr 2024 10:18:41 +0800 Subject: [PATCH 01/10] Merge pull request #398 from jadehh/release * Add md5X Function and Support Post "raw" Methods --- .../main/java/com/fongmi/quickjs/method/Global.java | 8 ++++++++ .../main/java/com/fongmi/quickjs/utils/Connect.java | 7 +++++++ .../main/java/com/fongmi/quickjs/utils/Crypto.java | 11 +++++++++++ 3 files changed, 26 insertions(+) diff --git a/quickjs/src/main/java/com/fongmi/quickjs/method/Global.java b/quickjs/src/main/java/com/fongmi/quickjs/method/Global.java index 65c1f64aa..3be1acfed 100644 --- a/quickjs/src/main/java/com/fongmi/quickjs/method/Global.java +++ b/quickjs/src/main/java/com/fongmi/quickjs/method/Global.java @@ -147,6 +147,14 @@ public class Global { return parser.joinUrl(parent, child); } + @Keep + @JSMethod + public String md5X(String text) { + String result = Crypto.md5(text); + Logger.t("md5X").d("text:%s\nresult:\n%s" , text, result); + return result; + } + @Keep @JSMethod public String aesX(String mode, boolean encrypt, String input, boolean inBase64, String key, String iv, boolean outBase64) { diff --git a/quickjs/src/main/java/com/fongmi/quickjs/utils/Connect.java b/quickjs/src/main/java/com/fongmi/quickjs/utils/Connect.java index b6ac1fecc..0508daa2c 100644 --- a/quickjs/src/main/java/com/fongmi/quickjs/utils/Connect.java +++ b/quickjs/src/main/java/com/fongmi/quickjs/utils/Connect.java @@ -68,6 +68,7 @@ public class Connect { if (req.getData() != null && "json".equals(req.getPostType())) return getJsonBody(req); if (req.getData() != null && "form".equals(req.getPostType())) return getFormBody(req); if (req.getData() != null && "form-data".equals(req.getPostType())) return getFormDataBody(req); + if (req.getData() != null && "raw".equals(req.getPostType())) return getRawBody(req); if (req.getBody() != null && contentType != null) return RequestBody.create(req.getBody(), MediaType.get(contentType)); return RequestBody.create("", null); } @@ -76,6 +77,10 @@ public class Connect { return RequestBody.create(req.getData().toString(), MediaType.get("application/json")); } + private static RequestBody getRawBody(Req req) { + return RequestBody.create(req.getData().toString(), MediaType.get("application/json; charset=utf-8")); + } + private static RequestBody getFormBody(Req req) { FormBody.Builder builder = new FormBody.Builder(); Map params = Json.toMap(req.getData()); @@ -91,6 +96,8 @@ public class Connect { return builder.build(); } + + private static void setHeader(QuickJSContext ctx, Response res, JSObject object) { for (Map.Entry> entry : res.headers().toMultimap().entrySet()) { if (entry.getValue().size() == 1) object.setProperty(entry.getKey(), entry.getValue().get(0)); diff --git a/quickjs/src/main/java/com/fongmi/quickjs/utils/Crypto.java b/quickjs/src/main/java/com/fongmi/quickjs/utils/Crypto.java index ee66a02f7..1ef28f03f 100644 --- a/quickjs/src/main/java/com/fongmi/quickjs/utils/Crypto.java +++ b/quickjs/src/main/java/com/fongmi/quickjs/utils/Crypto.java @@ -14,9 +14,20 @@ import java.util.Arrays; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; +import com.github.catvod.utils.Util; public class Crypto { + public static String md5(String text) { + try { + return Util.md5(text); + } catch (Exception e) { + e.printStackTrace(); + return ""; + } + } + + public static String aes(String mode, boolean encrypt, String input, boolean inBase64, String key, String iv, boolean outBase64) { try { byte[] keyBuf = key.getBytes(); From b02c9087fea5a15582ed6cbc95bd2d74ed5b5587 Mon Sep 17 00:00:00 2001 From: FongMi Date: Tue, 16 Apr 2024 12:07:22 +0800 Subject: [PATCH 02/10] Clean code --- .../src/main/java/com/fongmi/quickjs/method/Global.java | 4 ++-- .../src/main/java/com/fongmi/quickjs/utils/Connect.java | 7 ------- quickjs/src/main/java/com/fongmi/quickjs/utils/Crypto.java | 4 ++-- 3 files changed, 4 insertions(+), 11 deletions(-) diff --git a/quickjs/src/main/java/com/fongmi/quickjs/method/Global.java b/quickjs/src/main/java/com/fongmi/quickjs/method/Global.java index 3be1acfed..2b4760a7c 100644 --- a/quickjs/src/main/java/com/fongmi/quickjs/method/Global.java +++ b/quickjs/src/main/java/com/fongmi/quickjs/method/Global.java @@ -150,8 +150,8 @@ public class Global { @Keep @JSMethod public String md5X(String text) { - String result = Crypto.md5(text); - Logger.t("md5X").d("text:%s\nresult:\n%s" , text, result); + String result = Crypto.md5(text); + Logger.t("md5X").d("text:%s\nresult:\n%s", text, result); return result; } diff --git a/quickjs/src/main/java/com/fongmi/quickjs/utils/Connect.java b/quickjs/src/main/java/com/fongmi/quickjs/utils/Connect.java index 0508daa2c..f8b1925d2 100644 --- a/quickjs/src/main/java/com/fongmi/quickjs/utils/Connect.java +++ b/quickjs/src/main/java/com/fongmi/quickjs/utils/Connect.java @@ -68,16 +68,11 @@ public class Connect { if (req.getData() != null && "json".equals(req.getPostType())) return getJsonBody(req); if (req.getData() != null && "form".equals(req.getPostType())) return getFormBody(req); if (req.getData() != null && "form-data".equals(req.getPostType())) return getFormDataBody(req); - if (req.getData() != null && "raw".equals(req.getPostType())) return getRawBody(req); if (req.getBody() != null && contentType != null) return RequestBody.create(req.getBody(), MediaType.get(contentType)); return RequestBody.create("", null); } private static RequestBody getJsonBody(Req req) { - return RequestBody.create(req.getData().toString(), MediaType.get("application/json")); - } - - private static RequestBody getRawBody(Req req) { return RequestBody.create(req.getData().toString(), MediaType.get("application/json; charset=utf-8")); } @@ -96,8 +91,6 @@ public class Connect { return builder.build(); } - - private static void setHeader(QuickJSContext ctx, Response res, JSObject object) { for (Map.Entry> entry : res.headers().toMultimap().entrySet()) { if (entry.getValue().size() == 1) object.setProperty(entry.getKey(), entry.getValue().get(0)); diff --git a/quickjs/src/main/java/com/fongmi/quickjs/utils/Crypto.java b/quickjs/src/main/java/com/fongmi/quickjs/utils/Crypto.java index 1ef28f03f..44357c97d 100644 --- a/quickjs/src/main/java/com/fongmi/quickjs/utils/Crypto.java +++ b/quickjs/src/main/java/com/fongmi/quickjs/utils/Crypto.java @@ -2,6 +2,8 @@ package com.fongmi.quickjs.utils; import android.util.Base64; +import com.github.catvod.utils.Util; + import java.security.Key; import java.security.KeyFactory; import java.security.PublicKey; @@ -14,7 +16,6 @@ import java.util.Arrays; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; -import com.github.catvod.utils.Util; public class Crypto { @@ -27,7 +28,6 @@ public class Crypto { } } - public static String aes(String mode, boolean encrypt, String input, boolean inBase64, String key, String iv, boolean outBase64) { try { byte[] keyBuf = key.getBytes(); From 1db34ab13e29c80d0613837a8cae04972ef570e8 Mon Sep 17 00:00:00 2001 From: FongMi Date: Sat, 20 Apr 2024 17:11:44 +0800 Subject: [PATCH 03/10] Fix bug --- .../android/tv/ui/custom/CustomWebView.java | 3 ++- .../com/github/catvod/net/OkCookieJar.java | 26 +++++++++++++++---- .../com/fongmi/quickjs/utils/Connect.java | 2 ++ 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/fongmi/android/tv/ui/custom/CustomWebView.java b/app/src/main/java/com/fongmi/android/tv/ui/custom/CustomWebView.java index 26982414f..3d57378ff 100644 --- a/app/src/main/java/com/fongmi/android/tv/ui/custom/CustomWebView.java +++ b/app/src/main/java/com/fongmi/android/tv/ui/custom/CustomWebView.java @@ -31,6 +31,7 @@ import com.fongmi.android.tv.bean.Site; import com.fongmi.android.tv.impl.ParseCallback; import com.fongmi.android.tv.utils.Sniffer; import com.github.catvod.crawler.Spider; +import com.github.catvod.net.OkCookieJar; import com.google.common.net.HttpHeaders; import com.orhanobut.logger.Logger; @@ -113,7 +114,7 @@ public class CustomWebView extends WebView { private void checkHeader(String url, Map headers) { for (String key : headers.keySet()) { - if (HttpHeaders.COOKIE.equalsIgnoreCase(key)) CookieManager.getInstance().setCookie(url, headers.get(key)); + if (HttpHeaders.COOKIE.equalsIgnoreCase(key)) OkCookieJar.sync(url, headers.get(key)); if (HttpHeaders.USER_AGENT.equalsIgnoreCase(key)) getSettings().setUserAgentString(headers.get(key)); } } diff --git a/catvod/src/main/java/com/github/catvod/net/OkCookieJar.java b/catvod/src/main/java/com/github/catvod/net/OkCookieJar.java index 31dd93265..f4b3ded10 100644 --- a/catvod/src/main/java/com/github/catvod/net/OkCookieJar.java +++ b/catvod/src/main/java/com/github/catvod/net/OkCookieJar.java @@ -6,7 +6,6 @@ import android.webkit.CookieManager; import androidx.annotation.NonNull; import java.util.ArrayList; -import java.util.Collection; import java.util.Collections; import java.util.List; @@ -16,23 +15,40 @@ import okhttp3.HttpUrl; public class OkCookieJar implements CookieJar { + private CookieManager manager; + + public OkCookieJar() { + try { + manager = CookieManager.getInstance(); + } catch (Throwable ignored) { + } + } + + public static void sync(String url, String cookie) { + if (TextUtils.isEmpty(cookie)) return; + for (String split : cookie.split(";")) { + CookieManager.getInstance().setCookie(url, split); + } + } + @NonNull @Override public synchronized List loadForRequest(@NonNull HttpUrl url) { try { List items = new ArrayList<>(); - String cookie = CookieManager.getInstance().getCookie(url.toString()); - if (!TextUtils.isEmpty(cookie)) for (String split : cookie.split(";")) items.add(Cookie.parse(url, split)); + String cookie = manager.getCookie(url.toString()); + if (TextUtils.isEmpty(cookie)) return Collections.emptyList(); + for (String split : cookie.split(";")) items.add(Cookie.parse(url, split)); return items; } catch (Throwable e) { - return new ArrayList<>(); + return Collections.emptyList(); } } @Override public synchronized void saveFromResponse(@NonNull HttpUrl url, @NonNull List cookies) { try { - for (Cookie cookie : cookies) CookieManager.getInstance().setCookie(url.toString(), cookie.toString()); + for (Cookie cookie : cookies) manager.setCookie(url.toString(), cookie.toString()); } catch (Throwable ignored) { } } diff --git a/quickjs/src/main/java/com/fongmi/quickjs/utils/Connect.java b/quickjs/src/main/java/com/fongmi/quickjs/utils/Connect.java index f8b1925d2..d593aed37 100644 --- a/quickjs/src/main/java/com/fongmi/quickjs/utils/Connect.java +++ b/quickjs/src/main/java/com/fongmi/quickjs/utils/Connect.java @@ -1,6 +1,7 @@ package com.fongmi.quickjs.utils; import com.fongmi.quickjs.bean.Req; +import com.github.catvod.net.OkCookieJar; import com.github.catvod.net.OkHttp; import com.github.catvod.utils.Json; import com.github.catvod.utils.Util; @@ -25,6 +26,7 @@ import okhttp3.Response; public class Connect { public static Call to(String url, Req req) { + OkCookieJar.sync(url, req.getHeader().get(HttpHeaders.COOKIE)); OkHttpClient client = OkHttp.client(req.isRedirect(), req.getTimeout()); return client.newCall(getRequest(url, req, Headers.of(req.getHeader()))); } From 08ce6499ae76fc4280e6b119a6e1db975c61058e Mon Sep 17 00:00:00 2001 From: FongMi Date: Sat, 20 Apr 2024 22:16:50 +0800 Subject: [PATCH 04/10] Optimize Interceptor --- .../com/github/catvod/net/OkCookieJar.java | 7 ++-- .../java/com/github/catvod/net/OkHttp.java | 4 ++- .../net/interceptor/RequestInterceptor.java | 33 +++++++++++++++++++ .../ResponseInterceptor.java} | 20 ++--------- .../com/fongmi/quickjs/utils/Connect.java | 1 - 5 files changed, 43 insertions(+), 22 deletions(-) create mode 100644 catvod/src/main/java/com/github/catvod/net/interceptor/RequestInterceptor.java rename catvod/src/main/java/com/github/catvod/net/{OkInterceptor.java => interceptor/ResponseInterceptor.java} (70%) diff --git a/catvod/src/main/java/com/github/catvod/net/OkCookieJar.java b/catvod/src/main/java/com/github/catvod/net/OkCookieJar.java index f4b3ded10..338e989b1 100644 --- a/catvod/src/main/java/com/github/catvod/net/OkCookieJar.java +++ b/catvod/src/main/java/com/github/catvod/net/OkCookieJar.java @@ -25,9 +25,10 @@ public class OkCookieJar implements CookieJar { } public static void sync(String url, String cookie) { - if (TextUtils.isEmpty(cookie)) return; - for (String split : cookie.split(";")) { - CookieManager.getInstance().setCookie(url, split); + try { + if (TextUtils.isEmpty(cookie)) return; + for (String split : cookie.split(";")) CookieManager.getInstance().setCookie(url, split); + } catch (Throwable ignored) { } } diff --git a/catvod/src/main/java/com/github/catvod/net/OkHttp.java b/catvod/src/main/java/com/github/catvod/net/OkHttp.java index e27fc8571..f2e7cceab 100644 --- a/catvod/src/main/java/com/github/catvod/net/OkHttp.java +++ b/catvod/src/main/java/com/github/catvod/net/OkHttp.java @@ -5,6 +5,8 @@ import android.text.TextUtils; import androidx.collection.ArrayMap; import com.github.catvod.bean.Doh; +import com.github.catvod.net.interceptor.ResponseInterceptor; +import com.github.catvod.net.interceptor.RequestInterceptor; import com.github.catvod.utils.Path; import java.net.ProxySelector; @@ -131,7 +133,7 @@ public class OkHttp { } private static OkHttpClient.Builder getBuilder() { - OkHttpClient.Builder builder = new OkHttpClient.Builder().cookieJar(new OkCookieJar()).addNetworkInterceptor(new OkInterceptor()).connectTimeout(TIMEOUT, TimeUnit.MILLISECONDS).readTimeout(TIMEOUT, TimeUnit.MILLISECONDS).writeTimeout(TIMEOUT, TimeUnit.MILLISECONDS).dns(dns()).hostnameVerifier((hostname, session) -> true).followRedirects(true).sslSocketFactory(new SSLCompat(), SSLCompat.TM); + OkHttpClient.Builder builder = new OkHttpClient.Builder().cookieJar(new OkCookieJar()).addInterceptor(new RequestInterceptor()).addNetworkInterceptor(new ResponseInterceptor()).connectTimeout(TIMEOUT, TimeUnit.MILLISECONDS).readTimeout(TIMEOUT, TimeUnit.MILLISECONDS).writeTimeout(TIMEOUT, TimeUnit.MILLISECONDS).dns(dns()).hostnameVerifier((hostname, session) -> true).followRedirects(true).sslSocketFactory(new SSLCompat(), SSLCompat.TM); builder.proxySelector(get().proxy ? selector() : defaultSelector); return builder; } diff --git a/catvod/src/main/java/com/github/catvod/net/interceptor/RequestInterceptor.java b/catvod/src/main/java/com/github/catvod/net/interceptor/RequestInterceptor.java new file mode 100644 index 000000000..e010d0898 --- /dev/null +++ b/catvod/src/main/java/com/github/catvod/net/interceptor/RequestInterceptor.java @@ -0,0 +1,33 @@ +package com.github.catvod.net.interceptor; + +import androidx.annotation.NonNull; + +import com.github.catvod.Proxy; +import com.github.catvod.net.OkCookieJar; +import com.github.catvod.utils.Util; +import com.google.common.net.HttpHeaders; + +import java.io.IOException; +import java.net.URI; + +import okhttp3.Interceptor; +import okhttp3.Request; +import okhttp3.Response; + +public class RequestInterceptor implements Interceptor { + + @NonNull + @Override + public Response intercept(@NonNull Chain chain) throws IOException { + Request request = chain.request(); + URI uri = request.url().uri(); + String url = request.url().toString(); + Request.Builder builder = request.newBuilder(); + OkCookieJar.sync(url, request.header(HttpHeaders.COOKIE)); + boolean local = url.contains(":" + Proxy.getPort() + "/"); + if (url.contains("+") && local) builder.url(url.replace("+", "%2B")); + if (url.contains("gitcode.net")) builder.header(HttpHeaders.USER_AGENT, Util.CHROME); + if (uri.getUserInfo() != null) builder.header(HttpHeaders.AUTHORIZATION, Util.basic(uri.getUserInfo())); + return chain.proceed(builder.build()); + } +} diff --git a/catvod/src/main/java/com/github/catvod/net/OkInterceptor.java b/catvod/src/main/java/com/github/catvod/net/interceptor/ResponseInterceptor.java similarity index 70% rename from catvod/src/main/java/com/github/catvod/net/OkInterceptor.java rename to catvod/src/main/java/com/github/catvod/net/interceptor/ResponseInterceptor.java index 9401db592..8faf1a1c1 100644 --- a/catvod/src/main/java/com/github/catvod/net/OkInterceptor.java +++ b/catvod/src/main/java/com/github/catvod/net/interceptor/ResponseInterceptor.java @@ -1,33 +1,30 @@ -package com.github.catvod.net; +package com.github.catvod.net.interceptor; import android.net.Uri; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import com.github.catvod.Proxy; import com.github.catvod.utils.Util; import com.google.common.net.HttpHeaders; import java.io.IOException; -import java.net.URI; import java.util.zip.Inflater; import java.util.zip.InflaterInputStream; import okhttp3.Interceptor; import okhttp3.MediaType; -import okhttp3.Request; import okhttp3.Response; import okhttp3.ResponseBody; import okio.BufferedSource; import okio.Okio; -public class OkInterceptor implements Interceptor { +public class ResponseInterceptor implements Interceptor { @NonNull @Override public Response intercept(@NonNull Chain chain) throws IOException { - Response response = chain.proceed(getRequest(chain.request())); + Response response = chain.proceed(chain.request()); String location = response.header(HttpHeaders.LOCATION); String encoding = response.header(HttpHeaders.CONTENT_ENCODING); if (response.isRedirect() && location != null) checkAuth(response, location); @@ -35,17 +32,6 @@ public class OkInterceptor implements Interceptor { return response; } - private Request getRequest(Request request) { - URI uri = request.url().uri(); - String url = request.url().toString(); - Request.Builder builder = request.newBuilder(); - boolean local = url.contains(":" + Proxy.getPort() + "/"); - if (url.contains("+") && local) builder.url(url.replace("+", "%2B")); - if (url.contains("gitcode.net")) builder.header(HttpHeaders.USER_AGENT, Util.CHROME); - if (uri.getUserInfo() != null) builder.header(HttpHeaders.AUTHORIZATION, Util.basic(uri.getUserInfo())); - return builder.build(); - } - private void checkAuth(Response response, String location) { try { Uri uri = Uri.parse(location); diff --git a/quickjs/src/main/java/com/fongmi/quickjs/utils/Connect.java b/quickjs/src/main/java/com/fongmi/quickjs/utils/Connect.java index d593aed37..9ca20a809 100644 --- a/quickjs/src/main/java/com/fongmi/quickjs/utils/Connect.java +++ b/quickjs/src/main/java/com/fongmi/quickjs/utils/Connect.java @@ -26,7 +26,6 @@ import okhttp3.Response; public class Connect { public static Call to(String url, Req req) { - OkCookieJar.sync(url, req.getHeader().get(HttpHeaders.COOKIE)); OkHttpClient client = OkHttp.client(req.isRedirect(), req.getTimeout()); return client.newCall(getRequest(url, req, Headers.of(req.getHeader()))); } From 838d8733ec8803195a1348d55f86d9b6000962af Mon Sep 17 00:00:00 2001 From: FongMi Date: Sat, 20 Apr 2024 22:32:46 +0800 Subject: [PATCH 05/10] Clean code --- .../android/tv/ui/custom/CustomWebView.java | 10 ++-------- .../com/github/catvod/net/OkCookieJar.java | 20 +++++++++++++++++-- .../java/com/github/catvod/net/OkHttp.java | 4 ++-- 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/fongmi/android/tv/ui/custom/CustomWebView.java b/app/src/main/java/com/fongmi/android/tv/ui/custom/CustomWebView.java index 3d57378ff..f0ab70358 100644 --- a/app/src/main/java/com/fongmi/android/tv/ui/custom/CustomWebView.java +++ b/app/src/main/java/com/fongmi/android/tv/ui/custom/CustomWebView.java @@ -91,7 +91,6 @@ public class CustomWebView extends WebView { getSettings().setMediaPlaybackRequiresUserGesture(false); getSettings().setJavaScriptCanOpenWindowsAutomatically(false); getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); - CookieManager.getInstance().setAcceptThirdPartyCookies(this, true); setWebViewClient(webViewClient()); setWebChromeClient(webChromeClient()); } @@ -108,6 +107,7 @@ public class CustomWebView extends WebView { } private void start(String url, Map headers) { + OkCookieJar.setAcceptThirdPartyCookies(this); checkHeader(url, headers); loadUrl(url, headers); } @@ -129,7 +129,7 @@ public class CustomWebView extends WebView { if (TextUtils.isEmpty(host) || VodConfig.get().getAds().contains(host)) return empty; if (url.contains("challenges.cloudflare.com/cdn-cgi")) App.post(() -> showDialog()); if (detect && url.contains("player/?url=")) onParseAdd(headers, url); - else if (isVideoFormat(url)) interrupt(headers, url); + else if (isVideoFormat(url)) onParseSuccess(headers, url); return super.shouldInterceptRequest(view, request); } @@ -211,12 +211,6 @@ public class CustomWebView extends WebView { } } - private void interrupt(Map headers, String url) { - String cookie = CookieManager.getInstance().getCookie(url); - if (cookie != null) headers.put(HttpHeaders.COOKIE, cookie); - onParseSuccess(headers, url); - } - private void onParseAdd(Map headers, String url) { App.post(() -> CustomWebView.create(App.get()).start(key, from, headers, url, click, callback, false)); } diff --git a/catvod/src/main/java/com/github/catvod/net/OkCookieJar.java b/catvod/src/main/java/com/github/catvod/net/OkCookieJar.java index 338e989b1..48451aa0e 100644 --- a/catvod/src/main/java/com/github/catvod/net/OkCookieJar.java +++ b/catvod/src/main/java/com/github/catvod/net/OkCookieJar.java @@ -2,6 +2,7 @@ package com.github.catvod.net; import android.text.TextUtils; import android.webkit.CookieManager; +import android.webkit.WebView; import androidx.annotation.NonNull; @@ -17,17 +18,32 @@ public class OkCookieJar implements CookieJar { private CookieManager manager; - public OkCookieJar() { + private static class Loader { + static volatile OkCookieJar INSTANCE = new OkCookieJar(); + } + + public static OkCookieJar get() { + return Loader.INSTANCE; + } + + private OkCookieJar() { try { manager = CookieManager.getInstance(); } catch (Throwable ignored) { } } + public static void setAcceptThirdPartyCookies(WebView view) { + try { + get().manager.setAcceptThirdPartyCookies(view, true); + } catch (Throwable ignored) { + } + } + public static void sync(String url, String cookie) { try { if (TextUtils.isEmpty(cookie)) return; - for (String split : cookie.split(";")) CookieManager.getInstance().setCookie(url, split); + for (String split : cookie.split(";")) get().manager.setCookie(url, split); } catch (Throwable ignored) { } } diff --git a/catvod/src/main/java/com/github/catvod/net/OkHttp.java b/catvod/src/main/java/com/github/catvod/net/OkHttp.java index f2e7cceab..d19005eae 100644 --- a/catvod/src/main/java/com/github/catvod/net/OkHttp.java +++ b/catvod/src/main/java/com/github/catvod/net/OkHttp.java @@ -5,8 +5,8 @@ import android.text.TextUtils; import androidx.collection.ArrayMap; import com.github.catvod.bean.Doh; -import com.github.catvod.net.interceptor.ResponseInterceptor; import com.github.catvod.net.interceptor.RequestInterceptor; +import com.github.catvod.net.interceptor.ResponseInterceptor; import com.github.catvod.utils.Path; import java.net.ProxySelector; @@ -133,7 +133,7 @@ public class OkHttp { } private static OkHttpClient.Builder getBuilder() { - OkHttpClient.Builder builder = new OkHttpClient.Builder().cookieJar(new OkCookieJar()).addInterceptor(new RequestInterceptor()).addNetworkInterceptor(new ResponseInterceptor()).connectTimeout(TIMEOUT, TimeUnit.MILLISECONDS).readTimeout(TIMEOUT, TimeUnit.MILLISECONDS).writeTimeout(TIMEOUT, TimeUnit.MILLISECONDS).dns(dns()).hostnameVerifier((hostname, session) -> true).followRedirects(true).sslSocketFactory(new SSLCompat(), SSLCompat.TM); + OkHttpClient.Builder builder = new OkHttpClient.Builder().cookieJar(OkCookieJar.get()).addInterceptor(new RequestInterceptor()).addNetworkInterceptor(new ResponseInterceptor()).connectTimeout(TIMEOUT, TimeUnit.MILLISECONDS).readTimeout(TIMEOUT, TimeUnit.MILLISECONDS).writeTimeout(TIMEOUT, TimeUnit.MILLISECONDS).dns(dns()).hostnameVerifier((hostname, session) -> true).followRedirects(true).sslSocketFactory(new SSLCompat(), SSLCompat.TM); builder.proxySelector(get().proxy ? selector() : defaultSelector); return builder; } From 97b96a1fb4e8d0200b4dc708a3d4b9eb42d93d50 Mon Sep 17 00:00:00 2001 From: okjack Date: Sun, 28 Apr 2024 23:05:38 +0800 Subject: [PATCH 06/10] Fix bug --- .../java/com/fongmi/android/tv/ui/activity/VideoActivity.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java index 109c28f17..0d3904118 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java @@ -250,7 +250,8 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List } private Flag getFlag() { - return (Flag) mFlagAdapter.get(mBinding.flag.getSelectedPosition()); + int position = mBinding.flag.getSelectedPosition(); + return (Flag) mFlagAdapter.get(position < 0 ? 0 : position); } private Episode getEpisode() { From 2f1f43ab90319cb1b2f287cb0b709691e055ce20 Mon Sep 17 00:00:00 2001 From: okjack Date: Tue, 30 Apr 2024 18:50:01 +0800 Subject: [PATCH 07/10] Fix bug --- .../android/tv/ui/activity/VideoActivity.java | 28 ++++++++----------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java index 0d3904118..8797569f2 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java @@ -145,7 +145,6 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List private boolean initAuto; private boolean autoMode; private boolean useParse; - private int currentFlag; private int toggleCount; private int groupSize; private Runnable mR1; @@ -250,14 +249,18 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List } private Flag getFlag() { - int position = mBinding.flag.getSelectedPosition(); - return (Flag) mFlagAdapter.get(position < 0 ? 0 : position); + return (Flag) mFlagAdapter.get(getFlagPosition()); } private Episode getEpisode() { return (Episode) mEpisodeAdapter.get(getEpisodePosition()); } + private int getFlagPosition() { + for (int i = 0; i < mFlagAdapter.size(); i++) if (((Flag) mFlagAdapter.get(i)).isActivated()) return i; + return 0; + } + private int getEpisodePosition() { for (int i = 0; i < mEpisodeAdapter.size(); i++) if (((Episode) mEpisodeAdapter.get(i)).isActivated()) return i; return 0; @@ -700,13 +703,12 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List } public void setEpisodeActivated(Episode item) { + int flagPosition = getFlagPosition(); if (shouldEnterFullscreen(item)) return; - setCurrentFlag(mBinding.flag.getSelectedPosition()); - for (int i = 0; i < mFlagAdapter.size(); i++) ((Flag) mFlagAdapter.get(i)).toggle(getCurrentFlag() == i, item); + if (isFullscreen()) Notify.show(getString(R.string.play_ready, item.getName())); + for (int i = 0; i < mFlagAdapter.size(); i++) ((Flag) mFlagAdapter.get(i)).toggle(flagPosition == i, item); setEpisodeSelectedPosition(getEpisodePosition()); notifyItemChanged(getEpisodeView(), mEpisodeAdapter); - if (mEpisodeAdapter.size() == 0) return; - if (isFullscreen()) Notify.show(getString(R.string.play_ready, item.getName())); onRefresh(); } @@ -825,7 +827,7 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List mBinding.video.requestFocus(); mBinding.video.setForeground(null); mBinding.video.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT)); - mBinding.flag.setSelectedPosition(getCurrentFlag()); + mBinding.flag.setSelectedPosition(getFlagPosition()); mDanmakuContext.setScaleTextSize(1.2f * Setting.getDanmuSize()); setSubtitle(Setting.getSubtitle()); mKeyDown.setFull(true); @@ -1432,7 +1434,7 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List } private void checkFlag() { - int position = isGone(mBinding.flag) ? -1 : mBinding.flag.getSelectedPosition(); + int position = isGone(mBinding.flag) ? -1 : getFlagPosition(); if (position == mFlagAdapter.size() - 1) checkSearch(false); else nextFlag(position); } @@ -1583,14 +1585,6 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List this.useParse = useParse; } - public int getCurrentFlag() { - return currentFlag; - } - - public void setCurrentFlag(int currentFlag) { - this.currentFlag = currentFlag; - } - public int getToggleCount() { return toggleCount; } From 9fc1c0b4c592c595936bc7ae772cdb9b11b4b388 Mon Sep 17 00:00:00 2001 From: okjack Date: Tue, 30 Apr 2024 18:53:43 +0800 Subject: [PATCH 08/10] update --- app/src/leanback/res/layout/adapter_type.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/leanback/res/layout/adapter_type.xml b/app/src/leanback/res/layout/adapter_type.xml index 3d796fae6..bcc8f5848 100644 --- a/app/src/leanback/res/layout/adapter_type.xml +++ b/app/src/leanback/res/layout/adapter_type.xml @@ -9,5 +9,5 @@ android:focusableInTouchMode="true" android:gravity="center" android:textColor="@color/white" - android:textSize="18sp" + android:textSize="16sp" tools:text="電影" /> \ No newline at end of file From e4f92731772d23609534fa9369820971e91085c6 Mon Sep 17 00:00:00 2001 From: okjack Date: Tue, 30 Apr 2024 23:32:18 +0800 Subject: [PATCH 09/10] update --- app/build.gradle | 2 +- .../android/tv/ui/custom/CustomWebView.java | 1 - .../com/fongmi/android/tv/utils/Util.java | 6 ++++ .../android/tv/ui/activity/VideoActivity.java | 15 ++++++++- app/src/mobile/res/drawable/ic_battery_00.xml | 11 +++++++ app/src/mobile/res/drawable/ic_battery_25.xml | 9 ++++++ app/src/mobile/res/drawable/ic_battery_50.xml | 9 ++++++ app/src/mobile/res/drawable/ic_battery_75.xml | 9 ++++++ .../mobile/res/drawable/ic_battery_full.xml | 9 ++++++ .../mobile/res/layout/view_control_vod.xml | 31 +++++++++++++++++++ catvod/build.gradle | 1 + .../com/github/catvod/net/OkCookieJar.java | 4 +-- 12 files changed, 102 insertions(+), 5 deletions(-) create mode 100644 app/src/mobile/res/drawable/ic_battery_00.xml create mode 100644 app/src/mobile/res/drawable/ic_battery_25.xml create mode 100644 app/src/mobile/res/drawable/ic_battery_50.xml create mode 100644 app/src/mobile/res/drawable/ic_battery_75.xml create mode 100644 app/src/mobile/res/drawable/ic_battery_full.xml diff --git a/app/build.gradle b/app/build.gradle index 1e00bee16..80a3f8078 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -124,7 +124,7 @@ dependencies { implementation 'com.github.bumptech.glide:okhttp3-integration:4.16.0' implementation 'com.github.ctiao:DanmakuFlameMaster:0.9.25' implementation 'com.github.jahirfiquitiva:TextDrawable:1.0.3' - implementation('com.github.TeamNewPipe:NewPipeExtractor:v0.23.1') { exclude group: 'org.jsoup', module: 'jsoup' } + implementation('com.github.teamnewpipe:NewPipeExtractor:v0.23.1') { exclude group: 'org.jsoup', module: 'jsoup' } implementation 'com.github.thegrizzlylabs:sardine-android:0.9' implementation 'com.google.android.material:material:1.11.0' implementation 'com.google.net.cronet:cronet-okhttp:0.1.0' diff --git a/app/src/main/java/com/fongmi/android/tv/ui/custom/CustomWebView.java b/app/src/main/java/com/fongmi/android/tv/ui/custom/CustomWebView.java index f0ab70358..758ccc384 100644 --- a/app/src/main/java/com/fongmi/android/tv/ui/custom/CustomWebView.java +++ b/app/src/main/java/com/fongmi/android/tv/ui/custom/CustomWebView.java @@ -14,7 +14,6 @@ import com.tencent.smtt.export.external.interfaces.SslError; import com.tencent.smtt.export.external.interfaces.SslErrorHandler; import com.tencent.smtt.export.external.interfaces.WebResourceRequest; import com.tencent.smtt.export.external.interfaces.WebResourceResponse; -import com.tencent.smtt.sdk.CookieManager; import com.tencent.smtt.sdk.QbSdk; import com.tencent.smtt.sdk.WebChromeClient; import com.tencent.smtt.sdk.WebView; diff --git a/app/src/main/java/com/fongmi/android/tv/utils/Util.java b/app/src/main/java/com/fongmi/android/tv/utils/Util.java index fcba1a90c..bb6f81973 100644 --- a/app/src/main/java/com/fongmi/android/tv/utils/Util.java +++ b/app/src/main/java/com/fongmi/android/tv/utils/Util.java @@ -10,6 +10,7 @@ import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.res.Configuration; +import android.os.BatteryManager; import android.os.Build; import android.os.IBinder; import android.os.Parcelable; @@ -180,4 +181,9 @@ public class Util { return false; } + public static int batteryLevel() { + BatteryManager batteryManager = (BatteryManager) App.get().getSystemService(Context.BATTERY_SERVICE); + return batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY); + } + } diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java index 41092c9b2..3f2ed76f9 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java @@ -107,6 +107,7 @@ import org.greenrobot.eventbus.ThreadMode; import java.io.File; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.List; @@ -310,7 +311,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo mObserveSearch = this::setSearch; mDialogs = new ArrayList<>(); mBroken = new ArrayList<>(); - mClock = Clock.create(mBinding.display.time); + mClock = Clock.create(Arrays.asList(mBinding.display.time, mBinding.control.time)); mR0 = this::stopService; mR1 = this::hideControl; mR2 = this::setTraffic; @@ -1029,6 +1030,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo mBinding.control.danmu.setVisibility(isLock() || !mBinding.danmaku.isPrepared() ? View.GONE : View.VISIBLE); mBinding.control.danmuSetting.setVisibility(isLock() || !Setting.isDanmuLoad() || !isVisible(mBinding.danmaku) ? View.GONE : View.VISIBLE); mBinding.control.setting.setVisibility(mHistory == null || isFullscreen() ? View.GONE : View.VISIBLE); + mBinding.control.batteryInfo.setVisibility(isFullscreen() ? View.VISIBLE : View.GONE); mBinding.control.right.rotate.setVisibility(isFullscreen() && !isLock() ? View.VISIBLE : View.GONE); mBinding.control.keep.setVisibility(mHistory == null ? View.GONE : View.VISIBLE); mBinding.control.right.back.setVisibility(isFullscreen() && !isLock() ? View.VISIBLE : View.GONE); @@ -1043,6 +1045,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo mBinding.control.getRoot().setVisibility(View.VISIBLE); showDisplayInfo(); checkPlayImg(mPlayers.isPlaying()); + checkBatteryImg(); setR1Callback(); } @@ -1173,6 +1176,16 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo mBinding.control.danmu.setImageResource(Setting.isDanmu() ? R.drawable.ic_control_danmu_on : R.drawable.ic_control_danmu_off); } + private void checkBatteryImg() { + int batteryLevel = Util.batteryLevel(); + int resId = R.drawable.ic_battery_00; + if (batteryLevel >= 90) resId = R.drawable.ic_battery_full; + else if (batteryLevel >= 60) resId = R.drawable.ic_battery_75; + else if (batteryLevel >= 40) resId = R.drawable.ic_battery_50; + else if (batteryLevel >= 10) resId = R.drawable.ic_battery_25; + mBinding.control.battery.setImageResource(resId); + } + private void createKeep() { Keep keep = new Keep(); keep.setKey(getHistoryKey()); diff --git a/app/src/mobile/res/drawable/ic_battery_00.xml b/app/src/mobile/res/drawable/ic_battery_00.xml new file mode 100644 index 000000000..9cb1ef3a5 --- /dev/null +++ b/app/src/mobile/res/drawable/ic_battery_00.xml @@ -0,0 +1,11 @@ + + + + + diff --git a/app/src/mobile/res/drawable/ic_battery_25.xml b/app/src/mobile/res/drawable/ic_battery_25.xml new file mode 100644 index 000000000..8490e2603 --- /dev/null +++ b/app/src/mobile/res/drawable/ic_battery_25.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/mobile/res/drawable/ic_battery_50.xml b/app/src/mobile/res/drawable/ic_battery_50.xml new file mode 100644 index 000000000..13bc71137 --- /dev/null +++ b/app/src/mobile/res/drawable/ic_battery_50.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/mobile/res/drawable/ic_battery_75.xml b/app/src/mobile/res/drawable/ic_battery_75.xml new file mode 100644 index 000000000..06ebe8156 --- /dev/null +++ b/app/src/mobile/res/drawable/ic_battery_75.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/mobile/res/drawable/ic_battery_full.xml b/app/src/mobile/res/drawable/ic_battery_full.xml new file mode 100644 index 000000000..b05185351 --- /dev/null +++ b/app/src/mobile/res/drawable/ic_battery_full.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/mobile/res/layout/view_control_vod.xml b/app/src/mobile/res/layout/view_control_vod.xml index 29db0a64f..9b1180c3f 100644 --- a/app/src/mobile/res/layout/view_control_vod.xml +++ b/app/src/mobile/res/layout/view_control_vod.xml @@ -79,6 +79,37 @@ android:padding="8dp" android:src="@drawable/ic_control_setting" /> + + + + + + + + + diff --git a/catvod/build.gradle b/catvod/build.gradle index 8d26bb222..e60588173 100644 --- a/catvod/build.gradle +++ b/catvod/build.gradle @@ -20,4 +20,5 @@ dependencies { api 'com.squareup.okhttp3:okhttp:' + okhttpVersion api 'com.squareup.okhttp3:okhttp-dnsoverhttps:' + okhttpVersion api 'org.nanohttpd:nanohttpd:2.3.1' + api 'com.tencent.tbs:tbssdk:44286' } \ No newline at end of file diff --git a/catvod/src/main/java/com/github/catvod/net/OkCookieJar.java b/catvod/src/main/java/com/github/catvod/net/OkCookieJar.java index 48451aa0e..5c4e51944 100644 --- a/catvod/src/main/java/com/github/catvod/net/OkCookieJar.java +++ b/catvod/src/main/java/com/github/catvod/net/OkCookieJar.java @@ -1,8 +1,8 @@ package com.github.catvod.net; import android.text.TextUtils; -import android.webkit.CookieManager; -import android.webkit.WebView; +import com.tencent.smtt.sdk.CookieManager; +import com.tencent.smtt.sdk.WebView; import androidx.annotation.NonNull; From 9a6fd46e2986b4e3981a3d528ef3ef3555965825 Mon Sep 17 00:00:00 2001 From: okjack Date: Thu, 2 May 2024 10:14:47 +0800 Subject: [PATCH 10/10] build.gradle --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 80a3f8078..95691ade9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,7 +11,7 @@ android { minSdk 21 targetSdk 28 versionCode 233 - versionName "2.3.3" + versionName "0502" javaCompileOptions { annotationProcessorOptions { arguments = ["room.schemaLocation": "$projectDir/schemas".toString()]