From 90396f61a003c7fb4885fb2fc937ba6cc501149e Mon Sep 17 00:00:00 2001 From: jun <215613905@qq.com> Date: Tue, 15 Apr 2025 23:01:11 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=AE=80=E5=8C=96=E5=8E=BB?= =?UTF-8?q?=E5=B9=BF=E5=91=8Arules=E5=86=99=E6=B3=95{"name":"=E9=9D=9E?= =?UTF-8?q?=E5=87=A1","hosts":["vip.ffzy","hd.ffzy"],"regex":["6.666667","?= =?UTF-8?q?6.566667","2.966667","2.433333","-2.266667"]}=20(=E6=AD=A3?= =?UTF-8?q?=E6=95=B0=E4=BB=A3=E8=A1=A8=E7=A7=BB=E9=99=A4=E7=AC=AC=E4=B8=80?= =?UTF-8?q?=E6=AC=A1=E5=87=BA=E7=8E=B0=E7=9A=84=E5=88=87=E7=89=87=E7=BB=84?= =?UTF-8?q?,=E8=B4=9F=E6=95=B0=E4=BB=A3=E8=A1=A8=E6=9C=80=E5=90=8E?= =?UTF-8?q?=E4=B8=80=E6=AC=A1=E5=87=BA=E7=8E=B0=E7=9A=84=E5=88=87=E7=89=87?= =?UTF-8?q?=E7=BB=84);=20=E5=A2=9E=E5=8A=A0=E5=8E=BB=E9=99=A4=E5=B9=BF?= =?UTF-8?q?=E5=91=8A=E6=9D=A1=E6=95=B0=E7=BB=9F=E8=AE=A1=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../osc/player/controller/VodController.java | 2 +- .../github/tvbox/osc/util/DefaultConfig.java | 2 +- .../java/com/github/tvbox/osc/util/M3u8.java | 48 +++++++++++++++++-- 3 files changed, 46 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/github/tvbox/osc/player/controller/VodController.java b/app/src/main/java/com/github/tvbox/osc/player/controller/VodController.java index a50ad94c..7434a9e1 100644 --- a/app/src/main/java/com/github/tvbox/osc/player/controller/VodController.java +++ b/app/src/main/java/com/github/tvbox/osc/player/controller/VodController.java @@ -1300,7 +1300,7 @@ public class VodController extends BaseController { listener.startPlayUrl(url, headers); } else { listener.startPlayUrl(ControlManager.get().getAddress(true) + "proxyM3u8", headers); - Toast.makeText(getContext(), "已移除视频广告", Toast.LENGTH_SHORT).show(); + Toast.makeText(getContext(), "已移除视频广告 "+M3u8.currentAdCount+" 条", Toast.LENGTH_SHORT).show(); } } diff --git a/app/src/main/java/com/github/tvbox/osc/util/DefaultConfig.java b/app/src/main/java/com/github/tvbox/osc/util/DefaultConfig.java index c0c58ed4..3b1357ce 100644 --- a/app/src/main/java/com/github/tvbox/osc/util/DefaultConfig.java +++ b/app/src/main/java/com/github/tvbox/osc/util/DefaultConfig.java @@ -181,7 +181,7 @@ public class DefaultConfig { } private static final List NO_AD_KEYWORDS = Arrays.asList( - "tx", "youku", "qq","qiyi", "letv", "sohu", "mgtv", "bilibili", "优酷", "芒果", "腾讯", "奇艺" + "tx", "youku", "qq","qiyi", "letv", "leshi","sohu", "mgtv", "bilibili", "imgo","优酷", "芒果", "腾讯", "奇艺" ); public static boolean noAd(String flag) { diff --git a/app/src/main/java/com/github/tvbox/osc/util/M3u8.java b/app/src/main/java/com/github/tvbox/osc/util/M3u8.java index 2dcf8763..f716675d 100644 --- a/app/src/main/java/com/github/tvbox/osc/util/M3u8.java +++ b/app/src/main/java/com/github/tvbox/osc/util/M3u8.java @@ -25,12 +25,14 @@ public class M3u8 { 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 int currentAdCount; public static boolean isAd(String regex) { return regex.contains(TAG_DISCONTINUITY) || regex.contains(TAG_MEDIA_DURATION) || regex.contains(TAG_ENDLIST) || regex.contains(TAG_KEY) || M3u8.isDouble(regex); } public static String purify(String tsUrlPre, String m3u8content) { + currentAdCount = 0; if (null == m3u8content || m3u8content.length() == 0) return null; if (!m3u8content.startsWith("#EXTM3U")) return null; String result = removeMinorityUrl(tsUrlPre, m3u8content); @@ -106,6 +108,14 @@ public class M3u8 { if (maxPercent(preUrlMap) < 0.8) { return null; //视频非广告片断占比不够大 } + boolean allDomainsExceedThreshold = true; + for (Integer count : preUrlMap.values()) { + if (count <= 15) { + allDomainsExceedThreshold = false; + break; + } + } + if (allDomainsExceedThreshold) return null; domainFiltering = true; } @@ -162,6 +172,7 @@ public class M3u8 { lines[i - 1] = ""; } lines[i] = ""; + currentAdCount+=1; } } else { // 域名过滤模式:先转换为绝对 URL @@ -186,6 +197,7 @@ public class M3u8 { lines[i - 1] = ""; } lines[i] = ""; + currentAdCount+=1; } } } @@ -224,19 +236,47 @@ public class M3u8 { private static String scan(String line, List ads) { Matcher m1 = REGEX_X_DISCONTINUITY.matcher(line); + List needRemoveAd = new ArrayList<>(); while (m1.find()) { String group = m1.group(); - BigDecimal t = BigDecimal.ZERO; + String groupCleaned = group.replace(TAG_ENDLIST, ""); Matcher m2 = REGEX_MEDIA_DURATION.matcher(group); - if (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, ""), ""); + BigDecimal ft = BigDecimal.ZERO; + BigDecimal lt = BigDecimal.ZERO; + int tCount = 0; + while (m2.find()) { + if (ft.equals(BigDecimal.ZERO))ft = new BigDecimal(m2.group(1)); + lt = new BigDecimal(m2.group(1)); + tCount+=1; + } + String ftStr = ft.toString(); + String ltStr = lt.toString(); + for (String ad : ads) { + if (ad.startsWith("-")) { + String adClean = ad.substring(1); + if (ltStr.startsWith(adClean)) { + needRemoveAd.add(groupCleaned); + currentAdCount+=tCount; + break; + } + } else { + if (ftStr.startsWith(ad)) { + needRemoveAd.add(groupCleaned); + currentAdCount+=tCount; + break; + } + } + } + } + for (String rem : needRemoveAd) { + line = line.replace(rem, ""); } return line; } private static boolean isDouble(String ad) { try { - return Double.parseDouble(ad) > 0; + return Double.parseDouble(ad) != 0; } catch (Exception e) { return false; }