diff --git a/app/src/main/java/eu/kanade/domain/chapter/interactor/GetMergedChapterByMangaId.kt b/app/src/main/java/eu/kanade/domain/chapter/interactor/GetMergedChapterByMangaId.kt index 5f1dacc85..c03679390 100644 --- a/app/src/main/java/eu/kanade/domain/chapter/interactor/GetMergedChapterByMangaId.kt +++ b/app/src/main/java/eu/kanade/domain/chapter/interactor/GetMergedChapterByMangaId.kt @@ -41,7 +41,6 @@ class GetMergedChapterByMangaId( } } - // TODO more chapter dedupe fun transformMergedChapters(mangaReferences: List, chapterList: List, dedupe: Boolean): List { return if (dedupe) dedupeChapterList(mangaReferences, chapterList) else chapterList } @@ -49,7 +48,7 @@ class GetMergedChapterByMangaId( private fun dedupeChapterList(mangaReferences: List, chapterList: List): List { return when (mangaReferences.firstOrNull { it.mangaSourceId == MERGED_SOURCE_ID }?.chapterSortMode) { MergedMangaReference.CHAPTER_SORT_NO_DEDUPE, MergedMangaReference.CHAPTER_SORT_NONE -> chapterList - MergedMangaReference.CHAPTER_SORT_PRIORITY -> chapterList + MergedMangaReference.CHAPTER_SORT_PRIORITY -> dedupeByPriority(mangaReferences, chapterList) MergedMangaReference.CHAPTER_SORT_MOST_CHAPTERS -> { findSourceWithMostChapters(chapterList)?.let { mangaId -> chapterList.filter { it.mangaId == mangaId } @@ -71,4 +70,38 @@ class GetMergedChapterByMangaId( private fun findSourceWithHighestChapterNumber(chapterList: List): Long? { return chapterList.maxByOrNull { it.chapterNumber }?.mangaId } + + private fun dedupeByPriority(mangaReferences: List, chapterList: List): List { + val sortedChapterList = mutableListOf() + + var existingChapterIndex: Int + chapterList.groupBy { it.mangaId } + .entries + .sortedBy { (mangaId) -> + mangaReferences.find { it.mangaId == mangaId }?.chapterPriority ?: Int.MAX_VALUE + } + .forEach { (_, chapters) -> + existingChapterIndex = -1 + chapters.forEach { chapter -> + val oldChapterIndex = existingChapterIndex + if (chapter.isRecognizedNumber) { + existingChapterIndex = sortedChapterList.indexOfFirst { + it.isRecognizedNumber && it.chapterNumber == chapter.chapterNumber && // check if the chapter is not already there + it.mangaId != chapter.mangaId // allow multiple chapters of the same number from the same source + } + if (existingChapterIndex == -1) { + sortedChapterList.add(oldChapterIndex + 1, chapter) + existingChapterIndex = oldChapterIndex + 1 + } + } else { + sortedChapterList.add(oldChapterIndex + 1, chapter) + existingChapterIndex = oldChapterIndex + 1 + } + } + } + + return sortedChapterList.mapIndexed { index, chapter -> + chapter.copy(sourceOrder = index.toLong()) + } + } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/merged/EditMergedSettingsHeaderAdapter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/merged/EditMergedSettingsHeaderAdapter.kt index cf284e673..7f1d8a22e 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/merged/EditMergedSettingsHeaderAdapter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/merged/EditMergedSettingsHeaderAdapter.kt @@ -43,7 +43,7 @@ class EditMergedSettingsHeaderAdapter(private val state: EditMergedSettingsState android.R.layout.simple_spinner_item, listOfNotNull( itemView.context.getString(R.string.no_dedupe), - itemView.context.getString(R.string.dedupe_priority).let { null }, + itemView.context.getString(R.string.dedupe_priority), itemView.context.getString(R.string.dedupe_most_chapters), itemView.context.getString(R.string.dedupe_highest_chapter), ), @@ -54,9 +54,9 @@ class EditMergedSettingsHeaderAdapter(private val state: EditMergedSettingsState binding.dedupeModeSpinner.setSelection( when (it.chapterSortMode) { MergedMangaReference.CHAPTER_SORT_NO_DEDUPE -> 0 - /*MergedMangaReference.CHAPTER_SORT_PRIORITY -> 1*/ - MergedMangaReference.CHAPTER_SORT_MOST_CHAPTERS -> 1 - MergedMangaReference.CHAPTER_SORT_HIGHEST_CHAPTER_NUMBER -> 2 + MergedMangaReference.CHAPTER_SORT_PRIORITY -> 1 + MergedMangaReference.CHAPTER_SORT_MOST_CHAPTERS -> 2 + MergedMangaReference.CHAPTER_SORT_HIGHEST_CHAPTER_NUMBER -> 3 else -> 0 }, ) @@ -70,9 +70,9 @@ class EditMergedSettingsHeaderAdapter(private val state: EditMergedSettingsState ) { state.mergeReference?.chapterSortMode = when (position) { 0 -> MergedMangaReference.CHAPTER_SORT_NO_DEDUPE - /*1 -> MergedMangaReference.CHAPTER_SORT_PRIORITY*/ - 1 -> MergedMangaReference.CHAPTER_SORT_MOST_CHAPTERS - 2 -> MergedMangaReference.CHAPTER_SORT_HIGHEST_CHAPTER_NUMBER + 1 -> MergedMangaReference.CHAPTER_SORT_PRIORITY + 2 -> MergedMangaReference.CHAPTER_SORT_MOST_CHAPTERS + 3 -> MergedMangaReference.CHAPTER_SORT_HIGHEST_CHAPTER_NUMBER else -> MergedMangaReference.CHAPTER_SORT_NO_DEDUPE } xLogD(state.mergeReference?.chapterSortMode)