From 5eff0e243cbbc3f7de578ef6256dd5cd071d8291 Mon Sep 17 00:00:00 2001 From: okjack Date: Mon, 13 May 2024 12:30:54 +0800 Subject: [PATCH 01/17] update --- app/src/main/java/com/fongmi/android/tv/utils/M3U8.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/fongmi/android/tv/utils/M3U8.java b/app/src/main/java/com/fongmi/android/tv/utils/M3U8.java index 613796579..66afb8f90 100644 --- a/app/src/main/java/com/fongmi/android/tv/utils/M3U8.java +++ b/app/src/main/java/com/fongmi/android/tv/utils/M3U8.java @@ -22,7 +22,7 @@ public class M3U8 { try { if (TextUtils.isEmpty(url)) return ""; Response response = OkHttp.newCall(url, getHeader(headers)).execute(); - if (response.header(HttpHeaders.ACCEPT_RANGES) != null && !url.contains(".m3u8")) return ""; + if (response.header(HttpHeaders.ACCEPT_RANGES) != null) return ""; String result = response.body().string(); Matcher matcher = Pattern.compile("#EXT-X-STREAM-INF(.*)\\n?(.*)").matcher(result.replaceAll("\r\n", "\n")); if (matcher.find() && matcher.groupCount() > 1) return get(UriUtil.resolve(url, matcher.group(2)), headers); From f61735769c5aebdef93b755c32de0cb05ab6e743 Mon Sep 17 00:00:00 2001 From: okjack Date: Mon, 13 May 2024 16:23:45 +0800 Subject: [PATCH 02/17] fix ijk content view --- ijkplayer/src/main/res/layout/ijk_player_view.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ijkplayer/src/main/res/layout/ijk_player_view.xml b/ijkplayer/src/main/res/layout/ijk_player_view.xml index 68bdea036..6178fead5 100644 --- a/ijkplayer/src/main/res/layout/ijk_player_view.xml +++ b/ijkplayer/src/main/res/layout/ijk_player_view.xml @@ -3,8 +3,9 @@ + android:layout_gravity="center" + android:layout_width="wrap_content" + android:layout_height="wrap_content"> Date: Tue, 14 May 2024 23:33:29 +0800 Subject: [PATCH 03/17] Fix bug --- .../java/com/fongmi/android/tv/ui/custom/CustomKeyDownLive.java | 2 +- .../java/com/fongmi/android/tv/ui/custom/CustomKeyDownVod.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/custom/CustomKeyDownLive.java b/app/src/mobile/java/com/fongmi/android/tv/ui/custom/CustomKeyDownLive.java index 90b017e30..604b3c7ee 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/custom/CustomKeyDownLive.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/custom/CustomKeyDownLive.java @@ -47,7 +47,7 @@ public class CustomKeyDownLive extends GestureDetector.SimpleOnGestureListener { public boolean onTouchEvent(MotionEvent e) { if (changeBright && e.getAction() == MotionEvent.ACTION_UP) listener.onBrightEnd(); if (changeVolume && e.getAction() == MotionEvent.ACTION_UP) listener.onVolumeEnd(); - return detector.onTouchEvent(e); + return e.getPointerCount() == 1 && detector.onTouchEvent(e); } public void setLock(boolean lock) { diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/custom/CustomKeyDownVod.java b/app/src/mobile/java/com/fongmi/android/tv/ui/custom/CustomKeyDownVod.java index adea3026b..ededb1ad0 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/custom/CustomKeyDownVod.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/custom/CustomKeyDownVod.java @@ -47,7 +47,7 @@ public class CustomKeyDownVod extends GestureDetector.SimpleOnGestureListener { if (changeSpeed && e.getAction() == MotionEvent.ACTION_UP) listener.onSpeedEnd(); if (changeBright && e.getAction() == MotionEvent.ACTION_UP) listener.onBrightEnd(); if (changeVolume && e.getAction() == MotionEvent.ACTION_UP) listener.onVolumeEnd(); - return detector.onTouchEvent(e); + return e.getPointerCount() == 1 && detector.onTouchEvent(e); } public void setLock(boolean lock) { From 718c1f40afa4277aa9f5b671ce64a60a40eb5990 Mon Sep 17 00:00:00 2001 From: okjack Date: Wed, 15 May 2024 10:58:44 +0800 Subject: [PATCH 04/17] Update InfoDialog.java,Update library --- app/build.gradle | 4 ++-- .../java/com/fongmi/android/tv/ui/dialog/InfoDialog.java | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 7c3d22fff..60bf44c7f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -126,11 +126,11 @@ dependencies { 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.thegrizzlylabs:sardine-android:0.9' - implementation 'com.google.android.material:material:1.11.0' + implementation 'com.google.android.material:material:1.12.0' implementation 'com.google.net.cronet:cronet-okhttp:0.1.0' implementation 'com.google.zxing:core:3.3.0' implementation 'com.guolindev.permissionx:permissionx:1.7.1' - implementation 'com.hierynomus:smbj:0.11.5' + implementation 'com.hierynomus:smbj:0.13.0' implementation 'org.chromium.net:cronet-embedded:76.3809.111' implementation 'org.eclipse.jetty:jetty-client:8.1.21.v20160908' implementation 'org.eclipse.jetty:jetty-server:8.1.21.v20160908' diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/InfoDialog.java b/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/InfoDialog.java index c4921a2c2..612fcf86a 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/InfoDialog.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/InfoDialog.java @@ -47,8 +47,7 @@ public class InfoDialog { } public InfoDialog url(String url) { - if (url.startsWith("data")) this.url = "data***"; - else this.url = url; + this.url = url.startsWith("data") ? url.substring(0, Math.min(url.length(), 128)).concat("...") : url; return this; } From 9215cf46a217efe01b1a5b5ab52fb83af82bf15e Mon Sep 17 00:00:00 2001 From: okjack Date: Wed, 15 May 2024 11:15:13 +0800 Subject: [PATCH 05/17] Optimize cf dialog --- .../android/tv/ui/dialog/WebDialog.java | 44 +++++++++++++++++++ .../android/tv/ui/custom/CustomWebView.java | 23 +++++----- .../android/tv/ui/dialog/WebDialog.java | 38 ++++++++++++++++ 3 files changed, 94 insertions(+), 11 deletions(-) create mode 100644 app/src/leanback/java/com/fongmi/android/tv/ui/dialog/WebDialog.java create mode 100644 app/src/mobile/java/com/fongmi/android/tv/ui/dialog/WebDialog.java diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/dialog/WebDialog.java b/app/src/leanback/java/com/fongmi/android/tv/ui/dialog/WebDialog.java new file mode 100644 index 000000000..d5e9748a9 --- /dev/null +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/dialog/WebDialog.java @@ -0,0 +1,44 @@ +package com.fongmi.android.tv.ui.dialog; + +import android.content.DialogInterface; +import android.view.View; +import android.view.WindowManager; + +import androidx.appcompat.app.AlertDialog; + +import com.fongmi.android.tv.App; +import com.fongmi.android.tv.utils.ResUtil; +import com.google.android.material.dialog.MaterialAlertDialogBuilder; + +public class WebDialog { + + private final AlertDialog dialog; + + public static WebDialog create(View view) { + return new WebDialog(view); + } + + public WebDialog(View view) { + this.dialog = new MaterialAlertDialogBuilder(App.activity()).setView(view).create(); + this.dialog.setOnDismissListener((DialogInterface.OnDismissListener) view); + } + + public WebDialog show() { + initDialog(); + return this; + } + + public void dismiss() { + dialog.setOnDismissListener(null); + dialog.dismiss(); + } + + private void initDialog() { + WindowManager.LayoutParams params = dialog.getWindow().getAttributes(); + params.height = (int) (ResUtil.getScreenHeight() * 0.8f); + params.width = (int) (ResUtil.getScreenWidth() * 0.8f); + dialog.getWindow().setAttributes(params); + dialog.getWindow().setDimAmount(0); + dialog.show(); + } +} 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 758ccc384..5aa5d688c 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 @@ -1,8 +1,8 @@ package com.fongmi.android.tv.ui.custom; import android.annotation.SuppressLint; -import android.app.AlertDialog; import android.content.Context; +import android.content.DialogInterface; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; @@ -28,6 +28,7 @@ import com.fongmi.android.tv.Setting; import com.fongmi.android.tv.api.config.VodConfig; import com.fongmi.android.tv.bean.Site; import com.fongmi.android.tv.impl.ParseCallback; +import com.fongmi.android.tv.ui.dialog.WebDialog; import com.fongmi.android.tv.utils.Sniffer; import com.github.catvod.crawler.Spider; import com.github.catvod.net.OkCookieJar; @@ -39,14 +40,14 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; -public class CustomWebView extends WebView { +public class CustomWebView extends WebView implements DialogInterface.OnDismissListener { private static final String TAG = CustomWebView.class.getSimpleName(); private static final String BLANK = "about:blank"; private WebResourceResponse empty; private ParseCallback callback; - private AlertDialog dialog; + private WebDialog dialog; private Runnable timer; private boolean detect; private String click; @@ -126,18 +127,12 @@ public class CustomWebView extends WebView { String host = request.getUrl().getHost(); Map headers = request.getRequestHeaders(); if (TextUtils.isEmpty(host) || VodConfig.get().getAds().contains(host)) return empty; - if (url.contains("challenges.cloudflare.com/cdn-cgi")) App.post(() -> showDialog()); + if (url.contains("challenges.cloudflare.com/turnstile")) App.post(() -> showDialog()); if (detect && url.contains("player/?url=")) onParseAdd(headers, url); else if (isVideoFormat(url)) onParseSuccess(headers, url); return super.shouldInterceptRequest(view, request); } - @Override - public void onPageStarted(WebView view, String url, Bitmap favicon) { - super.onPageStarted(view, url, favicon); - if (dialog != null) hideDialog(); - } - @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); @@ -174,7 +169,8 @@ public class CustomWebView extends WebView { private void showDialog() { if (dialog != null || App.activity() == null) return; if (getParent() != null) ((ViewGroup) getParent()).removeView(this); - dialog = new AlertDialog.Builder(App.activity()).setView(this).show(); + dialog = new WebDialog(this).show(); + App.removeCallbacks(timer); } private void hideDialog() { @@ -182,6 +178,11 @@ public class CustomWebView extends WebView { dialog = null; } + @Override + public void onDismiss(DialogInterface dialog) { + stop(true); + } + private List getScript(String url) { List script = new ArrayList<>(Sniffer.getScript(Uri.parse(url))); if (TextUtils.isEmpty(click) || script.contains(click)) return script; diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/WebDialog.java b/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/WebDialog.java new file mode 100644 index 000000000..97ac4ba5f --- /dev/null +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/WebDialog.java @@ -0,0 +1,38 @@ +package com.fongmi.android.tv.ui.dialog; + +import android.content.DialogInterface; +import android.view.View; + +import androidx.appcompat.app.AlertDialog; + +import com.fongmi.android.tv.App; +import com.google.android.material.dialog.MaterialAlertDialogBuilder; + +public class WebDialog { + + private final AlertDialog dialog; + + public static WebDialog create(View view) { + return new WebDialog(view); + } + + public WebDialog(View view) { + this.dialog = new MaterialAlertDialogBuilder(App.activity()).setView(view).create(); + this.dialog.setOnDismissListener((DialogInterface.OnDismissListener) view); + } + + public WebDialog show() { + initDialog(); + return this; + } + + public void dismiss() { + dialog.setOnDismissListener(null); + dialog.dismiss(); + } + + private void initDialog() { + dialog.getWindow().setDimAmount(0); + dialog.show(); + } +} From 6a4b5ff54d691b55801ee65e03a0c133e7bc844c Mon Sep 17 00:00:00 2001 From: okjack Date: Wed, 15 May 2024 11:59:33 +0800 Subject: [PATCH 06/17] fix ijk content view --- app/src/leanback/res/layout/activity_video.xml | 5 +++-- ijkplayer/src/main/res/layout/ijk_player_view.xml | 5 ++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/leanback/res/layout/activity_video.xml b/app/src/leanback/res/layout/activity_video.xml index c55676834..aacd8b45d 100644 --- a/app/src/leanback/res/layout/activity_video.xml +++ b/app/src/leanback/res/layout/activity_video.xml @@ -42,8 +42,9 @@ + android:layout_width="match_parent" + android:layout_height="match_parent"> Date: Wed, 15 May 2024 12:00:19 +0800 Subject: [PATCH 07/17] fix ijk content view --- app/src/leanback/res/layout/activity_video.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/leanback/res/layout/activity_video.xml b/app/src/leanback/res/layout/activity_video.xml index aacd8b45d..0945fda67 100644 --- a/app/src/leanback/res/layout/activity_video.xml +++ b/app/src/leanback/res/layout/activity_video.xml @@ -42,9 +42,9 @@ Date: Wed, 15 May 2024 12:01:38 +0800 Subject: [PATCH 08/17] fix ijk content view --- app/src/mobile/res/layout-sw600dp/activity_video.xml | 5 +++-- app/src/mobile/res/layout/activity_video.xml | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/app/src/mobile/res/layout-sw600dp/activity_video.xml b/app/src/mobile/res/layout-sw600dp/activity_video.xml index 277392001..7bfa51722 100644 --- a/app/src/mobile/res/layout-sw600dp/activity_video.xml +++ b/app/src/mobile/res/layout-sw600dp/activity_video.xml @@ -40,8 +40,9 @@ Date: Wed, 15 May 2024 12:34:31 +0800 Subject: [PATCH 09/17] update library --- app/src/leanback/res/layout/dialog_buffer.xml | 1 + app/src/leanback/res/layout/dialog_subtitle.xml | 2 ++ app/src/mobile/res/layout/dialog_buffer.xml | 5 +++-- app/src/mobile/res/layout/dialog_control.xml | 3 +++ app/src/mobile/res/layout/dialog_subtitle.xml | 5 +++-- 5 files changed, 12 insertions(+), 4 deletions(-) diff --git a/app/src/leanback/res/layout/dialog_buffer.xml b/app/src/leanback/res/layout/dialog_buffer.xml index 97f2d3c78..337b6b650 100644 --- a/app/src/leanback/res/layout/dialog_buffer.xml +++ b/app/src/leanback/res/layout/dialog_buffer.xml @@ -13,6 +13,7 @@ android:valueFrom="1" android:valueTo="15" app:thumbColor="@color/blue_500" + app:tickVisible="false" app:trackColorActive="@color/blue_500" app:trackColorInactive="@color/blue_50" /> diff --git a/app/src/leanback/res/layout/dialog_subtitle.xml b/app/src/leanback/res/layout/dialog_subtitle.xml index a9c998de2..0548bf024 100644 --- a/app/src/leanback/res/layout/dialog_subtitle.xml +++ b/app/src/leanback/res/layout/dialog_subtitle.xml @@ -29,7 +29,9 @@ android:stepSize="1" android:valueFrom="14" android:valueTo="48" + app:labelBehavior="gone" app:thumbColor="@color/blue_500" + app:tickVisible="false" app:trackColorActive="@color/blue_500" app:trackColorInactive="@color/blue_50" /> diff --git a/app/src/mobile/res/layout/dialog_buffer.xml b/app/src/mobile/res/layout/dialog_buffer.xml index 8a8475491..91a15b995 100644 --- a/app/src/mobile/res/layout/dialog_buffer.xml +++ b/app/src/mobile/res/layout/dialog_buffer.xml @@ -4,9 +4,9 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" - android:paddingStart="24dp" + android:paddingStart="12dp" android:paddingTop="16dp" - android:paddingEnd="24dp"> + android:paddingEnd="12dp"> \ No newline at end of file diff --git a/app/src/mobile/res/layout/dialog_control.xml b/app/src/mobile/res/layout/dialog_control.xml index e8d191620..bacd6d694 100644 --- a/app/src/mobile/res/layout/dialog_control.xml +++ b/app/src/mobile/res/layout/dialog_control.xml @@ -19,9 +19,12 @@ android:id="@+id/speed" android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_marginStart="-12dp" + android:layout_marginEnd="-12dp" android:stepSize="0.1" android:valueFrom="0.2" android:valueTo="5" + app:tickVisible="false" app:trackColorInactive="@color/blue_50" /> + android:paddingEnd="12dp"> \ No newline at end of file From 6636fc5c4b87f98738119c18d5d2bbab4e9f00dd Mon Sep 17 00:00:00 2001 From: okjack Date: Thu, 16 May 2024 09:35:24 +0800 Subject: [PATCH 10/17] fix InfoDialog --- .../mobile/java/com/fongmi/android/tv/ui/dialog/InfoDialog.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/InfoDialog.java b/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/InfoDialog.java index 612fcf86a..0bfdeb43f 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/InfoDialog.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/InfoDialog.java @@ -47,6 +47,7 @@ public class InfoDialog { } public InfoDialog url(String url) { + if (TextUtils.isEmpty(url)) url = ""; this.url = url.startsWith("data") ? url.substring(0, Math.min(url.length(), 128)).concat("...") : url; return this; } @@ -89,6 +90,7 @@ public class InfoDialog { } private String convert(String url) { + if (TextUtils.isEmpty(url)) url = ""; return url.startsWith("http://127.0.0.1:7777") ? Uri.parse(url).getQueryParameter("url") : url; } From 3b782b3688bae737e5728349cc4ab0132a73a89c Mon Sep 17 00:00:00 2001 From: okjack Date: Thu, 16 May 2024 11:04:24 +0800 Subject: [PATCH 11/17] Tbs --- app/src/main/java/com/fongmi/android/tv/utils/Tbs.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/java/com/fongmi/android/tv/utils/Tbs.java b/app/src/main/java/com/fongmi/android/tv/utils/Tbs.java index 0d8a7b078..fbda49097 100644 --- a/app/src/main/java/com/fongmi/android/tv/utils/Tbs.java +++ b/app/src/main/java/com/fongmi/android/tv/utils/Tbs.java @@ -28,6 +28,8 @@ public class Tbs { } public static String getUrl() { + File file = new File(Path.tv(), "x5.tbs.apk"); + if (file.exists()) return Server.get().getAddress("/file/TV/x5.tbs.apk"); return Server.get().getAddress("x5.tbs.apk"); } From 1bab27038839efacd6b6a5002d135c4fe75cc28f Mon Sep 17 00:00:00 2001 From: okjack Date: Thu, 16 May 2024 11:05:01 +0800 Subject: [PATCH 12/17] build.gradle --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 60bf44c7f..6d72b00a0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,7 +11,7 @@ android { minSdk 21 targetSdk 28 versionCode 233 - versionName "0512" + versionName "0516" javaCompileOptions { annotationProcessorOptions { arguments = ["room.schemaLocation": "$projectDir/schemas".toString()] From 46d924bb45396fdb5996b7f03b376ebd1944bbc5 Mon Sep 17 00:00:00 2001 From: FongMi Date: Thu, 16 May 2024 11:18:13 +0800 Subject: [PATCH 13/17] Optimize ads check --- .../com/fongmi/android/tv/api/config/VodConfig.java | 12 ++++++------ .../fongmi/android/tv/ui/custom/CustomWebView.java | 9 ++++++++- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/fongmi/android/tv/api/config/VodConfig.java b/app/src/main/java/com/fongmi/android/tv/api/config/VodConfig.java index e5f86762e..a614e2b16 100644 --- a/app/src/main/java/com/fongmi/android/tv/api/config/VodConfig.java +++ b/app/src/main/java/com/fongmi/android/tv/api/config/VodConfig.java @@ -41,6 +41,7 @@ public class VodConfig { private List sites; private List parses; private List flags; + private List ads; private JarLoader jarLoader; private PyLoader pyLoader; private JsLoader jsLoader; @@ -48,7 +49,6 @@ public class VodConfig { private Config config; private Parse parse; private String wall; - private String ads; private Site home; private static class Loader { @@ -84,11 +84,11 @@ public class VodConfig { } public VodConfig init() { - this.ads = null; this.wall = null; this.home = null; this.parse = null; this.config = Config.vod(); + this.ads = new ArrayList<>(); this.doh = new ArrayList<>(); this.rules = new ArrayList<>(); this.sites = new ArrayList<>(); @@ -107,10 +107,10 @@ public class VodConfig { } public VodConfig clear() { - this.ads = null; this.wall = null; this.home = null; this.parse = null; + this.ads.clear(); this.doh.clear(); this.rules.clear(); this.sites.clear(); @@ -336,12 +336,12 @@ public class VodConfig { this.flags.addAll(flags); } - public String getAds() { - return TextUtils.isEmpty(ads) ? "" : ads; + public List getAds() { + return ads == null ? Collections.emptyList() : ads; } private void setAds(List ads) { - this.ads = TextUtils.join(",", ads); + this.ads = ads; } public Config getConfig() { 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 5aa5d688c..5a85ed72d 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 @@ -39,6 +39,7 @@ import java.io.ByteArrayInputStream; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.regex.Pattern; public class CustomWebView extends WebView implements DialogInterface.OnDismissListener { @@ -125,8 +126,8 @@ public class CustomWebView extends WebView implements DialogInterface.OnDismissL public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { String url = request.getUrl().toString(); String host = request.getUrl().getHost(); + if (TextUtils.isEmpty(host) || isAd(host)) return empty; Map headers = request.getRequestHeaders(); - if (TextUtils.isEmpty(host) || VodConfig.get().getAds().contains(host)) return empty; if (url.contains("challenges.cloudflare.com/turnstile")) App.post(() -> showDialog()); if (detect && url.contains("player/?url=")) onParseAdd(headers, url); else if (isVideoFormat(url)) onParseSuccess(headers, url); @@ -199,6 +200,12 @@ public class CustomWebView extends WebView implements DialogInterface.OnDismissL } } + private boolean isAd(String host) { + for (String ad : VodConfig.get().getAds()) if (host.contains(ad)) return true; + for (String ad : VodConfig.get().getAds()) if (Pattern.compile(ad).matcher(host).find()) return true; + return false; + } + private boolean isVideoFormat(String url) { try { Logger.t(TAG).d(url); From 549ba200341edc5f8888b7745716dbda38879bb1 Mon Sep 17 00:00:00 2001 From: FongMi Date: Thu, 16 May 2024 12:16:09 +0800 Subject: [PATCH 14/17] Fix seek view bug --- .../java/com/fongmi/android/tv/ui/custom/CustomSeekView.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/fongmi/android/tv/ui/custom/CustomSeekView.java b/app/src/main/java/com/fongmi/android/tv/ui/custom/CustomSeekView.java index afbb39abb..8bbe701c0 100644 --- a/app/src/main/java/com/fongmi/android/tv/ui/custom/CustomSeekView.java +++ b/app/src/main/java/com/fongmi/android/tv/ui/custom/CustomSeekView.java @@ -90,10 +90,10 @@ public class CustomSeekView extends FrameLayout implements TimeBar.OnScrubListen timeBar.setBufferedPosition(buffered); } if (player.isEmpty()) { - timeBar.setPosition(0); - timeBar.setDuration(0); positionView.setText("00:00"); durationView.setText("00:00"); + timeBar.setPosition(currentDuration = 0); + timeBar.setDuration(currentDuration = 0); } removeCallbacks(refresh); if (player.isPlaying()) { From 7c695fe1bd4637ff9ceebe70db95b985bf50f534 Mon Sep 17 00:00:00 2001 From: okjack Date: Thu, 16 May 2024 14:32:17 +0800 Subject: [PATCH 15/17] revert ads --- .../com/fongmi/android/tv/player/ExoUtil.java | 5 +-- .../com/fongmi/android/tv/player/IjkUtil.java | 5 ++- .../com/fongmi/android/tv/utils/M3U8.java | 40 ++++++++++++++++++- 3 files changed, 43 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/fongmi/android/tv/player/ExoUtil.java b/app/src/main/java/com/fongmi/android/tv/player/ExoUtil.java index 8f72cf86b..64a7dd461 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/ExoUtil.java +++ b/app/src/main/java/com/fongmi/android/tv/player/ExoUtil.java @@ -44,14 +44,13 @@ import com.fongmi.android.tv.bean.Channel; import com.fongmi.android.tv.bean.Drm; import com.fongmi.android.tv.bean.Result; import com.fongmi.android.tv.bean.Sub; -import com.fongmi.android.tv.server.Server; +import com.fongmi.android.tv.utils.Sniffer; import com.fongmi.android.tv.utils.UrlUtil; import com.github.catvod.net.OkHttp; import com.github.catvod.utils.Path; import com.github.catvod.utils.Util; import com.google.common.net.HttpHeaders; -import java.net.URLEncoder; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -141,7 +140,6 @@ public class ExoUtil { String mimeType = getMimeType(format, errorCode); if (uri.getUserInfo() != null) headers.put(HttpHeaders.AUTHORIZATION, Util.basic(uri.getUserInfo())); if (url.contains("***") && url.contains("|||")) return getConcat(headers, url, format, subs, sub, drm, errorCode); - if (url.contains(".m3u8") && Setting.isRemoveAd()) uri = Uri.parse(Server.get().getAddress().concat("/m3u8?url=").concat(URLEncoder.encode(url))); return new DefaultMediaSourceFactory(getDataSourceFactory(headers), getExtractorsFactory()).createMediaSource(getMediaItem(uri, mimeType, subs, drm)); } @@ -162,6 +160,7 @@ public class ExoUtil { if (drm != null) builder.setDrmConfiguration(drm.get()); builder.setAllowChunklessPreparation(Players.isHard(Players.EXO)); if (mimeType != null) builder.setMimeType(mimeType); + builder.setAds(Sniffer.getRegex(uri)); return builder.build(); } diff --git a/app/src/main/java/com/fongmi/android/tv/player/IjkUtil.java b/app/src/main/java/com/fongmi/android/tv/player/IjkUtil.java index 439675734..4461eb76a 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/IjkUtil.java +++ b/app/src/main/java/com/fongmi/android/tv/player/IjkUtil.java @@ -2,10 +2,10 @@ package com.fongmi.android.tv.player; import android.net.Uri; -import com.fongmi.android.tv.Setting; import com.fongmi.android.tv.bean.Channel; import com.fongmi.android.tv.bean.Result; import com.fongmi.android.tv.server.Server; +import com.fongmi.android.tv.utils.Sniffer; import com.fongmi.android.tv.utils.UrlUtil; import java.net.URLEncoder; @@ -25,7 +25,8 @@ public class IjkUtil { public static MediaSource getSource(Map headers, String url) { Uri uri = UrlUtil.uri(url); - if (url.contains(".m3u8") && Setting.isRemoveAd()) uri = Uri.parse(Server.get().getAddress().concat("/m3u8?url=").concat(URLEncoder.encode(url))); + boolean m3u8Ad = Sniffer.getRegex(uri).size() > 0; + if (m3u8Ad) uri = Uri.parse(Server.get().getAddress().concat("/m3u8?url=").concat(URLEncoder.encode(uri.toString()))); return new MediaSource(Players.checkUa(headers), uri); } } diff --git a/app/src/main/java/com/fongmi/android/tv/utils/M3U8.java b/app/src/main/java/com/fongmi/android/tv/utils/M3U8.java index 66afb8f90..a45548688 100644 --- a/app/src/main/java/com/fongmi/android/tv/utils/M3U8.java +++ b/app/src/main/java/com/fongmi/android/tv/utils/M3U8.java @@ -1,5 +1,6 @@ package com.fongmi.android.tv.utils; +import android.net.Uri; import android.text.TextUtils; import androidx.media3.common.util.UriUtil; @@ -7,6 +8,8 @@ import androidx.media3.common.util.UriUtil; import com.github.catvod.net.OkHttp; import com.google.common.net.HttpHeaders; +import java.math.BigDecimal; +import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -15,7 +18,14 @@ import okhttp3.Headers; import okhttp3.Response; public class M3U8 { + + private static final String TAG_DISCONTINUITY = "#EXT-X-DISCONTINUITY"; + private static final String TAG_MEDIA_DURATION = "#EXTINF"; + private static final String TAG_ENDLIST = "#EXT-X-ENDLIST"; private static final String TAG_KEY = "#EXT-X-KEY"; + + private static final Pattern REGEX_X_DISCONTINUITY = Pattern.compile("#EXT-X-DISCONTINUITY[\\s\\S]*?(?=#EXT-X-DISCONTINUITY|$)"); + private static final Pattern REGEX_MEDIA_DURATION = Pattern.compile(TAG_MEDIA_DURATION + ":([\\d\\.]+)\\b"); private static final Pattern REGEX_URI = Pattern.compile("URI=\"(.+?)\""); public static String get(String url, Map headers) { @@ -28,13 +38,31 @@ public class M3U8 { if (matcher.find() && matcher.groupCount() > 1) return get(UriUtil.resolve(url, matcher.group(2)), headers); StringBuilder sb = new StringBuilder(); for (String line : result.split("\n")) sb.append(shouldResolve(line) ? resolve(url, line) : line).append("\n"); - return clean(sb.toString()); + List ads = Sniffer.getRegex(Uri.parse(url)); + return clean(sb.toString(), ads); } catch (Throwable ignored) { return ""; } } - private static String clean(String line) { + private static String clean(String line, List ads) { + boolean scan = false; + for (String ad : ads) { + if (ad.contains(TAG_DISCONTINUITY) || ad.contains(TAG_MEDIA_DURATION)) line = line.replaceAll(ad, ""); + else if (isDouble(ad)) scan = true; + } + return scan ? scan(line, ads) : line; + } + + private static String scan(String line, List ads) { + Matcher m1 = REGEX_X_DISCONTINUITY.matcher(line); + while (m1.find()) { + String group = m1.group(); + BigDecimal t = BigDecimal.ZERO; + Matcher m2 = REGEX_MEDIA_DURATION.matcher(group); + while (m2.find()) t = t.add(new BigDecimal(m2.group(1))); + for (String ad : ads) if (t.toString().startsWith(ad)) line = line.replace(group.replace(TAG_ENDLIST, ""), ""); + } return line; } @@ -45,6 +73,14 @@ public class M3U8 { return builder.build(); } + private static boolean isDouble(String ad) { + try { + return Double.parseDouble(ad) > 0; + } catch (Exception e) { + return false; + } + } + private static boolean shouldResolve(String line) { return (!line.startsWith("#") && !line.startsWith("http")) || line.startsWith(TAG_KEY); } From ae6d9c6f235a134a56f1e668655180a1d29325a8 Mon Sep 17 00:00:00 2001 From: okjack Date: Thu, 16 May 2024 14:48:28 +0800 Subject: [PATCH 16/17] update --- .../com/fongmi/android/tv/player/ExoUtil.java | 2 - .../com/fongmi/android/tv/player/IjkUtil.java | 2 - .../com/fongmi/android/tv/utils/M3U8.java | 97 ------------------- 3 files changed, 101 deletions(-) delete mode 100644 app/src/main/java/com/fongmi/android/tv/utils/M3U8.java diff --git a/app/src/main/java/com/fongmi/android/tv/player/ExoUtil.java b/app/src/main/java/com/fongmi/android/tv/player/ExoUtil.java index 64a7dd461..0025c4e06 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/ExoUtil.java +++ b/app/src/main/java/com/fongmi/android/tv/player/ExoUtil.java @@ -44,7 +44,6 @@ import com.fongmi.android.tv.bean.Channel; import com.fongmi.android.tv.bean.Drm; import com.fongmi.android.tv.bean.Result; import com.fongmi.android.tv.bean.Sub; -import com.fongmi.android.tv.utils.Sniffer; import com.fongmi.android.tv.utils.UrlUtil; import com.github.catvod.net.OkHttp; import com.github.catvod.utils.Path; @@ -160,7 +159,6 @@ public class ExoUtil { if (drm != null) builder.setDrmConfiguration(drm.get()); builder.setAllowChunklessPreparation(Players.isHard(Players.EXO)); if (mimeType != null) builder.setMimeType(mimeType); - builder.setAds(Sniffer.getRegex(uri)); return builder.build(); } diff --git a/app/src/main/java/com/fongmi/android/tv/player/IjkUtil.java b/app/src/main/java/com/fongmi/android/tv/player/IjkUtil.java index 4461eb76a..7cf60de4f 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/IjkUtil.java +++ b/app/src/main/java/com/fongmi/android/tv/player/IjkUtil.java @@ -25,8 +25,6 @@ public class IjkUtil { public static MediaSource getSource(Map headers, String url) { Uri uri = UrlUtil.uri(url); - boolean m3u8Ad = Sniffer.getRegex(uri).size() > 0; - if (m3u8Ad) uri = Uri.parse(Server.get().getAddress().concat("/m3u8?url=").concat(URLEncoder.encode(uri.toString()))); return new MediaSource(Players.checkUa(headers), uri); } } diff --git a/app/src/main/java/com/fongmi/android/tv/utils/M3U8.java b/app/src/main/java/com/fongmi/android/tv/utils/M3U8.java deleted file mode 100644 index a45548688..000000000 --- a/app/src/main/java/com/fongmi/android/tv/utils/M3U8.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.fongmi.android.tv.utils; - -import android.net.Uri; -import android.text.TextUtils; - -import androidx.media3.common.util.UriUtil; - -import com.github.catvod.net.OkHttp; -import com.google.common.net.HttpHeaders; - -import java.math.BigDecimal; -import java.util.List; -import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import okhttp3.Headers; -import okhttp3.Response; - -public class M3U8 { - - private static final String TAG_DISCONTINUITY = "#EXT-X-DISCONTINUITY"; - private static final String TAG_MEDIA_DURATION = "#EXTINF"; - private static final String TAG_ENDLIST = "#EXT-X-ENDLIST"; - private static final String TAG_KEY = "#EXT-X-KEY"; - - private static final Pattern REGEX_X_DISCONTINUITY = Pattern.compile("#EXT-X-DISCONTINUITY[\\s\\S]*?(?=#EXT-X-DISCONTINUITY|$)"); - private static final Pattern REGEX_MEDIA_DURATION = Pattern.compile(TAG_MEDIA_DURATION + ":([\\d\\.]+)\\b"); - private static final Pattern REGEX_URI = Pattern.compile("URI=\"(.+?)\""); - - public static String get(String url, Map headers) { - try { - if (TextUtils.isEmpty(url)) return ""; - Response response = OkHttp.newCall(url, getHeader(headers)).execute(); - if (response.header(HttpHeaders.ACCEPT_RANGES) != null) return ""; - String result = response.body().string(); - Matcher matcher = Pattern.compile("#EXT-X-STREAM-INF(.*)\\n?(.*)").matcher(result.replaceAll("\r\n", "\n")); - if (matcher.find() && matcher.groupCount() > 1) return get(UriUtil.resolve(url, matcher.group(2)), headers); - StringBuilder sb = new StringBuilder(); - for (String line : result.split("\n")) sb.append(shouldResolve(line) ? resolve(url, line) : line).append("\n"); - List ads = Sniffer.getRegex(Uri.parse(url)); - return clean(sb.toString(), ads); - } catch (Throwable ignored) { - return ""; - } - } - - private static String clean(String line, List ads) { - boolean scan = false; - for (String ad : ads) { - if (ad.contains(TAG_DISCONTINUITY) || ad.contains(TAG_MEDIA_DURATION)) line = line.replaceAll(ad, ""); - else if (isDouble(ad)) scan = true; - } - return scan ? scan(line, ads) : line; - } - - private static String scan(String line, List ads) { - Matcher m1 = REGEX_X_DISCONTINUITY.matcher(line); - while (m1.find()) { - String group = m1.group(); - BigDecimal t = BigDecimal.ZERO; - Matcher m2 = REGEX_MEDIA_DURATION.matcher(group); - while (m2.find()) t = t.add(new BigDecimal(m2.group(1))); - for (String ad : ads) if (t.toString().startsWith(ad)) line = line.replace(group.replace(TAG_ENDLIST, ""), ""); - } - return line; - } - - private static Headers getHeader(Map headers) { - Headers.Builder builder = new Headers.Builder(); - for (Map.Entry header : headers.entrySet()) if (HttpHeaders.USER_AGENT.equalsIgnoreCase(header.getKey()) || HttpHeaders.REFERER.equalsIgnoreCase(header.getKey()) || HttpHeaders.COOKIE.equalsIgnoreCase(header.getKey())) builder.add(header.getKey(), header.getValue()); - builder.add(HttpHeaders.RANGE, "bytes=0-"); - return builder.build(); - } - - private static boolean isDouble(String ad) { - try { - return Double.parseDouble(ad) > 0; - } catch (Exception e) { - return false; - } - } - - private static boolean shouldResolve(String line) { - return (!line.startsWith("#") && !line.startsWith("http")) || line.startsWith(TAG_KEY); - } - - private static String resolve(String base, String line) { - if (line.startsWith(TAG_KEY)) { - Matcher matcher = REGEX_URI.matcher(line); - String value = matcher.find() ? matcher.group(1) : null; - return value == null ? line : line.replace(value, UriUtil.resolve(base, value)); - } else { - return UriUtil.resolve(base, line); - } - } -} From 4f521f032b4e6f044dd1fd93c7dff61f5681fc43 Mon Sep 17 00:00:00 2001 From: okjack Date: Thu, 16 May 2024 14:50:28 +0800 Subject: [PATCH 17/17] update --- .../main/java/com/fongmi/android/tv/server/Nano.java | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/app/src/main/java/com/fongmi/android/tv/server/Nano.java b/app/src/main/java/com/fongmi/android/tv/server/Nano.java index ae6b66ed5..9c8fb7bb9 100644 --- a/app/src/main/java/com/fongmi/android/tv/server/Nano.java +++ b/app/src/main/java/com/fongmi/android/tv/server/Nano.java @@ -9,14 +9,11 @@ import com.fongmi.android.tv.server.process.Action; import com.fongmi.android.tv.server.process.Cache; import com.fongmi.android.tv.server.process.Local; import com.fongmi.android.tv.server.process.Process; -import com.fongmi.android.tv.utils.M3U8; import com.github.catvod.utils.Asset; import com.google.common.net.HttpHeaders; -import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; -import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -72,7 +69,6 @@ public class Nano extends NanoHTTPD { if (session.getMethod() == Method.POST) parse(session, files); if (url.contains("?")) url = url.substring(0, url.indexOf('?')); if (url.startsWith("/go")) return go(); - if (url.startsWith("/m3u8")) return m3u8(session); if (url.startsWith("/proxy")) return proxy(session); if (url.startsWith("/tvbus")) return success(LiveConfig.getResp()); if (url.startsWith("/device")) return success(Device.get().toString()); @@ -99,13 +95,6 @@ public class Nano extends NanoHTTPD { return success(); } - private Response m3u8(IHTTPSession session) { - String url = session.getParms().get("url"); - String result = M3U8.get(url, session.getHeaders()); - if (result.isEmpty()) return redirect(url, session.getHeaders()); - return newChunkedResponse(Response.Status.OK, MIME_PLAINTEXT, new ByteArrayInputStream(result.getBytes(StandardCharsets.UTF_8))); - } - private Response proxy(IHTTPSession session) { try { Map params = session.getParms();