mirror of
https://github.com/gedoor/legado.git
synced 2025-08-10 00:52:30 +00:00
添加通用封面规则
This commit is contained in:
4
app/src/main/assets/defaultData/coverRuleConfig.json
Normal file
4
app/src/main/assets/defaultData/coverRuleConfig.json
Normal file
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"searchUrl": "https://api.yousuu.com/api/search?type=title&value={{key}}&page=1&highlight=0&from=search",
|
||||
"coverRule": "@js:java.getString(\"$..books[?(@.author == '\" + book.author + \"')].cover\")"
|
||||
}
|
||||
@@ -6,8 +6,10 @@ import io.legado.app.data.entities.RssSource
|
||||
import io.legado.app.data.entities.TxtTocRule
|
||||
import io.legado.app.help.config.ReadBookConfig
|
||||
import io.legado.app.help.config.ThemeConfig
|
||||
import io.legado.app.model.BookCover
|
||||
import io.legado.app.utils.GSON
|
||||
import io.legado.app.utils.fromJsonArray
|
||||
import io.legado.app.utils.fromJsonObject
|
||||
import splitties.init.appCtx
|
||||
import java.io.File
|
||||
|
||||
@@ -60,6 +62,14 @@ object DefaultData {
|
||||
}.getOrDefault(emptyList())
|
||||
}
|
||||
|
||||
val coverRuleConfig: BookCover.CoverRuleConfig by lazy {
|
||||
val json = String(
|
||||
appCtx.assets.open("defaultData${File.separator}coverRuleConfig.json")
|
||||
.readBytes()
|
||||
)
|
||||
GSON.fromJsonObject<BookCover.CoverRuleConfig>(json).getOrThrow()!!
|
||||
}
|
||||
|
||||
fun importDefaultHttpTTS() {
|
||||
appDb.httpTTSDao.deleteDefault()
|
||||
appDb.httpTTSDao.insert(*httpTTS.toTypedArray())
|
||||
|
||||
@@ -9,14 +9,15 @@ import com.bumptech.glide.request.RequestOptions
|
||||
import io.legado.app.R
|
||||
import io.legado.app.constant.PreferKey
|
||||
import io.legado.app.data.entities.BaseSource
|
||||
import io.legado.app.data.entities.Book
|
||||
import io.legado.app.help.BlurTransformation
|
||||
import io.legado.app.help.CacheManager
|
||||
import io.legado.app.help.DefaultData
|
||||
import io.legado.app.help.config.AppConfig
|
||||
import io.legado.app.help.glide.ImageLoader
|
||||
import io.legado.app.model.analyzeRule.AnalyzeRule
|
||||
import io.legado.app.model.analyzeRule.AnalyzeUrl
|
||||
import io.legado.app.utils.*
|
||||
import kotlinx.coroutines.runBlocking
|
||||
import splitties.init.appCtx
|
||||
|
||||
object BookCover {
|
||||
@@ -28,11 +29,9 @@ object BookCover {
|
||||
private set
|
||||
lateinit var defaultDrawable: Drawable
|
||||
private set
|
||||
var coverRuleConfig: CoverRuleConfig? =
|
||||
var coverRuleConfig: CoverRuleConfig =
|
||||
GSON.fromJsonObject<CoverRuleConfig>(CacheManager.get(coverRuleConfigKey)).getOrNull()
|
||||
private val analyzeRule by lazy {
|
||||
AnalyzeRule()
|
||||
}
|
||||
?: DefaultData.coverRuleConfig
|
||||
|
||||
init {
|
||||
upDefaultCover()
|
||||
@@ -67,18 +66,23 @@ object BookCover {
|
||||
.apply(RequestOptions.bitmapTransform(BlurTransformation(context, 25)))
|
||||
}
|
||||
|
||||
fun searchCover(name: String, author: String): String? {
|
||||
val config = coverRuleConfig ?: return null
|
||||
suspend fun searchCover(book: Book): String? {
|
||||
val config = coverRuleConfig
|
||||
if (config.searchUrl.isBlank() || config.coverRule.isBlank()) {
|
||||
return null
|
||||
}
|
||||
val analyzeUrl =
|
||||
AnalyzeUrl(config.searchUrl, name, source = config, headerMapF = config.getHeaderMap())
|
||||
return runBlocking {
|
||||
analyzeUrl.getStrResponseAwait().body?.let { body ->
|
||||
return@let analyzeRule.getString(config.coverRule, body, true)
|
||||
}
|
||||
}
|
||||
AnalyzeUrl(
|
||||
config.searchUrl,
|
||||
book.name,
|
||||
source = config,
|
||||
headerMapF = config.getHeaderMap()
|
||||
)
|
||||
val res = analyzeUrl.getStrResponseAwait()
|
||||
val analyzeRule = AnalyzeRule(book)
|
||||
analyzeRule.setContent(res.body, config.searchUrl)
|
||||
analyzeRule.setRedirectUrl(res.url)
|
||||
return analyzeRule.getString(config.coverRule, isUrl = true)
|
||||
}
|
||||
|
||||
fun saveCoverRuleConfig(config: CoverRuleConfig) {
|
||||
|
||||
@@ -182,7 +182,7 @@ class BookInfoActivity :
|
||||
if (viewModel.inBookshelf) {
|
||||
viewModel.bookData.value?.let {
|
||||
it.canUpdate = !it.canUpdate
|
||||
viewModel.saveBook()
|
||||
viewModel.saveBook(it)
|
||||
}
|
||||
} else {
|
||||
toastOnUi(R.string.after_add_bookshelf)
|
||||
@@ -306,7 +306,7 @@ class BookInfoActivity :
|
||||
}
|
||||
tvTocView.setOnClickListener {
|
||||
if (!viewModel.inBookshelf) {
|
||||
viewModel.saveBook {
|
||||
viewModel.saveBook(viewModel.bookData.value) {
|
||||
viewModel.saveChapterList {
|
||||
openChapterList()
|
||||
}
|
||||
@@ -366,15 +366,17 @@ class BookInfoActivity :
|
||||
}
|
||||
customView { alertBinding.root }
|
||||
okButton {
|
||||
viewModel.bookData.value
|
||||
?.putVariable("custom", alertBinding.editView.text?.toString())
|
||||
viewModel.saveBook()
|
||||
viewModel.bookData.value?.let { book ->
|
||||
book.putVariable("custom", alertBinding.editView.text?.toString())
|
||||
viewModel.saveBook(book)
|
||||
}
|
||||
}
|
||||
cancelButton()
|
||||
neutralButton(R.string.delete) {
|
||||
viewModel.bookData.value
|
||||
?.putVariable("custom", null)
|
||||
viewModel.saveBook()
|
||||
viewModel.bookData.value?.let { book ->
|
||||
book.putVariable("custom", null)
|
||||
viewModel.saveBook(book)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -423,13 +425,13 @@ class BookInfoActivity :
|
||||
|
||||
private fun readBook(book: Book) {
|
||||
if (!viewModel.inBookshelf) {
|
||||
viewModel.saveBook {
|
||||
viewModel.saveBook(book) {
|
||||
viewModel.saveChapterList {
|
||||
startReadActivity(book)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
viewModel.saveBook {
|
||||
viewModel.saveBook(book) {
|
||||
startReadActivity(book)
|
||||
}
|
||||
}
|
||||
@@ -461,22 +463,24 @@ class BookInfoActivity :
|
||||
}
|
||||
|
||||
override fun coverChangeTo(coverUrl: String) {
|
||||
viewModel.bookData.value?.let {
|
||||
it.coverUrl = coverUrl
|
||||
viewModel.saveBook()
|
||||
showCover(it)
|
||||
viewModel.bookData.value?.let { book ->
|
||||
book.customCoverUrl = coverUrl
|
||||
viewModel.saveBook(book)
|
||||
showCover(book)
|
||||
}
|
||||
}
|
||||
|
||||
override fun upGroup(requestCode: Int, groupId: Long) {
|
||||
upGroup(groupId)
|
||||
viewModel.bookData.value?.group = groupId
|
||||
if (viewModel.inBookshelf) {
|
||||
viewModel.saveBook()
|
||||
} else if (groupId > 0) {
|
||||
viewModel.saveBook()
|
||||
viewModel.inBookshelf = true
|
||||
upTvBookshelf()
|
||||
viewModel.bookData.value?.let { book ->
|
||||
book.group = groupId
|
||||
if (viewModel.inBookshelf) {
|
||||
viewModel.saveBook(book)
|
||||
} else if (groupId > 0) {
|
||||
viewModel.saveBook(book)
|
||||
viewModel.inBookshelf = true
|
||||
upTvBookshelf()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -15,6 +15,7 @@ import io.legado.app.data.entities.BookSource
|
||||
import io.legado.app.help.BookHelp
|
||||
import io.legado.app.help.ContentProcessor
|
||||
import io.legado.app.help.coroutine.Coroutine
|
||||
import io.legado.app.model.BookCover
|
||||
import io.legado.app.model.NoStackTraceException
|
||||
import io.legado.app.model.ReadBook
|
||||
import io.legado.app.model.localBook.LocalBook
|
||||
@@ -69,9 +70,16 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) {
|
||||
}
|
||||
}
|
||||
|
||||
private fun setBook(book: Book) {
|
||||
private suspend fun setBook(book: Book) {
|
||||
durChapterIndex = book.durChapterIndex
|
||||
bookData.postValue(book)
|
||||
if (book.customCoverUrl.isNullOrBlank()) {
|
||||
BookCover.searchCover(book)?.let { coverUrl ->
|
||||
book.customCoverUrl = coverUrl
|
||||
bookData.postValue(book)
|
||||
saveBook(book)
|
||||
}
|
||||
}
|
||||
bookSource = if (book.isLocalBook()) {
|
||||
null
|
||||
} else {
|
||||
@@ -232,20 +240,19 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) {
|
||||
}
|
||||
}
|
||||
|
||||
fun saveBook(success: (() -> Unit)? = null) {
|
||||
fun saveBook(book: Book?, success: (() -> Unit)? = null) {
|
||||
book ?: return
|
||||
execute {
|
||||
bookData.value?.let { book ->
|
||||
if (book.order == 0) {
|
||||
book.order = appDb.bookDao.minOrder - 1
|
||||
}
|
||||
appDb.bookDao.getBook(book.name, book.author)?.let {
|
||||
book.durChapterPos = it.durChapterPos
|
||||
book.durChapterTitle = it.durChapterTitle
|
||||
}
|
||||
book.save()
|
||||
if (ReadBook.book?.name == book.name && ReadBook.book?.author == book.author) {
|
||||
ReadBook.book = book
|
||||
}
|
||||
if (book.order == 0) {
|
||||
book.order = appDb.bookDao.minOrder - 1
|
||||
}
|
||||
appDb.bookDao.getBook(book.name, book.author)?.let {
|
||||
book.durChapterPos = it.durChapterPos
|
||||
book.durChapterTitle = it.durChapterTitle
|
||||
}
|
||||
book.save()
|
||||
if (ReadBook.book?.name == book.name && ReadBook.book?.author == book.author) {
|
||||
ReadBook.book = book
|
||||
}
|
||||
}.onSuccess {
|
||||
success?.invoke()
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
package io.legado.app.ui.config
|
||||
|
||||
import android.os.Bundle
|
||||
import android.view.View
|
||||
import io.legado.app.R
|
||||
import io.legado.app.base.BaseDialogFragment
|
||||
|
||||
class CoverRuleConfigDialog : BaseDialogFragment(R.layout.dialog_cover_rule_config) {
|
||||
|
||||
override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) {
|
||||
TODO("Not yet implemented")
|
||||
}
|
||||
|
||||
}
|
||||
6
app/src/main/res/layout/dialog_cover_rule_config.xml
Normal file
6
app/src/main/res/layout/dialog_cover_rule_config.xml
Normal file
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
@@ -879,7 +879,7 @@
|
||||
<string name="set_book_variable">设置书籍变量</string>
|
||||
<string name="summary">注释</string>
|
||||
<string name="cover_config">封面设置</string>
|
||||
<string name="cover_config_summary">设置默认封面样式</string>
|
||||
<string name="cover_config_summary">通用封面规则及默认封面样式</string>
|
||||
<string name="cover_show_name">显示书名</string>
|
||||
<string name="cover_show_name_summary">封面上显示书名</string>
|
||||
<string name="cover_show_author">显示作者</string>
|
||||
|
||||
@@ -882,7 +882,7 @@
|
||||
<string name="set_book_variable">设置书籍变量</string>
|
||||
<string name="summary">注释</string>
|
||||
<string name="cover_config">封面设置</string>
|
||||
<string name="cover_config_summary">设置默认封面样式</string>
|
||||
<string name="cover_config_summary">通用封面规则及默认封面样式</string>
|
||||
<string name="cover_show_name">显示书名</string>
|
||||
<string name="cover_show_name_summary">封面上显示书名</string>
|
||||
<string name="cover_show_author">显示作者</string>
|
||||
|
||||
@@ -880,7 +880,7 @@
|
||||
<string name="set_book_variable">设置书籍变量</string>
|
||||
<string name="summary">注释</string>
|
||||
<string name="cover_config">封面设置</string>
|
||||
<string name="cover_config_summary">设置默认封面样式</string>
|
||||
<string name="cover_config_summary">通用封面规则及默认封面样式</string>
|
||||
<string name="cover_show_name">显示书名</string>
|
||||
<string name="cover_show_name_summary">封面上显示书名</string>
|
||||
<string name="cover_show_author">显示作者</string>
|
||||
|
||||
@@ -879,7 +879,7 @@
|
||||
<string name="set_book_variable">設置書籍變量</string>
|
||||
<string name="summary">注釋</string>
|
||||
<string name="cover_config">封面設置</string>
|
||||
<string name="cover_config_summary">設置默認封面樣式</string>
|
||||
<string name="cover_config_summary">通用封面规则及默认封面样式</string>
|
||||
<string name="cover_show_name">顯示書名</string>
|
||||
<string name="cover_show_name_summary">封面上顯示書名</string>
|
||||
<string name="cover_show_author">顯示作者</string>
|
||||
|
||||
@@ -881,7 +881,7 @@
|
||||
<string name="set_book_variable">設定書籍變數</string>
|
||||
<string name="summary">注釋</string>
|
||||
<string name="cover_config">封面設定</string>
|
||||
<string name="cover_config_summary">設定預設封面樣式</string>
|
||||
<string name="cover_config_summary">通用封面规则及默认封面样式</string>
|
||||
<string name="cover_show_name">顯示書名</string>
|
||||
<string name="cover_show_name_summary">封面上顯示書名</string>
|
||||
<string name="cover_show_author">顯示作者</string>
|
||||
|
||||
@@ -883,7 +883,7 @@
|
||||
<string name="set_book_variable">设置书籍变量</string>
|
||||
<string name="summary">注释</string>
|
||||
<string name="cover_config">封面设置</string>
|
||||
<string name="cover_config_summary">设置默认封面样式</string>
|
||||
<string name="cover_config_summary">通用封面规则及默认封面样式</string>
|
||||
<string name="cover_show_name">显示书名</string>
|
||||
<string name="cover_show_name_summary">封面上显示书名</string>
|
||||
<string name="cover_show_author">显示作者</string>
|
||||
|
||||
@@ -882,7 +882,7 @@
|
||||
<string name="set_book_variable">设置书籍变量</string>
|
||||
<string name="summary">summary</string>
|
||||
<string name="cover_config">cover config</string>
|
||||
<string name="cover_config_summary">设置默认封面样式</string>
|
||||
<string name="cover_config_summary">通用封面规则及默认封面样式</string>
|
||||
<string name="cover_show_name">show name</string>
|
||||
<string name="cover_show_name_summary">封面上显示书名</string>
|
||||
<string name="cover_show_author">show author</string>
|
||||
|
||||
Reference in New Issue
Block a user