麦动KTV: 移除Gitee数据库(改官方Muse同步), 歌曲源切w.w345.my, 远程日志+广告屏蔽
- DatabaseBootstrapper: 删除 Gitee 分片/manifest/blob 下载逻辑, 曲库只走官方 MuseDbSync - build.gradle: 移除 GITEE_DATABASE_* 构建参数 - MainActivity: 重置数据库文案改为官方同步 - ktv_api.js: 歌曲源仅 w.w345.my, 缓存标记 7, 广告/错号资源拦截+重试 - 远程日志: 点歌记录 编号/标题/请求源/状态
This commit is contained in:
@@ -0,0 +1,63 @@
|
||||
package com.local.ktv
|
||||
|
||||
import android.util.Log
|
||||
import java.io.File
|
||||
import java.util.Locale
|
||||
|
||||
/**
|
||||
* 曲库下载引导(仅官方 Muse 同步源)。
|
||||
*
|
||||
* 说明:已移除 Gitee 数据库分片/镜像下载路径(database_publish 不再发布到 Gitee,
|
||||
* Gitee 仓库此后只存代码)。曲库统一从官方 Muse 服务(mconn.cherryonline.cn mls-api)
|
||||
* 同步,由 [MuseDbSync] 负责登录、同步、校验与安装;本类只做版本文件与可读错误包装。
|
||||
*/
|
||||
object DatabaseBootstrapper {
|
||||
private const val TAG = "DatabaseBootstrapper"
|
||||
|
||||
private val versionFile: File get() = File(MuseDatabase.defaultDbFile().parentFile, "db_version.txt")
|
||||
|
||||
/** 远端曲库版本(官方 Muse);失败返回 null。 */
|
||||
fun fetchRemoteVersion(): String? = MuseDbSync.fetchVersion()
|
||||
|
||||
fun getLocalDbVersion(): String? = runCatching {
|
||||
versionFile.takeIf { it.exists() }?.readText()?.trim()?.takeIf { it.isNotEmpty() }
|
||||
}.getOrNull()
|
||||
|
||||
private fun saveLocalDbVersion(version: String) {
|
||||
runCatching { versionFile.writeText(version.trim()) }
|
||||
}
|
||||
|
||||
/** 下载曲库:仅官方 Muse 同步源。 */
|
||||
fun download(onProgress: (Int) -> Unit): Result<File> {
|
||||
return runCatching {
|
||||
val file = MuseDbSync.download(onProgress)
|
||||
// MuseDbSync 内部已保存版本;此处幂等兜底。
|
||||
MuseDbSync.fetchVersion()?.let(::saveLocalDbVersion)
|
||||
file
|
||||
}.mapError(::readableError)
|
||||
}
|
||||
|
||||
private inline fun <T> Result<T>.mapError(transform: (Throwable) -> Throwable): Result<T> =
|
||||
fold(onSuccess = { Result.success(it) }, onFailure = { Result.failure(transform(it)) })
|
||||
|
||||
private fun formatSize(bytes: Long): String =
|
||||
String.format(Locale.ROOT, "%.2f GB", bytes / 1024.0 / 1024.0 / 1024.0)
|
||||
|
||||
private fun isNoSpaceError(error: Throwable?): Boolean = generateSequence(error) { it.cause }
|
||||
.mapNotNull { it.message?.lowercase(Locale.ROOT) }
|
||||
.any { "enospc" in it || "no space left" in it }
|
||||
|
||||
private fun readableError(error: Throwable): Throwable {
|
||||
if (isNoSpaceError(error)) {
|
||||
val target = MuseDatabase.defaultDbFile()
|
||||
return IllegalStateException(
|
||||
"曲库分区空间不足(当前可用 ${formatSize(target.parentFile?.usableSpace ?: 0L)})," +
|
||||
"已清理下载临时文件,请释放空间后重试",
|
||||
error,
|
||||
)
|
||||
}
|
||||
val message = error.message?.takeIf { it.isNotBlank() } ?: "曲库下载失败"
|
||||
Log.w(TAG, "Database download failed: $message")
|
||||
return IllegalStateException(message, error)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user