From a565319ecb60d3e1f8519619776337126ad92161 Mon Sep 17 00:00:00 2001 From: Blatzar <46196380+Blatzar@users.noreply.github.com> Date: Mon, 10 Oct 2022 23:57:50 +0200 Subject: [PATCH 1/2] Remove links to website in app & fix plugin deletion bug --- .../settings/extensions/ExtensionsFragment.kt | 41 ++++++++--------- .../settings/extensions/PluginsViewModel.kt | 44 ++++++++++++++----- .../ui/setup/SetupFragmentExtensions.kt | 24 +++++----- app/src/main/res/layout/add_repo_input.xml | 19 ++++---- .../main/res/layout/fragment_extensions.xml | 12 ++--- .../res/layout/fragment_setup_extensions.xml | 22 +++++----- app/src/main/res/values/strings.xml | 2 +- 7 files changed, 89 insertions(+), 75 deletions(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/ExtensionsFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/ExtensionsFragment.kt index 8480c94d..f674cafe 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/ExtensionsFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/ExtensionsFragment.kt @@ -16,7 +16,6 @@ import androidx.core.view.isVisible import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import androidx.navigation.fragment.findNavController -import com.lagradost.cloudstream3.AcraApplication.Companion.openBrowser import com.lagradost.cloudstream3.CommonActivity.showToast import com.lagradost.cloudstream3.MainActivity.Companion.afterRepositoryLoadedEvent import com.lagradost.cloudstream3.R @@ -25,7 +24,6 @@ import com.lagradost.cloudstream3.mvvm.observe import com.lagradost.cloudstream3.plugins.RepositoryManager import com.lagradost.cloudstream3.ui.result.setText import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTrueTvSettings -import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTvSettings import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setUpToolbar import com.lagradost.cloudstream3.utils.AppUtils.downloadAllPluginsDialog import com.lagradost.cloudstream3.utils.Coroutines.ioSafe @@ -34,7 +32,6 @@ import com.lagradost.cloudstream3.utils.UIHelper.dismissSafe import com.lagradost.cloudstream3.widget.LinearRecycleViewLayoutManager import kotlinx.android.synthetic.main.add_repo_input.* import kotlinx.android.synthetic.main.fragment_extensions.* -import kotlinx.android.synthetic.main.fragment_extensions.list_repositories const val PUBLIC_REPOSITORIES_LIST = "https://recloudstream.github.io/repos/" @@ -128,20 +125,20 @@ class ExtensionsFragment : Fragment() { } } - list_repositories?.setOnClickListener { - // Open webview on tv if browser fails - val isTv = isTvSettings() - openBrowser(PUBLIC_REPOSITORIES_LIST, isTv, this) - - // Set clipboard on TV because the browser might not exist or work properly - if (isTv) { - val serviceClipboard = - (activity?.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager?) - ?: return@setOnClickListener - val clip = ClipData.newPlainText("Repository url", PUBLIC_REPOSITORIES_LIST) - serviceClipboard.setPrimaryClip(clip) - } - } +// list_repositories?.setOnClickListener { +// // Open webview on tv if browser fails +// val isTv = isTvSettings() +// openBrowser(PUBLIC_REPOSITORIES_LIST, isTv, this) +// +// // Set clipboard on TV because the browser might not exist or work properly +// if (isTv) { +// val serviceClipboard = +// (activity?.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager?) +// ?: return@setOnClickListener +// val clip = ClipData.newPlainText("Repository url", PUBLIC_REPOSITORIES_LIST) +// serviceClipboard.setPrimaryClip(clip) +// } +// } observe(extensionViewModel.pluginStats) { when (it) { @@ -200,11 +197,11 @@ class ExtensionsFragment : Fragment() { } } - dialog.list_repositories?.setOnClickListener { - // Open webview on tv if browser fails - openBrowser(PUBLIC_REPOSITORIES_LIST, isTvSettings(), this) - dialog.dismissSafe() - } +// dialog.list_repositories?.setOnClickListener { +// // Open webview on tv if browser fails +// openBrowser(PUBLIC_REPOSITORIES_LIST, isTvSettings(), this) +// dialog.dismissSafe() +// } // dialog.text2?.text = provider.name dialog.apply_btt?.setOnClickListener secondListener@{ 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 6d94f91e..b0e253be 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 @@ -12,7 +12,6 @@ import com.lagradost.cloudstream3.CommonActivity.showToast import com.lagradost.cloudstream3.R import com.lagradost.cloudstream3.apmap import com.lagradost.cloudstream3.mvvm.launchSafe -import com.lagradost.cloudstream3.plugins.PluginData import com.lagradost.cloudstream3.plugins.PluginManager import com.lagradost.cloudstream3.plugins.PluginManager.getPluginPath import com.lagradost.cloudstream3.plugins.RepositoryManager @@ -21,8 +20,8 @@ import com.lagradost.cloudstream3.ui.result.txt import com.lagradost.cloudstream3.utils.Coroutines.ioSafe import com.lagradost.cloudstream3.utils.Coroutines.main import com.lagradost.cloudstream3.utils.Coroutines.runOnMainThread -import kotlinx.coroutines.launch import me.xdrop.fuzzywuzzy.FuzzySearch +import java.io.File typealias Plugin = Pair /** @@ -47,7 +46,11 @@ class PluginsViewModel : ViewModel() { private val repositoryCache: MutableMap> = mutableMapOf() const val TAG = "PLG" - private fun isDownloaded(context: Context, pluginName: String, repositoryUrl: String): Boolean { + private fun isDownloaded( + context: Context, + pluginName: String, + repositoryUrl: String + ): Boolean { return getPluginPath(context, pluginName, repositoryUrl).exists() } @@ -73,7 +76,13 @@ class PluginsViewModel : ViewModel() { if (activity == null) return@ioSafe val plugins = getPlugins(repositoryUrl) - plugins.filter { plugin -> !isDownloaded(activity, plugin.second.internalName, repositoryUrl) }.also { list -> + plugins.filter { plugin -> + !isDownloaded( + activity, + plugin.second.internalName, + repositoryUrl + ) + }.also { list -> main { showToast( activity, @@ -133,9 +142,13 @@ class PluginsViewModel : ViewModel() { if (activity == null) return@ioSafe val (repo, metadata) = plugin - val file = getPluginPath(activity, plugin.second.internalName, plugin.first) + val file = if (isLocal) File(plugin.second.url) else getPluginPath( + activity, + plugin.second.internalName, + plugin.first + ) - val (success, message) = if (file.exists() || isLocal) { + val (success, message) = if (file.exists()) { PluginManager.deletePlugin(file) to R.string.plugin_deleted } else { PluginManager.downloadAndLoadPlugin( @@ -167,7 +180,9 @@ class PluginsViewModel : ViewModel() { } this.plugins = list - _filteredPlugins.postValue(false to list.filterTvTypes().filterLang().sortByQuery(currentQuery)) + _filteredPlugins.postValue( + false to list.filterTvTypes().filterLang().sortByQuery(currentQuery) + ) } // Perhaps can be optimized? @@ -175,7 +190,8 @@ class PluginsViewModel : ViewModel() { if (tvTypes.isEmpty()) return this return this.filter { (it.plugin.second.tvTypes?.any { type -> tvTypes.contains(type) } == true) || - (tvTypes.contains("Others") && (it.plugin.second.tvTypes ?: emptyList()).isEmpty()) + (tvTypes.contains("Others") && (it.plugin.second.tvTypes + ?: emptyList()).isEmpty()) } } @@ -199,7 +215,9 @@ class PluginsViewModel : ViewModel() { } fun updateFilteredPlugins() { - _filteredPlugins.postValue(false to plugins.filterTvTypes().filterLang().sortByQuery(currentQuery)) + _filteredPlugins.postValue( + false to plugins.filterTvTypes().filterLang().sortByQuery(currentQuery) + ) } fun updatePluginList(context: Context?, repositoryUrl: String) = viewModelScope.launchSafe { @@ -210,7 +228,9 @@ class PluginsViewModel : ViewModel() { fun search(query: String?) { currentQuery = query - _filteredPlugins.postValue(true to (filteredPlugins.value?.second?.sortByQuery(query) ?: emptyList())) + _filteredPlugins.postValue( + true to (filteredPlugins.value?.second?.sortByQuery(query) ?: emptyList()) + ) } /** @@ -226,6 +246,8 @@ class PluginsViewModel : ViewModel() { } plugins = downloadedPlugins - _filteredPlugins.postValue(false to downloadedPlugins.filterTvTypes().filterLang().sortByQuery(currentQuery)) + _filteredPlugins.postValue( + false to downloadedPlugins.filterTvTypes().filterLang().sortByQuery(currentQuery) + ) } } \ No newline at end of file diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/setup/SetupFragmentExtensions.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/setup/SetupFragmentExtensions.kt index 43037038..7b7e5458 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/setup/SetupFragmentExtensions.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/setup/SetupFragmentExtensions.kt @@ -7,21 +7,16 @@ import android.view.ViewGroup import androidx.core.view.isVisible import androidx.fragment.app.Fragment import androidx.navigation.fragment.findNavController -import com.lagradost.cloudstream3.AcraApplication.Companion.openBrowser import com.lagradost.cloudstream3.MainActivity.Companion.afterRepositoryLoadedEvent import com.lagradost.cloudstream3.R import com.lagradost.cloudstream3.plugins.RepositoryManager import com.lagradost.cloudstream3.plugins.RepositoryManager.PREBUILT_REPOSITORIES -import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTvSettings -import com.lagradost.cloudstream3.ui.settings.extensions.PUBLIC_REPOSITORIES_LIST import com.lagradost.cloudstream3.ui.settings.extensions.PluginsViewModel import com.lagradost.cloudstream3.ui.settings.extensions.RepoAdapter import com.lagradost.cloudstream3.utils.Coroutines.main import com.lagradost.cloudstream3.utils.UIHelper.fixPaddingStatusbar import kotlinx.android.synthetic.main.fragment_extensions.blank_repo_screen -import kotlinx.android.synthetic.main.fragment_extensions.list_repositories import kotlinx.android.synthetic.main.fragment_extensions.repo_recycler_view -import kotlinx.android.synthetic.main.fragment_setup_extensions.* import kotlinx.android.synthetic.main.fragment_setup_media.next_btt import kotlinx.android.synthetic.main.fragment_setup_media.prev_btt import kotlinx.android.synthetic.main.fragment_setup_media.setup_root @@ -64,18 +59,19 @@ class SetupFragmentExtensions : Fragment() { val hasRepos = repositories.isNotEmpty() repo_recycler_view?.isVisible = hasRepos blank_repo_screen?.isVisible = !hasRepos - view_public_repositories_button?.isVisible = hasRepos +// view_public_repositories_button?.isVisible = hasRepos if (hasRepos) { repo_recycler_view?.adapter = RepoAdapter(true, {}, { PluginsViewModel.downloadAll(activity, it.url, null) }).apply { updateList(repositories) } - } else { - list_repositories?.setOnClickListener { - // Open webview on tv if browser fails - openBrowser(PUBLIC_REPOSITORIES_LIST, isTvSettings(), this) - } } +// else { +// list_repositories?.setOnClickListener { +// // Open webview on tv if browser fails +// openBrowser(PUBLIC_REPOSITORIES_LIST, isTvSettings(), this) +// } +// } } } @@ -84,9 +80,9 @@ class SetupFragmentExtensions : Fragment() { context?.fixPaddingStatusbar(setup_root) val isSetup = arguments?.getBoolean(SETUP_EXTENSION_BUNDLE_IS_SETUP) ?: false - view_public_repositories_button?.setOnClickListener { - openBrowser(PUBLIC_REPOSITORIES_LIST, isTvSettings(), this) - } +// view_public_repositories_button?.setOnClickListener { +// openBrowser(PUBLIC_REPOSITORIES_LIST, isTvSettings(), this) +// } with(context) { if (this == null) return diff --git a/app/src/main/res/layout/add_repo_input.xml b/app/src/main/res/layout/add_repo_input.xml index 445e71ec..6f6b4d5b 100644 --- a/app/src/main/res/layout/add_repo_input.xml +++ b/app/src/main/res/layout/add_repo_input.xml @@ -28,15 +28,15 @@ android:textSize="20sp" android:textStyle="bold" /> - + + + + + + + + + - + + + + + + - + + + + + - + + + + + + Disabled: %d Not downloaded: %d Updated %d plugins - Add a repository to install site extensions + CloudStream has no sites installed by default. You need to install the sites from repositories.\n\nBecause of a brainless DMCA takedown by Sky Uk Limited 🤮 we cannot link the repository sites in app.\n\nJoin our discord for links or search online. View community repositories Public list Uppercase all subtitles From 661f8c3c4e8b6ee72f40477d73bd8677db15174e Mon Sep 17 00:00:00 2001 From: reduplicated <110570621+reduplicated@users.noreply.github.com> Date: Tue, 11 Oct 2022 15:24:16 +0200 Subject: [PATCH 2/2] mini api fix --- .../com/lagradost/cloudstream3/MainAPI.kt | 39 +++++++++++++++---- .../cloudstream3/ui/APIRepository.kt | 14 +++++-- 2 files changed, 42 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/MainAPI.kt b/app/src/main/java/com/lagradost/cloudstream3/MainAPI.kt index a06dd95e..e5896434 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/MainAPI.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/MainAPI.kt @@ -22,7 +22,6 @@ import okhttp3.Interceptor import java.text.SimpleDateFormat import java.util.* import kotlin.math.absoluteValue -import kotlin.collections.MutableList const val USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36" @@ -332,13 +331,24 @@ data class SettingsJson( data class MainPageData( val name: String, val data: String, + val horizontalImages: Boolean = false ) data class MainPageRequest( val name: String, val data: String, + val horizontalImages: Boolean, + //TODO genre selection or smth ) +fun mainPage(url: String, name: String, horizontalImages: Boolean = false): MainPageData { + return MainPageData(name = name, data = url, horizontalImages = horizontalImages) +} + +fun mainPageOf(vararg elements: MainPageData): List { + return elements.toList() +} + /** return list of MainPageData with url to name, make for more readable code */ fun mainPageOf(vararg elements: Pair): List { return elements.map { (url, name) -> MainPageData(name = name, data = url) } @@ -347,7 +357,7 @@ fun mainPageOf(vararg elements: Pair): List { fun newHomePageResponse( name: String, list: List, - hasNext: Boolean? = null + hasNext: Boolean? = null, ): HomePageResponse { return HomePageResponse( listOf(HomePageList(name, list)), @@ -355,6 +365,17 @@ fun newHomePageResponse( ) } +fun newHomePageResponse( + data: MainPageRequest, + list: List, + hasNext: Boolean? = null, +): HomePageResponse { + return HomePageResponse( + listOf(HomePageList(data.name, list, data.horizontalImages)), + hasNext = hasNext ?: list.isNotEmpty() + ) +} + fun newHomePageResponse(list: HomePageList, hasNext: Boolean? = null): HomePageResponse { return HomePageResponse(listOf(list), hasNext = hasNext ?: list.list.isNotEmpty()) } @@ -391,14 +412,17 @@ abstract class MainAPI { /** if this is turned on then it will request the homepage one after the other, used to delay if they block many request at the same time*/ - open var sequentialMainPage : Boolean = false + open var sequentialMainPage: Boolean = false + /** in milliseconds, this can be used to add more delay between homepage requests * on first load if sequentialMainPage is turned on */ - open var sequentialMainPageDelay : Long = 0L + open var sequentialMainPageDelay: Long = 0L + /** in milliseconds, this can be used to add more delay between homepage requests when scrolling */ - open var sequentialMainPageScrollDelay : Long = 0L + open var sequentialMainPageScrollDelay: Long = 0L + /** used to keep track when last homepage request was in unixtime ms */ - var lastHomepageRequest : Long = 0L + var lastHomepageRequest: Long = 0L open var lang = "en" // ISO_639_1 check SubtitleHelper @@ -431,7 +455,8 @@ abstract class MainAPI { open val vpnStatus = VPNStatus.None open val providerType = ProviderType.DirectProvider - open val mainPage = listOf(MainPageData("", "")) + //emptyList() // + open val mainPage = listOf(MainPageData("", "", false)) @WorkerThread open suspend fun getMainPage( diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/APIRepository.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/APIRepository.kt index b43b1434..0e5e544b 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/APIRepository.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/APIRepository.kt @@ -66,7 +66,7 @@ class APIRepository(val api: MainAPI) { suspend fun waitForHomeDelay() { val delta = api.sequentialMainPageScrollDelay + api.lastHomepageRequest - unixTimeMS - if(delta < 0) return + if (delta < 0) return delay(delta) } @@ -75,7 +75,7 @@ class APIRepository(val api: MainAPI) { api.lastHomepageRequest = unixTimeMS nameIndex?.let { api.mainPage.getOrNull(it) }?.let { data -> - listOf(api.getMainPage(page, MainPageRequest(data.name, data.data))) + listOf(api.getMainPage(page, MainPageRequest(data.name, data.data, data.horizontalImages))) } ?: run { if (api.sequentialMainPage) { var first = true @@ -84,11 +84,17 @@ class APIRepository(val api: MainAPI) { delay(api.sequentialMainPageDelay) first = false - api.getMainPage(page, MainPageRequest(data.name, data.data)) + api.getMainPage( + page, + MainPageRequest(data.name, data.data, data.horizontalImages) + ) } } else { api.mainPage.apmap { data -> - api.getMainPage(page, MainPageRequest(data.name, data.data)) + api.getMainPage( + page, + MainPageRequest(data.name, data.data, data.horizontalImages) + ) } } }