From 9bcda08ab3a65a1af35e2c3d960144dca8feb8f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=8E=E4=BF=8A?= <215613905@qq.com> Date: Wed, 19 Feb 2025 15:31:06 +0800 Subject: [PATCH] =?UTF-8?q?=E5=86=8D=E6=AC=A1=E4=BC=98=E5=8C=96EXO?= =?UTF-8?q?=E7=9A=84dns=E8=A7=A3=E6=9E=90;=E8=A7=A3=E5=86=B3=E9=A2=91?= =?UTF-8?q?=E7=B9=81=E5=88=87=E6=8D=A2=E5=AF=BC=E8=87=B4=E6=92=AD=E6=94=BE?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tvbox/osc/player/IjkMediaPlayer.java | 2 +- .../com/github/tvbox/osc/util/OkGoHelper.java | 62 ++++++++++++------- 2 files changed, 41 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/com/github/tvbox/osc/player/IjkMediaPlayer.java b/app/src/main/java/com/github/tvbox/osc/player/IjkMediaPlayer.java index 5b44b9d5..c15abd9a 100644 --- a/app/src/main/java/com/github/tvbox/osc/player/IjkMediaPlayer.java +++ b/app/src/main/java/com/github/tvbox/osc/player/IjkMediaPlayer.java @@ -68,7 +68,7 @@ public class IjkMediaPlayer extends IjkPlayer { // mMediaPlayer.setOption(tv.danmaku.ijk.media.player.IjkMediaPlayer.OPT_CATEGORY_FORMAT, "fflags", "nobuffer"); // 减少协议层缓冲 }else{ LOG.i("type-点播"); - mMediaPlayer.setOption(tv.danmaku.ijk.media.player.IjkMediaPlayer.OPT_CATEGORY_PLAYER, "max_cached_duration", 100); +// mMediaPlayer.setOption(tv.danmaku.ijk.media.player.IjkMediaPlayer.OPT_CATEGORY_PLAYER, "max_cached_duration", 100); mMediaPlayer.setOption(tv.danmaku.ijk.media.player.IjkMediaPlayer.OPT_CATEGORY_FORMAT, "infbuf", 0); mMediaPlayer.setOption(tv.danmaku.ijk.media.player.IjkMediaPlayer.OPT_CATEGORY_PLAYER, "min-frames", 5); } diff --git a/app/src/main/java/com/github/tvbox/osc/util/OkGoHelper.java b/app/src/main/java/com/github/tvbox/osc/util/OkGoHelper.java index 513ccce6..9d48a410 100644 --- a/app/src/main/java/com/github/tvbox/osc/util/OkGoHelper.java +++ b/app/src/main/java/com/github/tvbox/osc/util/OkGoHelper.java @@ -20,11 +20,10 @@ import java.net.InetAddress; import java.net.UnknownHostException; import java.security.cert.CertificateException; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Map; -import java.util.Objects; -import java.util.concurrent.PriorityBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; + import java.util.concurrent.TimeUnit; import java.util.logging.Level; @@ -39,6 +38,7 @@ import okhttp3.dnsoverhttps.DnsOverHttps; import okhttp3.internal.Version; import xyz.doikki.videoplayer.exo.ExoMediaSourceHelper; + public class OkGoHelper { public static final long DEFAULT_MILLISECONDS = 8000; //默认的超时时间 @@ -66,6 +66,7 @@ public class OkGoHelper { th.printStackTrace(); } +// builder.dns(dnsOverHttps); builder.dns(new CustomDns()); ExoMediaSourceHelper.getInstance(App.getInstance()).setOkClient(builder.build()); @@ -76,7 +77,7 @@ public class OkGoHelper { public static ArrayList dnsHttpsList = new ArrayList<>(); public static boolean is_doh = false; - public static Map myHosts = null; + public static Map myHosts = null; public static String getDohUrl(int type) { @@ -125,35 +126,52 @@ public class OkGoHelper { builder.cache(new Cache(new File(App.getInstance().getCacheDir().getAbsolutePath(), "dohcache"), 100 * 1024 * 1024)); OkHttpClient dohClient = builder.build(); String dohUrl = getDohUrl(Hawk.get(HawkConfig.DOH_URL, 0)); - if(!dohUrl.isEmpty())is_doh=true; + if (!dohUrl.isEmpty()) is_doh = true; dnsOverHttps = new DnsOverHttps.Builder() .client(dohClient) - .url(dohUrl.isEmpty()?null:HttpUrl.get(dohUrl)) + .url(dohUrl.isEmpty() ? null : HttpUrl.get(dohUrl)) .build(); } - // 自定义 DNS 解析器,优先使用 DoH,失败时降级到系统 DNS + // 自定义 DNS 解析器 static class CustomDns implements Dns { @NonNull @Override public List lookup(@NonNull String hostname) throws UnknownHostException { - if(myHosts==null){ - LOG.i("echo-exo-setHOSTS"); - myHosts= ApiConfig.get().getMyHost(); + if (myHosts == null)myHosts = ApiConfig.get().getMyHost(); //确保只获取一次减少消耗 + // 判断输入是否为 IP 地址 + if (isValidIpAddress(hostname)) { + return Collections.singletonList(InetAddress.getByName(hostname)); + } else { + if(!myHosts.isEmpty() && myHosts.containsKey(hostname))hostname=myHosts.get(hostname); + assert hostname != null; +// return (is_doh?dnsOverHttps:Dns.SYSTEM).lookup(hostname); + return (dnsOverHttps).lookup(hostname); } - if (is_doh && !hostname.equals("127.0.0.1")) { - if (!myHosts.isEmpty() && myHosts.containsKey(hostname)) { - return dnsOverHttps.lookup(Objects.requireNonNull(myHosts.get(hostname))); - }else { - return dnsOverHttps.lookup(hostname); - } - }else { - if (!myHosts.isEmpty() && myHosts.containsKey(hostname)) { - return Dns.SYSTEM.lookup(Objects.requireNonNull(myHosts.get(hostname))); - }else { - return Dns.SYSTEM.lookup(hostname); + } + + //简单判断减少开销 + private boolean isValidIpAddress(String str) { + // 处理 IPv4 地址的判断 + if (str.indexOf('.') > 0)return isValidIPv4(str); + // 处理 IPv6 地址的判断 + if (str.indexOf(':') > 0)return true; + return false; + } + + private boolean isValidIPv4(String str) { + String[] parts = str.split("\\."); + // IPv4 地址必须有 4 个部分 + if (parts.length != 4)return false; + // 检查每一部分是否是 0-255 的数字 + for (String part : parts) { + try { + Integer.parseInt(part); + } catch (NumberFormatException e) { + return false; } } + return true; } } @@ -190,7 +208,7 @@ public class OkGoHelper { builder.writeTimeout(DEFAULT_MILLISECONDS, TimeUnit.MILLISECONDS); builder.connectTimeout(DEFAULT_MILLISECONDS, TimeUnit.MILLISECONDS); - if(dnsOverHttps!=null)builder.dns(dnsOverHttps); + builder.dns(dnsOverHttps); try { setOkHttpSsl(builder); } catch (Throwable th) {