From 1c0f08fc5bbde5b86e1abc5be7e1d2e36700405f Mon Sep 17 00:00:00 2001 From: MCAxiaz Date: Sun, 10 May 2020 20:10:31 -0700 Subject: [PATCH] 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 (cherry picked from commit 5723c184b1c7963ac5fbbf61452328f0c21271ec) # Conflicts: # app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt # app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt --- .../data/library/LibraryUpdateService.kt | 26 +++++++++++++------ .../tachiyomi/ui/library/LibraryController.kt | 3 ++- .../ui/manga/MangaAllInOnePresenter.kt | 4 +-- .../ui/manga/info/MangaInfoPresenter.kt | 4 +-- .../kanade/tachiyomi/util/MangaExtensions.kt | 25 +++++++++++++++--- 5 files changed, 43 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt b/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt index 9dbf22c52..17c97bac3 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt @@ -355,9 +355,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 @@ -374,11 +372,23 @@ class LibraryUpdateService( var count = 0 return Observable.from(mangaToUpdate) - .doOnNext { notifier.showProgressNotification(it, count++, mangaToUpdate.size) } - .map { manga -> - manga.prepUpdateCover(coverCache) - db.insertManga(manga).executeAsBlocking() - manga + .doOnNext { + notifier.showProgressNotification(it, count++, mangaToUpdate.size) + } + .flatMap { manga -> + val source = sourceManager.get(manga.source) + ?: return@flatMap Observable.empty() + + 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 { notifier.cancelProgressNotification() diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt index b0125fee0..2562bcf07 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt @@ -40,6 +40,7 @@ import eu.kanade.tachiyomi.ui.manga.MangaAllInOneController import eu.kanade.tachiyomi.ui.manga.MangaController import eu.kanade.tachiyomi.ui.migration.MigrationController import eu.kanade.tachiyomi.ui.migration.manga.design.PreMigrationController +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.inflate @@ -556,7 +557,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) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaAllInOnePresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaAllInOnePresenter.kt index 2c65c8f04..123271ced 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaAllInOnePresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaAllInOnePresenter.kt @@ -206,9 +206,7 @@ class MangaAllInOnePresenter( 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() diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoPresenter.kt index 41fe8e74f..57cbb1195 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoPresenter.kt @@ -84,9 +84,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() diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/MangaExtensions.kt b/app/src/main/java/eu/kanade/tachiyomi/util/MangaExtensions.kt index 55da8e53e..c56ba0533 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/MangaExtensions.kt +++ b/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 (!isLocal()) { - coverCache.deleteFromCache(this, false) + if (!refreshSameUrl && thumbnail_url == newUrl) return + + 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