diff --git a/jmcomic-core/src/main/java/io/github/jukomu/jmcomic/core/client/AbstractJmClient.java b/jmcomic-core/src/main/java/io/github/jukomu/jmcomic/core/client/AbstractJmClient.java index 90f2bd3..3937eb1 100644 --- a/jmcomic-core/src/main/java/io/github/jukomu/jmcomic/core/client/AbstractJmClient.java +++ b/jmcomic-core/src/main/java/io/github/jukomu/jmcomic/core/client/AbstractJmClient.java @@ -103,13 +103,18 @@ protected AbstractJmClient(JmConfiguration config, OkHttpClient httpClient, Cook /* * 后台异步初始化:更新域名列表 -> 域名探活排掉死域名 -> 启动定期复探 -> 调子类初始化 */ - this.internalExecutor.submit(() -> { - this.updateDomains(); - DomainProbe probe = createDomainProbe(); - this.domainManager.probeAllDomains(probe); - this.domainManager.startPeriodicProbe(probe, config.getDomainProbeIntervalMs()); - this.domainManager.setInitialized(true); - this.initialize(); + this.internalExecutor.execute(() -> { + try { + this.updateDomains(); + DomainProbe probe = createDomainProbe(); + this.domainManager.probeAllDomains(probe); + this.domainManager.startPeriodicProbe(probe, config.getDomainProbeIntervalMs()); + this.domainManager.setInitialized(true); + this.initialize(); + } catch (RuntimeException e) { + logger.error("后台初始化任务执行失败", e); + throw e; + } }); // 生成一个 128位的 AES 随机密钥 try { diff --git a/jmcomic-core/src/main/java/io/github/jukomu/jmcomic/core/client/impl/JmApiClient.java b/jmcomic-core/src/main/java/io/github/jukomu/jmcomic/core/client/impl/JmApiClient.java index 67801e1..fc0579f 100644 --- a/jmcomic-core/src/main/java/io/github/jukomu/jmcomic/core/client/impl/JmApiClient.java +++ b/jmcomic-core/src/main/java/io/github/jukomu/jmcomic/core/client/impl/JmApiClient.java @@ -25,6 +25,7 @@ import java.io.IOException; import java.net.CookieManager; import java.net.MalformedURLException; +import java.net.URI; import java.net.URL; import java.time.Instant; import java.util.List; @@ -111,8 +112,38 @@ private void updateSetting() { logger.info("当前API客户端版本[{}],更新API客户端版本[{}] -> [{}]", JmConstants.APP_VERSION, JmConstants.APP_VERSION, JmConstants.APP_VERSION); } - if (imgHost != null) { - JmConstants.DEFAULT_IMAGE_DOMAINS.add(imgHost); + String imageHost = normalizeImageHost(imgHost); + if (imageHost != null) { + boolean added; + synchronized (JmConstants.DEFAULT_IMAGE_DOMAINS) { + added = !JmConstants.DEFAULT_IMAGE_DOMAINS.contains(imageHost) && JmConstants.DEFAULT_IMAGE_DOMAINS.add(imageHost); + } + if (added) { + logger.info("添加动态图片域名[{}],当前图片域名列表: {}", imageHost, JmConstants.DEFAULT_IMAGE_DOMAINS); + } + } + } + + /** + * 标准化图片域名,提取并返回主机名(Host)。 + * + * @param imgHost 图片URL或主机名,可为任意格式 + * @return 标准化后的主机名 + */ + private static String normalizeImageHost(String imgHost) { + if (StringUtils.isBlank(imgHost)) { + return null; + } + + String value = imgHost.trim(); + try { + URI uri = URI.create(value); + if (uri.getScheme() == null) { + uri = URI.create(JmConstants.PROTOCOL_HTTPS + value); + } + return uri.getHost(); + } catch (IllegalArgumentException e) { + return null; } } diff --git a/jmcomic-core/src/main/java/io/github/jukomu/jmcomic/core/constant/JmConstants.java b/jmcomic-core/src/main/java/io/github/jukomu/jmcomic/core/constant/JmConstants.java index 1a2fa5b..9eb9252 100644 --- a/jmcomic-core/src/main/java/io/github/jukomu/jmcomic/core/constant/JmConstants.java +++ b/jmcomic-core/src/main/java/io/github/jukomu/jmcomic/core/constant/JmConstants.java @@ -4,6 +4,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.CopyOnWriteArrayList; /** * @author JUKOMU @@ -126,7 +127,7 @@ private JmConstants() { "www.cdnplaystation6.cc" )); - public static List DEFAULT_IMAGE_DOMAINS = Collections.unmodifiableList(List.of( + public static List DEFAULT_IMAGE_DOMAINS = new CopyOnWriteArrayList<>(List.of( "cdn-msp.jmapiproxy1.cc", "cdn-msp.jmapiproxy2.cc", "cdn-msp2.jmapiproxy2.cc",