|
|
@@ -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<AnalyzeUrl.UrlOption>(
|
|
|
+ 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()
|