diff --git a/app/src/main/java/io/legado/app/data/dao/BookSourceDao.kt b/app/src/main/java/io/legado/app/data/dao/BookSourceDao.kt index 685a12cd0..f2c7976a5 100644 --- a/app/src/main/java/io/legado/app/data/dao/BookSourceDao.kt +++ b/app/src/main/java/io/legado/app/data/dao/BookSourceDao.kt @@ -276,6 +276,9 @@ interface BookSourceDao { @Query("select count(*) from book_sources") fun allCount(): Int + @Query("SELECT EXISTS(select 1 from book_sources where bookSourceUrl = :key)") + fun has(key: String): Boolean + @Insert(onConflict = OnConflictStrategy.REPLACE) fun insert(vararg bookSource: BookSource) diff --git a/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt b/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt index 850a91e94..84b83e6f5 100644 --- a/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt @@ -429,6 +429,10 @@ class BookInfoActivity : tvOrigin.setOnClickListener { viewModel.getBook()?.let { book -> if (book.isLocal) return@let + if (!appDb.bookSourceDao.has(book.origin)) { + toastOnUi(R.string.error_no_source) + return@let + } editSourceResult.launch { putExtra("sourceUrl", book.origin) } diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfViewModel.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfViewModel.kt index 5730590bf..bdbab2b76 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfViewModel.kt @@ -73,8 +73,16 @@ class BookshelfViewModel(application: Application) : BaseViewModel(application) kotlin.runCatching { WebBook.getBookInfoAwait(bookSource, book) }.onSuccess { - it.order = appDb.bookDao.minOrder - 1 - it.save() + val dbBook = appDb.bookDao.getBook(it.name, it.author) + if (dbBook != null) { + val toc = WebBook.getChapterListAwait(bookSource, it).getOrThrow() + dbBook.migrateTo(it, toc) + appDb.bookDao.insert(it) + appDb.bookChapterDao.insert(*toc.toTypedArray()) + } else { + it.order = appDb.bookDao.minOrder - 1 + it.save() + } successCount++ addBookProgressLiveData.postValue(successCount) }