From 82c667b0111512bb23c9f006c23e6dc6ba1f4ccd Mon Sep 17 00:00:00 2001 From: FongMi Date: Mon, 5 Jun 2023 21:40:04 +0800 Subject: [PATCH] Clean code --- .../com/fongmi/android/tv/player/IjkUtil.java | 3 +-- .../com/fongmi/android/tv/server/Nano.java | 17 ++++++++++++ .../com/fongmi/android/tv/utils/M3U8.java | 26 +++++++++++++++++++ .../com/fongmi/android/tv/utils/Sniffer.java | 5 ++++ 4 files changed, 49 insertions(+), 2 deletions(-) create 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/IjkUtil.java b/app/src/main/java/com/fongmi/android/tv/player/IjkUtil.java index c0344129b..abb843837 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 @@ -18,8 +18,7 @@ public class IjkUtil { public static MediaSource getSource(Map headers, String url) { Uri uri = Uri.parse(url.trim().replace("\\", "")); - boolean hasAds = Sniffer.getAdsRegex(uri).size() > 0; - if (hasAds) uri = Uri.parse(Server.get().getAddress(true).concat("/m3u8?url=").concat(url)); + if (Sniffer.isAds(uri)) uri = Uri.parse(Server.get().getAddress(true).concat("/m3u8?url=").concat(url)); return new MediaSource(headers, uri); } } 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 d50c6aa70..bc0c81178 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 @@ -1,5 +1,7 @@ package com.fongmi.android.tv.server; +import android.net.Uri; + import com.fongmi.android.tv.R; import com.fongmi.android.tv.api.ApiConfig; import com.fongmi.android.tv.bean.Device; @@ -7,6 +9,8 @@ import com.fongmi.android.tv.server.process.ActionRequestProcess; import com.fongmi.android.tv.server.process.RawRequestProcess; import com.fongmi.android.tv.server.process.RequestProcess; import com.fongmi.android.tv.utils.FileUtil; +import com.fongmi.android.tv.utils.M3U8; +import com.fongmi.android.tv.utils.Sniffer; import com.google.gson.JsonArray; import com.google.gson.JsonObject; @@ -25,6 +29,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import fi.iki.elonen.NanoHTTPD; +import okhttp3.Headers; public class Nano extends NanoHTTPD { @@ -78,6 +83,7 @@ public class Nano extends NanoHTTPD { switch (session.getMethod()) { case GET: if (url.startsWith("/file")) return doFile(url); + else if (url.startsWith("/m3u8")) return doM3u8(session); else if (url.startsWith("/proxy")) return doProxy(session.getParms()); else if (url.startsWith("/device")) return createSuccessResponse(Device.get().toString()); break; @@ -114,6 +120,17 @@ public class Nano extends NanoHTTPD { } } + private Response doM3u8(IHTTPSession session) { + try { + String url = session.getParms().get("url"); + String result = M3U8.get(url, Headers.of(session.getHeaders())); + for (String ad : Sniffer.getAdsRegex(Uri.parse(url))) result = result.replaceAll(ad, ""); + return newFixedLengthResponse(Response.Status.OK, NanoHTTPD.MIME_PLAINTEXT, result); + } catch (Exception e) { + return createErrorResponse(e.getMessage()); + } + } + private Response doProxy(Map params) { try { Object[] rs = ApiConfig.get().proxyLocal(params); 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 new file mode 100644 index 000000000..80c4c651c --- /dev/null +++ b/app/src/main/java/com/fongmi/android/tv/utils/M3U8.java @@ -0,0 +1,26 @@ +package com.fongmi.android.tv.utils; + +import androidx.media3.common.util.UriUtil; + +import com.github.catvod.net.OkHttp; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import okhttp3.Headers; + +public class M3U8 { + + public static String get(String url, Headers headers) throws Exception { + String result = OkHttp.newCall(url, headers).execute().body().string(); + Matcher matcher = Pattern.compile("#EXT-X-STREAM-INF(.*)\\n?(.*)").matcher(result); + 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) ? UriUtil.resolve(url, line) : line).append("\n"); + return sb.toString(); + } + + private static boolean shouldResolve(String line) { + return !line.startsWith("#") && !line.startsWith("http"); + } +} 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 921f7bf21..0748e5872 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,6 +41,11 @@ public class Sniffer { return false; } + public static boolean isAds(Uri uri) { + if (uri.getHost() != null) for (Rule rule : ApiConfig.get().getRules()) for (String host : rule.getHosts()) if (uri.getHost().contains(host)) return true; + return false; + } + public static List getAdsRegex(Uri uri) { if (uri.getHost() != null) for (Rule rule : ApiConfig.get().getRules()) for (String host : rule.getHosts()) if (uri.getHost().contains(host)) return rule.getRegex(); return Collections.emptyList();