kunfei 4 лет назад
Родитель
Сommit
519cada7f6

+ 8 - 0
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()
         }

+ 37 - 17
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<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()