From ca81f48c1c19d7db3b37e6d04a1efaf8e256228c Mon Sep 17 00:00:00 2001
From: Luqman <16263232+Riztard@users.noreply.github.com>
Date: Sun, 18 Feb 2024 03:46:23 +0700
Subject: [PATCH] add toggle to auto mark read dupe chapter (#1078)

* add toggle to auto mark read dupe chapter

https: //github.com/tachiyomiorg/tachiyomi/pull/9662
Co-Authored-By: Trace <49712094+traceltrc@users.noreply.github.com>

* Update LibraryUpdateJob.kt

---------

Co-authored-by: Trace <49712094+traceltrc@users.noreply.github.com>
---
 .../settings/screen/SettingsLibraryScreen.kt   |  5 +++++
 .../tachiyomi/data/library/LibraryUpdateJob.kt | 18 +++++++++++++++++-
 .../library/service/LibraryPreferences.kt      |  2 ++
 .../commonMain/resources/MR/base/strings.xml   |  3 +++
 4 files changed, 27 insertions(+), 1 deletion(-)

diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsLibraryScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsLibraryScreen.kt
index 6f97e3eab..6e9c1c53e 100644
--- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsLibraryScreen.kt
+++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsLibraryScreen.kt
@@ -235,6 +235,11 @@ object SettingsLibraryScreen : SearchableSettings {
                     pref = libraryPreferences.newShowUpdatesCount(),
                     title = stringResource(MR.strings.pref_library_update_show_tab_badge),
                 ),
+                Preference.PreferenceItem.SwitchPreference(
+                    pref = libraryPreferences.libraryReadDuplicateChapters(),
+                    title = stringResource(MR.strings.pref_library_mark_duplicate_chapters),
+                    subtitle = stringResource(MR.strings.pref_library_mark_duplicate_chapters_summary),
+                ),
             ),
         )
     }
diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateJob.kt b/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateJob.kt
index 0922f6fb4..a88c8b931 100755
--- a/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateJob.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateJob.kt
@@ -16,6 +16,7 @@ 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
@@ -100,6 +101,7 @@ import java.util.concurrent.CopyOnWriteArrayList
 import java.util.concurrent.TimeUnit
 import java.util.concurrent.atomic.AtomicBoolean
 import java.util.concurrent.atomic.AtomicInteger
+import tachiyomi.domain.chapter.interactor.GetChaptersByMangaId
 
 class LibraryUpdateJob(private val context: Context, workerParams: WorkerParameters) :
     CoroutineWorker(context, workerParams) {
@@ -125,6 +127,8 @@ 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)
@@ -392,7 +396,19 @@ class LibraryUpdateJob(private val context: Context, workerParams: WorkerParamet
                                 ) {
                                     try {
                                         val newChapters = updateManga(manga, fetchWindow)
-                                            .sortedByDescending { it.sourceOrder }
+                                            // SY -->
+                                            .sortedByDescending { it.sourceOrder }.run {
+                                                if (libraryPreferences.libraryReadDuplicateChapters().get()) {
+                                                    val readChapters = getChaptersByMangaId.await(manga.id).filter { it.read }
+                                                    val newReadChapters = this.filter { chapter -> readChapters.any { it.chapterNumber == chapter.chapterNumber } }
+                                                        .also { setReadStatus.await(true, *it.toTypedArray()) }
+
+                                                    this.filterNot { newReadChapters.contains(it) }
+                                                } else {
+                                                    this
+                                                }
+                                            }
+                                        //SY <--
 
                                         if (newChapters.isNotEmpty()) {
                                             val categoryIds = getCategories.await(manga.id).map { it.id }
diff --git a/domain/src/main/java/tachiyomi/domain/library/service/LibraryPreferences.kt b/domain/src/main/java/tachiyomi/domain/library/service/LibraryPreferences.kt
index 0e8bc4ca4..535bcf9e3 100644
--- a/domain/src/main/java/tachiyomi/domain/library/service/LibraryPreferences.kt
+++ b/domain/src/main/java/tachiyomi/domain/library/service/LibraryPreferences.kt
@@ -92,6 +92,8 @@ 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(
diff --git a/i18n/src/commonMain/resources/MR/base/strings.xml b/i18n/src/commonMain/resources/MR/base/strings.xml
index 92075a425..bba159c91 100755
--- a/i18n/src/commonMain/resources/MR/base/strings.xml
+++ b/i18n/src/commonMain/resources/MR/base/strings.xml
@@ -284,6 +284,9 @@
     <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>
 
+    <string name="pref_library_mark_duplicate_chapters">Mark new duplicate chapters as read</string>
+    <string name="pref_library_mark_duplicate_chapters_summary">Automatically mark new chapters as read if it has been read before</string>
+
     <string name="default_category">Default category</string>
     <string name="default_category_summary">Always ask</string>
     <string name="categorized_display_settings">Per-category settings for sort</string>