From 897cdd9f872e37a3d3f5dc7cd0d097b0c25c6296 Mon Sep 17 00:00:00 2001 From: Luna712 <142361265+Luna712@users.noreply.github.com> Date: Mon, 18 May 2026 10:58:02 -0600 Subject: [PATCH] Migrate from fuzzywuzzy to fuzzykot --- app/build.gradle.kts | 2 +- .../com/lagradost/cloudstream3/syncproviders/AuthAPI.kt | 1 - .../com/lagradost/cloudstream3/syncproviders/SyncAPI.kt | 4 ++-- .../cloudstream3/ui/settings/extensions/PluginsViewModel.kt | 4 ++-- gradle/libs.versions.toml | 4 ++-- library/build.gradle.kts | 2 +- .../kotlin/com/lagradost/cloudstream3/utils/ExtractorApi.kt | 4 ++-- .../com/lagradost/cloudstream3/utils/SubtitleHelper.kt | 6 +++--- 8 files changed, 13 insertions(+), 14 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index ae530192998..62ae1d72ed0 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -255,7 +255,7 @@ dependencies { // Extensions & Other Libs implementation(libs.jsoup) // HTML Parser implementation(libs.rhino) // Run JavaScript - implementation(libs.fuzzywuzzy) // Library/Ext Searching with Levenshtein Distance + implementation(libs.fuzzykot) // Library/Extension Matching implementation(libs.safefile) // To Prevent the URI File Fu*kery coreLibraryDesugaring(libs.desugar.jdk.libs.nio) // NIO Flavor Needed for NewPipeExtractor implementation(libs.conscrypt.android) // To Fix SSL Fu*kery on Android 9 diff --git a/app/src/main/java/com/lagradost/cloudstream3/syncproviders/AuthAPI.kt b/app/src/main/java/com/lagradost/cloudstream3/syncproviders/AuthAPI.kt index 83a7a09847c..961c65d187b 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/syncproviders/AuthAPI.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/syncproviders/AuthAPI.kt @@ -40,7 +40,6 @@ import com.lagradost.cloudstream3.utils.Coroutines.threadSafeListOf import com.lagradost.cloudstream3.utils.DataStoreHelper import com.lagradost.cloudstream3.utils.UiText import com.lagradost.cloudstream3.utils.txt -import me.xdrop.fuzzywuzzy.FuzzySearch import java.net.URL import java.security.SecureRandom import java.util.Date diff --git a/app/src/main/java/com/lagradost/cloudstream3/syncproviders/SyncAPI.kt b/app/src/main/java/com/lagradost/cloudstream3/syncproviders/SyncAPI.kt index e5f9aca8493..98b9cb5827e 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/syncproviders/SyncAPI.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/syncproviders/SyncAPI.kt @@ -1,6 +1,7 @@ package com.lagradost.cloudstream3.syncproviders import androidx.annotation.WorkerThread +import com.github.terrakok.fuzzykot.Levenshtein import com.lagradost.cloudstream3.ActorData import com.lagradost.cloudstream3.NextAiring import com.lagradost.cloudstream3.Score @@ -11,7 +12,6 @@ import com.lagradost.cloudstream3.TvType import com.lagradost.cloudstream3.ui.SyncWatchType import com.lagradost.cloudstream3.ui.library.ListSorting import com.lagradost.cloudstream3.utils.UiText -import me.xdrop.fuzzywuzzy.FuzzySearch import java.util.Date /** @@ -138,7 +138,7 @@ abstract class SyncAPI : AuthAPI() { ListSorting.Query -> if (query != null) { items.sortedBy { - -FuzzySearch.partialRatio( + -Levenshtein.partialRatio( query.lowercase(), it.name.lowercase() ) } diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/PluginsViewModel.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/PluginsViewModel.kt index dfc61eba54c..d34484a28b8 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/PluginsViewModel.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/PluginsViewModel.kt @@ -9,6 +9,7 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import androidx.preference.PreferenceManager +import com.github.terrakok.fuzzykot.Levenshtein import com.lagradost.cloudstream3.CommonActivity.showToast import com.lagradost.cloudstream3.PROVIDER_STATUS_DOWN import com.lagradost.cloudstream3.R @@ -23,7 +24,6 @@ import com.lagradost.cloudstream3.utils.txt import com.lagradost.cloudstream3.utils.Coroutines.ioSafe import com.lagradost.cloudstream3.utils.Coroutines.main import com.lagradost.cloudstream3.utils.Coroutines.runOnMainThread -import me.xdrop.fuzzywuzzy.FuzzySearch import java.io.File // String => repository url @@ -246,7 +246,7 @@ class PluginsViewModel : ViewModel() { this.sortedBy { it.plugin.second.name } } else { this.sortedBy { - -FuzzySearch.partialRatio( + -Levenshtein.partialRatio( it.plugin.second.name.lowercase(), query.lowercase() ) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index a97145c3f81..6a4a6941e5d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -17,7 +17,7 @@ desugar_jdk_libs_nio = "2.1.5" dokkaGradlePlugin = "2.2.0" espressoCore = "3.7.0" fragmentKtx = "1.8.9" -fuzzywuzzy = "1.4.0" +fuzzykot = "1.0.0" jacksonModuleKotlin = { strictly = "2.13.1" } # Later versions don't support minSdk <26 (Crashes on Android TV's and FireSticks) json = "20251224" jsoup = "1.22.1" @@ -74,7 +74,7 @@ desugar_jdk_libs_nio = { module = "com.android.tools:desugar_jdk_libs_nio", vers espresso-core = { module = "androidx.test.espresso:espresso-core", version.ref = "espressoCore" } ext-junit = { module = "androidx.test.ext:junit", version.ref = "junitVersion" } fragment-ktx = { module = "androidx.fragment:fragment-ktx", version.ref = "fragmentKtx" } -fuzzywuzzy = { module = "me.xdrop:fuzzywuzzy", version.ref = "fuzzywuzzy" } +fuzzykot = { module = "com.github.terrakok:fuzzykot", version.ref = "fuzzykot" } jackson-module-kotlin = { module = "com.fasterxml.jackson.module:jackson-module-kotlin", version.ref = "jacksonModuleKotlin" } json = { module = "org.json:json", version.ref = "json" } jsoup = { module = "org.jsoup:jsoup", version.ref = "jsoup" } diff --git a/library/build.gradle.kts b/library/build.gradle.kts index 073e49e6483..359fb85ab1c 100644 --- a/library/build.gradle.kts +++ b/library/build.gradle.kts @@ -57,7 +57,7 @@ kotlin { implementation(libs.nicehttp) // HTTP Lib implementation(libs.jackson.module.kotlin) // JSON Parser implementation(libs.kotlinx.coroutines.core) - implementation(libs.fuzzywuzzy) // Match Extractors + implementation(libs.fuzzykot) // Match Extractors implementation(libs.jsoup) // HTML Parser implementation(libs.rhino) // Run JavaScript implementation(libs.newpipeextractor) diff --git a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/ExtractorApi.kt b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/ExtractorApi.kt index ab80cf2cade..d407dfe8843 100644 --- a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/ExtractorApi.kt +++ b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/ExtractorApi.kt @@ -1,6 +1,7 @@ package com.lagradost.cloudstream3.utils import com.fasterxml.jackson.annotation.JsonIgnore +import com.github.terrakok.fuzzykot.Levenshtein import com.lagradost.cloudstream3.AudioFile import com.lagradost.cloudstream3.IDownloadableMinimum import com.lagradost.cloudstream3.SubtitleFile @@ -310,7 +311,6 @@ import com.lagradost.cloudstream3.mvvm.logError import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.delay import kotlinx.coroutines.ensureActive -import me.xdrop.fuzzywuzzy.FuzzySearch import org.jsoup.Jsoup import java.net.URI import java.util.UUID @@ -882,7 +882,7 @@ suspend fun loadExtractor( // this is to match mirror domains - like example.com, example.net for (index in extractorApis.lastIndex downTo 0) { val extractor = extractorApis[index] - if (FuzzySearch.partialRatio( + if (Levenshtein.partialRatio( extractor.mainUrl, currentUrl ) > 80 diff --git a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/SubtitleHelper.kt b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/SubtitleHelper.kt index 8d5479cc0ab..cd03411b7d5 100644 --- a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/SubtitleHelper.kt +++ b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/SubtitleHelper.kt @@ -1,6 +1,6 @@ package com.lagradost.cloudstream3.utils -import me.xdrop.fuzzywuzzy.FuzzySearch +import com.github.terrakok.fuzzykot.Levenshtein import java.util.Locale // If you find a way to use SettingsGeneral getCurrentLocale() @@ -112,8 +112,8 @@ object SubtitleHelper { for (lang in languages) { val score = maxOf( - FuzzySearch.ratio(lowLangName, lang.languageName.lowercase()), - FuzzySearch.ratio( + Levenshtein.ratio(lowLangName, lang.languageName.lowercase()), + Levenshtein.ratio( lowLangName, lang.nativeName.lowercase() ) )