Add option to mark new duplicate read chapters as read (mihonapp/mihon#1785)
(cherry picked from commit cd0481592c09dc9cfb331805e90e6e5c3752a08c)
This commit is contained in:
parent
a561d733cf
commit
5a5b86d3c6
7 changed files with 29 additions and 51 deletions
|
|
@ -20,6 +20,7 @@ The format is a modified version of [Keep a Changelog](https://keepachangelog.co
|
|||
- Add private tracking support for Kitsu ([@MajorTanya](https://github.com/MajorTanya)) ([#1774](https://github.com/mihonapp/mihon/pull/1774))
|
||||
- Add option to export minimal library information to a CSV file ([@Animeboynz](https://github.com/Animeboynz), [@AntsyLich](https://github.com/AntsyLich)) ([#1161](https://github.com/mihonapp/mihon/pull/1161))
|
||||
- Add back support for drag-and-drop category reordering ([@cuong-tran](https://github.com/cuong-tran)) ([#1427](https://github.com/mihonapp/mihon/pull/1427))
|
||||
- Add option to mark new duplicate read chapters as read
|
||||
|
||||
### Changed
|
||||
- Apply "Downloaded only" filter to all entries regardless of favourite status ([@NGB-Was-Taken](https://github.com/NGB-Was-Taken)) ([#1603](https://github.com/mihonapp/mihon/pull/1603))
|
||||
|
|
|
|||
|
|
@ -157,7 +157,7 @@ class DomainModule : InjektModule {
|
|||
addFactory { UpdateChapter(get()) }
|
||||
addFactory { SetReadStatus(get(), get(), get(), get(), get()) }
|
||||
addFactory { ShouldUpdateDbChapter() }
|
||||
addFactory { SyncChaptersWithSource(get(), get(), get(), get(), get(), get(), get(), get()) }
|
||||
addFactory { SyncChaptersWithSource(get(), get(), get(), get(), get(), get(), get(), get(), get()) }
|
||||
addFactory { GetAvailableScanlators(get()) }
|
||||
addFactory { FilterChaptersForDownload(get(), get(), get(), get()) }
|
||||
|
||||
|
|
|
|||
|
|
@ -20,6 +20,7 @@ import tachiyomi.domain.chapter.model.NoChaptersException
|
|||
import tachiyomi.domain.chapter.model.toChapterUpdate
|
||||
import tachiyomi.domain.chapter.repository.ChapterRepository
|
||||
import tachiyomi.domain.chapter.service.ChapterRecognition
|
||||
import tachiyomi.domain.library.service.LibraryPreferences
|
||||
import tachiyomi.domain.manga.model.Manga
|
||||
import tachiyomi.source.local.isLocal
|
||||
import java.lang.Long.max
|
||||
|
|
@ -35,6 +36,7 @@ class SyncChaptersWithSource(
|
|||
private val updateChapter: UpdateChapter,
|
||||
private val getChaptersByMangaId: GetChaptersByMangaId,
|
||||
private val getExcludedScanlators: GetExcludedScanlators,
|
||||
private val libraryPreferences: LibraryPreferences,
|
||||
) {
|
||||
|
||||
/**
|
||||
|
|
@ -153,12 +155,18 @@ class SyncChaptersWithSource(
|
|||
return emptyList()
|
||||
}
|
||||
|
||||
val reAdded = mutableListOf<Chapter>()
|
||||
val changedOrDuplicateReadUrls = mutableSetOf<String>()
|
||||
|
||||
val deletedChapterNumbers = TreeSet<Double>()
|
||||
val deletedReadChapterNumbers = TreeSet<Double>()
|
||||
val deletedBookmarkedChapterNumbers = TreeSet<Double>()
|
||||
|
||||
val readChapterNumbers = dbChapters
|
||||
.asSequence()
|
||||
.filter { it.read && it.isRecognizedNumber }
|
||||
.map { it.chapterNumber }
|
||||
.toSet()
|
||||
|
||||
removedChapters.forEach { chapter ->
|
||||
if (chapter.read) deletedReadChapterNumbers.add(chapter.chapterNumber)
|
||||
if (chapter.bookmark) deletedBookmarkedChapterNumbers.add(chapter.chapterNumber)
|
||||
|
|
@ -168,12 +176,19 @@ class SyncChaptersWithSource(
|
|||
val deletedChapterNumberDateFetchMap = removedChapters.sortedByDescending { it.dateFetch }
|
||||
.associate { it.chapterNumber to it.dateFetch }
|
||||
|
||||
val markDuplicateAsRead = libraryPreferences.markDuplicateChapterRead().get()
|
||||
|
||||
// Date fetch is set in such a way that the upper ones will have bigger value than the lower ones
|
||||
// Sources MUST return the chapters from most to less recent, which is common.
|
||||
var itemCount = newChapters.size
|
||||
var updatedToAdd = newChapters.map { toAddItem ->
|
||||
var chapter = toAddItem.copy(dateFetch = nowMillis + itemCount--)
|
||||
|
||||
if (chapter.chapterNumber in readChapterNumbers && markDuplicateAsRead) {
|
||||
changedOrDuplicateReadUrls.add(chapter.url)
|
||||
chapter = chapter.copy(read = true)
|
||||
}
|
||||
|
||||
if (!chapter.isRecognizedNumber || chapter.chapterNumber !in deletedChapterNumbers) return@map chapter
|
||||
|
||||
chapter = chapter.copy(
|
||||
|
|
@ -186,19 +201,19 @@ class SyncChaptersWithSource(
|
|||
chapter = chapter.copy(dateFetch = it)
|
||||
}
|
||||
|
||||
reAdded.add(chapter)
|
||||
changedOrDuplicateReadUrls.add(chapter.url)
|
||||
|
||||
chapter
|
||||
}
|
||||
|
||||
// --> EXH (carry over reading progress)
|
||||
if (manga.isEhBasedManga()) {
|
||||
val finalAdded = updatedToAdd.subtract(reAdded)
|
||||
if (finalAdded.isNotEmpty()) {
|
||||
val hasNewChapters = updatedToAdd.any { it.url !in changedOrDuplicateReadUrls }
|
||||
if (hasNewChapters) {
|
||||
val max = dbChapters.maxOfOrNull { it.lastPageRead }
|
||||
if (max != null && max > 0) {
|
||||
updatedToAdd = updatedToAdd.map {
|
||||
if (it !in reAdded) {
|
||||
if (it.url !in changedOrDuplicateReadUrls) {
|
||||
it.copy(lastPageRead = max)
|
||||
} else {
|
||||
it
|
||||
|
|
@ -228,12 +243,8 @@ class SyncChaptersWithSource(
|
|||
// Note that last_update actually represents last time the chapter list changed at all
|
||||
updateManga.awaitUpdateLastUpdate(manga.id)
|
||||
|
||||
val reAddedUrls = reAdded.map { it.url }.toHashSet()
|
||||
|
||||
val excludedScanlators = getExcludedScanlators.await(manga.id).toHashSet()
|
||||
|
||||
return updatedToAdd.filterNot {
|
||||
it.url in reAddedUrls || it.scanlator in excludedScanlators
|
||||
}
|
||||
return updatedToAdd.filterNot { it.url in changedOrDuplicateReadUrls || it.scanlator in excludedScanlators }
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -231,13 +231,10 @@ object SettingsLibraryScreen : SearchableSettings {
|
|||
preference = libraryPreferences.newShowUpdatesCount(),
|
||||
title = stringResource(MR.strings.pref_library_update_show_tab_badge),
|
||||
),
|
||||
// SY -->
|
||||
Preference.PreferenceItem.SwitchPreference(
|
||||
preference = libraryPreferences.libraryReadDuplicateChapters(),
|
||||
title = stringResource(SYMR.strings.pref_library_mark_duplicate_chapters),
|
||||
subtitle = stringResource(SYMR.strings.pref_library_mark_duplicate_chapters_summary),
|
||||
preference = libraryPreferences.markDuplicateChapterRead(),
|
||||
title = stringResource(MR.strings.pref_mark_duplicate_chapter_read),
|
||||
),
|
||||
// SY <--
|
||||
// KMK -->
|
||||
Preference.PreferenceItem.SwitchPreference(
|
||||
preference = libraryPreferences.showUpdatingProgressBanner(),
|
||||
|
|
|
|||
|
|
@ -18,7 +18,6 @@ import androidx.work.WorkInfo
|
|||
import androidx.work.WorkQuery
|
||||
import androidx.work.WorkerParameters
|
||||
import androidx.work.workDataOf
|
||||
import eu.kanade.domain.chapter.interactor.SetReadStatus
|
||||
import eu.kanade.domain.chapter.interactor.SyncChaptersWithSource
|
||||
import eu.kanade.domain.manga.interactor.UpdateManga
|
||||
import eu.kanade.domain.manga.model.copyFrom
|
||||
|
|
@ -65,7 +64,6 @@ import tachiyomi.core.common.util.lang.withIOContext
|
|||
import tachiyomi.core.common.util.system.logcat
|
||||
import tachiyomi.domain.UnsortedPreferences
|
||||
import tachiyomi.domain.category.model.Category
|
||||
import tachiyomi.domain.chapter.interactor.GetChaptersByMangaId
|
||||
import tachiyomi.domain.chapter.model.Chapter
|
||||
import tachiyomi.domain.chapter.model.NoChaptersException
|
||||
import tachiyomi.domain.library.model.GroupLibraryMode
|
||||
|
|
@ -130,8 +128,6 @@ class LibraryUpdateJob(private val context: Context, workerParams: WorkerParamet
|
|||
private val insertTrack: InsertTrack = Injekt.get()
|
||||
private val trackerManager: TrackerManager = Injekt.get()
|
||||
private val mdList = trackerManager.mdList
|
||||
private val getChaptersByMangaId: GetChaptersByMangaId = Injekt.get()
|
||||
private val setReadStatus: SetReadStatus = Injekt.get()
|
||||
// SY <--
|
||||
|
||||
private val notifier = LibraryUpdateNotifier(context)
|
||||
|
|
@ -438,35 +434,7 @@ class LibraryUpdateJob(private val context: Context, workerParams: WorkerParamet
|
|||
) {
|
||||
try {
|
||||
val newChapters = updateManga(manga, fetchWindow)
|
||||
// SY -->
|
||||
.sortedByDescending { it.sourceOrder }.run {
|
||||
if (libraryPreferences.libraryReadDuplicateChapters().get()) {
|
||||
val readChapters = getChaptersByMangaId.await(manga.id).filter {
|
||||
it.read
|
||||
}
|
||||
val newReadChapters = this.filter { chapter ->
|
||||
chapter.chapterNumber >= 0 &&
|
||||
readChapters.any {
|
||||
it.chapterNumber == chapter.chapterNumber
|
||||
}
|
||||
}
|
||||
|
||||
if (newReadChapters.isNotEmpty()) {
|
||||
setReadStatus.await(
|
||||
true,
|
||||
*newReadChapters.toTypedArray(),
|
||||
// KMK -->
|
||||
manually = false,
|
||||
// KMK <--
|
||||
)
|
||||
}
|
||||
|
||||
this.filterNot { newReadChapters.contains(it) }
|
||||
} else {
|
||||
this
|
||||
}
|
||||
}
|
||||
// SY <--
|
||||
.sortedByDescending { it.sourceOrder }
|
||||
|
||||
if (newChapters.isNotEmpty()) {
|
||||
val chaptersToDownload = filterChaptersForDownload.await(manga, newChapters)
|
||||
|
|
|
|||
|
|
@ -112,8 +112,6 @@ class LibraryPreferences(
|
|||
"pref_filter_library_lewd_v2",
|
||||
TriState.DISABLED,
|
||||
)
|
||||
|
||||
fun libraryReadDuplicateChapters() = preferenceStore.getBoolean("pref_library_mark_duplicate_chapters", false)
|
||||
// SY <--
|
||||
|
||||
fun filterTracking(id: Int) = preferenceStore.getEnum(
|
||||
|
|
@ -154,6 +152,8 @@ class LibraryPreferences(
|
|||
|
||||
fun categorizedDisplaySettings() = preferenceStore.getBoolean("categorized_display", false)
|
||||
|
||||
fun markDuplicateChapterRead() = preferenceStore.getBoolean("mark_duplicate_chapter_read", false)
|
||||
|
||||
// KMK -->
|
||||
fun showHiddenCategories() = preferenceStore.getBoolean("hide_hidden_categories", false)
|
||||
// KMK <--
|
||||
|
|
|
|||
|
|
@ -294,6 +294,7 @@
|
|||
<string name="pref_update_only_started">Skip unstarted entries</string>
|
||||
<string name="pref_update_only_in_release_period">Predict next release time</string>
|
||||
<string name="pref_library_update_show_tab_badge">Show unread count on Updates icon</string>
|
||||
<string name="pref_mark_duplicate_chapter_read">Mark new duplicate read chapters as read</string>
|
||||
|
||||
<string name="pref_library_update_refresh_metadata">Automatically refresh metadata</string>
|
||||
<string name="pref_library_update_refresh_metadata_summary">Check for new cover and details when updating library</string>
|
||||
|
|
|
|||
Loading…
Reference in a new issue