添加通用封面规则
This commit is contained in:
@@ -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")
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user