From f4e5eedb3754ecf669b7bc919a1e261df1710b2b Mon Sep 17 00:00:00 2001 From: kunfei Date: Sat, 13 May 2023 23:25:08 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=9C=A8=E7=BA=BFtts?= =?UTF-8?q?=E6=9C=97=E8=AF=BB=E5=A4=B1=E8=B4=A5bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/HttpTtsTest.kt | 26 +++++++++++++++++++ .../app/help/exoplayer/ExoPlayerHelper.kt | 19 +++++--------- .../io/legado/app/service/AudioPlayService.kt | 9 +------ .../app/service/HttpReadAloudService.kt | 25 ++++++++++++------ 4 files changed, 51 insertions(+), 28 deletions(-) create mode 100644 app/src/androidTest/java/io/legado/app/HttpTtsTest.kt diff --git a/app/src/androidTest/java/io/legado/app/HttpTtsTest.kt b/app/src/androidTest/java/io/legado/app/HttpTtsTest.kt new file mode 100644 index 000000000..e9b1601bb --- /dev/null +++ b/app/src/androidTest/java/io/legado/app/HttpTtsTest.kt @@ -0,0 +1,26 @@ +package io.legado.app + +import io.legado.app.help.config.AppConfig +import io.legado.app.model.analyzeRule.AnalyzeUrl +import kotlinx.coroutines.runBlocking +import org.junit.Test + +class HttpTtsTest { + + @Test + fun test() { + val url = """ + http://tsn.baidu.com/text2audio,{ + "method": "POST", + "body": "tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=4114&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=220&vol=5&aue=6&pit=5&_res_tag_=audio" + } + """.trimIndent() + val analyzeUrl = + AnalyzeUrl(url, speakText = "魔神", speakSpeed = AppConfig.speechRatePlay + 5) + runBlocking { + val response = analyzeUrl.getResponseAwait() + response.headers + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/help/exoplayer/ExoPlayerHelper.kt b/app/src/main/java/io/legado/app/help/exoplayer/ExoPlayerHelper.kt index d8b0ea472..4b66a6f92 100644 --- a/app/src/main/java/io/legado/app/help/exoplayer/ExoPlayerHelper.kt +++ b/app/src/main/java/io/legado/app/help/exoplayer/ExoPlayerHelper.kt @@ -59,7 +59,7 @@ object ExoPlayerHelper { return MediaItem.Builder().setUri(formatUrl).build() } - fun createExoPlayer(context: Context): ExoPlayer { + fun createHttpExoPlayer(context: Context): ExoPlayer { return ExoPlayer.Builder(context).setLoadControl( DefaultLoadControl.Builder().setBufferDurationsMs( DefaultLoadControl.DEFAULT_MIN_BUFFER_MS, @@ -68,12 +68,11 @@ object ExoPlayerHelper { DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS / 10 ).build() - ) - .setMediaSourceFactory( - DefaultMediaSourceFactory(context) - .setDataSourceFactory(resolvingDataSource) - .setLiveTargetOffsetMs(5000) - ).build() + ).setMediaSourceFactory( + DefaultMediaSourceFactory(context) + .setDataSourceFactory(resolvingDataSource) + .setLiveTargetOffsetMs(5000) + ).build() } /** @@ -107,9 +106,7 @@ object ExoPlayerHelper { private val resolvingDataSource: ResolvingDataSource.Factory by lazy { - ResolvingDataSource.Factory( - cacheDataSourceFactory - ) { + ResolvingDataSource.Factory(cacheDataSourceFactory) { var res = it if (it.uri.toString().contains(SPLIT_TAG)) { @@ -123,8 +120,6 @@ object ExoPlayerHelper { } } - - res } diff --git a/app/src/main/java/io/legado/app/service/AudioPlayService.kt b/app/src/main/java/io/legado/app/service/AudioPlayService.kt index 5f8aaab80..321306c02 100644 --- a/app/src/main/java/io/legado/app/service/AudioPlayService.kt +++ b/app/src/main/java/io/legado/app/service/AudioPlayService.kt @@ -74,7 +74,7 @@ class AudioPlayService : BaseService(), MediaHelp.buildAudioFocusRequestCompat(this) } private val exoPlayer: ExoPlayer by lazy { - ExoPlayerHelper.createExoPlayer(this) + ExoPlayerHelper.createHttpExoPlayer(this) } private var mediaSessionCompat: MediaSessionCompat? = null private var broadcastReceiver: BroadcastReceiver? = null @@ -152,13 +152,6 @@ class AudioPlayService : BaseService(), chapter = AudioPlay.durChapter, headerMapF = AudioPlay.headers(true), ) - //val uri = Uri.parse(analyzeUrl.url) - //ExoPlayerHelper.preDownload(uri, analyzeUrl.headerMap) - //休息1秒钟,防止403 - //delay(1000) -// val mediaSource = ExoPlayerHelper -// .createMediaSource(uri, analyzeUrl.headerMap) - //exoPlayer.setMediaSource(mediaSource) exoPlayer.setMediaItem(ExoPlayerHelper.createMediaItem(analyzeUrl.url,analyzeUrl.headerMap)) exoPlayer.playWhenReady = true exoPlayer.prepare() diff --git a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt index 633407711..6f2fde001 100644 --- a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt @@ -16,13 +16,21 @@ import io.legado.app.exception.ConcurrentException import io.legado.app.exception.NoStackTraceException import io.legado.app.help.config.AppConfig import io.legado.app.help.coroutine.Coroutine -import io.legado.app.help.exoplayer.ExoPlayerHelper import io.legado.app.model.ReadAloud import io.legado.app.model.ReadBook import io.legado.app.model.analyzeRule.AnalyzeUrl -import io.legado.app.utils.* -import kotlinx.coroutines.* +import io.legado.app.utils.FileUtils +import io.legado.app.utils.MD5Utils +import io.legado.app.utils.postEvent +import io.legado.app.utils.printOnDebug +import io.legado.app.utils.servicePendingIntent +import io.legado.app.utils.toastOnUi +import kotlinx.coroutines.CancellationException import kotlinx.coroutines.Dispatchers.IO +import kotlinx.coroutines.Job +import kotlinx.coroutines.delay +import kotlinx.coroutines.ensureActive +import kotlinx.coroutines.launch import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import okhttp3.Response @@ -39,8 +47,7 @@ class HttpReadAloudService : BaseReadAloudService(), Player.Listener { private val exoPlayer: ExoPlayer by lazy { - //ExoPlayer.Builder(this).build() - ExoPlayerHelper.createExoPlayer(this) + ExoPlayer.Builder(this).build() } private val ttsFolderPath: String by lazy { cacheDir.absolutePath + File.separator + "httpTTS" + File.separator @@ -161,9 +168,11 @@ class HttpReadAloudService : BaseReadAloudService(), if (checkJs?.isNotBlank() == true) { response = analyzeUrl.evalJS(checkJs, response) as Response } - val ct = httpTts.contentType - if (ct?.isNotBlank() == true) { - response.headers["Content-Type"]?.let { contentType -> + response.headers["Content-Type"]?.let { contentType -> + val ct = httpTts.contentType + if (contentType == "application/json") { + throw NoStackTraceException(response.body!!.string()) + } else if (ct?.isNotBlank() == true) { if (!contentType.matches(ct.toRegex())) { throw NoStackTraceException("TTS服务器返回错误:" + response.body!!.string()) }