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 9f3b90504..c7bf5497b 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 @@ -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(); } 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..faf20099f 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 @@ -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 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)); } } 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 179195368..b719bbd9f 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; @@ -71,7 +68,6 @@ public class Nano extends NanoHTTPD { Map 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 params = session.getParms(); 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 f1b056469..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 && !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 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); - } - } -} diff --git a/app/src/main/java/com/fongmi/android/tv/utils/Sniffer.java b/app/src/main/java/com/fongmi/android/tv/utils/Sniffer.java index 42a36e6a0..32ae9fe59 100644 --- a/app/src/main/java/com/fongmi/android/tv/utils/Sniffer.java +++ b/app/src/main/java/com/fongmi/android/tv/utils/Sniffer.java @@ -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(); }