From dce6f06368f536793b444cb10617acf54cf89859 Mon Sep 17 00:00:00 2001 From: Jace <54625750+Jacekun@users.noreply.github.com> Date: Mon, 15 Aug 2022 15:22:46 +0800 Subject: [PATCH] [Feature] Filter search results by film quality --- .../com/lagradost/cloudstream3/MainAPI.kt | 54 +++++++++++++------ .../ui/quicksearch/QuickSearchFragment.kt | 3 +- .../cloudstream3/ui/search/SearchFragment.kt | 5 +- .../cloudstream3/ui/settings/SettingsUI.kt | 21 ++++++++ app/src/main/res/values/strings.xml | 2 + app/src/main/res/xml/settins_ui.xml | 4 ++ 6 files changed, 70 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/MainAPI.kt b/app/src/main/java/com/lagradost/cloudstream3/MainAPI.kt index bcc71f3c..408e7c63 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/MainAPI.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/MainAPI.kt @@ -253,6 +253,26 @@ object APIHolder { allApis.filter { api -> api.supportedTypes.any { it in mediaTypeList } } } } + + fun Context.filterSearchResultByFilmQuality(data: List): List { + // Filter results omitting entries with certain quality + if (data.isEmpty()) { + return data + } + val filteredSearchQuality = PreferenceManager.getDefaultSharedPreferences(this) + ?.getStringSet(getString(R.string.pref_filter_search_quality_key), setOf()) + ?.mapNotNull { entry -> + entry.toIntOrNull() ?: return@mapNotNull null + } ?: listOf() + if (filteredSearchQuality.isNotEmpty()) { + return data.filter { item -> + val searchQualVal = item.quality?.ordinal ?: -1 + //Log.i("filterSearch", "QuickSearch item => ${item.toJson()}") + !filteredSearchQuality.contains(searchQualVal) + } + } + return data + } } @@ -586,24 +606,24 @@ data class HomePageList( val isHorizontalImages: Boolean = false ) -enum class SearchQuality { +enum class SearchQuality(value: Int?) { //https://en.wikipedia.org/wiki/Pirated_movie_release_types - Cam, - CamRip, - HdCam, - Telesync, // TS - WorkPrint, - Telecine, // TC - HQ, - HD, - HDR, // high dynamic range - BlueRay, - DVD, - SD, - FourK, - UHD, - SDR, // standard dynamic range - WebRip + Cam(1), + CamRip(2), + HdCam(3), + Telesync(4), // TS + WorkPrint(5), + Telecine(6), // TC + HQ(7), + HD(8), + HDR(9), // high dynamic range + BlueRay(10), + DVD(11), + SD(12), + FourK(13), + UHD(14), + SDR(15), // standard dynamic range + WebRip(16) } /**Add anything to here if you find a site that uses some specific naming convention*/ 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 df53f209..62f967d2 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 @@ -16,6 +16,7 @@ import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.GridLayoutManager import com.lagradost.cloudstream3.APIHolder.filterProviderByPreferredMedia +import com.lagradost.cloudstream3.APIHolder.filterSearchResultByFilmQuality import com.lagradost.cloudstream3.APIHolder.getApiFromNameNull import com.lagradost.cloudstream3.HomePageList import com.lagradost.cloudstream3.R @@ -214,7 +215,7 @@ class QuickSearchFragment : Fragment() { is Resource.Success -> { it.value.let { data -> (quick_search_autofit_results?.adapter as? SearchAdapter?)?.updateList( - data + context?.filterSearchResultByFilmQuality(data) ?: data ) } searchExitIcon?.alpha = 1f diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/search/SearchFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/search/SearchFragment.kt index 0786c1fa..041d1a7e 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/search/SearchFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/search/SearchFragment.kt @@ -21,6 +21,7 @@ import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.android.material.button.MaterialButton import com.lagradost.cloudstream3.* import com.lagradost.cloudstream3.APIHolder.filterProviderByPreferredMedia +import com.lagradost.cloudstream3.APIHolder.filterSearchResultByFilmQuality import com.lagradost.cloudstream3.APIHolder.getApiFromName import com.lagradost.cloudstream3.APIHolder.getApiProviderLangSettings import com.lagradost.cloudstream3.APIHolder.getApiSettings @@ -429,9 +430,11 @@ class SearchFragment : Fragment() { listLock.lock() (search_master_recycler?.adapter as ParentItemAdapter?)?.apply { val newItems = list.map { ongoing -> + val dataList = if (ongoing.data is Resource.Success) ongoing.data.value else ArrayList() + val dataListFiltered = context?.filterSearchResultByFilmQuality(dataList) ?: dataList val ongoingList = HomePageList( ongoing.apiName, - if (ongoing.data is Resource.Success) ongoing.data.value else ArrayList() + dataListFiltered ) ongoingList } diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsUI.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsUI.kt index 64ae2f8e..0dd1dec9 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsUI.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsUI.kt @@ -5,6 +5,7 @@ import android.view.View import androidx.preference.PreferenceFragmentCompat import androidx.preference.PreferenceManager import com.lagradost.cloudstream3.R +import com.lagradost.cloudstream3.SearchQuality import com.lagradost.cloudstream3.mvvm.logError import com.lagradost.cloudstream3.ui.search.SearchResultBuilder import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.getPref @@ -125,5 +126,25 @@ class SettingsUI : PreferenceFragmentCompat() { return@setOnPreferenceClickListener true } + getPref(R.string.pref_filter_search_quality_key)?.setOnPreferenceClickListener { + val names = enumValues().sorted().map { it.name } + val currentList = settingsManager.getStringSet(getString(R.string.pref_filter_search_quality_key), setOf())?.map { + it.toInt() + } ?: listOf() + + activity?.showMultiDialog( + names, + currentList, + getString(R.string.pref_filter_search_quality), + {}) { selectedList -> + settingsManager.edit().putStringSet( + this.getString(R.string.pref_filter_search_quality_key), + selectedList.map { it.toString() }.toMutableSet() + ).apply() + } + + return@setOnPreferenceClickListener true + } + } } \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8e5eadf0..36303c1f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -54,6 +54,7 @@ override_site_key redo_setup_key filter_sub_lang_key + pref_filter_search_quality_key %d %s | %sMB @@ -261,6 +262,7 @@ Show filler episode for anime Show trailers Show posters from kitsu + Hide selected video quality on Search results Automatic plugin updates Show app updates diff --git a/app/src/main/res/xml/settins_ui.xml b/app/src/main/res/xml/settins_ui.xml index f670bc42..071df918 100644 --- a/app/src/main/res/xml/settins_ui.xml +++ b/app/src/main/res/xml/settins_ui.xml @@ -50,4 +50,8 @@ android:title="@string/random_button_settings" android:summary="@string/random_button_settings_desc" app:defaultValue="false" /> + \ No newline at end of file