精简远程日志: 每次事件一条汇总, 细节只留本地
- MiliLog 新增只写本地通道 local/localWarn/localError
(队列改为 Entry(local, remote), remote 为 null 即只写本地、跳过 HTTP)
- 本地日志文件改为纯文本 yyyy-MM-dd HH:mm:ss.SSS LEVEL text, 单行上限 4000
(远程仍按 900 截断) —— 本地是"详细记录", 要人能直接读
- 逐源/逐次日志全部改本地:
· SongUrlResolver: i.php/do.php 异常、token 失败、do.php code、HTTP 4xx/5xx、
响应非 JSON、冷却跳过、403 提示、广告示例 URL
· KtvJsBridge: JS 控制台转发(量最大)、单次 HTTP-<status>、NET-ERR
- 结果: 每次取址远程恰好一条
成功 NATIVE-SONG 取址成功… / 失败 NATIVE-SONG 全部源失败… / 全广告 SOURCE-BLOCKED…
(改前 9 个源逐个上报, 一次取址 9+ 条)
- 保留: JS-BRIDGE…(状态变化)、点歌失败…(每首一行)、SONG-AD…(广告拦截) 仍上报远程
- AGENTS: 写日志约定新增第 5 条(远程=结论、本地=过程), JS 日志规则改为只进本地
版本号按规则 3: 1.5.7(39) → 1.5.8(40); 按要求未打包
验证: compileReleaseKotlin + 单元测试(9 例全过)
This commit is contained in:
@@ -116,14 +116,14 @@ object SongUrlResolver {
|
||||
fun resolve(musicno: String, resolution: String = "720", h265: Boolean = false): String? {
|
||||
if (musicno.isBlank()) return null
|
||||
val channel = fetch ?: run {
|
||||
MiliLog.warn("NATIVE-SONG 未安装取址通道,跳过原生兜底")
|
||||
MiliLog.localWarn("NATIVE-SONG 未安装取址通道,跳过原生兜底")
|
||||
return null
|
||||
}
|
||||
// 已判定"源站对该出口 IP 只发广告/测试资源"时进入冷却:直接失败,
|
||||
// 既让用户立刻看到结论,也避免继续冲击源站把限流拖得更久。
|
||||
val nowMs = System.currentTimeMillis()
|
||||
if (nowMs < blockedUntil) {
|
||||
MiliLog.warn(
|
||||
MiliLog.localWarn(
|
||||
"SOURCE-BLOCKED 冷却中(剩 ${(blockedUntil - nowMs) / 1000}s)跳过取址 编号=$musicno",
|
||||
)
|
||||
return null
|
||||
@@ -139,7 +139,7 @@ object SongUrlResolver {
|
||||
|
||||
for ((index, host) in hosts.withIndex()) {
|
||||
val token = runCatching { fetchToken(channel, host, mac) }.getOrElse {
|
||||
MiliLog.warn("NATIVE-SONG i.php 异常 源=$host ${it.javaClass.simpleName}: ${it.message}")
|
||||
MiliLog.localWarn("NATIVE-SONG i.php 异常 源=$host ${it.javaClass.simpleName}: ${it.message}")
|
||||
null
|
||||
}
|
||||
if (token.isNullOrEmpty()) {
|
||||
@@ -150,7 +150,7 @@ object SongUrlResolver {
|
||||
}
|
||||
val url = runCatching { fetchSongUrl(channel, host, mac, musicno, token, resolution, h265) }
|
||||
.getOrElse {
|
||||
MiliLog.warn("NATIVE-SONG do.php 异常 源=$host ${it.javaClass.simpleName}: ${it.message}")
|
||||
MiliLog.localWarn("NATIVE-SONG do.php 异常 源=$host ${it.javaClass.simpleName}: ${it.message}")
|
||||
null
|
||||
}
|
||||
if (!url.isNullOrEmpty() && isValidSongUrl(url, musicno)) {
|
||||
@@ -185,10 +185,12 @@ object SongUrlResolver {
|
||||
// 这里把它识别出来并接入 Eac19WindowGuard 的提示(引导重启光猫/路由器换公网 IP)。
|
||||
if (adOnlyCount > 0 && otherFailCount == 0) {
|
||||
blockedUntil = System.currentTimeMillis() + BLOCKED_COOLDOWN_MS
|
||||
// 远程只留这一条汇总;逐源细节与示例 URL 只写本地。
|
||||
MiliLog.error(
|
||||
"SOURCE-BLOCKED 全部 $adOnlyCount 个源只返回广告/测试资源(该出口 IP 授权窗口失效)" +
|
||||
" 编号=$musicno 示例=$adSample 用时=${elapsed}ms",
|
||||
" 编号=$musicno 用时=${elapsed}ms",
|
||||
)
|
||||
MiliLog.localError("SOURCE-BLOCKED 示例广告地址=$adSample")
|
||||
Eac19WindowGuard.noteRiskBlocked()
|
||||
} else {
|
||||
MiliLog.error(
|
||||
@@ -197,7 +199,7 @@ object SongUrlResolver {
|
||||
// 全都 403 = 源站明确风控(另一种受限形态,与"只发广告"并列),同样引导换公网 IP。
|
||||
if (sawForbidden) {
|
||||
blockedUntil = System.currentTimeMillis() + BLOCKED_COOLDOWN_MS
|
||||
MiliLog.error("SOURCE-BLOCKED 源站返回 HTTP 403(风控/授权窗口失效)编号=$musicno")
|
||||
MiliLog.localError("SOURCE-BLOCKED 源站返回 HTTP 403(风控/授权窗口失效)编号=$musicno")
|
||||
Eac19WindowGuard.noteRiskBlocked()
|
||||
}
|
||||
}
|
||||
@@ -215,7 +217,7 @@ object SongUrlResolver {
|
||||
val sign = md5(params + APP_KEY)
|
||||
val json = getJson(channel, "$host/i.php?$params&sign=$sign") ?: return null
|
||||
if (json.optInt("code") != 200) {
|
||||
MiliLog.warn("NATIVE-SONG token 失败 源=$host code=${json.optInt("code")} msg=${json.optString("msg")}")
|
||||
MiliLog.localWarn("NATIVE-SONG token 失败 源=$host code=${json.optInt("code")} msg=${json.optString("msg")}")
|
||||
return null
|
||||
}
|
||||
return json.optString("token").takeIf { it.isNotEmpty() }
|
||||
@@ -238,7 +240,7 @@ object SongUrlResolver {
|
||||
val json = getJson(channel, "$host/music/do.php?$params&sign=$sign") ?: return null
|
||||
val code = json.optInt("code")
|
||||
if (code != 200) {
|
||||
MiliLog.warn("NATIVE-SONG do.php 源=$host code=$code msg=${json.optString("msg")}")
|
||||
MiliLog.localWarn("NATIVE-SONG do.php 源=$host code=$code msg=${json.optString("msg")}")
|
||||
return null
|
||||
}
|
||||
return json.optString("data").takeIf { it.isNotEmpty() }
|
||||
@@ -253,7 +255,7 @@ object SongUrlResolver {
|
||||
// 403 = 源站风控的直接信号(2026-10 实测主源 w.w345.my/i.php 就是 403)。
|
||||
// 记下来,全部源都失败时据此走 Eac19WindowGuard 的"换公网 IP"提示。
|
||||
if (status == 403) sawForbidden = true
|
||||
MiliLog.warn(
|
||||
MiliLog.localWarn(
|
||||
"NATIVE-SONG HTTP $status ${runCatching { java.net.URI(url).host }.getOrNull()} " +
|
||||
"err=${envelope.optString("error").take(80)}",
|
||||
)
|
||||
@@ -262,7 +264,7 @@ object SongUrlResolver {
|
||||
val body = envelope.optString("body")
|
||||
if (body.isBlank()) return null
|
||||
return runCatching { JSONObject(body) }.getOrElse {
|
||||
MiliLog.warn("NATIVE-SONG 响应非 JSON: ${body.take(120)}")
|
||||
MiliLog.localWarn("NATIVE-SONG 响应非 JSON: ${body.take(120)}")
|
||||
null
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user