From 0ffc798e9ae5a201ef2051d48099bf38f467815b Mon Sep 17 00:00:00 2001 From: NGB-Was-Taken <76197326+NGB-Was-Taken@users.noreply.github.com> Date: Fri, 26 Dec 2025 03:32:56 +0545 Subject: [PATCH] Add preference to toggle chapter URL hash for downloads (#1533) --- .../settings/screen/SettingsAdvancedScreen.kt | 21 +++++++++++++++++++ .../data/download/DownloadProvider.kt | 6 +++++- .../download/service/DownloadPreferences.kt | 2 ++ .../moko-resources/base/strings.xml | 2 ++ 4 files changed, 30 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsAdvancedScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsAdvancedScreen.kt index ac3a92242..b2e404e16 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsAdvancedScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsAdvancedScreen.kt @@ -89,6 +89,7 @@ import tachiyomi.core.common.util.lang.withUIContext import tachiyomi.core.common.util.system.ImageUtil import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.chapter.interactor.GetChaptersByMangaId +import tachiyomi.domain.download.service.DownloadPreferences import tachiyomi.domain.library.service.LibraryPreferences import tachiyomi.domain.manga.interactor.GetAllManga import tachiyomi.domain.manga.interactor.ResetViewerFlags @@ -117,6 +118,7 @@ object SettingsAdvancedScreen : SearchableSettings { val basePreferences = remember { Injekt.get() } val networkPreferences = remember { Injekt.get() } val libraryPreferences = remember { Injekt.get() } + val downloadPreferences = remember { Injekt.get() } return listOf( Preference.PreferenceItem.TextPreference( @@ -167,6 +169,7 @@ object SettingsAdvancedScreen : SearchableSettings { getDataGroup(), getNetworkGroup(networkPreferences = networkPreferences), getLibraryGroup(libraryPreferences = libraryPreferences), + getDownloadsGroup(downloadPreferences = downloadPreferences), getReaderGroup(basePreferences = basePreferences), getExtensionsGroup(basePreferences = basePreferences), // SY --> @@ -378,6 +381,24 @@ object SettingsAdvancedScreen : SearchableSettings { ) } + // SY -> + @Composable + private fun getDownloadsGroup( + downloadPreferences: DownloadPreferences, + ): Preference.PreferenceGroup { + return Preference.PreferenceGroup( + title = stringResource(MR.strings.pref_category_downloads), + preferenceItems = persistentListOf( + Preference.PreferenceItem.SwitchPreference( + preference = downloadPreferences.includeChapterUrlHash(), + title = stringResource(SYMR.strings.pref_include_chapter_url_hash), + subtitle = stringResource(SYMR.strings.pref_include_chapter_url_hash_desc), + ), + ), + ) + } + // <- SY + @Composable private fun getReaderGroup( basePreferences: BasePreferences, diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadProvider.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadProvider.kt index ec08f7052..c442b8dbe 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadProvider.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadProvider.kt @@ -10,6 +10,7 @@ import tachiyomi.core.common.i18n.stringResource import tachiyomi.core.common.storage.displayablePath import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.chapter.model.Chapter +import tachiyomi.domain.download.service.DownloadPreferences import tachiyomi.domain.library.service.LibraryPreferences import tachiyomi.domain.manga.model.Manga import tachiyomi.domain.storage.service.StorageManager @@ -28,6 +29,7 @@ class DownloadProvider( private val context: Context, private val storageManager: StorageManager = Injekt.get(), private val libraryPreferences: LibraryPreferences = Injekt.get(), + private val downloadPreferences: DownloadPreferences = Injekt.get(), ) { private val downloadsDir: UniFile? @@ -190,6 +192,7 @@ class DownloadProvider( chapterScanlator: String?, chapterUrl: String, disallowNonAsciiFilenames: Boolean = libraryPreferences.disallowNonAsciiFilenames().get(), + includeChapterUrlHash: Boolean = downloadPreferences.includeChapterUrlHash().get(), ): String { var dirName = sanitizeChapterName(chapterName) if (!chapterScanlator.isNullOrBlank()) { @@ -197,7 +200,7 @@ class DownloadProvider( } // Subtract 7 bytes for hash and underscore, 4 bytes for .cbz dirName = DiskUtil.buildValidFilename(dirName, DiskUtil.MAX_FILE_NAME_BYTES - 11, disallowNonAsciiFilenames) - dirName += "_" + md5(chapterUrl).take(6) + if (includeChapterUrlHash) dirName += "_" + md5(chapterUrl).take(6) return dirName } @@ -233,6 +236,7 @@ class DownloadProvider( chapterScanlator, chapterUrl, !libraryPreferences.disallowNonAsciiFilenames().get(), + !downloadPreferences.includeChapterUrlHash().get(), ) return buildList(2) { 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 269d788a4..97801ef34 100644 --- a/domain/src/main/java/tachiyomi/domain/download/service/DownloadPreferences.kt +++ b/domain/src/main/java/tachiyomi/domain/download/service/DownloadPreferences.kt @@ -41,6 +41,8 @@ class DownloadPreferences( fun parallelPageLimit() = preferenceStore.getInt("download_parallel_page_limit", 5) + fun includeChapterUrlHash() = preferenceStore.getBoolean("download_include_chapter_url_hash", true) + companion object { private const val REMOVE_EXCLUDE_CATEGORIES_PREF_KEY = "remove_exclude_categories" private const val DOWNLOAD_NEW_CATEGORIES_PREF_KEY = "download_new_categories" diff --git a/i18n-sy/src/commonMain/moko-resources/base/strings.xml b/i18n-sy/src/commonMain/moko-resources/base/strings.xml index d5a4664b9..662fe0ee6 100644 --- a/i18n-sy/src/commonMain/moko-resources/base/strings.xml +++ b/i18n-sy/src/commonMain/moko-resources/base/strings.xml @@ -153,6 +153,8 @@ Bandwidth Hero Proxy Server Put Bandwidth Hero Proxy server url here Keep entries with read chapters + Include chapter URL hash + Append the first six characters of the chapter URL's MD5 hash to the chapter file folder name. Minimal