From 066a6fa9ecd3200431147fad7598438ce2d79f17 Mon Sep 17 00:00:00 2001 From: ByAyzen <189399597+ByAyzen@users.noreply.github.com> Date: Thu, 24 Sep 2026 13:34:57 +0300 Subject: [PATCH] Feat: Search with preferredmedia --- .../ui/quicksearch/QuickSearchFragment.kt | 55 ++++++++++++++----- .../ui/result/ResultFragmentPhone.kt | 2 +- .../ui/result/ResultFragmentTv.kt | 2 +- .../ui/result/ResultViewModel2.kt | 2 + 4 files changed, 46 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/quicksearch/QuickSearchFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/quicksearch/QuickSearchFragment.kt index cf9bc9975c0..5dca119baee 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/quicksearch/QuickSearchFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/quicksearch/QuickSearchFragment.kt @@ -19,6 +19,7 @@ import com.lagradost.cloudstream3.APIHolder.getApiFromNameNull import com.lagradost.cloudstream3.CommonActivity.activity import com.lagradost.cloudstream3.HomePageList import com.lagradost.cloudstream3.R +import com.lagradost.cloudstream3.TvType import com.lagradost.cloudstream3.databinding.QuickSearchBinding import com.lagradost.cloudstream3.mvvm.Resource import com.lagradost.cloudstream3.mvvm.logError @@ -42,6 +43,7 @@ import com.lagradost.cloudstream3.utils.AppContextUtils.filterSearchResultByFilm import com.lagradost.cloudstream3.utils.AppContextUtils.isRecyclerScrollable import com.lagradost.cloudstream3.utils.AppContextUtils.ownShow import com.lagradost.cloudstream3.utils.Coroutines.ioSafe +import com.lagradost.cloudstream3.utils.DataStoreHelper import com.lagradost.cloudstream3.utils.UIHelper.fixSystemBarsPadding import com.lagradost.cloudstream3.utils.UIHelper.getSpanCount import com.lagradost.cloudstream3.utils.UIHelper.hideKeyboard @@ -55,23 +57,31 @@ class QuickSearchFragment : BaseFragment( companion object { const val AUTOSEARCH_KEY = "autosearch" const val PROVIDER_KEY = "providers" + const val TV_TYPE_KEY = "tv_type" + + private val ANIME_TYPES = setOf(TvType.Anime, TvType.AnimeMovie, TvType.OVA) fun pushSearch( autoSearch: String? = null, - providers: Array? = null + providers: Array? = null, + type: TvType? = null ) { - pushSearch(activity, autoSearch, providers) + pushSearch(activity, autoSearch, providers, type) } fun pushSearch( activity: Activity?, autoSearch: String? = null, - providers: Array? = null + providers: Array? = null, + type: TvType? = null ) { activity.navigate(R.id.global_to_navigation_quick_search, Bundle().apply { providers?.let { putStringArray(PROVIDER_KEY, it) } + type?.let { + putString(TV_TYPE_KEY, it.name) + } autoSearch?.let { putString( AUTOSEARCH_KEY, @@ -89,6 +99,7 @@ class QuickSearchFragment : BaseFragment( } private var providers: Set? = null + private var searchType: TvType? = null private lateinit var searchViewModel: SearchViewModel private var bottomSheetDialog: BottomSheetDialog? = null @@ -121,23 +132,41 @@ class QuickSearchFragment : BaseFragment( } fun search(context: Context?, query: String, isQuickSearch: Boolean): Boolean { - (providers ?: context?.filterProviderByPreferredMedia(hasHomePageIsRequired = false) - ?.map { it.name }?.toSet())?.let { active -> - searchViewModel.searchAndCancel( - query = query, - ignoreSettings = false, - providersActive = active, - isQuickSearch = isQuickSearch - ) - return true + val explicitProviders = providers + val active = explicitProviders ?: run { + val selected = DataStoreHelper.searchPreferenceProviders.toSet() + val preferredMediaApis = + context?.filterProviderByPreferredMedia(hasHomePageIsRequired = false).orEmpty() + val typeProviders = searchType?.let { type -> + preferredMediaApis.filter { api -> + val types = api.supportedTypes + types.contains(type) || + (type in ANIME_TYPES && types.any { it in ANIME_TYPES }) + }.map { it.name }.toSet() + }.orEmpty() + + (selected + typeProviders).ifEmpty { + preferredMediaApis.map { it.name }.toSet() + } } - return false + if (active.isEmpty()) return false + + searchViewModel.searchAndCancel( + query = query, + ignoreSettings = false, + providersActive = active, + isQuickSearch = isQuickSearch + ) + return true } override fun onBindingCreated(binding: QuickSearchBinding) { arguments?.getStringArray(PROVIDER_KEY)?.let { providers = it.toSet() } + arguments?.getString(TV_TYPE_KEY)?.let { name -> + searchType = runCatching { TvType.valueOf(name) }.getOrNull() + } val isSingleProvider = providers?.size == 1 val isSingleProviderQuickSearch = if (isSingleProvider) { diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragmentPhone.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragmentPhone.kt index 38b24b26517..44d55d5c04f 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragmentPhone.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragmentPhone.kt @@ -1016,7 +1016,7 @@ open class ResultFragmentPhone : BaseFragment( binding.apply { resultSearch.isGone = d.title.isBlank() resultSearch.setOnClickListener { - QuickSearchFragment.pushSearch(activity, d.title) + QuickSearchFragment.pushSearch(activity, d.title, type = d.type) } resultShare.setOnClickListener { diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragmentTv.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragmentTv.kt index c316fae1715..65f8ffb5652 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragmentTv.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragmentTv.kt @@ -941,7 +941,7 @@ class ResultFragmentTv : BaseFragment( } resultSearchButton.setOnClickListener { - QuickSearchFragment.pushSearch(activity, d.title) + QuickSearchFragment.pushSearch(activity, d.title, type = d.type) } } diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultViewModel2.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultViewModel2.kt index c519e0de230..395522ceb27 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultViewModel2.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultViewModel2.kt @@ -194,6 +194,7 @@ data class ResultData( val nextAiringEpisode: UiText?, val plotHeaderText: UiText, val posterHeaders: Map? = null, + val type: TvType? = null, ) data class CheckDuplicateData( @@ -278,6 +279,7 @@ fun LoadResponse.toResultData(repo: APIRepository): ResultData { } val dur = duration return ResultData( + type = type, syncData = syncData, plotHeaderText = txt( when (this.type) {