Add convenience extension functions for rate limit interceptors

To be included in extension-lib 1.3 as a replacement for the lib that's currently compiled in tachiyomi-extensions.
This commit is contained in:
arkon 2021-11-28 14:41:46 -05:00
parent 3ea3b0bf2e
commit e8f284d377
3 changed files with 24 additions and 9 deletions

View file

@ -6,7 +6,7 @@ import eu.kanade.tachiyomi.data.database.models.Track
import eu.kanade.tachiyomi.data.track.model.TrackSearch import eu.kanade.tachiyomi.data.track.model.TrackSearch
import eu.kanade.tachiyomi.network.POST import eu.kanade.tachiyomi.network.POST
import eu.kanade.tachiyomi.network.await import eu.kanade.tachiyomi.network.await
import eu.kanade.tachiyomi.network.interceptor.RateLimitInterceptor import eu.kanade.tachiyomi.network.interceptor.rateLimit
import eu.kanade.tachiyomi.network.jsonMime import eu.kanade.tachiyomi.network.jsonMime
import eu.kanade.tachiyomi.network.parseAs import eu.kanade.tachiyomi.network.parseAs
import eu.kanade.tachiyomi.util.lang.withIOContext import eu.kanade.tachiyomi.util.lang.withIOContext
@ -25,13 +25,13 @@ import kotlinx.serialization.json.putJsonObject
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.RequestBody.Companion.toRequestBody import okhttp3.RequestBody.Companion.toRequestBody
import java.util.Calendar import java.util.Calendar
import java.util.concurrent.TimeUnit.MINUTES import java.util.concurrent.TimeUnit
class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) {
private val authClient = client.newBuilder() private val authClient = client.newBuilder()
.addInterceptor(interceptor) .addInterceptor(interceptor)
.addInterceptor(RateLimitInterceptor(85, 1, MINUTES)) .rateLimit(permits = 85, period = 1, unit = TimeUnit.MINUTES)
.build() .build()
suspend fun addLibManga(track: Track): Track { suspend fun addLibManga(track: Track): Track {

View file

@ -2,6 +2,7 @@ package eu.kanade.tachiyomi.network.interceptor
import android.os.SystemClock import android.os.SystemClock
import okhttp3.Interceptor import okhttp3.Interceptor
import okhttp3.OkHttpClient
import okhttp3.Response import okhttp3.Response
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
@ -17,10 +18,16 @@ import java.util.concurrent.TimeUnit
* @param period {Long} The limiting duration. Defaults to 1. * @param period {Long} The limiting duration. Defaults to 1.
* @param unit {TimeUnit} The unit of time for the period. Defaults to seconds. * @param unit {TimeUnit} The unit of time for the period. Defaults to seconds.
*/ */
class RateLimitInterceptor( fun OkHttpClient.Builder.rateLimit(
permits: Int,
period: Long = 1,
unit: TimeUnit = TimeUnit.SECONDS,
) = addInterceptor(RateLimitInterceptor(permits, period, unit))
private class RateLimitInterceptor(
private val permits: Int, private val permits: Int,
private val period: Long = 1, period: Long,
private val unit: TimeUnit = TimeUnit.SECONDS unit: TimeUnit,
) : Interceptor { ) : Interceptor {
private val requestQueue = ArrayList<Long>(permits) private val requestQueue = ArrayList<Long>(permits)

View file

@ -3,6 +3,7 @@ package eu.kanade.tachiyomi.network.interceptor
import android.os.SystemClock import android.os.SystemClock
import okhttp3.HttpUrl import okhttp3.HttpUrl
import okhttp3.Interceptor import okhttp3.Interceptor
import okhttp3.OkHttpClient
import okhttp3.Response import okhttp3.Response
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
@ -19,11 +20,18 @@ import java.util.concurrent.TimeUnit
* @param period {Long} The limiting duration. Defaults to 1. * @param period {Long} The limiting duration. Defaults to 1.
* @param unit {TimeUnit} The unit of time for the period. Defaults to seconds. * @param unit {TimeUnit} The unit of time for the period. Defaults to seconds.
*/ */
fun OkHttpClient.Builder.rateLimitHost(
httpUrl: HttpUrl,
permits: Int,
period: Long = 1,
unit: TimeUnit = TimeUnit.SECONDS,
) = addInterceptor(SpecificHostRateLimitInterceptor(httpUrl, permits, period, unit))
class SpecificHostRateLimitInterceptor( class SpecificHostRateLimitInterceptor(
private val httpUrl: HttpUrl, httpUrl: HttpUrl,
private val permits: Int, private val permits: Int,
private val period: Long = 1, period: Long,
private val unit: TimeUnit = TimeUnit.SECONDS unit: TimeUnit,
) : Interceptor { ) : Interceptor {
private val requestQueue = ArrayList<Long>(permits) private val requestQueue = ArrayList<Long>(permits)