From b0c1f9fcec13ffb6c6cd3f82cb154aa2c94bdbd8 Mon Sep 17 00:00:00 2001 From: HapeLee <63206378+HapeLee@users.noreply.github.com> Date: Fri, 19 Jun 2026 00:15:31 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E6=9C=97=E8=AF=BB?= =?UTF-8?q?=E5=BC=95=E6=93=8E=E6=89=B9=E9=87=8F=E5=AF=BC=E5=85=A5=E9=80=89?= =?UTF-8?q?=E6=8B=A9=E7=95=8C=E9=9D=A2=E5=8F=8A=E5=AF=BC=E5=87=BA=20URL=20?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/association/ImportHttpTtsViewModel.kt | 10 ++++++++- .../book/read/sheet/ReadAloudConfigSheet.kt | 21 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/ui/association/ImportHttpTtsViewModel.kt b/app/src/main/java/io/legado/app/ui/association/ImportHttpTtsViewModel.kt index 47fe75d4a..3b275481a 100644 --- a/app/src/main/java/io/legado/app/ui/association/ImportHttpTtsViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/association/ImportHttpTtsViewModel.kt @@ -1,12 +1,14 @@ package io.legado.app.ui.association import android.app.Application +import android.util.Base64 import androidx.core.net.toUri import androidx.lifecycle.MutableLiveData import io.legado.app.R import io.legado.app.base.BaseViewModel import io.legado.app.constant.AppConst import io.legado.app.constant.AppLog +import io.legado.app.constant.AppPattern import io.legado.app.data.appDb import io.legado.app.data.entities.HttpTTS import io.legado.app.exception.NoStackTraceException @@ -15,6 +17,7 @@ import io.legado.app.help.http.newCallResponseBody import io.legado.app.help.http.okHttpClient import io.legado.app.help.http.text import io.legado.app.utils.isAbsUrl +import io.legado.app.utils.isDataUrl import io.legado.app.utils.isJsonArray import io.legado.app.utils.isJsonObject import io.legado.app.utils.isUri @@ -86,6 +89,11 @@ class ImportHttpTtsViewModel(app: Application) : BaseViewModel(app) { text.isJsonArray() -> HttpTTS.fromJsonArray(text).getOrThrow().let { items -> allSources.addAll(items) } + text.isDataUrl() -> { + val data = AppPattern.dataUriRegex.find(text)?.groupValues?.getOrNull(1) + ?: throw NoStackTraceException(context.getString(R.string.wrong_format)) + importSourceAwait(Base64.decode(data, Base64.DEFAULT).toString(Charsets.UTF_8)) + } text.isAbsUrl() -> { importSourceUrl(text) } @@ -120,4 +128,4 @@ class ImportHttpTtsViewModel(app: Application) : BaseViewModel(app) { } } -} \ No newline at end of file +} diff --git a/app/src/main/java/io/legado/app/ui/book/read/sheet/ReadAloudConfigSheet.kt b/app/src/main/java/io/legado/app/ui/book/read/sheet/ReadAloudConfigSheet.kt index f11fd678b..6fe078e1d 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/sheet/ReadAloudConfigSheet.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/sheet/ReadAloudConfigSheet.kt @@ -36,6 +36,7 @@ import io.legado.app.ui.widget.components.AppTextField import io.legado.app.ui.widget.components.alert.AppAlertDialog import io.legado.app.ui.widget.components.button.series.SmallTonalButton import io.legado.app.ui.widget.components.filePicker.FilePickerSheet +import io.legado.app.ui.widget.components.importComponents.BatchImportDialog import io.legado.app.ui.widget.components.importComponents.SourceInputDialog import io.legado.app.ui.widget.components.menuItem.RoundDropdownMenu import io.legado.app.ui.widget.components.menuItem.RoundDropdownMenuItem @@ -199,6 +200,19 @@ fun SpeakEngineConfigSheet( }, allowExtensions = arrayOf("json", "txt"), ) + BatchImportDialog( + title = stringResource(R.string.import_tts), + importState = state.httpTtsImportState, + onDismissRequest = { onIntent(ReadBookIntent.CancelHttpTtsImport) }, + onToggleItem = { onIntent(ReadBookIntent.ToggleHttpTtsImportSelection(it)) }, + onToggleAll = { onIntent(ReadBookIntent.ToggleHttpTtsImportAll(it)) }, + onUpdateItem = { index, httpTTS -> + onIntent(ReadBookIntent.UpdateHttpTtsImportItem(index, httpTTS)) + }, + onConfirm = { onIntent(ReadBookIntent.SaveImportedHttpTts) }, + itemTitle = { it.name }, + itemSubtitle = { it.url }, + ) AppModalBottomSheet( show = show, @@ -232,6 +246,13 @@ fun SpeakEngineConfigSheet( onIntent(ReadBookIntent.ExportAllHttpTts) }, ) + RoundDropdownMenuItem( + text = stringResource(R.string.copy_url), + onClick = { + expanded = false + onIntent(ReadBookIntent.ExportAllHttpTtsAsUrl) + }, + ) RoundDropdownMenuItem( text = stringResource(R.string.clear_cache), onClick = {