Dedupe by priority

This commit is contained in:
Jobobby04 2022-11-16 13:08:07 -05:00
parent 797a9e6b4e
commit 6a6d8c0657
2 changed files with 42 additions and 9 deletions

View File

@ -41,7 +41,6 @@ class GetMergedChapterByMangaId(
} }
} }
// TODO more chapter dedupe
fun transformMergedChapters(mangaReferences: List<MergedMangaReference>, chapterList: List<Chapter>, dedupe: Boolean): List<Chapter> { fun transformMergedChapters(mangaReferences: List<MergedMangaReference>, chapterList: List<Chapter>, dedupe: Boolean): List<Chapter> {
return if (dedupe) dedupeChapterList(mangaReferences, chapterList) else chapterList return if (dedupe) dedupeChapterList(mangaReferences, chapterList) else chapterList
} }
@ -49,7 +48,7 @@ class GetMergedChapterByMangaId(
private fun dedupeChapterList(mangaReferences: List<MergedMangaReference>, chapterList: List<Chapter>): List<Chapter> { private fun dedupeChapterList(mangaReferences: List<MergedMangaReference>, chapterList: List<Chapter>): List<Chapter> {
return when (mangaReferences.firstOrNull { it.mangaSourceId == MERGED_SOURCE_ID }?.chapterSortMode) { return when (mangaReferences.firstOrNull { it.mangaSourceId == MERGED_SOURCE_ID }?.chapterSortMode) {
MergedMangaReference.CHAPTER_SORT_NO_DEDUPE, MergedMangaReference.CHAPTER_SORT_NONE -> chapterList 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 -> { MergedMangaReference.CHAPTER_SORT_MOST_CHAPTERS -> {
findSourceWithMostChapters(chapterList)?.let { mangaId -> findSourceWithMostChapters(chapterList)?.let { mangaId ->
chapterList.filter { it.mangaId == mangaId } chapterList.filter { it.mangaId == mangaId }
@ -71,4 +70,38 @@ class GetMergedChapterByMangaId(
private fun findSourceWithHighestChapterNumber(chapterList: List<Chapter>): Long? { private fun findSourceWithHighestChapterNumber(chapterList: List<Chapter>): Long? {
return chapterList.maxByOrNull { it.chapterNumber }?.mangaId return chapterList.maxByOrNull { it.chapterNumber }?.mangaId
} }
private fun dedupeByPriority(mangaReferences: List<MergedMangaReference>, chapterList: List<Chapter>): List<Chapter> {
val sortedChapterList = mutableListOf<Chapter>()
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())
}
}
} }

View File

@ -43,7 +43,7 @@ class EditMergedSettingsHeaderAdapter(private val state: EditMergedSettingsState
android.R.layout.simple_spinner_item, android.R.layout.simple_spinner_item,
listOfNotNull( listOfNotNull(
itemView.context.getString(R.string.no_dedupe), 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_most_chapters),
itemView.context.getString(R.string.dedupe_highest_chapter), itemView.context.getString(R.string.dedupe_highest_chapter),
), ),
@ -54,9 +54,9 @@ class EditMergedSettingsHeaderAdapter(private val state: EditMergedSettingsState
binding.dedupeModeSpinner.setSelection( binding.dedupeModeSpinner.setSelection(
when (it.chapterSortMode) { when (it.chapterSortMode) {
MergedMangaReference.CHAPTER_SORT_NO_DEDUPE -> 0 MergedMangaReference.CHAPTER_SORT_NO_DEDUPE -> 0
/*MergedMangaReference.CHAPTER_SORT_PRIORITY -> 1*/ MergedMangaReference.CHAPTER_SORT_PRIORITY -> 1
MergedMangaReference.CHAPTER_SORT_MOST_CHAPTERS -> 1 MergedMangaReference.CHAPTER_SORT_MOST_CHAPTERS -> 2
MergedMangaReference.CHAPTER_SORT_HIGHEST_CHAPTER_NUMBER -> 2 MergedMangaReference.CHAPTER_SORT_HIGHEST_CHAPTER_NUMBER -> 3
else -> 0 else -> 0
}, },
) )
@ -70,9 +70,9 @@ class EditMergedSettingsHeaderAdapter(private val state: EditMergedSettingsState
) { ) {
state.mergeReference?.chapterSortMode = when (position) { state.mergeReference?.chapterSortMode = when (position) {
0 -> MergedMangaReference.CHAPTER_SORT_NO_DEDUPE 0 -> MergedMangaReference.CHAPTER_SORT_NO_DEDUPE
/*1 -> MergedMangaReference.CHAPTER_SORT_PRIORITY*/ 1 -> MergedMangaReference.CHAPTER_SORT_PRIORITY
1 -> MergedMangaReference.CHAPTER_SORT_MOST_CHAPTERS 2 -> MergedMangaReference.CHAPTER_SORT_MOST_CHAPTERS
2 -> MergedMangaReference.CHAPTER_SORT_HIGHEST_CHAPTER_NUMBER 3 -> MergedMangaReference.CHAPTER_SORT_HIGHEST_CHAPTER_NUMBER
else -> MergedMangaReference.CHAPTER_SORT_NO_DEDUPE else -> MergedMangaReference.CHAPTER_SORT_NO_DEDUPE
} }
xLogD(state.mergeReference?.chapterSortMode) xLogD(state.mergeReference?.chapterSortMode)