瀏覽代碼

Cover Update Followup to Address #3139 (#3150)

* update cover logic when thumbnail url becomes null

* always clear cover on refresh even if custom cover is set

* remove concurrency changes
MCAxiaz 4 年之前
父節點
當前提交
5723c184b1

+ 18 - 8
app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt

@@ -396,9 +396,7 @@ class LibraryUpdateService(
         // Update manga details metadata in the background
         source.fetchMangaDetails(manga)
             .map { networkManga ->
-                if (manga.thumbnail_url != networkManga.thumbnail_url) {
-                    manga.prepUpdateCover(coverCache)
-                }
+                manga.prepUpdateCover(coverCache, networkManga, false)
                 manga.copyFrom(networkManga)
                 db.insertManga(manga).executeAsBlocking()
                 manga
@@ -415,11 +413,23 @@ class LibraryUpdateService(
         var count = 0
 
         return Observable.from(mangaToUpdate)
-            .doOnNext { showProgressNotification(it, count++, mangaToUpdate.size) }
-            .map { manga ->
-                manga.prepUpdateCover(coverCache)
-                db.insertManga(manga).executeAsBlocking()
-                manga
+            .doOnNext {
+                showProgressNotification(it, count++, mangaToUpdate.size)
+            }
+            .flatMap { manga ->
+                val source = sourceManager.get(manga.source)
+                    ?: return@flatMap Observable.empty<LibraryManga>()
+
+                source.fetchMangaDetails(manga)
+                    .map { networkManga ->
+                        manga.prepUpdateCover(coverCache, networkManga, true)
+                        networkManga.thumbnail_url?.let {
+                            manga.thumbnail_url = it
+                            db.insertManga(manga).executeAsBlocking()
+                        }
+                        manga
+                    }
+                    .onErrorReturn { manga }
             }
             .doOnCompleted {
                 cancelProgressNotification()

+ 2 - 1
app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt

@@ -34,6 +34,7 @@ import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction
 import eu.kanade.tachiyomi.ui.main.MainActivity
 import eu.kanade.tachiyomi.ui.main.offsetAppbarHeight
 import eu.kanade.tachiyomi.ui.manga.MangaController
+import eu.kanade.tachiyomi.util.hasCustomCover
 import eu.kanade.tachiyomi.util.system.getResourceColor
 import eu.kanade.tachiyomi.util.system.toast
 import eu.kanade.tachiyomi.util.view.visible
@@ -487,7 +488,7 @@ class LibraryController(
     private fun handleChangeCover() {
         val manga = selectedMangas.firstOrNull() ?: return
 
-        if (coverCache.getCustomCoverFile(manga).exists()) {
+        if (manga.hasCustomCover(coverCache)) {
             showEditCoverDialog(manga)
         } else {
             openMangaCoverPicker(manga)

+ 1 - 3
app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoPresenter.kt

@@ -75,9 +75,7 @@ class MangaInfoPresenter(
         if (!fetchMangaSubscription.isNullOrUnsubscribed()) return
         fetchMangaSubscription = Observable.defer { source.fetchMangaDetails(manga) }
             .map { networkManga ->
-                if (manualFetch || manga.thumbnail_url != networkManga.thumbnail_url) {
-                    manga.prepUpdateCover(coverCache)
-                }
+                manga.prepUpdateCover(coverCache, networkManga, manualFetch)
                 manga.copyFrom(networkManga)
                 manga.initialized = true
                 db.insertManga(manga).executeAsBlocking()

+ 21 - 4
app/src/main/java/eu/kanade/tachiyomi/util/MangaExtensions.kt

@@ -4,6 +4,7 @@ import eu.kanade.tachiyomi.data.cache.CoverCache
 import eu.kanade.tachiyomi.data.database.DatabaseHelper
 import eu.kanade.tachiyomi.data.database.models.Manga
 import eu.kanade.tachiyomi.source.LocalSource
+import eu.kanade.tachiyomi.source.model.SManga
 import java.util.Date
 
 fun Manga.isLocal() = source == LocalSource.ID
@@ -11,14 +12,30 @@ fun Manga.isLocal() = source == LocalSource.ID
 /**
  * Call before updating [Manga.thumbnail_url] to ensure old cover can be cleared from cache
  */
-fun Manga.prepUpdateCover(coverCache: CoverCache) {
-    cover_last_modified = Date().time
+fun Manga.prepUpdateCover(coverCache: CoverCache, remoteManga: SManga, refreshSameUrl: Boolean) {
+    // Never refresh covers if the new url is null, as the current url has possibly become invalid
+    val newUrl = remoteManga.thumbnail_url ?: return
+
+    if (!refreshSameUrl && thumbnail_url == newUrl) return
 
-    if (!isLocal()) {
-        coverCache.deleteFromCache(this, false)
+    when {
+        isLocal() -> {
+            cover_last_modified = Date().time
+        }
+        hasCustomCover(coverCache) -> {
+            coverCache.deleteFromCache(this, false)
+        }
+        else -> {
+            cover_last_modified = Date().time
+            coverCache.deleteFromCache(this, false)
+        }
     }
 }
 
+fun Manga.hasCustomCover(coverCache: CoverCache): Boolean {
+    return coverCache.getCustomCoverFile(this).exists()
+}
+
 fun Manga.removeCovers(coverCache: CoverCache) {
     if (isLocal()) return