From d61be8aa5636860bd62760636aebf008fb8fcbb8 Mon Sep 17 00:00:00 2001 From: jhengazuji Date: Sat, 8 Nov 2025 14:02:25 +0800 Subject: [PATCH] Fix hook bug --- app/libs/hook-release.aar | Bin 6682 -> 5816 bytes .../main/java/com/fongmi/android/tv/App.java | 3 +- .../com/fongmi/android/tv/api/EpgParser.java | 19 +++----- .../java/com/fongmi/android/tv/bean/Epg.java | 4 +- .../fongmi/android/tv/player/ParseJob.java | 9 +++- .../android/tv/ui/custom/CustomWebView.java | 8 ++-- .../com/fongmi/android/tv/utils/Util.java | 14 ++++-- .../fongmi/android/tv/utils/WebViewUtil.java | 44 ++++++++++++++++++ .../main/java/com/fongmi/hook/Chromium.java | 43 ++--------------- 9 files changed, 80 insertions(+), 64 deletions(-) create mode 100644 app/src/main/java/com/fongmi/android/tv/utils/WebViewUtil.java diff --git a/app/libs/hook-release.aar b/app/libs/hook-release.aar index 976bdca94e38d45ce8568b7531164ea169037a41..179856a41a3e03ce569f00a66b8a82ca1071830c 100644 GIT binary patch delta 5116 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 delta 6013 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 epg.getList().add(getEpgData(programme))); return epg; } @@ -91,10 +92,10 @@ public class EpgParser { String xmlChannelId = programme.getChannel(); Channel targetChannel = findTargetChannel(xmlChannelId, liveChannelMap, data.map); if (targetChannel == null) continue; - Date startDate = parse(formatFull, programme.getStart()); + Date startDate = Util.parse(formatFull, programme.getStart()); if (!isToday(startDate.getTime())) continue; String liveTvgId = targetChannel.getTvgId(); - Date endDate = parse(formatFull, programme.getStop()); + Date endDate = Util.parse(formatFull, programme.getStop()); epgMap.computeIfAbsent(liveTvgId, key -> Epg.create(key, today)).getList().add(getEpgData(startDate, endDate, programme)); Optional.ofNullable(data.map.get(xmlChannelId)).filter(Tv.Channel::hasSrc).ifPresent(ch -> srcMap.putIfAbsent(liveTvgId, ch.getSrc())); } @@ -120,8 +121,8 @@ public class EpgParser { } private static EpgData getEpgData(Tv.Programme programme) { - Date startDate = parse(formatFull, programme.getStart()); - Date endDate = parse(formatFull, programme.getStop()); + Date startDate = Util.parse(formatFull, programme.getStart()); + Date endDate = Util.parse(formatFull, programme.getStop()); return getEpgData(startDate, endDate, programme); } @@ -139,14 +140,6 @@ public class EpgParser { } } - private static Date parse(SimpleDateFormat format, String source) { - try { - return format.parse(source); - } catch (Exception e) { - return new Date(0); - } - } - private static class XmlData { Tv tv; diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Epg.java b/app/src/main/java/com/fongmi/android/tv/bean/Epg.java index 89d748118..dd14e4d6c 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Epg.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Epg.java @@ -81,8 +81,8 @@ public class Epg { private void setTime(List formats) { setList(new ArrayList<>(new LinkedHashSet<>(getList()))); for (EpgData item : getList()) { - item.setStartTime(Util.format(getDate().concat(item.getStart()), formats)); - item.setEndTime(Util.format(getDate().concat(item.getEnd()), formats)); + item.setStartTime(Util.parse(formats, getDate().concat(item.getStart()))); + item.setEndTime(Util.parse(formats, getDate().concat(item.getEnd()))); if (item.getEndTime() < item.getStartTime()) item.checkDay(); item.setTitle(Trans.s2t(item.getTitle())); } diff --git a/app/src/main/java/com/fongmi/android/tv/player/ParseJob.java b/app/src/main/java/com/fongmi/android/tv/player/ParseJob.java index 0228b03d7..364009285 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/ParseJob.java +++ b/app/src/main/java/com/fongmi/android/tv/player/ParseJob.java @@ -12,6 +12,7 @@ import com.fongmi.android.tv.impl.ParseCallback; import com.fongmi.android.tv.server.Server; import com.fongmi.android.tv.ui.custom.CustomWebView; import com.fongmi.android.tv.utils.UrlUtil; +import com.fongmi.android.tv.utils.WebViewUtil; import com.github.catvod.net.OkHttp; import com.github.catvod.utils.Json; import com.github.catvod.utils.Util; @@ -185,8 +186,12 @@ public class ParseJob implements ParseCallback { } private void startWeb(String key, String from, Map headers, String url, String click) { - App.post(() -> webViews.add(CustomWebView.create(App.get()).start(key, from, headers, url, click, this, !url.contains("player/?url=")))); - App.get().setSniff(true); + if (WebViewUtil.support()) { + App.post(() -> webViews.add(CustomWebView.create(App.get()).start(key, from, headers, url, click, this, !url.contains("player/?url=")))); + App.get().setSniff(true); + } else { + onParseError(); + } } private Map getHeader(JsonObject object) { 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 eb9cff05e..644d97d1f 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 @@ -61,7 +61,7 @@ public class CustomWebView extends WebView implements DialogInterface.OnDismissL return new CustomWebView(context); } - public CustomWebView(@NonNull Context context) { + private CustomWebView(@NonNull Context context) { super(context); initSettings(); } @@ -121,7 +121,7 @@ public class CustomWebView extends WebView implements DialogInterface.OnDismissL String host = request.getUrl().getHost(); if (TextUtils.isEmpty(host) || isAd(host)) return empty; Map headers = request.getRequestHeaders(); - if (url.contains("/cdn-cgi/challenge-platform/")) App.post(() -> showDialog()); + if (url.contains("/cdn-cgi/challenge-platform/")) post(() -> showDialog()); if (detect && PLAYER.matcher(url).find() && addUrl(url)) onParseAdd(headers, url); else if (isVideoFormat(url)) onParseSuccess(headers, url); return super.shouldInterceptRequest(view, request); @@ -204,13 +204,13 @@ public class CustomWebView extends WebView implements DialogInterface.OnDismissL } private void onParseAdd(Map headers, String url) { - App.post(() -> CustomWebView.create(App.get()).start(key, from, headers, url, click, callback, false)); + post(() -> CustomWebView.create(App.get()).start(key, from, headers, url, click, callback, false)); } private void onParseSuccess(Map headers, String url) { if (callback != null) callback.onParseSuccess(headers, url, from); SpiderDebug.log(TAG, "url=%s, headers=%s", url, headers); - App.post(() -> stop(false)); + post(() -> stop(false)); callback = null; } 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 3720eb993..6154b328a 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 @@ -31,6 +31,7 @@ import java.net.NetworkInterface; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; +import java.util.Date; import java.util.Formatter; import java.util.List; @@ -179,9 +180,16 @@ public class Util { return text; } - public static long format(String src, List formats) { - for (SimpleDateFormat format : formats) try { return format.parse(src).getTime(); } catch (Exception ignored) {} - return 0; + public static Date parse(SimpleDateFormat format, String source) { + try { + return format.parse(source); + } catch (Exception e) { + return new Date(0); + } + } + + public static long parse(List formats, String source) { + return formats.stream().map(format -> parse(format, source)).map(Date::getTime).filter(time -> time > 0).findFirst().orElse(0L); } public static boolean isLeanback() { diff --git a/app/src/main/java/com/fongmi/android/tv/utils/WebViewUtil.java b/app/src/main/java/com/fongmi/android/tv/utils/WebViewUtil.java new file mode 100644 index 000000000..a107e7de7 --- /dev/null +++ b/app/src/main/java/com/fongmi/android/tv/utils/WebViewUtil.java @@ -0,0 +1,44 @@ +package com.fongmi.android.tv.utils; + +import android.content.pm.PackageManager; +import android.webkit.CookieManager; + +import com.fongmi.android.tv.App; + +import java.util.Set; + +public class WebViewUtil { + + private static final String SYSTEM_SETTINGS_PACKAGE = "com.android.settings"; + + private static final Set BROWSER_PACKAGES = Set.of( + "com.android.chrome", + "com.mi.globalbrowser", + "com.huawei.browser", + "com.heytap.browser", + "com.vivo.browser" + ); + + private static boolean installed(PackageManager pm, String pkg) { + try { + pm.getPackageInfo(pkg, PackageManager.GET_META_DATA); + return true; + } catch (PackageManager.NameNotFoundException ignored) { + return false; + } + } + + public static String spoof() { + PackageManager pm = App.get().getPackageManager(); + return BROWSER_PACKAGES.stream().filter(packageName -> installed(pm, packageName)).findFirst().orElse(SYSTEM_SETTINGS_PACKAGE); + } + + public static boolean support() { + try { + CookieManager.getInstance(); + } catch (Throwable e) { + return false; + } + return App.get().getPackageManager().hasSystemFeature(PackageManager.FEATURE_WEBVIEW); + } +} diff --git a/hook/src/main/java/com/fongmi/hook/Chromium.java b/hook/src/main/java/com/fongmi/hook/Chromium.java index e190be373..6adb8a5d4 100644 --- a/hook/src/main/java/com/fongmi/hook/Chromium.java +++ b/hook/src/main/java/com/fongmi/hook/Chromium.java @@ -1,54 +1,19 @@ package com.fongmi.hook; -import android.content.Context; -import android.content.pm.PackageManager; import android.os.Looper; import java.util.Arrays; -import java.util.Set; public class Chromium { - private static final String SYSTEM_SETTINGS_PACKAGE = "com.android.settings"; - - private static final Set CHROMIUM_CLASS_NAMES = Set.of( - "org.chromium.base.buildinfo", - "org.chromium.base.apkinfo" - ); - - private static final Set CHROMIUM_METHOD_NAMES = Set.of( - "getall", - "getpackagename", - "" - ); - - private static final Set BROWSER_PACKAGES = Set.of( - "com.android.chrome", - "com.mi.globalbrowser", - "com.huawei.browser", - "com.heytap.browser", - "com.vivo.browser" - ); - - private static boolean isInstalled(PackageManager pm, String pkg) { - try { - pm.getPackageInfo(pkg, PackageManager.GET_META_DATA); - return true; - } catch (PackageManager.NameNotFoundException ignored) { - return false; - } - } + private static final String CLASS_NAME = "org.chromium.base.buildinfo"; + private static final String METHOD_NAME = "getall"; public static boolean find() { try { - return Arrays.stream(Looper.getMainLooper().getThread().getStackTrace()).anyMatch(trace -> CHROMIUM_CLASS_NAMES.contains(trace.getClassName().toLowerCase()) && CHROMIUM_METHOD_NAMES.contains(trace.getMethodName().toLowerCase())); - } catch (Exception e) { + return Arrays.stream(Looper.getMainLooper().getThread().getStackTrace()).anyMatch(trace -> CLASS_NAME.equalsIgnoreCase(trace.getClassName()) && METHOD_NAME.equalsIgnoreCase(trace.getMethodName())); + } catch (Throwable ignored) { return false; } } - - public static String spoofedPackageName(Context context) { - PackageManager pm = context.getPackageManager(); - return BROWSER_PACKAGES.stream().filter(packageName -> isInstalled(pm, packageName)).findFirst().orElse(SYSTEM_SETTINGS_PACKAGE); - } }