Remove m3u8 ads check

pull/496/head
FongMi 2 years ago
parent d3826b623a
commit e259d623f3
  1. 1
      app/src/main/java/com/fongmi/android/tv/player/ExoUtil.java
  2. 10
      app/src/main/java/com/fongmi/android/tv/player/IjkUtil.java
  3. 11
      app/src/main/java/com/fongmi/android/tv/server/Nano.java
  4. 97
      app/src/main/java/com/fongmi/android/tv/utils/M3U8.java
  5. 1
      app/src/main/java/com/fongmi/android/tv/utils/Sniffer.java

@ -157,7 +157,6 @@ public class ExoUtil {
if (drm != null) builder.setDrmConfiguration(drm.get());
builder.setAllowChunklessPreparation(Players.isHard());
if (mimeType != null) builder.setMimeType(mimeType);
builder.setAds(Sniffer.getRegex(uri));
return builder.build();
}

@ -1,14 +1,9 @@
package com.fongmi.android.tv.player;
import android.net.Uri;
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;
import java.util.Map;
import tv.danmaku.ijk.media.player.MediaSource;
@ -24,9 +19,6 @@ public class IjkUtil {
}
public static MediaSource getSource(Map<String, String> 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);
return new MediaSource(Players.checkUa(headers), UrlUtil.uri(url));
}
}

@ -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;
@ -71,7 +68,6 @@ public class Nano extends NanoHTTPD {
Map<String, String> files = new HashMap<>();
if (session.getMethod() == Method.POST) parse(session, files);
if (url.contains("?")) url = url.substring(0, url.indexOf('?'));
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());
@ -93,13 +89,6 @@ public class Nano extends NanoHTTPD {
}
}
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<String, String> params = session.getParms();

@ -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<String, String> headers) {
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 "";
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<String> ads = Sniffer.getRegex(Uri.parse(url));
return clean(sb.toString(), ads);
} catch (Throwable ignored) {
return "";
}
}
private static String clean(String line, List<String> 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<String> 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<String, String> headers) {
Headers.Builder builder = new Headers.Builder();
for (Map.Entry<String, String> 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);
}
}
}

@ -41,7 +41,6 @@ public class Sniffer {
for (String exclude : rule.getExclude()) if (Pattern.compile(exclude).matcher(url).find()) return false;
for (String regex : rule.getRegex()) if (url.contains(regex)) return true;
for (String regex : rule.getRegex()) if (Pattern.compile(regex).matcher(url).find()) return true;
if (url.contains("url=http") || url.contains("v=http") || url.contains(".css") || url.contains(".html")) return false;
return SNIFFER.matcher(url).find();
}

Loading…
Cancel
Save