mirror of
https://gitlab.futo.org/videostreaming/grayjay.git
synced 2025-08-06 08:10:17 +00:00
Per-plugin ratelimit setting
This commit is contained in:
parent
2fa9005806
commit
16a0351125
6 changed files with 46 additions and 5 deletions
|
@ -92,6 +92,19 @@ open class JSClient : IPlatformClient {
|
||||||
val enableInSearch get() = descriptor.appSettings.tabEnabled.enableSearch ?: true
|
val enableInSearch get() = descriptor.appSettings.tabEnabled.enableSearch ?: true
|
||||||
val enableInHome get() = descriptor.appSettings.tabEnabled.enableHome ?: 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 onDisabled = Event1<JSClient>();
|
||||||
val onCaptchaException = Event2<JSClient, ScriptCaptchaRequiredException>();
|
val onCaptchaException = Event2<JSClient, ScriptCaptchaRequiredException>();
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@ package com.futo.platformplayer.api.media.platforms.js
|
||||||
import com.futo.platformplayer.R
|
import com.futo.platformplayer.R
|
||||||
import com.futo.platformplayer.constructs.Event0
|
import com.futo.platformplayer.constructs.Event0
|
||||||
import com.futo.platformplayer.serializers.FlexibleBooleanSerializer
|
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.FieldForm
|
||||||
import com.futo.platformplayer.views.fields.FormField
|
import com.futo.platformplayer.views.fields.FormField
|
||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
|
@ -79,6 +80,29 @@ class SourcePluginDescriptor {
|
||||||
var enableSearch: Boolean? = null;
|
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) {
|
fun loadDefaults(config: SourcePluginConfig) {
|
||||||
|
|
|
@ -176,8 +176,8 @@ class SubscriptionsFeedFragment : MainFragment() {
|
||||||
private val _taskGetPager = TaskHandler<Boolean, IPager<IPlatformContent>>({StateApp.instance.scope}, { withRefresh ->
|
private val _taskGetPager = TaskHandler<Boolean, IPager<IPlatformContent>>({StateApp.instance.scope}, { withRefresh ->
|
||||||
if(!_bypassRateLimit) {
|
if(!_bypassRateLimit) {
|
||||||
val subRequestCounts = StateSubscriptions.instance.getSubscriptionRequestCount();
|
val subRequestCounts = StateSubscriptions.instance.getSubscriptionRequestCount();
|
||||||
val reqCountStr = subRequestCounts.map { " ${it.key.config.name}: ${it.value}/${it.key.config.subscriptionRateLimit}" }.joinToString("\n");
|
val reqCountStr = subRequestCounts.map { " ${it.key.config.name}: ${it.value}/${it.key.getSubscriptionRateLimit()}" }.joinToString("\n");
|
||||||
val rateLimitPlugins = subRequestCounts.filter { clientCount -> clientCount.key.config.subscriptionRateLimit?.let { rateLimit -> clientCount.value > rateLimit } == true }
|
val rateLimitPlugins = subRequestCounts.filter { clientCount -> clientCount.key.getSubscriptionRateLimit()?.let { rateLimit -> clientCount.value > rateLimit } == true }
|
||||||
Logger.w(TAG, "Refreshing subscriptions with requests:\n" + reqCountStr);
|
Logger.w(TAG, "Refreshing subscriptions with requests:\n" + reqCountStr);
|
||||||
if(rateLimitPlugins.any())
|
if(rateLimitPlugins.any())
|
||||||
throw RateLimitException(rateLimitPlugins.map { it.key.id });
|
throw RateLimitException(rateLimitPlugins.map { it.key.id });
|
||||||
|
|
|
@ -452,8 +452,8 @@ class StateApp {
|
||||||
if(Settings.instance.subscriptions.fetchOnAppBoot) {
|
if(Settings.instance.subscriptions.fetchOnAppBoot) {
|
||||||
scope.launch(Dispatchers.IO) {
|
scope.launch(Dispatchers.IO) {
|
||||||
val subRequestCounts = StateSubscriptions.instance.getSubscriptionRequestCount();
|
val subRequestCounts = StateSubscriptions.instance.getSubscriptionRequestCount();
|
||||||
val reqCountStr = subRequestCounts.map { " ${it.key.config.name}: ${it.value}/${it.key.config.subscriptionRateLimit}" }.joinToString("\n");
|
val reqCountStr = subRequestCounts.map { " ${it.key.config.name}: ${it.value}/${it.key.getSubscriptionRateLimit()}" }.joinToString("\n");
|
||||||
val isRateLimitReached = !subRequestCounts.any { clientCount -> clientCount.key.config.subscriptionRateLimit?.let { rateLimit -> clientCount.value > rateLimit } == true };
|
val isRateLimitReached = !subRequestCounts.any { clientCount -> clientCount.key.getSubscriptionRateLimit()?.let { rateLimit -> clientCount.value > rateLimit } == true };
|
||||||
if (isRateLimitReached) {
|
if (isRateLimitReached) {
|
||||||
Logger.w(TAG, "Subscriptions request on boot, request counts:\n${reqCountStr}");
|
Logger.w(TAG, "Subscriptions request on boot, request counts:\n${reqCountStr}");
|
||||||
delay(5000);
|
delay(5000);
|
||||||
|
|
|
@ -59,7 +59,7 @@ class SmartSubscriptionAlgorithm(
|
||||||
|
|
||||||
|
|
||||||
for(clientTasks in ordering) {
|
for(clientTasks in ordering) {
|
||||||
val limit = clientTasks.first.config.subscriptionRateLimit;
|
val limit = clientTasks.first.getSubscriptionRateLimit();
|
||||||
if(limit == null || limit <= 0)
|
if(limit == null || limit <= 0)
|
||||||
finalTasks.addAll(clientTasks.second);
|
finalTasks.addAll(clientTasks.second);
|
||||||
else {
|
else {
|
||||||
|
|
|
@ -396,6 +396,10 @@
|
||||||
<string name="various_tests_against_a_custom_source">Various tests against a custom source</string>
|
<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="writes_to_disk_till_no_space_is_left">Writes to disk till no space is left</string>
|
||||||
<string name="visibility">Visibility</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="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_home_tab">Show content in home tab</string>
|
||||||
<string name="show_content_in_search_results">Show content in search results</string>
|
<string name="show_content_in_search_results">Show content in search results</string>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue