Fix loading fallback thumbnails in browse view (closes #4127)
(cherry picked from commit c5ca739b4926362967d02323ceda56072d992134) # Conflicts: # app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourcePresenter.kt
This commit is contained in:
parent
962344f5fc
commit
1d55a1bec4
@ -64,8 +64,10 @@ interface Source : tachiyomi.source.Source {
|
|||||||
*/
|
*/
|
||||||
@Suppress("DEPRECATION")
|
@Suppress("DEPRECATION")
|
||||||
override suspend fun getMangaDetails(manga: MangaInfo): MangaInfo {
|
override suspend fun getMangaDetails(manga: MangaInfo): MangaInfo {
|
||||||
return fetchMangaDetails(manga.toSManga()).awaitSingle()
|
val sManga = manga.toSManga()
|
||||||
.toMangaInfo()
|
val networkManga = fetchMangaDetails(sManga).awaitSingle()
|
||||||
|
sManga.copyFrom(networkManga)
|
||||||
|
return sManga.toMangaInfo()
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -635,7 +635,6 @@ open class BrowseSourceController(bundle: Bundle) :
|
|||||||
val adapter = adapter ?: return
|
val adapter = adapter ?: return
|
||||||
|
|
||||||
preferences.sourceDisplayMode().set(mode)
|
preferences.sourceDisplayMode().set(mode)
|
||||||
presenter.refreshDisplayMode()
|
|
||||||
activity?.invalidateOptionsMenu()
|
activity?.invalidateOptionsMenu()
|
||||||
setupRecycler(view)
|
setupRecycler(view)
|
||||||
|
|
||||||
|
@ -37,10 +37,13 @@ import eu.kanade.tachiyomi.util.lang.launchUI
|
|||||||
import eu.kanade.tachiyomi.util.removeCovers
|
import eu.kanade.tachiyomi.util.removeCovers
|
||||||
import exh.savedsearches.EXHSavedSearch
|
import exh.savedsearches.EXHSavedSearch
|
||||||
import exh.savedsearches.JsonSavedSearch
|
import exh.savedsearches.JsonSavedSearch
|
||||||
import kotlinx.coroutines.Job
|
|
||||||
import kotlinx.coroutines.flow.MutableStateFlow
|
import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
|
import kotlinx.coroutines.flow.asFlow
|
||||||
|
import kotlinx.coroutines.flow.catch
|
||||||
|
import kotlinx.coroutines.flow.collect
|
||||||
|
import kotlinx.coroutines.flow.filter
|
||||||
|
import kotlinx.coroutines.flow.map
|
||||||
import kotlinx.coroutines.flow.onEach
|
import kotlinx.coroutines.flow.onEach
|
||||||
import kotlinx.coroutines.isActive
|
|
||||||
import kotlinx.serialization.decodeFromString
|
import kotlinx.serialization.decodeFromString
|
||||||
import kotlinx.serialization.json.Json
|
import kotlinx.serialization.json.Json
|
||||||
import kotlinx.serialization.json.JsonObject
|
import kotlinx.serialization.json.JsonObject
|
||||||
@ -126,11 +129,6 @@ open class BrowseSourcePresenter(
|
|||||||
private val filterSerializer = FilterSerializer()
|
private val filterSerializer = FilterSerializer()
|
||||||
// SY <--
|
// SY <--
|
||||||
|
|
||||||
/**
|
|
||||||
* Job to initialize manga details.
|
|
||||||
*/
|
|
||||||
private var initializerJob: Job? = null
|
|
||||||
|
|
||||||
override fun onCreate(savedState: Bundle?) {
|
override fun onCreate(savedState: Bundle?) {
|
||||||
super.onCreate(savedState)
|
super.onCreate(savedState)
|
||||||
|
|
||||||
@ -168,8 +166,6 @@ open class BrowseSourcePresenter(
|
|||||||
this.query = query
|
this.query = query
|
||||||
this.appliedFilters = filters
|
this.appliedFilters = filters
|
||||||
|
|
||||||
initializeManga()
|
|
||||||
|
|
||||||
// Create a new pager.
|
// Create a new pager.
|
||||||
pager = createPager(query, filters)
|
pager = createPager(query, filters)
|
||||||
|
|
||||||
@ -225,27 +221,6 @@ open class BrowseSourcePresenter(
|
|||||||
return pager.hasNextPage
|
return pager.hasNextPage
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Subscribes to the initializer of manga details and updates the view if needed.
|
|
||||||
*/
|
|
||||||
private fun initializeManga() {
|
|
||||||
initializerJob?.cancel()
|
|
||||||
initializerJob = launchIO {
|
|
||||||
mangaDetailsFlow
|
|
||||||
.onEach { mangas ->
|
|
||||||
if (!isActive) return@onEach
|
|
||||||
|
|
||||||
try {
|
|
||||||
mangas.filter { it.thumbnail_url == null && !it.initialized }
|
|
||||||
.map { getMangaDetails(it) }
|
|
||||||
.forEach { launchUI { view?.onMangaInitialized(it) } }
|
|
||||||
} catch (error: Exception) {
|
|
||||||
launchUI { Timber.e(error) }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a manga from the database for the given manga from network. It creates a new entry
|
* Returns a manga from the database for the given manga from network. It creates a new entry
|
||||||
* if the manga is not yet in the database.
|
* if the manga is not yet in the database.
|
||||||
@ -271,7 +246,19 @@ open class BrowseSourcePresenter(
|
|||||||
* @param mangas the list of manga to initialize.
|
* @param mangas the list of manga to initialize.
|
||||||
*/
|
*/
|
||||||
fun initializeMangas(mangas: List<Manga>) {
|
fun initializeMangas(mangas: List<Manga>) {
|
||||||
launchIO { mangaDetailsFlow.emit(mangas) }
|
launchIO {
|
||||||
|
mangas.asFlow()
|
||||||
|
.filter { it.thumbnail_url == null && !it.initialized }
|
||||||
|
.map { getMangaDetails(it) }
|
||||||
|
.onEach {
|
||||||
|
launchUI {
|
||||||
|
@Suppress("DEPRECATION")
|
||||||
|
view?.onMangaInitialized(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.catch { e -> Timber.e(e) }
|
||||||
|
.collect()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -281,17 +268,15 @@ open class BrowseSourcePresenter(
|
|||||||
* @return the initialized manga
|
* @return the initialized manga
|
||||||
*/
|
*/
|
||||||
private suspend fun getMangaDetails(manga: Manga): Manga {
|
private suspend fun getMangaDetails(manga: Manga): Manga {
|
||||||
return try {
|
try {
|
||||||
source.getMangaDetails(manga.toMangaInfo())
|
val networkManga = source.getMangaDetails(manga.toMangaInfo())
|
||||||
.let { networkManga ->
|
|
||||||
manga.copyFrom(networkManga.toSManga())
|
manga.copyFrom(networkManga.toSManga())
|
||||||
manga.initialized = true
|
manga.initialized = true
|
||||||
db.insertManga(manga).executeAsBlocking()
|
db.insertManga(manga).executeAsBlocking()
|
||||||
manga
|
|
||||||
}
|
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
manga
|
Timber.e(e)
|
||||||
}
|
}
|
||||||
|
return manga
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -315,13 +300,6 @@ open class BrowseSourcePresenter(
|
|||||||
db.insertManga(manga).executeAsBlocking()
|
db.insertManga(manga).executeAsBlocking()
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Refreshes the active display mode.
|
|
||||||
*/
|
|
||||||
fun refreshDisplayMode() {
|
|
||||||
initializeManga()
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the filter states for the current source.
|
* Set the filter states for the current source.
|
||||||
*
|
*
|
||||||
|
Loading…
x
Reference in New Issue
Block a user