From 8b0be676852dd78e69823681d2e61ae2c7bbe2ad Mon Sep 17 00:00:00 2001 From: Cuong-Tran <16017808+cuong-tran@users.noreply.github.com> Date: Wed, 22 Oct 2025 12:28:17 +0700 Subject: [PATCH] Batoto: Custom regex for cleaning title & fix duplicate manga (#11164) * Batoto: config custom regex to be removed from title * fix(BatoTo): add original (uncleaned) title to description * verify regex * add real-time validation for custom regex input & update summary on change * Also clean title while browsing/searching * Batoto: Fix duplicate manga due to name changed Close #11037 --- src/all/batoto/build.gradle | 2 +- .../tachiyomi/extension/all/batoto/BatoTo.kt | 107 +++++++++++++++--- 2 files changed, 91 insertions(+), 18 deletions(-) diff --git a/src/all/batoto/build.gradle b/src/all/batoto/build.gradle index 88e7ea146..e60397b34 100644 --- a/src/all/batoto/build.gradle +++ b/src/all/batoto/build.gradle @@ -1,7 +1,7 @@ ext { extName = 'Bato.to' extClass = '.BatoToFactory' - extVersionCode = 55 + extVersionCode = 56 isNsfw = true } diff --git a/src/all/batoto/src/eu/kanade/tachiyomi/extension/all/batoto/BatoTo.kt b/src/all/batoto/src/eu/kanade/tachiyomi/extension/all/batoto/BatoTo.kt index 3ba763adb..85203d64a 100644 --- a/src/all/batoto/src/eu/kanade/tachiyomi/extension/all/batoto/BatoTo.kt +++ b/src/all/batoto/src/eu/kanade/tachiyomi/extension/all/batoto/BatoTo.kt @@ -2,7 +2,12 @@ package eu.kanade.tachiyomi.extension.all.batoto import android.app.Application import android.content.SharedPreferences +import android.text.Editable +import android.text.TextWatcher +import android.widget.Button +import android.widget.Toast import androidx.preference.CheckBoxPreference +import androidx.preference.EditTextPreference import androidx.preference.ListPreference import androidx.preference.PreferenceScreen import eu.kanade.tachiyomi.extension.BuildConfig @@ -87,9 +92,49 @@ open class BatoTo( "You might also want to clear the database in advanced settings." setDefaultValue(false) } + val removeCustomPref = EditTextPreference(screen.context).apply { + key = "${REMOVE_TITLE_CUSTOM_PREF}_$lang" + title = "Custom regex to be removed from title" + summary = customRemoveTitle() + setDefaultValue("") + + val validate = { str: String -> + runCatching { Regex(str) } + .map { true to "" } + .getOrElse { false to it.message } + } + + setOnBindEditTextListener { editText -> + editText.addTextChangedListener( + object : TextWatcher { + override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {} + override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {} + + override fun afterTextChanged(editable: Editable?) { + editable ?: return + val text = editable.toString() + val valid = validate(text) + editText.error = if (!valid.first) valid.second else null + editText.rootView.findViewById