删除"歌曲源临时受限"弹窗, 取址失败只保留一个提示
- 删除 Eac19WindowGuard.onBlocked 及其弹窗(含 MainActivity 处理器、60 秒去重、lastAllFailedAt 访问器) - 取址失败现在只有一句用户可见提示: onAllFailed → "远程源已全部失效,等待新版本修复"(15 分钟节流) - 风控 403 改为只写日志: noteRiskBlocked() 落 SOURCE-BLOCKED 源站风控 403… 到远程日志与本地 logs/ktv.log (保留它是为了区分"403 风控"与"只发广告"两种受限原因, 删掉会失去现场判断依据) - 类注释与 AGENTS 段落同步更新 版本号按规则 3: 1.5.6(38) → 1.5.7(39); 本地打包(未发布) 验证: assembleRelease + 单元测试(9 例全过); 全局检索无 onBlocked/lastAllFailedAt 残留
This commit is contained in:
@@ -16,23 +16,25 @@ import android.util.Log
|
||||
* 这种"看似成功"的形态以前不触发任何提示,用户只看到"无法生成下载地址" ——
|
||||
* 现在由 `SongUrlResolver` 识别"全部源只返回广告/测试资源"后调用 [noteRiskBlocked]。
|
||||
*
|
||||
* 职责:
|
||||
* - 通知 UI 弹一次提示(引导重启光猫/路由器换 IP);
|
||||
* - 取 URL 成功(窗口恢复)后自动复位, 下一次到期可再次提示;
|
||||
* 职责(2026-10 调整后):
|
||||
* - 取址**全部失败**时通知 UI 弹一次「远程源已全部失效,等待新版本修复」([onAllFailed]);
|
||||
* - 风控 403 只写日志([noteRiskBlocked])—— 原先那个「歌曲源临时受限…换 IP」弹窗
|
||||
* **已按用户要求删除**,用户可见提示只保留上面那一个;
|
||||
* - 取 URL 成功(窗口恢复)后自动复位 episode, 下一次失败可再次提示;
|
||||
* - 全程不阻塞、不影响播放(本地已缓存歌曲照常播)。
|
||||
*/
|
||||
object Eac19WindowGuard {
|
||||
private const val TAG = "Eac19WindowGuard"
|
||||
|
||||
/** UI 层订阅: 窗口到期(风控 403)时回调(已在主线程)。 */
|
||||
@Volatile var onBlocked: (() -> Unit)? = null
|
||||
|
||||
/**
|
||||
* UI 层订阅:**所有源都取不到可用地址**时回调(已在主线程)。
|
||||
*
|
||||
* 与 [onBlocked](风控 403 / 只发广告)的区别:这里是"这一轮取址彻底失败"的总信号,
|
||||
* 无论原因是 403、只返回广告、还是网络异常 —— 用户此时什么都点不了,
|
||||
* 需要一句明确的话,而不是让界面看起来像没反应。
|
||||
* 这是取址失败**唯一**的用户可见提示(2026-10 起)——不论原因是风控 403、只返回广告,
|
||||
* 还是网络异常。用户此时什么都点不了,需要一句明确的话,
|
||||
* 而不是让界面看起来像没反应。
|
||||
*
|
||||
* ⚠️ 原先还有一个 `onBlocked`(「歌曲源临时受限…请重启光猫换 IP」)弹窗,
|
||||
* **2026-10 按用户要求删除**;风控 403 现在只由 [noteRiskBlocked] 写一条日志。
|
||||
*/
|
||||
@Volatile var onAllFailed: (() -> Unit)? = null
|
||||
|
||||
@@ -44,23 +46,23 @@ object Eac19WindowGuard {
|
||||
private var blockedEpisodeActive = false
|
||||
private var lastAllFailedAt = 0L
|
||||
|
||||
/** 由 JS 桥在 do.php 返回风控 403 时调用(任意线程)。 */
|
||||
/** 由 JS 桥在 do.php / i.php 返回风控 403 时调用(任意线程)。**只写日志,无 UI**。 */
|
||||
fun noteRiskBlocked() {
|
||||
val now = System.currentTimeMillis()
|
||||
val shouldNotify: Boolean
|
||||
val shouldLog: Boolean
|
||||
synchronized(lock) {
|
||||
if (!blockedEpisodeActive) {
|
||||
blockedEpisodeActive = true
|
||||
lastPromptAt = now
|
||||
shouldNotify = true
|
||||
shouldLog = true
|
||||
} else {
|
||||
shouldNotify = now - lastPromptAt >= MIN_PROMPT_INTERVAL_MS
|
||||
if (shouldNotify) lastPromptAt = now
|
||||
shouldLog = now - lastPromptAt >= MIN_PROMPT_INTERVAL_MS
|
||||
if (shouldLog) lastPromptAt = now
|
||||
}
|
||||
}
|
||||
if (shouldNotify) {
|
||||
if (shouldLog) {
|
||||
Log.w(TAG, "歌曲源 risk-control 403 (trial window expired)")
|
||||
onBlocked?.invoke()
|
||||
MiliLog.warn("SOURCE-BLOCKED 源站风控 403(歌曲源试用窗口/授权受限)")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -81,9 +83,6 @@ object Eac19WindowGuard {
|
||||
}
|
||||
}
|
||||
|
||||
/** 最近一次"全部源失效"提示的时间(0 = 从未);供 403 提示去重,避免同时弹两个框。 */
|
||||
fun lastAllFailedAt(): Long = lastAllFailedAt
|
||||
|
||||
/** 取到有效歌曲 URL(窗口恢复)时调用, 复位本次到期 episode。 */
|
||||
fun noteUrlOk() {
|
||||
synchronized(lock) {
|
||||
|
||||
@@ -519,27 +519,9 @@ class MainActivity : AppCompatActivity() {
|
||||
// 现在统一在 reportDeviceBootInfo() 的后台线程里、awaitServerIp() 之后上报。
|
||||
refreshLogDeviceContext()
|
||||
reportDeviceBootInfo()
|
||||
// 歌曲源窗口/风控到期守卫: 源对陌生出口 IP 可能在短暂窗口后返回 403,
|
||||
// 换公网 IP 即恢复。到期时弹一次提示引导用户重启光猫/路由器(重拨换 IP)。
|
||||
Eac19WindowGuard.onBlocked = {
|
||||
main.post {
|
||||
if (isFinishing || isDestroyed) return@post
|
||||
// 刚刚弹过"全部源失效"就不再叠加第二个框(两者常常同时触发)。
|
||||
if (System.currentTimeMillis() - Eac19WindowGuard.lastAllFailedAt() < 60_000L) return@post
|
||||
AlertDialog.Builder(this)
|
||||
.setTitle("歌曲源临时受限")
|
||||
.setMessage(
|
||||
"歌曲源在当前网络(公网 IP)下暂时无法获取新歌播放地址。\n\n" +
|
||||
"表现有两种:风控/试用窗口到期,或对每一首歌都只返回广告/测试资源" +
|
||||
"(额度记在出口 IP 上,换设备无效)。\n\n" +
|
||||
"解决办法:重启光猫/路由器重新拨号更换公网 IP,恢复后即可继续点歌。\n\n" +
|
||||
"已缓存/已下载的歌曲不受影响,可正常播放。",
|
||||
)
|
||||
.setPositiveButton("知道了", null)
|
||||
.create()
|
||||
.showForTv(DialogInterface.BUTTON_POSITIVE)
|
||||
}
|
||||
}
|
||||
// ⚠️ 这里**不再有**「歌曲源临时受限」弹窗(2026-10 按用户要求删除):
|
||||
// 取不到地址时只弹下面那一个「远程源已全部失效」框。
|
||||
// 风控 403 仍由 Eac19WindowGuard.noteRiskBlocked() 写日志(只有日志,无 UI)。
|
||||
// 所有源都取不到地址(403 / 只发广告 / 网络异常都算):给用户一句明确的话。
|
||||
// 以前这里只有"无法生成下载地址"的 toast,用户看着像没反应。
|
||||
Eac19WindowGuard.onAllFailed = {
|
||||
|
||||
Reference in New Issue
Block a user