kunfei 4 lat temu
rodzic
commit
3d4e7411e2

+ 3 - 0
app/src/main/java/io/legado/app/help/book/BookExtensions.kt

@@ -53,6 +53,9 @@ val Book.isOnLineTxt: Boolean
         return !isLocal && type and BookType.text > 0
     }
 
+val Book.isUpError: Boolean
+    get() = type and BookType.updateError > 0
+
 fun Book.contains(word: String?): Boolean {
     if (word.isNullOrEmpty()) {
         return true

+ 30 - 26
app/src/main/java/io/legado/app/ui/main/MainViewModel.kt

@@ -12,10 +12,7 @@ import io.legado.app.data.entities.Book
 import io.legado.app.data.entities.BookSource
 import io.legado.app.help.AppWebDav
 import io.legado.app.help.DefaultData
-import io.legado.app.help.book.BookHelp
-import io.legado.app.help.book.addType
-import io.legado.app.help.book.isLocal
-import io.legado.app.help.book.removeType
+import io.legado.app.help.book.*
 import io.legado.app.help.config.AppConfig
 import io.legado.app.help.config.LocalConfig
 import io.legado.app.model.CacheBook
@@ -113,35 +110,42 @@ class MainViewModel(application: Application) : BaseViewModel(application) {
         }
         val source = appDb.bookSourceDao.getBookSource(book.origin)
         if (source == null) {
-            book.addType(BookType.updateError)
-            appDb.bookDao.update(book)
+            if (!book.isUpError) {
+                book.addType(BookType.updateError)
+                appDb.bookDao.update(book)
+            }
             waitUpTocBooks.remove(book.bookUrl)
             return
         }
         waitUpTocBooks.remove(bookUrl)
         upTocAdd(bookUrl)
         execute(context = upTocPool) {
-            val oldBook = book.copy()
-            WebBook.runPreUpdateJs(source, book)
-            if (book.tocUrl.isBlank()) {
-                WebBook.getBookInfoAwait(source, book)
-            }
-            val toc = WebBook.getChapterListAwait(source, book).getOrThrow()
-            book.removeType(BookType.updateError)
-            if (book.bookUrl == bookUrl) {
-                appDb.bookDao.update(book)
-            } else {
-                upTocAdd(book.bookUrl)
-                appDb.bookDao.insert(book)
-                BookHelp.updateCacheFolder(oldBook, book)
+            kotlin.runCatching {
+                val oldBook = book.copy()
+                WebBook.runPreUpdateJs(source, book)
+                if (book.tocUrl.isBlank()) {
+                    WebBook.getBookInfoAwait(source, book)
+                }
+                val toc = WebBook.getChapterListAwait(source, book).getOrThrow()
+                book.removeType(BookType.updateError)
+                if (book.bookUrl == bookUrl) {
+                    appDb.bookDao.update(book)
+                } else {
+                    upTocAdd(book.bookUrl)
+                    appDb.bookDao.insert(book)
+                    BookHelp.updateCacheFolder(oldBook, book)
+                }
+                appDb.bookChapterDao.delByBook(bookUrl)
+                appDb.bookChapterDao.insert(*toc.toTypedArray())
+                addDownload(source, book)
+            }.onFailure {
+                AppLog.put("${book.name} 更新目录失败\n${it.localizedMessage}", it)
+                //这里可能因为时间太长书籍信息已经更改,所以重新获取
+                appDb.bookDao.getBook(book.bookUrl)?.let { book ->
+                    book.addType(BookType.updateError)
+                    appDb.bookDao.update(book)
+                }
             }
-            appDb.bookChapterDao.delByBook(bookUrl)
-            appDb.bookChapterDao.insert(*toc.toTypedArray())
-            addDownload(source, book)
-        }.onError(upTocPool) {
-            book.addType(BookType.updateError)
-            appDb.bookDao.update(book)
-            AppLog.put("${book.name} 更新目录失败\n${it.localizedMessage}", it)
         }.onCancel(upTocPool) {
             upTocCancel(bookUrl)
             upTocCancel(book.bookUrl)