pull/137/head
FongMi 3 years ago
parent 9202461612
commit 82c667b011
  1. 3
      app/src/main/java/com/fongmi/android/tv/player/IjkUtil.java
  2. 17
      app/src/main/java/com/fongmi/android/tv/server/Nano.java
  3. 26
      app/src/main/java/com/fongmi/android/tv/utils/M3U8.java
  4. 5
      app/src/main/java/com/fongmi/android/tv/utils/Sniffer.java

@ -18,8 +18,7 @@ public class IjkUtil {
public static MediaSource getSource(Map<String, String> 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);
}
}

@ -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<String, String> params) {
try {
Object[] rs = ApiConfig.get().proxyLocal(params);

@ -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");
}
}

@ -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<String> 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();

Loading…
Cancel
Save