From 72b3689a940c9202d3413a6e3e6d75a28c45e604 Mon Sep 17 00:00:00 2001 From: kunfei Date: Tue, 15 Nov 2022 23:04:36 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/model/analyzeRule/AnalyzeUrl.kt | 8 +++ .../ui/association/AddToBookshelfDialog.kt | 54 +++++++++++++------ 2 files changed, 45 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt index 56650fa87..aad527d6f 100644 --- a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt +++ b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt @@ -661,6 +661,14 @@ class AnalyzeUrl( return charset } + fun setOrigin(value: String?) { + origin = if (value.isNullOrBlank()) null else value + } + + fun getOrigin(): String? { + return origin + } + fun setRetry(value: String?) { retry = if (value.isNullOrEmpty()) null else value.toIntOrNull() } diff --git a/app/src/main/java/io/legado/app/ui/association/AddToBookshelfDialog.kt b/app/src/main/java/io/legado/app/ui/association/AddToBookshelfDialog.kt index 144806c20..830dc3ff3 100644 --- a/app/src/main/java/io/legado/app/ui/association/AddToBookshelfDialog.kt +++ b/app/src/main/java/io/legado/app/ui/association/AddToBookshelfDialog.kt @@ -14,8 +14,10 @@ import io.legado.app.base.BaseViewModel import io.legado.app.constant.AppLog import io.legado.app.data.appDb import io.legado.app.data.entities.Book +import io.legado.app.data.entities.BookSource import io.legado.app.databinding.DialogAddToBookshelfBinding import io.legado.app.exception.NoStackTraceException +import io.legado.app.model.analyzeRule.AnalyzeUrl import io.legado.app.model.webBook.WebBook import io.legado.app.ui.book.read.ReadBookActivity import io.legado.app.utils.* @@ -102,31 +104,38 @@ class AddToBookshelfDialog() : BaseDialogFragment(R.layout.dialog_add_to_bookshe fun load(bookUrl: String, success: (book: Book) -> Unit) { execute { - val sources = appDb.bookSourceDao.hasBookUrlPattern appDb.bookDao.getBook(bookUrl)?.let { throw NoStackTraceException("${it.name} 已在书架") } val baseUrl = NetworkUtils.getBaseUrl(bookUrl) ?: throw NoStackTraceException("书籍地址格式不对") - var source = appDb.bookSourceDao.getBookSource(baseUrl) - if (source == null) { - sources.forEach { bookSource -> - if (bookUrl.matches(bookSource.bookUrlPattern!!.toRegex())) { - source = bookSource - return@forEach + val urlMatcher = AnalyzeUrl.paramPattern.matcher(bookUrl) + if (urlMatcher.find()) { + val origin = GSON.fromJsonObject( + bookUrl.substring(urlMatcher.end()) + ).getOrNull()?.getOrigin() + origin?.let { + val source = appDb.bookSourceDao.getBookSource(it) + source?.let { + getBookInfo(bookUrl, source)?.let { book -> + return@execute book + } } } } - source?.let { bookSource -> - val book = Book( - bookUrl = bookUrl, - origin = bookSource.bookSourceUrl, - originName = bookSource.bookSourceName - ) - WebBook.getBookInfoAwait(bookSource, book) - book.order = appDb.bookDao.minOrder - 1 - return@execute book - } ?: throw NoStackTraceException("未找到匹配书源") + appDb.bookSourceDao.getBookSource(baseUrl)?.let { source -> + getBookInfo(bookUrl, source)?.let { book -> + return@execute book + } + } + appDb.bookSourceDao.hasBookUrlPattern.forEach { source -> + if (bookUrl.matches(source.bookUrlPattern!!.toRegex())) { + getBookInfo(bookUrl, source)?.let { book -> + return@execute book + } + } + } + throw NoStackTraceException("未找到匹配书源") }.onError { AppLog.put("添加书籍 ${bookUrl} 出错", it) loadErrorLiveData.postValue(it.localizedMessage) @@ -140,6 +149,17 @@ class AddToBookshelfDialog() : BaseDialogFragment(R.layout.dialog_add_to_bookshe } } + private suspend fun getBookInfo(bookUrl: String, source: BookSource): Book? { + return kotlin.runCatching { + val book = Book( + bookUrl = bookUrl, + origin = source.bookSourceUrl, + originName = source.bookSourceName + ) + WebBook.getBookInfoAwait(source, book) + }.getOrNull() + } + fun saveBook(success: (book: Book?) -> Unit) { execute { book?.save()