pull/1817/head
kunfei 3 years ago
parent f8b105303c
commit 0bdf3eae54
  1. 54
      app/src/main/java/io/legado/app/service/HttpReadAloudService.kt

@ -39,7 +39,6 @@ class HttpReadAloudService : BaseReadAloudService(),
cacheDir.absolutePath + File.separator + "httpTTS" + File.separator
}
private var speechRate: Int = AppConfig.speechRatePlay
private val cacheFiles = hashSetOf<String>()
private var downloadTask: Coroutine<*>? = null
private var playIndexJob: Job? = null
private var downloadTaskIsActive = false
@ -65,17 +64,14 @@ class HttpReadAloudService : BaseReadAloudService(),
} else {
super.play()
kotlin.runCatching {
val tts = ReadAloud.httpTTS ?: throw NoStackTraceException("httpTts is null")
val fileName = md5SpeakFileName(
tts.url, AppConfig.ttsSpeechRate.toString(), contentList[nowSpeak]
)
if (nowSpeak == 0 && downloadTask?.isActive != true) {
downloadAudio()
} else {
val fileName = md5SpeakFileName(contentList[nowSpeak])
val file = getSpeakFileAsMd5(fileName)
if (file.exists()) {
playAudio(file)
} else {
} else if (downloadTask?.isActive != true) {
downloadAudio()
}
}
@ -107,27 +103,22 @@ class HttpReadAloudService : BaseReadAloudService(),
delay(100)
}
downloadTask = execute {
clearSpeakCache()
removeCacheFile()
val httpTts = ReadAloud.httpTTS ?: return@execute
val httpTts = ReadAloud.httpTTS ?: throw NoStackTraceException("tts is null")
contentList.forEachIndexed { index, content ->
ensureActive()
val fileName =
md5SpeakFileName(httpTts.url, speechRate.toString(), content)
val fileName = md5SpeakFileName(content)
val speakText = content.replace(AppPattern.notReadAloudRegex, "")
if (hasSpeakFile(fileName)) { //已经下载好的语音缓存
if (index == nowSpeak) {
val file = getSpeakFileAsMd5(fileName)
playAudio(file)
}
} else if (hasSpeakCache(fileName)) { //缓存文件还在,可能还没下载完
return@forEachIndexed
} else if (speakText.isEmpty()) {
createSilentSound(fileName)
return@forEachIndexed
} else {
runCatching {
createSpeakCache(fileName)
val analyzeUrl = AnalyzeUrl(
httpTts.url,
speakText = speakText,
@ -155,7 +146,6 @@ class HttpReadAloudService : BaseReadAloudService(),
response.body!!.bytes().let { bytes ->
val file = createSpeakFileAsMd5IfNotExist(fileName)
file.writeBytes(bytes)
removeSpeakCache(fileName)
if (index == nowSpeak) {
playAudio(file)
}
@ -163,9 +153,8 @@ class HttpReadAloudService : BaseReadAloudService(),
downloadErrorNo = 0
}.onFailure {
when (it) {
is CancellationException -> removeSpeakCache(fileName)
is CancellationException -> Unit
is ConcurrentException -> {
removeSpeakCache(fileName)
delay(it.waitTime.toLong())
downloadAudio()
}
@ -177,7 +166,6 @@ class HttpReadAloudService : BaseReadAloudService(),
pauseReadAloud(true)
}
is SocketTimeoutException, is ConnectException -> {
removeSpeakCache(fileName)
downloadErrorNo++
if (downloadErrorNo > 5) {
val msg = "tts超时或连接错误超过5次\n${it.localizedMessage}"
@ -189,7 +177,6 @@ class HttpReadAloudService : BaseReadAloudService(),
}
}
else -> {
removeSpeakCache(fileName)
downloadErrorNo++
val msg = "tts下载错误\n${it.localizedMessage}"
AppLog.put(msg, it)
@ -228,9 +215,9 @@ class HttpReadAloudService : BaseReadAloudService(),
}
}
private fun md5SpeakFileName(url: String, ttsConfig: String, content: String): String {
private fun md5SpeakFileName(content: String): String {
return MD5Utils.md5Encode16(textChapter?.title ?: "") + "_" +
MD5Utils.md5Encode16("$url-|-$ttsConfig-|-$content")
MD5Utils.md5Encode16("${ReadAloud.httpTTS?.url}-|-$speechRate-|-$content")
}
private fun createSilentSound(fileName: String) {
@ -238,26 +225,17 @@ class HttpReadAloudService : BaseReadAloudService(),
file.writeBytes(resources.openRawResource(R.raw.silent_sound).readBytes())
}
@Synchronized
private fun clearSpeakCache() = cacheFiles.clear()
@Synchronized
private fun hasSpeakCache(name: String) = cacheFiles.contains(name)
@Synchronized
private fun createSpeakCache(name: String) = cacheFiles.add(name)
@Synchronized
private fun removeSpeakCache(name: String) = cacheFiles.remove(name)
private fun hasSpeakFile(name: String) =
FileUtils.exist("${ttsFolderPath}$name.mp3")
private fun hasSpeakFile(name: String): Boolean {
return FileUtils.exist("${ttsFolderPath}$name.mp3")
}
private fun getSpeakFileAsMd5(name: String): File =
File("${ttsFolderPath}$name.mp3")
private fun getSpeakFileAsMd5(name: String): File {
return File("${ttsFolderPath}$name.mp3")
}
private fun createSpeakFileAsMd5IfNotExist(name: String): File =
FileUtils.createFileIfNotExist("${ttsFolderPath}$name.mp3")
private fun createSpeakFileAsMd5IfNotExist(name: String): File {
return FileUtils.createFileIfNotExist("${ttsFolderPath}$name.mp3")
}
/**
* 移除缓存文件

Loading…
Cancel
Save