优化封面规则

This commit is contained in:
HapeLee
2026-05-14 20:07:57 +08:00
parent 56d82d5e25
commit 3247d48256
@@ -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
)
}
}
}