diff --git a/app/src/main/java/eu/kanade/domain/DomainModule.kt b/app/src/main/java/eu/kanade/domain/DomainModule.kt index a9dee6637..85a7ec19d 100644 --- a/app/src/main/java/eu/kanade/domain/DomainModule.kt +++ b/app/src/main/java/eu/kanade/domain/DomainModule.kt @@ -27,6 +27,7 @@ import eu.kanade.domain.track.interactor.SyncChapterProgressWithTrack import eu.kanade.domain.track.interactor.TrackChapter import mihon.data.repository.ExtensionRepoRepositoryImpl import mihon.domain.chapter.interactor.FilterChaptersForDownload +import mihon.domain.chapter.interactor.GetChaptersForLibraryUpdateDownload import mihon.domain.extensionrepo.interactor.CreateExtensionRepo import mihon.domain.extensionrepo.interactor.DeleteExtensionRepo import mihon.domain.extensionrepo.interactor.GetExtensionRepo @@ -171,6 +172,7 @@ class DomainModule : InjektModule { addFactory { SyncChaptersWithSource(get(), get(), get(), get(), get(), get(), get(), get(), get()) } addFactory { GetAvailableScanlators(get()) } addFactory { FilterChaptersForDownload(get(), get(), get(), get()) } + addFactory { GetChaptersForLibraryUpdateDownload(get(), get()) } addSingletonFactory { HistoryRepositoryImpl(get()) } addFactory { GetHistory(get()) } diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsDownloadScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsDownloadScreen.kt index c6176eb7f..60e778f21 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsDownloadScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsDownloadScreen.kt @@ -18,6 +18,7 @@ import kotlinx.collections.immutable.toImmutableMap import tachiyomi.domain.category.interactor.GetCategories import tachiyomi.domain.category.model.Category import tachiyomi.domain.download.service.DownloadPreferences +import tachiyomi.domain.download.service.LibraryUpdateDownloadMode import tachiyomi.i18n.MR import tachiyomi.i18n.kmk.KMR import tachiyomi.presentation.core.i18n.pluralStringResource @@ -77,6 +78,7 @@ object SettingsDownloadScreen : SearchableSettings { allCategories = allCategories, ), getDownloadAheadGroup(downloadPreferences = downloadPreferences), + getLibraryUpdateDownloadGroup(downloadPreferences = downloadPreferences), // KMK --> getDownloadCacheRenewInterval(downloadPreferences = downloadPreferences), // KMK <-- @@ -216,6 +218,39 @@ object SettingsDownloadScreen : SearchableSettings { ) } + @Composable + private fun getLibraryUpdateDownloadGroup( + downloadPreferences: DownloadPreferences, + ): Preference.PreferenceGroup { + val modePref = downloadPreferences.libraryUpdateDownloadMode() + val amountPref = downloadPreferences.libraryUpdateDownloadAmount() + val mode by modePref.collectAsState() + + return Preference.PreferenceGroup( + title = stringResource(KMR.strings.library_update_download), + preferenceItems = persistentListOf( + Preference.PreferenceItem.ListPreference( + preference = modePref, + entries = persistentMapOf( + LibraryUpdateDownloadMode.DISABLED to stringResource(MR.strings.disabled), + LibraryUpdateDownloadMode.NEXT_X to stringResource(KMR.strings.library_update_download_mode_next_x), + LibraryUpdateDownloadMode.ALL to stringResource(KMR.strings.library_update_download_mode_all), + ), + title = stringResource(KMR.strings.library_update_download_mode), + ), + Preference.PreferenceItem.ListPreference( + preference = amountPref, + entries = listOf(2, 3, 5, 10) + .associateWith { pluralStringResource(MR.plurals.next_unread_chapters, count = it, it) } + .toImmutableMap(), + title = stringResource(KMR.strings.library_update_download_amount), + enabled = mode == LibraryUpdateDownloadMode.NEXT_X, + ), + Preference.PreferenceItem.InfoPreference(stringResource(KMR.strings.library_update_download_info)), + ), + ) + } + // KMK --> @Composable private fun getDownloadCacheRenewInterval( 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 5696a4600..15ed6a87d 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateJob.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateJob.kt @@ -58,6 +58,7 @@ import kotlinx.coroutines.sync.Semaphore import kotlinx.coroutines.sync.withPermit import logcat.LogPriority import mihon.domain.chapter.interactor.FilterChaptersForDownload +import mihon.domain.chapter.interactor.GetChaptersForLibraryUpdateDownload import tachiyomi.core.common.i18n.stringResource import tachiyomi.core.common.preference.getAndSet import tachiyomi.core.common.util.lang.withIOContext @@ -119,6 +120,7 @@ class LibraryUpdateJob(private val context: Context, workerParams: WorkerParamet private val syncChaptersWithSource: SyncChaptersWithSource = Injekt.get() private val fetchInterval: FetchInterval = Injekt.get() private val filterChaptersForDownload: FilterChaptersForDownload = Injekt.get() + private val getChaptersForLibraryUpdateDownload: GetChaptersForLibraryUpdateDownload = Injekt.get() // SY --> private val getFavorites: GetFavorites = Injekt.get() @@ -465,6 +467,12 @@ class LibraryUpdateJob(private val context: Context, workerParams: WorkerParamet // Convert to the manga that contains new chapters newUpdates.add(manga to newChapters.toTypedArray()) } + + val libraryUpdateChapters = getChaptersForLibraryUpdateDownload.await(manga) + if (libraryUpdateChapters.isNotEmpty()) { + downloadChapters(manga, libraryUpdateChapters) + hasDownloads.store(true) + } clearErrorFromDB(mangaId = manga.id) } catch (e: Throwable) { val errorMessage = when (e) { @@ -493,9 +501,10 @@ class LibraryUpdateJob(private val context: Context, workerParams: WorkerParamet if (newUpdates.isNotEmpty()) { notifier.showUpdateNotifications(newUpdates) - if (hasDownloads.load()) { - downloadManager.startDownloads() - } + } + + if (hasDownloads.load()) { + downloadManager.startDownloads() } if (failedUpdates.isNotEmpty()) { diff --git a/domain/src/main/java/mihon/domain/chapter/interactor/GetChaptersForLibraryUpdateDownload.kt b/domain/src/main/java/mihon/domain/chapter/interactor/GetChaptersForLibraryUpdateDownload.kt new file mode 100644 index 000000000..b1462d809 --- /dev/null +++ b/domain/src/main/java/mihon/domain/chapter/interactor/GetChaptersForLibraryUpdateDownload.kt @@ -0,0 +1,31 @@ +package mihon.domain.chapter.interactor + +import tachiyomi.domain.chapter.model.Chapter +import tachiyomi.domain.download.service.DownloadPreferences +import tachiyomi.domain.download.service.LibraryUpdateDownloadMode +import tachiyomi.domain.history.interactor.GetNextChapters +import tachiyomi.domain.manga.model.Manga + +class GetChaptersForLibraryUpdateDownload( + private val downloadPreferences: DownloadPreferences, + private val getNextChapters: GetNextChapters, +) { + + suspend fun await(manga: Manga): List { + if (!manga.favorite) return emptyList() + + val mode = downloadPreferences.libraryUpdateDownloadMode().get() + if (mode == LibraryUpdateDownloadMode.DISABLED) return emptyList() + + val chapters = getNextChapters.await(manga.id) + if (chapters.isEmpty()) return emptyList() + + return when (mode) { + LibraryUpdateDownloadMode.NEXT_X -> { + chapters.take(downloadPreferences.libraryUpdateDownloadAmount().get()) + } + LibraryUpdateDownloadMode.ALL -> chapters + else -> emptyList() + } + } +} diff --git a/domain/src/main/java/tachiyomi/domain/download/service/DownloadPreferences.kt b/domain/src/main/java/tachiyomi/domain/download/service/DownloadPreferences.kt index 9d2a481a1..6055965ec 100644 --- a/domain/src/main/java/tachiyomi/domain/download/service/DownloadPreferences.kt +++ b/domain/src/main/java/tachiyomi/domain/download/service/DownloadPreferences.kt @@ -47,6 +47,13 @@ class DownloadPreferences( // KMK --> fun downloadCacheRenewInterval() = preferenceStore.getInt("download_cache_renew_interval", 1) + + fun libraryUpdateDownloadMode() = preferenceStore.getInt( + "library_update_download_mode", + LibraryUpdateDownloadMode.DISABLED, + ) + + fun libraryUpdateDownloadAmount() = preferenceStore.getInt("library_update_download_amount", 10) // KMK <-- companion object { diff --git a/domain/src/main/java/tachiyomi/domain/download/service/LibraryUpdateDownloadMode.kt b/domain/src/main/java/tachiyomi/domain/download/service/LibraryUpdateDownloadMode.kt new file mode 100644 index 000000000..6e655e92f --- /dev/null +++ b/domain/src/main/java/tachiyomi/domain/download/service/LibraryUpdateDownloadMode.kt @@ -0,0 +1,7 @@ +package tachiyomi.domain.download.service + +object LibraryUpdateDownloadMode { + const val DISABLED = 0 + const val NEXT_X = 1 + const val ALL = 2 +} diff --git a/i18n-kmk/src/commonMain/moko-resources/base/strings.xml b/i18n-kmk/src/commonMain/moko-resources/base/strings.xml index b94002b31..afc666e9d 100644 --- a/i18n-kmk/src/commonMain/moko-resources/base/strings.xml +++ b/i18n-kmk/src/commonMain/moko-resources/base/strings.xml @@ -113,6 +113,12 @@ 12 hours 1 day If set to "manual", either refresh each manga or using the "Reindex downloads" action in "Advanced" + Download on library update + Download chapters on library update + Next unread chapters from current position + All unread chapters from current position + Number of chapters to download + Downloads unread chapters from your current reading position when the library is updated. Already downloaded chapters are skipped. Auto sync progress from Trackers Sync progress from Trackers up to chapter %d diff --git a/i18n-kmk/src/commonMain/moko-resources/de/strings.xml b/i18n-kmk/src/commonMain/moko-resources/de/strings.xml index 7da0a0930..50e0141fb 100644 --- a/i18n-kmk/src/commonMain/moko-resources/de/strings.xml +++ b/i18n-kmk/src/commonMain/moko-resources/de/strings.xml @@ -12,6 +12,12 @@ 12 Stunden 1 Tag Wenn auf \"Manuell\" gesetzt, aktualisieren Sie entweder jedes Manga oder verwenden Sie die Aktion \"Downloads neu indizieren\" in \"Erweitert\" + Bei Bibliotheksaktualisierung herunterladen + Kapitel bei Bibliotheksaktualisierung herunterladen + Nächste ungelesene Kapitel ab aktueller Leseposition + Alle ungelesenen Kapitel ab aktueller Leseposition + Anzahl der herunterzuladenden Kapitel + Lädt ungelesene Kapitel ab deiner aktuellen Leseposition herunter, wenn die Bibliothek aktualisiert wird. Bereits heruntergeladene Kapitel werden übersprungen. Ungültige Downloads bereinigen Finden und entfernen Sie alle Downloads, Dateien, Ordner die nicht in Ihrer Bibliothek gespeichert sind Ungültige Downloads bereinigt