From 3247d48256ee5237ac47929ce592c1cc65eccdfd Mon Sep 17 00:00:00 2001 From: HapeLee <63206378+HapeLee@users.noreply.github.com> Date: Thu, 14 May 2026 20:07:57 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=B0=81=E9=9D=A2=E8=A7=84?= =?UTF-8?q?=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coverConfig/CoverRuleConfigSheet.kt | 159 +++++++++++------- 1 file changed, 94 insertions(+), 65 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/config/coverConfig/CoverRuleConfigSheet.kt b/app/src/main/java/io/legado/app/ui/config/coverConfig/CoverRuleConfigSheet.kt index 7095b16d2..52ac8d03f 100644 --- a/app/src/main/java/io/legado/app/ui/config/coverConfig/CoverRuleConfigSheet.kt +++ b/app/src/main/java/io/legado/app/ui/config/coverConfig/CoverRuleConfigSheet.kt @@ -1,5 +1,6 @@ package io.legado.app.ui.config.coverConfig +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer @@ -8,6 +9,9 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Save +import androidx.compose.material.icons.filled.SettingsBackupRestore import androidx.compose.material3.Button import androidx.compose.material3.Checkbox import androidx.compose.material3.ExperimentalMaterial3Api @@ -27,14 +31,59 @@ import androidx.compose.ui.unit.dp import io.legado.app.R import io.legado.app.model.BookCover import io.legado.app.ui.theme.LegadoTheme +import io.legado.app.ui.widget.components.AppTextField +import io.legado.app.ui.widget.components.button.MediumIconButton +import io.legado.app.ui.widget.components.card.GlassCard +import io.legado.app.ui.widget.components.checkBox.CheckboxItem import io.legado.app.ui.widget.components.modalBottomSheet.AppModalBottomSheet -import io.legado.app.ui.widget.components.settingItem.InputSettingItem import io.legado.app.ui.widget.components.text.AppText import io.legado.app.utils.toastOnUi import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import splitties.init.appCtx +private const val DEFAULT_SEARCH_URL = "data:;base64,{{java.base64Encode(key)}},{\"type\":\"lyc\"}" +private val DEFAULT_COVER_RULE = """ + @js: + var key = java.hexDecodeToString(result); + var url1 = `https://pre-api.tuishujun.com/api/searchBook?search_value=${'$'}{key}&page=1&pageSize=20`; + var url2 = `http://m.ypshuo.com/api/novel/search?keyword=${'$'}{key}&searchType=1&page=1`; + var [rr1, rr2] = java.ajaxAll([url1, url2]).map(r => r.body()); + function jjson(str, rule) { + try { + return com.jayway.jsonpath.JsonPath.read(str, rule); + } catch (e) { + return []; + } + } + rr1 = jjson(rr1, '$.data.data[*]'); + rr2 = jjson(rr2, '$.data.data[*]'); + var na = String(book.name), + au = String(book.author); + function search() { + for (let char of rr1) { + //本地书名包含搜索结果书名 + if (na.includes(char.title + '')) { + let au2 = char.author_nickname + ''; + //作者匹配 + if (au.includes(au2) || au2.includes(au)) { + return char.cover; + } + } + } + for (let char of rr2) { + if (na.includes(char.novel_name + '')) { + let au2 = char.author_name + ''; + if (au.includes(au2) || au2.includes(au)) { + return char.novel_img; + } + } + } + return ''; + } + search() +""".trimIndent() + @OptIn(ExperimentalMaterial3Api::class) @Composable fun CoverRuleConfigSheet( @@ -56,68 +105,22 @@ fun CoverRuleConfigSheet( AppModalBottomSheet( show = show, - onDismissRequest = onDismissRequest - ) { - Column( - modifier = Modifier - .fillMaxWidth() - .padding(16.dp) - .verticalScroll(rememberScrollState()) - ) { - AppText( - text = stringResource(R.string.cover_rule), - style = LegadoTheme.typography.titleLarge, - modifier = Modifier.padding(bottom = 16.dp) - ) - - Row( - verticalAlignment = Alignment.CenterVertically, - modifier = Modifier.fillMaxWidth() - ) { - Checkbox( - checked = enable, - onCheckedChange = { enable = it } - ) - AppText(text = stringResource(R.string.enable)) - } - - InputSettingItem( - title = stringResource(R.string.search_via_url), - value = searchUrl, - onConfirm = { searchUrl = it } - ) - - InputSettingItem( - title = stringResource(R.string.cover_rule_edit), - value = coverRule, - onConfirm = { coverRule = it } - ) - - Spacer(modifier = Modifier.height(24.dp)) - - Row( - modifier = Modifier.fillMaxWidth(), - verticalAlignment = Alignment.CenterVertically - ) { - TextButton(onClick = { - BookCover.delCoverRule() - onDismissRequest() - }) { - AppText( - stringResource(R.string.delete), - color = MaterialTheme.colorScheme.error - ) + onDismissRequest = onDismissRequest, + title = stringResource(R.string.cover_rule), + startAction = { + MediumIconButton( + imageVector = Icons.Default.SettingsBackupRestore, + onClick = { + searchUrl = DEFAULT_SEARCH_URL + coverRule = DEFAULT_COVER_RULE + appCtx.toastOnUi(R.string.restore_default) } - - Spacer(modifier = Modifier.weight(1f)) - - OutlinedButton(onClick = onDismissRequest) { - AppText(stringResource(R.string.cancel)) - } - - Spacer(modifier = Modifier.padding(horizontal = 4.dp)) - - Button(onClick = { + ) + }, + endAction = { + MediumIconButton( + imageVector = Icons.Default.Save, + onClick = { if (searchUrl.isBlank() || coverRule.isBlank()) { appCtx.toastOnUi("搜索url和cover规则不能为空") } else { @@ -126,10 +129,36 @@ fun CoverRuleConfigSheet( } onDismissRequest() } - }) { - AppText(stringResource(R.string.ok)) } - } + ) + } + ) { + Column( + modifier = Modifier + .fillMaxWidth() + .verticalScroll(rememberScrollState()), + verticalArrangement = Arrangement.spacedBy(8.dp) + ) { + CheckboxItem( + title = stringResource(R.string.enable), + checked = enable, + onCheckedChange = { enable = it } + ) + + AppTextField( + value = searchUrl, + onValueChange = { searchUrl = it }, + label = stringResource(R.string.search_via_url), + modifier = Modifier.fillMaxWidth() + ) + + AppTextField( + value = coverRule, + onValueChange = { coverRule = it }, + label = stringResource(R.string.cover_rule_edit), + modifier = Modifier.fillMaxWidth(), + minLines = 3 + ) } } }