From e8100fc95876dc7eda40738433436e8c686250b2 Mon Sep 17 00:00:00 2001 From: Jobobby04 Date: Sat, 15 Jan 2022 20:00:45 -0500 Subject: [PATCH] Properly handle EHentai browse duplication --- .../source/browse/BrowseSourcePresenter.kt | 9 +++- .../ui/browse/source/browse/EHentaiPager.kt | 51 +++++++++++++++++++ 2 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/EHentaiPager.kt diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourcePresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourcePresenter.kt index 311b1d2bc..2d2f161bc 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourcePresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourcePresenter.kt @@ -43,6 +43,7 @@ import eu.kanade.tachiyomi.util.system.logcat import exh.log.xLogE import exh.savedsearches.EXHSavedSearch import exh.savedsearches.JsonSavedSearch +import exh.source.isEhBasedSource import kotlinx.coroutines.Job import kotlinx.coroutines.flow.asFlow import kotlinx.coroutines.flow.catch @@ -342,7 +343,13 @@ open class BrowseSourcePresenter( } open fun createPager(query: String, filters: FilterList): Pager { - return SourcePager(source, query, filters) + // SY --> + return if (source.isEhBasedSource()) { + EHentaiPager(source, query, filters) + } else { + SourcePager(source, query, filters) + } + // SY <-- } // SY --> diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/EHentaiPager.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/EHentaiPager.kt new file mode 100644 index 000000000..d9b4e2ce6 --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/EHentaiPager.kt @@ -0,0 +1,51 @@ +package eu.kanade.tachiyomi.ui.browse.source.browse + +import eu.kanade.tachiyomi.source.CatalogueSource +import eu.kanade.tachiyomi.source.model.FilterList +import eu.kanade.tachiyomi.source.model.MetadataMangasPage +import eu.kanade.tachiyomi.util.lang.awaitSingle + +open class EHentaiPager(source: CatalogueSource, query: String, filters: FilterList) : SourcePager(source, query, filters) { + + private var lastMangaLink: String? = null + + override suspend fun requestNextPage() { + val page = currentPage + val lastMangaLink = lastMangaLink + + val observable = if (query.isBlank() && filters.isEmpty()) { + source.fetchPopularManga(page) + } else { + source.fetchSearchManga(page, query, filters) + } + + val mangasPage = observable.awaitSingle() + + mangasPage.mangas.lastOrNull()?.let { + this.lastMangaLink = it.url + } + if (lastMangaLink != null) { + val index = mangasPage.mangas.indexOfFirst { it.url == lastMangaLink } + if (index != -1) { + val lastIndex = mangasPage.mangas.size + val startIndex = (index + 1).coerceAtMost(mangasPage.mangas.lastIndex) + onPageReceived( + if (mangasPage is MetadataMangasPage) { + mangasPage.copy( + mangas = mangasPage.mangas.subList(startIndex, lastIndex), + mangasMetadata = mangasPage.mangasMetadata.subList(startIndex, lastIndex) + ) + } else { + mangasPage.copy( + mangas = mangasPage.mangas.subList(startIndex, lastIndex) + ) + } + ) + } else { + onPageReceived(mangasPage) + } + } else { + onPageReceived(mangasPage) + } + } +}