diff --git a/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/JSClient.kt b/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/JSClient.kt index eff3e0f1534ed2da2a72a0d9e6bab98b024d106a..2411ce72cdb3ea8df8f41c0159d3284fc98c524e 100644 --- a/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/JSClient.kt +++ b/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/JSClient.kt @@ -92,6 +92,19 @@ open class JSClient : IPlatformClient { val enableInSearch get() = descriptor.appSettings.tabEnabled.enableSearch ?: true val enableInHome get() = descriptor.appSettings.tabEnabled.enableHome ?: true + fun getSubscriptionRateLimit(): Int? { + val pluginRateLimit = config.subscriptionRateLimit; + val settingsRateLimit = descriptor.appSettings.rateLimit.getSubRateLimit(); + if(settingsRateLimit > 0) { + if(pluginRateLimit != null) + return settingsRateLimit.coerceAtMost(pluginRateLimit); + else + return settingsRateLimit; + } + else + return pluginRateLimit; + } + val onDisabled = Event1<JSClient>(); val onCaptchaException = Event2<JSClient, ScriptCaptchaRequiredException>(); diff --git a/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/SourcePluginDescriptor.kt b/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/SourcePluginDescriptor.kt index 5595ae3e314cbc93a3026d47c8ad81652fa045b9..8bcb51b348ca4742521a726b74f03f4559327950 100644 --- a/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/SourcePluginDescriptor.kt +++ b/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/SourcePluginDescriptor.kt @@ -3,6 +3,7 @@ package com.futo.platformplayer.api.media.platforms.js import com.futo.platformplayer.R import com.futo.platformplayer.constructs.Event0 import com.futo.platformplayer.serializers.FlexibleBooleanSerializer +import com.futo.platformplayer.views.fields.DropdownFieldOptions import com.futo.platformplayer.views.fields.FieldForm import com.futo.platformplayer.views.fields.FormField import kotlinx.serialization.Serializable @@ -79,6 +80,29 @@ class SourcePluginDescriptor { var enableSearch: Boolean? = null; } + @FormField(R.string.ratelimit, "group", R.string.ratelimit_description, 3) + var rateLimit = RateLimit(); + @Serializable + class RateLimit { + @FormField(R.string.subscriptions, FieldForm.DROPDOWN, R.string.ratelimit_sub_setting_description, 1) + @DropdownFieldOptions("Plugin defined", "25", "50", "75", "100", "125", "150", "200") + var rateLimitSubs: Int = 0; + + fun getSubRateLimit(): Int { + return when(rateLimitSubs) { + 0 -> -1 + 1 -> 25 + 2 -> 50 + 3 -> 75 + 4 -> 100 + 5 -> 125 + 6 -> 150 + 7 -> 200 + else -> -1 + } + } + + } fun loadDefaults(config: SourcePluginConfig) { diff --git a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/SubscriptionsFeedFragment.kt b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/SubscriptionsFeedFragment.kt index 3030c5fc0bdf8c73df88e79c90c83b49ab336911..b391ad241141d2d4471bc415abff8c7a670aee3d 100644 --- a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/SubscriptionsFeedFragment.kt +++ b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/SubscriptionsFeedFragment.kt @@ -176,8 +176,8 @@ class SubscriptionsFeedFragment : MainFragment() { private val _taskGetPager = TaskHandler<Boolean, IPager<IPlatformContent>>({StateApp.instance.scope}, { withRefresh -> if(!_bypassRateLimit) { val subRequestCounts = StateSubscriptions.instance.getSubscriptionRequestCount(); - val reqCountStr = subRequestCounts.map { " ${it.key.config.name}: ${it.value}/${it.key.config.subscriptionRateLimit}" }.joinToString("\n"); - val rateLimitPlugins = subRequestCounts.filter { clientCount -> clientCount.key.config.subscriptionRateLimit?.let { rateLimit -> clientCount.value > rateLimit } == true } + val reqCountStr = subRequestCounts.map { " ${it.key.config.name}: ${it.value}/${it.key.getSubscriptionRateLimit()}" }.joinToString("\n"); + val rateLimitPlugins = subRequestCounts.filter { clientCount -> clientCount.key.getSubscriptionRateLimit()?.let { rateLimit -> clientCount.value > rateLimit } == true } Logger.w(TAG, "Refreshing subscriptions with requests:\n" + reqCountStr); if(rateLimitPlugins.any()) throw RateLimitException(rateLimitPlugins.map { it.key.id }); diff --git a/app/src/main/java/com/futo/platformplayer/states/StateApp.kt b/app/src/main/java/com/futo/platformplayer/states/StateApp.kt index 6af44d7ded8817b0e41ea946b75ae0bd73184056..646460055d20b6cb54da02d73d83032e32006ceb 100644 --- a/app/src/main/java/com/futo/platformplayer/states/StateApp.kt +++ b/app/src/main/java/com/futo/platformplayer/states/StateApp.kt @@ -452,8 +452,8 @@ class StateApp { if(Settings.instance.subscriptions.fetchOnAppBoot) { scope.launch(Dispatchers.IO) { val subRequestCounts = StateSubscriptions.instance.getSubscriptionRequestCount(); - val reqCountStr = subRequestCounts.map { " ${it.key.config.name}: ${it.value}/${it.key.config.subscriptionRateLimit}" }.joinToString("\n"); - val isRateLimitReached = !subRequestCounts.any { clientCount -> clientCount.key.config.subscriptionRateLimit?.let { rateLimit -> clientCount.value > rateLimit } == true }; + val reqCountStr = subRequestCounts.map { " ${it.key.config.name}: ${it.value}/${it.key.getSubscriptionRateLimit()}" }.joinToString("\n"); + val isRateLimitReached = !subRequestCounts.any { clientCount -> clientCount.key.getSubscriptionRateLimit()?.let { rateLimit -> clientCount.value > rateLimit } == true }; if (isRateLimitReached) { Logger.w(TAG, "Subscriptions request on boot, request counts:\n${reqCountStr}"); delay(5000); diff --git a/app/src/main/java/com/futo/platformplayer/subscription/SmartSubscriptionAlgorithm.kt b/app/src/main/java/com/futo/platformplayer/subscription/SmartSubscriptionAlgorithm.kt index 0cbbb2becaf467df189b660ed6000a9733c3886c..5df4f381ed27e2896820df4436af94bfb8473c0d 100644 --- a/app/src/main/java/com/futo/platformplayer/subscription/SmartSubscriptionAlgorithm.kt +++ b/app/src/main/java/com/futo/platformplayer/subscription/SmartSubscriptionAlgorithm.kt @@ -59,7 +59,7 @@ class SmartSubscriptionAlgorithm( for(clientTasks in ordering) { - val limit = clientTasks.first.config.subscriptionRateLimit; + val limit = clientTasks.first.getSubscriptionRateLimit(); if(limit == null || limit <= 0) finalTasks.addAll(clientTasks.second); else { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2859f2ec8dcdad0df494693955b44a2213bb7779..2ea180bd7ba2b9cb25351efa90d6a5981b572834 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -396,6 +396,10 @@ <string name="various_tests_against_a_custom_source">Various tests against a custom source</string> <string name="writes_to_disk_till_no_space_is_left">Writes to disk till no space is left</string> <string name="visibility">Visibility</string> + <string name="ratelimit">Rate-limit</string> + <string name="ratelimit_description">Settings related to rate-limiting this plugin\'s behavior</string> + <string name="ratelimit_sub_setting">Rate-limit Subscriptions</string> + <string name="ratelimit_sub_setting_description">Limit the amount of subscription requests made</string> <string name="enable_where_this_plugins_content_are_visible">Enable where this plugin\'s content are visible</string> <string name="show_content_in_home_tab">Show content in home tab</string> <string name="show_content_in_search_results">Show content in search results</string>