diff --git a/src/all/kamyroll/build.gradle b/src/all/kamyroll/build.gradle index da4db5b87..0c25e0e82 100644 --- a/src/all/kamyroll/build.gradle +++ b/src/all/kamyroll/build.gradle @@ -6,7 +6,7 @@ ext { extName = 'Consumyroll' pkgNameSuffix = 'all.kamyroll' extClass = '.Consumyroll' - extVersionCode = 14 + extVersionCode = 15 libVersion = '13' } diff --git a/src/all/kamyroll/src/eu/kanade/tachiyomi/animeextension/all/kamyroll/AccessTokenInterceptor.kt b/src/all/kamyroll/src/eu/kanade/tachiyomi/animeextension/all/kamyroll/AccessTokenInterceptor.kt index 7f25a7f9b..ec2233f17 100644 --- a/src/all/kamyroll/src/eu/kanade/tachiyomi/animeextension/all/kamyroll/AccessTokenInterceptor.kt +++ b/src/all/kamyroll/src/eu/kanade/tachiyomi/animeextension/all/kamyroll/AccessTokenInterceptor.kt @@ -12,23 +12,17 @@ import okhttp3.Response import java.net.HttpURLConnection class AccessTokenInterceptor( + private val baseUrl: String, private val json: Json, private val preferences: SharedPreferences ) : Interceptor { - private var accessToken = preferences.getString("access_token", null).let { - if (it.isNullOrBlank()) { - null - } else { - json.decodeFromString(it) - } - } + private var accessToken = preferences.getString(TOKEN_PREF_KEY, null) ?: "" override fun intercept(chain: Interceptor.Chain): Response { - if (accessToken == null) accessToken = refreshAccessToken() + if (accessToken.isBlank()) accessToken = refreshAccessToken() - val request = chain.request().newBuilder() - .header("authorization", "${accessToken!!.token_type} ${accessToken!!.access_token}") - .build() + val parsed = json.decodeFromString(accessToken) + val request = newRequestWithAccessToken(chain.request(), "${parsed.token_type} ${parsed.access_token}") val response = chain.proceed(request) @@ -36,21 +30,12 @@ class AccessTokenInterceptor( HttpURLConnection.HTTP_UNAUTHORIZED -> { synchronized(this) { response.close() - val newAccessToken = refreshAccessToken() // Access token is refreshed in another thread. - if (accessToken != newAccessToken) { - accessToken = newAccessToken - return chain.proceed( - newRequestWithAccessToken(chain.request(), "${accessToken!!.token_type} ${accessToken!!.access_token}") - ) - } - - // Need to refresh an access token - val updatedAccessToken = refreshAccessToken() - accessToken = updatedAccessToken + accessToken = refreshAccessToken() + val newParsed = json.decodeFromString(accessToken) // Retry the request return chain.proceed( - newRequestWithAccessToken(chain.request(), "${accessToken!!.token_type} ${accessToken!!.access_token}") + newRequestWithAccessToken(chain.request(), "${newParsed.token_type} ${newParsed.access_token}") ) } } @@ -64,15 +49,19 @@ class AccessTokenInterceptor( .build() } - private fun refreshAccessToken(): AccessToken { + fun refreshAccessToken(): String { val client = OkHttpClient().newBuilder().build() - val response = client.newCall(GET("https://cronchy.consumet.stream/token")).execute() - val parsedJson = json.decodeFromString(response.body!!.string()) - preferences.edit().putString("access_token", parsedJson.toJsonString()).apply() + val response = client.newCall(GET("$baseUrl/token")).execute() + val parsedJson = json.decodeFromString(response.body!!.string()).toJsonString() + preferences.edit().putString(TOKEN_PREF_KEY, parsedJson).apply() return parsedJson } private fun AccessToken.toJsonString(): String { return json.encodeToString(this) } + + companion object { + val TOKEN_PREF_KEY = "access_token_data" + } } diff --git a/src/all/kamyroll/src/eu/kanade/tachiyomi/animeextension/all/kamyroll/Consumyroll.kt b/src/all/kamyroll/src/eu/kanade/tachiyomi/animeextension/all/kamyroll/Consumyroll.kt index a3c96a710..84ce0a04f 100644 --- a/src/all/kamyroll/src/eu/kanade/tachiyomi/animeextension/all/kamyroll/Consumyroll.kt +++ b/src/all/kamyroll/src/eu/kanade/tachiyomi/animeextension/all/kamyroll/Consumyroll.kt @@ -54,8 +54,10 @@ class Consumyroll : ConfigurableAnimeSource, AnimeHttpSource() { Injekt.get().getSharedPreferences("source_$id", 0x0000) } + private val TokenInterceptor = AccessTokenInterceptor(baseUrl, json, preferences) + override val client: OkHttpClient = OkHttpClient().newBuilder() - .addInterceptor(AccessTokenInterceptor(json, preferences)).build() + .addInterceptor(TokenInterceptor).build() companion object { private val DateFormatter by lazy { @@ -163,18 +165,17 @@ class Consumyroll : ConfigurableAnimeSource, AnimeHttpSource() { override fun fetchVideoList(episode: SEpisode): Observable> { val urlJson = json.decodeFromString(episode.url) - val policyJson = preferences.getString("access_token", null)!!.let { - json.decodeFromString(it) - } - val videoList = urlJson.ids.chunked(5).map { - it.parallelMap { media -> - runCatching { - extractVideo(media, policyJson) - }.getOrNull() - } - .filterNotNull() - .flatten() - }.flatten() + val dubLocale = preferences.getString("preferred_audio", "en-US")!! + val tokenJson = preferences.getString(AccessTokenInterceptor.TOKEN_PREF_KEY, null) + ?: TokenInterceptor.refreshAccessToken() + val policyJson = json.decodeFromString(tokenJson) + val videoList = urlJson.ids.filter { + it.second == dubLocale || it.second == "ja-JP" || it.second == "en-US" + }.parallelMap { media -> + runCatching { + extractVideo(media, policyJson) + }.getOrNull() + }.filterNotNull().flatten() return Observable.just(videoList.sort()) }