tts朗读引擎跟随单本书籍

pull/1601/head
Xwite 3 years ago
parent f5a4725ba4
commit 717c451a3e
  1. 1
      app/src/main/assets/updateLog.md
  2. 9
      app/src/main/java/io/legado/app/data/entities/Book.kt
  3. 3
      app/src/main/java/io/legado/app/model/ReadAloud.kt
  4. 2
      app/src/main/java/io/legado/app/service/TTSReadAloudService.kt
  5. 4
      app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudConfigDialog.kt
  6. 8
      app/src/main/java/io/legado/app/ui/book/read/config/SpeakEngineDialog.kt

@ -18,6 +18,7 @@
* txt单章字数超102400均分txt,添加开关 by Xwite * txt单章字数超102400均分txt,添加开关 by Xwite
* 修复tts被回收后无法继续朗读的bug,重新初始化tts * 修复tts被回收后无法继续朗读的bug,重新初始化tts
* webDav备份支持自定义文件夹 * webDav备份支持自定义文件夹
* tts朗读引擎按书籍配置,未设置的和上一次设置的引擎相同
**2022/02/03** **2022/02/03**

@ -188,6 +188,14 @@ data class Book(
return config().delTag and tag == tag return config().delTag and tag == tag
} }
var ttsEngine: String?
get() = config().ttsEngine
set(value) {
config().ttsEngine = value
AppConfig.ttsEngine = value
save()
}
fun getFolderName(): String { fun getFolderName(): String {
//防止书名过长,只取9位 //防止书名过长,只取9位
var folderName = name.replace(AppPattern.fileNameRegex, "") var folderName = name.replace(AppPattern.fileNameRegex, "")
@ -277,6 +285,7 @@ data class Book(
data class ReadConfig( data class ReadConfig(
var reverseToc: Boolean = false, var reverseToc: Boolean = false,
var pageAnim: Int = -1, var pageAnim: Int = -1,
var ttsEngine: String? = AppConfig.ttsEngine,
var reSegment: Boolean = false, var reSegment: Boolean = false,
var limitContentLength: Boolean = true, //txt规则解析目录时超过规定的最大字数时均分txt var limitContentLength: Boolean = true, //txt规则解析目录时超过规定的最大字数时均分txt
var imageStyle: String? = null, var imageStyle: String? = null,

@ -5,7 +5,6 @@ import android.content.Intent
import io.legado.app.constant.IntentAction import io.legado.app.constant.IntentAction
import io.legado.app.data.appDb import io.legado.app.data.appDb
import io.legado.app.data.entities.HttpTTS import io.legado.app.data.entities.HttpTTS
import io.legado.app.help.AppConfig
import io.legado.app.service.BaseReadAloudService import io.legado.app.service.BaseReadAloudService
import io.legado.app.service.HttpReadAloudService import io.legado.app.service.HttpReadAloudService
import io.legado.app.service.TTSReadAloudService import io.legado.app.service.TTSReadAloudService
@ -17,7 +16,7 @@ object ReadAloud {
var httpTTS: HttpTTS? = null var httpTTS: HttpTTS? = null
private fun getReadAloudClass(): Class<*> { private fun getReadAloudClass(): Class<*> {
val ttsEngine = AppConfig.ttsEngine val ttsEngine = ReadBook.book?.ttsEngine
if (ttsEngine.isNullOrBlank()) { if (ttsEngine.isNullOrBlank()) {
return TTSReadAloudService::class.java return TTSReadAloudService::class.java
} }

@ -36,7 +36,7 @@ class TTSReadAloudService : BaseReadAloudService(), TextToSpeech.OnInitListener
@Synchronized @Synchronized
private fun initTts() { private fun initTts() {
ttsInitFinish = false ttsInitFinish = false
val engine = GSON.fromJsonObject<SelectItem<String>>(AppConfig.ttsEngine)?.value val engine = GSON.fromJsonObject<SelectItem<String>>(ReadBook.book?.ttsEngine)?.value
textToSpeech = if (engine.isNullOrBlank()) { textToSpeech = if (engine.isNullOrBlank()) {
TextToSpeech(this, this) TextToSpeech(this, this)
} else { } else {

@ -14,11 +14,11 @@ import io.legado.app.base.BasePreferenceFragment
import io.legado.app.constant.EventBus import io.legado.app.constant.EventBus
import io.legado.app.constant.PreferKey import io.legado.app.constant.PreferKey
import io.legado.app.data.appDb import io.legado.app.data.appDb
import io.legado.app.help.AppConfig
import io.legado.app.lib.dialogs.SelectItem import io.legado.app.lib.dialogs.SelectItem
import io.legado.app.lib.theme.backgroundColor import io.legado.app.lib.theme.backgroundColor
import io.legado.app.lib.theme.primaryColor import io.legado.app.lib.theme.primaryColor
import io.legado.app.model.ReadAloud import io.legado.app.model.ReadAloud
import io.legado.app.model.ReadBook
import io.legado.app.service.BaseReadAloudService import io.legado.app.service.BaseReadAloudService
import io.legado.app.utils.* import io.legado.app.utils.*
@ -60,7 +60,7 @@ class ReadAloudConfigDialog : DialogFragment() {
private val speakEngineSummary: String private val speakEngineSummary: String
get() { get() {
val ttsEngine = AppConfig.ttsEngine val ttsEngine = ReadBook.book?.ttsEngine
?: return getString(R.string.system_tts) ?: return getString(R.string.system_tts)
if (StringUtils.isNumeric(ttsEngine)) { if (StringUtils.isNumeric(ttsEngine)) {
return appDb.httpTTSDao.getName(ttsEngine.toLong()) return appDb.httpTTSDao.getName(ttsEngine.toLong())

@ -17,12 +17,12 @@ import io.legado.app.data.entities.HttpTTS
import io.legado.app.databinding.DialogEditTextBinding import io.legado.app.databinding.DialogEditTextBinding
import io.legado.app.databinding.DialogRecyclerViewBinding import io.legado.app.databinding.DialogRecyclerViewBinding
import io.legado.app.databinding.ItemHttpTtsBinding import io.legado.app.databinding.ItemHttpTtsBinding
import io.legado.app.help.AppConfig
import io.legado.app.help.DirectLinkUpload import io.legado.app.help.DirectLinkUpload
import io.legado.app.lib.dialogs.SelectItem import io.legado.app.lib.dialogs.SelectItem
import io.legado.app.lib.dialogs.alert import io.legado.app.lib.dialogs.alert
import io.legado.app.lib.dialogs.selector import io.legado.app.lib.dialogs.selector
import io.legado.app.lib.theme.primaryColor import io.legado.app.lib.theme.primaryColor
import io.legado.app.model.ReadBook
import io.legado.app.ui.document.HandleFileContract import io.legado.app.ui.document.HandleFileContract
import io.legado.app.utils.* import io.legado.app.utils.*
import io.legado.app.utils.viewbindingdelegate.viewBinding import io.legado.app.utils.viewbindingdelegate.viewBinding
@ -37,7 +37,7 @@ class SpeakEngineDialog : BaseDialogFragment(R.layout.dialog_recycler_view),
private val viewModel: SpeakEngineViewModel by viewModels() private val viewModel: SpeakEngineViewModel by viewModels()
private val ttsUrlKey = "ttsUrlKey" private val ttsUrlKey = "ttsUrlKey"
private val adapter by lazy { Adapter(requireContext()) } private val adapter by lazy { Adapter(requireContext()) }
private var ttsEngine: String? = AppConfig.ttsEngine private var ttsEngine: String? = ReadBook.book?.ttsEngine
private val importDocResult = registerForActivityResult(HandleFileContract()) { private val importDocResult = registerForActivityResult(HandleFileContract()) {
it.uri?.let { uri -> it.uri?.let { uri ->
viewModel.importLocal(uri) viewModel.importLocal(uri)
@ -87,7 +87,7 @@ class SpeakEngineDialog : BaseDialogFragment(R.layout.dialog_recycler_view),
} }
tvOk.visible() tvOk.visible()
tvOk.setOnClickListener { tvOk.setOnClickListener {
AppConfig.ttsEngine = ttsEngine ReadBook.book?.ttsEngine = ttsEngine
dismissAllowingStateLoss() dismissAllowingStateLoss()
} }
tvCancel.visible() tvCancel.visible()
@ -136,7 +136,7 @@ class SpeakEngineDialog : BaseDialogFragment(R.layout.dialog_recycler_view),
SelectItem(it.label, it.name) SelectItem(it.label, it.name)
} }
context?.selector(R.string.system_tts, ttsItems) { _, item, _ -> context?.selector(R.string.system_tts, ttsItems) { _, item, _ ->
AppConfig.ttsEngine = GSON.toJson(item) ReadBook.book?.ttsEngine = GSON.toJson(item)
ttsEngine = null ttsEngine = null
adapter.notifyItemRangeChanged(0, adapter.itemCount) adapter.notifyItemRangeChanged(0, adapter.itemCount)
dismissAllowingStateLoss() dismissAllowingStateLoss()

Loading…
Cancel
Save