源列表只保留 zk.ktv1.top:6677, 删除其余全部源
实测(同一出口 IP, 编号 7009126, 三节点同时刻对照): zk.ktv1.top:6677 → i.php 200(与 e.ac19.cn 逐字段一致) + do.php 真源 7009126.ts / 7303235.ts ✅ e.ac19.cn → 同款 i.php + 真源 7009126.ts ✅ 124.223.20.123:58→ 同款 i.php, 但 do.php 返回 0021.ts(非本曲) ❌ 三者同一后台; 昨日 e.ac19.cn/124.223.20.123:58 的 HTTP 403 空响应为临时额度/风控, 今日已恢复 改动: - SongUrlResolver.DEFAULT_HOSTS 与 ktv_api.js CONFIG.HOSTS(含 HOST) 均只留 http://zk.ktv1.top:6677 - KTV_BRIDGE_API 11 → 12 (ktv_api.js 两处 + KtvJsBridge.kt 两处校验) - ensureConfig(): api.php 失败也写负缓存(该节点无 api.php, 否则每首歌白请求一次) - MainActivity 日志不再写死旧源名, 改用 SongUrlResolver.lastHost - AdVideoFilter.AD_HOSTS 不变(管"返回地址"的 host, 与"取址入口"无关) 版本号按规则 3: 1.5.9(41) → 1.5.10(42); 本地打包(未发布) 验证: assembleRelease + 单元测试(9 例全过); 解包确认 APK 内 ktv_api.js 只含新源且标记为 12
This commit is contained in:
@@ -358,7 +358,7 @@ class KtvJsBridge(context: Context) {
|
||||
runCatching {
|
||||
file.isFile && file.length() in 1_001..500_000 &&
|
||||
file.readText(Charsets.UTF_8).let {
|
||||
it.contains("KtvApi") && it.contains("KTV_BRIDGE_API: 11")
|
||||
it.contains("KtvApi") && it.contains("KTV_BRIDGE_API: 12")
|
||||
}
|
||||
}.getOrDefault(false)
|
||||
|
||||
@@ -384,7 +384,7 @@ class KtvJsBridge(context: Context) {
|
||||
val script = String(bytes, StandardCharsets.UTF_8)
|
||||
require(
|
||||
script.length > 1000 && script.contains("KtvApi") &&
|
||||
script.contains("KTV_BRIDGE_API: 11"),
|
||||
script.contains("KTV_BRIDGE_API: 12"),
|
||||
) { "Invalid or incompatible JS file" }
|
||||
tempFile.writeText(script, Charsets.UTF_8)
|
||||
if (!tempFile.renameTo(cacheFile)) {
|
||||
|
||||
@@ -5163,7 +5163,8 @@ class MainActivity : AppCompatActivity() {
|
||||
}
|
||||
if (url == null || url.isEmpty()) {
|
||||
MiliLog.error(
|
||||
"点歌编号=${song?.let(::extractTid)} 标题=${song?.title} 请求源=w.w345.my 状态=失败 详情=无法获取播放地址",
|
||||
"点歌编号=${song?.let(::extractTid)} 标题=${song?.title} 请求源=" +
|
||||
"${SongUrlResolver.lastHost.ifEmpty { "unknown" }} 状态=失败 详情=无法获取播放地址",
|
||||
)
|
||||
main.post(Runnable {
|
||||
hideDownloadProgress()
|
||||
|
||||
@@ -49,18 +49,16 @@ object SongUrlResolver {
|
||||
/** `api.php` 配置缓存时长(原版每次启动/长时间后取一次即可)。 */
|
||||
private const val CONFIG_TTL_MS = 30 * 60_000L
|
||||
|
||||
/**
|
||||
* 歌曲源入口(**2026-10-09 起只保留这一个**)。
|
||||
*
|
||||
* `zk.ktv1.top:6677` 实测与 `e.ac19.cn` **同一个后台**(`i.php` 响应逐字段一致、
|
||||
* `do.php` 同款 SUCCESS + 同一条真源 CDN 路径),且能连续下发**文件名=编号**的真源地址;
|
||||
* 而其它入口要么只发广告/测试资源,要么整体 403。故按用户要求**清空其余入口**,
|
||||
* 只留它一个(少扫源同时也避免了把同后台节点的额度一起打光)。
|
||||
*/
|
||||
private val DEFAULT_HOSTS = listOf(
|
||||
// 与其他入口同一后台、同一协议;2026-10 实测唯一仍下发真源 CDN 地址的入口,放首位。
|
||||
"http://gz.ac16.vip",
|
||||
// 与 w345.my 同机(154.219.102.181)的兄弟入口;实测登录层正常,取址行为待观察。
|
||||
"http://a.ktv8.my",
|
||||
"http://w.w345.my",
|
||||
"http://desktok.top",
|
||||
"http://mm.kk456.top",
|
||||
"http://w.w345.my:66",
|
||||
"http://z.w345.my",
|
||||
"http://b.sktv.top",
|
||||
"http://w345.my",
|
||||
"http://zk.ktv1.top:6677",
|
||||
)
|
||||
|
||||
/** 运行时源优先级(与 JS 一样:解析失败的源沉到队尾)。 */
|
||||
@@ -152,9 +150,12 @@ object SongUrlResolver {
|
||||
val form = "action=get_config&device_id=$mac"
|
||||
val raw = runCatching { channel("$host/api.php", form) }.getOrNull() ?: return
|
||||
val envelope = runCatching { JSONObject(raw) }.getOrNull() ?: return
|
||||
// ⚠️ 失败也要进负缓存:本节点(zk.ktv1.top:6677)**没有 api.php**(404),
|
||||
// 不缓存的话每首歌取址前都要白请求一次,既拖慢又白耗额度。
|
||||
configAt = System.currentTimeMillis()
|
||||
val status = envelope.optInt("status")
|
||||
if (status !in 200..299) {
|
||||
MiliLog.localWarn("SOURCE-CONFIG api.php HTTP $status")
|
||||
MiliLog.localWarn("SOURCE-CONFIG api.php HTTP $status(本节点无配置接口,按全部源尝试)")
|
||||
return
|
||||
}
|
||||
val body = runCatching { JSONObject(envelope.optString("body")) }.getOrNull() ?: return
|
||||
|
||||
Reference in New Issue
Block a user