From 50d31978b29d8c9fd04c2cb1fadca237939732e1 Mon Sep 17 00:00:00 2001 From: AntsyLich <59261191+AntsyLich@users.noreply.github.com> Date: Thu, 3 Apr 2025 01:48:54 +0600 Subject: [PATCH] Deduplicate entries when browsing (mihonapp/mihon#1957) (cherry picked from commit f81da3dcce9afba883b6a3accdd3bf4ea21cfa81) --- CHANGELOG.md | 1 + .../tachiyomi/ui/browse/feed/FeedScreenModel.kt | 4 +++- .../browse/source/feed/SourceFeedScreenModel.kt | 1 + .../source/globalsearch/SearchScreenModel.kt | 4 +++- .../kanade/tachiyomi/ui/manga/MangaScreenModel.kt | 15 +++++---------- .../main/java/exh/recs/RecommendsScreenModel.kt | 1 + .../tachiyomi/data/source/EHentaiPagingSource.kt | 4 +++- .../tachiyomi/data/source/SourcePagingSource.kt | 6 +++++- 8 files changed, 22 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9b5c6fbd7..18b91f5c3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ The format is a modified version of [Keep a Changelog](https://keepachangelog.co ### Improved - Significantly improve browsing speed (near instantaneous) ([@AntsyLich](https://github.com/AntsyLich)) ([#1946](https://github.com/mihonapp/mihon/pull/1946)) +- Deduplicate entries when browsing ([@AntsyLich](https://github.com/AntsyLich)) ([#1957](https://github.com/mihonapp/mihon/pull/1957)) ### Fixes - Fix Bangumi search results including novels ([@MajorTanya](https://github.com/MajorTanya)) ([#1885](https://github.com/mihonapp/mihon/pull/1885)) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/feed/FeedScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/feed/FeedScreenModel.kt index 768314ba4..dfc9d3191 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/feed/FeedScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/feed/FeedScreenModel.kt @@ -301,7 +301,9 @@ open class FeedScreenModel( val result = withIOContext { itemUI.copy( - results = page.map { it.toDomainManga(itemUI.source!!.id) } + results = page + .map { it.toDomainManga(itemUI.source!!.id) } + .distinctBy { it.url } .let { networkToLocalManga(it) } // KMK --> .filter { !hideInLibraryFeedItems.get() || !it.favorite }, diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/feed/SourceFeedScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/feed/SourceFeedScreenModel.kt index 23528c36e..73676c519 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/feed/SourceFeedScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/feed/SourceFeedScreenModel.kt @@ -212,6 +212,7 @@ open class SourceFeedScreenModel( val titles = withIOContext { page.map { it.toDomainManga(source.id) } + .distinctBy { it.url } .let { networkToLocalManga(it) } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/globalsearch/SearchScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/globalsearch/SearchScreenModel.kt index 7819527a1..1e702decc 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/globalsearch/SearchScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/globalsearch/SearchScreenModel.kt @@ -186,7 +186,9 @@ abstract class SearchScreenModel( source.getSearchManga(1, query, source.getFilterList()) } - val titles = page.mangas.map { it.toDomainManga(source.id) } + val titles = page.mangas + .map { it.toDomainManga(source.id) } + .distinctBy { it.url } .let { networkToLocalManga(it) } if (isActive) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreenModel.kt index 12af0ad1f..43b63f76a 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreenModel.kt @@ -1151,7 +1151,9 @@ class MangaScreenModel( state.source.getRelatedMangaList(state.manga.toSManga(), { e -> exceptionHandler(e) }) { pair, _ -> /* Push found related mangas into collection */ val relatedManga = RelatedManga.Success.fromPair(pair) { mangaList -> - mangaList.map { it.toDomainManga(state.source.id) } + mangaList + .map { it.toDomainManga(state.source.id) } + .distinctBy { it.url } .let { networkToLocalManga(it) } } @@ -2013,17 +2015,10 @@ sealed interface RelatedManga { return map { relatedManga -> if (relatedManga is Success) { - val stripedList = relatedManga.mangaList.mapNotNull { - if (!mangaIds.contains(it.id)) { - mangaIds.add(it.id) - it - } else { - null - } - } Success( relatedManga.keyword, - stripedList, + relatedManga.mangaList + .filter { mangaIds.add(it.id) }, ) } else { relatedManga diff --git a/app/src/main/java/exh/recs/RecommendsScreenModel.kt b/app/src/main/java/exh/recs/RecommendsScreenModel.kt index 4ac332f9a..c63ed52bf 100644 --- a/app/src/main/java/exh/recs/RecommendsScreenModel.kt +++ b/app/src/main/java/exh/recs/RecommendsScreenModel.kt @@ -86,6 +86,7 @@ open class RecommendsScreenModel( // Otherwise, skip this step. The user will be prompted to choose a source via SmartSearch page.mangas.map { it.toDomainManga(RECOMMENDS_SOURCE) } } + .distinctBy { it.url } if (isActive) { updateItem(recSource, RecommendationItemResult.Success(titles)) diff --git a/data/src/main/java/tachiyomi/data/source/EHentaiPagingSource.kt b/data/src/main/java/tachiyomi/data/source/EHentaiPagingSource.kt index af2be6ace..35117f1b5 100644 --- a/data/src/main/java/tachiyomi/data/source/EHentaiPagingSource.kt +++ b/data/src/main/java/tachiyomi/data/source/EHentaiPagingSource.kt @@ -17,7 +17,9 @@ abstract class EHentaiPagingSource(override val source: CatalogueSource) : BaseS mangasPage as MetadataMangasPage val metadata = mangasPage.mangasMetadata - val manga = mangasPage.mangas.map { it.toDomainManga(source.id) } + val manga = mangasPage.mangas + .map { it.toDomainManga(source.id) } + .filter { seenManga.add(it.url) } .let { networkToLocalManga(it) } // SY --> .mapIndexed { index, manga -> manga to metadata.getOrNull(index) } diff --git a/data/src/main/java/tachiyomi/data/source/SourcePagingSource.kt b/data/src/main/java/tachiyomi/data/source/SourcePagingSource.kt index c711b5231..9f9ba9405 100644 --- a/data/src/main/java/tachiyomi/data/source/SourcePagingSource.kt +++ b/data/src/main/java/tachiyomi/data/source/SourcePagingSource.kt @@ -50,6 +50,8 @@ abstract class BaseSourcePagingSource( protected val networkToLocalManga: NetworkToLocalManga = Injekt.get(), ) : SourcePagingSource() { + protected val seenManga = hashSetOf() + abstract suspend fun requestNextPage(currentPage: Int): MangasPage override suspend fun load( @@ -87,7 +89,9 @@ abstract class BaseSourcePagingSource( } // SY <-- - val manga = mangasPage.mangas.map { it.toDomainManga(source!!.id) } + val manga = mangasPage.mangas + .map { it.toDomainManga(source!!.id) } + .filter { seenManga.add(it.url) } .let { networkToLocalManga(it) } // SY --> .mapIndexed { index, manga -> manga to metadata.getOrNull(index) }