diff --git a/app/build.gradle b/app/build.gradle
index 41cccdc65..7c3d22fff 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -11,7 +11,7 @@ android {
minSdk 21
targetSdk 28
versionCode 233
- versionName "0510"
+ versionName "0512"
javaCompileOptions {
annotationProcessorOptions {
arguments = ["room.schemaLocation": "$projectDir/schemas".toString()]
diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingActivity.java
index 72903ea5c..a99f141b1 100644
--- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingActivity.java
+++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingActivity.java
@@ -7,9 +7,7 @@ import android.view.View;
import androidx.viewbinding.ViewBinding;
-import com.fongmi.android.tv.App;
import com.fongmi.android.tv.BuildConfig;
-import com.fongmi.android.tv.R;
import com.fongmi.android.tv.Setting;
import com.fongmi.android.tv.Updater;
import com.fongmi.android.tv.api.config.LiveConfig;
@@ -37,12 +35,9 @@ import com.fongmi.android.tv.ui.dialog.ProxyDialog;
import com.fongmi.android.tv.ui.dialog.SiteDialog;
import com.fongmi.android.tv.utils.FileUtil;
import com.fongmi.android.tv.utils.Notify;
-import com.fongmi.android.tv.utils.ResUtil;
import com.fongmi.android.tv.utils.UrlUtil;
import com.github.catvod.bean.Doh;
import com.github.catvod.net.OkHttp;
-import com.github.catvod.utils.Shell;
-import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.permissionx.guolindev.PermissionX;
import java.util.ArrayList;
@@ -52,7 +47,6 @@ public class SettingActivity extends BaseActivity implements ConfigCallback, Sit
private ActivitySettingBinding mBinding;
private int type;
- private String[] configCache;
public static void start(Activity activity) {
activity.startActivity(new Intent(activity, SettingActivity.class));
@@ -84,7 +78,6 @@ public class SettingActivity extends BaseActivity implements ConfigCallback, Sit
mBinding.versionText.setText(BuildConfig.VERSION_NAME);
mBinding.proxyText.setText(UrlUtil.scheme(Setting.getProxy()));
mBinding.aboutText.setText(BuildConfig.FLAVOR_mode + "-" + BuildConfig.FLAVOR_api + "-" + BuildConfig.FLAVOR_abi);
- mBinding.configCacheText.setText((configCache = ResUtil.getStringArray(R.array.select_config_cache))[Setting.getConfigCache()]);
setCacheText();
}
@@ -122,8 +115,7 @@ public class SettingActivity extends BaseActivity implements ConfigCallback, Sit
mBinding.wallRefresh.setOnClickListener(this::setWallRefresh);
mBinding.custom.setOnClickListener(this::onCustom);
mBinding.doh.setOnClickListener(this::setDoh);
- mBinding.configCache.setOnClickListener(this::setConfigCache);
- mBinding.reset.setOnClickListener(this::onReset);
+ mBinding.about.setOnClickListener(this::onAbout);
}
@Override
@@ -289,20 +281,8 @@ public class SettingActivity extends BaseActivity implements ConfigCallback, Sit
SettingCustomActivity.start(this);
}
- private void setConfigCache(View view) {
- int index = Setting.getConfigCache();
- Setting.putConfigCache(index = index == configCache.length - 1 ? 0 : ++index);
- mBinding.configCacheText.setText(configCache[index]);
- }
-
- private void onReset(View view) {
- new MaterialAlertDialogBuilder(this).setTitle(R.string.dialog_reset_app).setMessage(R.string.dialog_reset_app_data).setNegativeButton(R.string.dialog_negative, null).setPositiveButton(R.string.dialog_positive, (dialog, which) -> reset()).show();
- }
-
- private void reset() {
- new Thread(() -> {
- Shell.exec("pm clear " + App.get().getPackageName());
- }).start();
+ private void onAbout(View view) {
+ mBinding.aboutText.setText(BuildConfig.FLAVOR_mode + "-" + BuildConfig.FLAVOR_api + "-" + BuildConfig.FLAVOR_abi);
}
private void setDoh(View view) {
diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingCustomActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingCustomActivity.java
index f4fce8df2..4ee5cf4c0 100644
--- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingCustomActivity.java
+++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingCustomActivity.java
@@ -18,6 +18,8 @@ import com.fongmi.android.tv.ui.dialog.LanguageDialog;
import com.fongmi.android.tv.ui.dialog.MenuKeyDialog;
import com.fongmi.android.tv.ui.dialog.X5WebViewDialog;
import com.fongmi.android.tv.utils.ResUtil;
+import com.github.catvod.utils.Shell;
+import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.tencent.smtt.sdk.QbSdk;
import java.util.Locale;
@@ -31,6 +33,7 @@ public class SettingCustomActivity extends BaseActivity {
private String[] smallWindowBackKey;
private String[] homeUI;
private String[] parseWebview;
+ private String[] configCache;
@Override
protected ViewBinding getBinding() {
@@ -60,8 +63,10 @@ public class SettingCustomActivity extends BaseActivity {
mBinding.aggregatedSearchText.setText(getSwitch(Setting.isAggregatedSearch()));
mBinding.homeUIText.setText((homeUI = ResUtil.getStringArray(R.array.select_home_ui))[Setting.getHomeUI()]);
mBinding.homeHistoryText.setText(getSwitch(Setting.isHomeHistory()));
+ mBinding.removeAdText.setText(getSwitch(Setting.isRemoveAd()));
mBinding.languageText.setText((ResUtil.getStringArray(R.array.select_language))[Setting.getLanguage()]);
mBinding.parseWebviewText.setText((parseWebview = ResUtil.getStringArray(R.array.select_parse_webview))[Setting.getParseWebView()]);
+ mBinding.configCacheText.setText((configCache = ResUtil.getStringArray(R.array.select_config_cache))[Setting.getConfigCache()]);
}
@Override
@@ -81,8 +86,11 @@ public class SettingCustomActivity extends BaseActivity {
mBinding.homeUI.setOnClickListener(this::setHomeUI);
mBinding.homeButtons.setOnClickListener(this::onHomeButtons);
mBinding.homeHistory.setOnClickListener(this::setHomeHistory);
+ mBinding.removeAd.setOnClickListener(this::setRemoveAd);
mBinding.setLanguage.setOnClickListener(this::setLanguage);
mBinding.parseWebview.setOnClickListener(this::setParseWebview);
+ mBinding.configCache.setOnClickListener(this::setConfigCache);
+ mBinding.reset.setOnClickListener(this::onReset);
}
@@ -178,6 +186,11 @@ public class SettingCustomActivity extends BaseActivity {
mBinding.homeHistoryText.setText(getSwitch(Setting.isHomeHistory()));
}
+ private void setRemoveAd(View view) {
+ Setting.putRemoveAd(!Setting.isRemoveAd());
+ mBinding.removeAdText.setText(getSwitch(Setting.isRemoveAd()));
+ }
+
private void setLanguage(View view) {
LanguageDialog.create(this).show();
}
@@ -194,4 +207,20 @@ public class SettingCustomActivity extends BaseActivity {
if (index == 1 && QbSdk.getTbsVersion(App.get()) <= 0) X5WebViewDialog.create(this).show();
}
+ private void setConfigCache(View view) {
+ int index = Setting.getConfigCache();
+ Setting.putConfigCache(index = index == configCache.length - 1 ? 0 : ++index);
+ mBinding.configCacheText.setText(configCache[index]);
+ }
+
+ private void onReset(View view) {
+ new MaterialAlertDialogBuilder(this).setTitle(R.string.dialog_reset_app).setMessage(R.string.dialog_reset_app_data).setNegativeButton(R.string.dialog_negative, null).setPositiveButton(R.string.dialog_positive, (dialog, which) -> reset()).show();
+ }
+
+ private void reset() {
+ new Thread(() -> {
+ Shell.exec("pm clear " + App.get().getPackageName());
+ }).start();
+ }
+
}
diff --git a/app/src/leanback/res/layout/activity_setting.xml b/app/src/leanback/res/layout/activity_setting.xml
index 297e495c7..ecbdaa19b 100644
--- a/app/src/leanback/res/layout/activity_setting.xml
+++ b/app/src/leanback/res/layout/activity_setting.xml
@@ -319,64 +319,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/leanback/res/layout/adapter_func_horizontal.xml b/app/src/leanback/res/layout/adapter_func_horizontal.xml
index 858476414..d27d711f7 100644
--- a/app/src/leanback/res/layout/adapter_func_horizontal.xml
+++ b/app/src/leanback/res/layout/adapter_func_horizontal.xml
@@ -1,7 +1,7 @@
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())));
+ if (url.contains(".m3u8") && Setting.isRemoveAd()) uri = Uri.parse(Server.get().getAddress().concat("/m3u8?url=").concat(URLEncoder.encode(url)));
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 f1b056469..613796579 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,6 +1,5 @@
package com.fongmi.android.tv.utils;
-import android.net.Uri;
import android.text.TextUtils;
import androidx.media3.common.util.UriUtil;
@@ -8,8 +7,6 @@ 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;
@@ -18,14 +15,7 @@ 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) {
@@ -38,31 +28,13 @@ 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");
- List ads = Sniffer.getRegex(Uri.parse(url));
- return clean(sb.toString(), ads);
+ return clean(sb.toString());
} 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, ""), "");
- }
+ private static String clean(String line) {
return line;
}
@@ -73,14 +45,6 @@ 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);
}
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index 1b7f7cb31..b1a16ced5 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -86,6 +86,7 @@
首页菜单键
首页源锁定
无痕模式
+ AI去广告
小窗返回键
首页显示站源
首页UI
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
index 4897a7e3f..5a1dd4df9 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -86,8 +86,9 @@
首頁選單鍵
首頁源鎖定
無痕模式
+ AI去廣告
小窗返回鍵
- 首頁显示站源
+ 首頁顯示站源
首頁UI
首頁按鈕
DoH
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 5f71105a9..2e00bf8a0 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -86,6 +86,7 @@
Home menu key
Home site lock
Incognito mode
+ Remove ads
Small window back key
Home display name
Home ui style
diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingCustomFragment.java b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingCustomFragment.java
index 2a6ec3a66..6beebcd39 100644
--- a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingCustomFragment.java
+++ b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingCustomFragment.java
@@ -49,6 +49,7 @@ public class SettingCustomFragment extends BaseFragment {
mBinding.incognitoText.setText(getSwitch(Setting.isIncognito()));
mBinding.aggregatedSearchText.setText(getSwitch(Setting.isAggregatedSearch()));
mBinding.homeDisplayNameText.setText(getSwitch(Setting.isHomeDisplayName()));
+ mBinding.removeAdText.setText(getSwitch(Setting.isRemoveAd()));
mBinding.languageText.setText((lang = ResUtil.getStringArray(R.array.select_language))[Setting.getLanguage()]);
mBinding.configCacheText.setText((configCache = ResUtil.getStringArray(R.array.select_config_cache))[Setting.getConfigCache()]);
}
@@ -63,6 +64,7 @@ public class SettingCustomFragment extends BaseFragment {
mBinding.incognito.setOnClickListener(this::setIncognito);
mBinding.aggregatedSearch.setOnClickListener(this::setAggregatedSearch);
mBinding.homeDisplayName.setOnClickListener(this::setHomeDisplayName);
+ mBinding.removeAd.setOnClickListener(this::setRemoveAd);
mBinding.language.setOnClickListener(this::setLanguage);
mBinding.configCache.setOnClickListener(this::setConfigCache);
mBinding.reset.setOnClickListener(this::onReset);
@@ -122,6 +124,11 @@ public class SettingCustomFragment extends BaseFragment {
RefreshEvent.config();
}
+ private void setRemoveAd(View view) {
+ Setting.putRemoveAd(!Setting.isRemoveAd());
+ mBinding.removeAdText.setText(getSwitch(Setting.isRemoveAd()));
+ }
+
private void setLanguage(View view) {
new MaterialAlertDialogBuilder(getActivity()).setTitle(R.string.setting_language).setNegativeButton(R.string.dialog_negative, null).setSingleChoiceItems(lang, Setting.getLanguage(), (dialog, which) -> {
mBinding.languageText.setText(lang[which]);
diff --git a/app/src/mobile/res/layout/fragment_setting_custom.xml b/app/src/mobile/res/layout/fragment_setting_custom.xml
index 5c3d90d21..b7cb91fed 100644
--- a/app/src/mobile/res/layout/fragment_setting_custom.xml
+++ b/app/src/mobile/res/layout/fragment_setting_custom.xml
@@ -206,6 +206,33 @@
+
+
+
+
+
+
+
+