OkHttp Call: split await() and awaitSuccess() (#8980)

(cherry picked from commit 448702e5beedcd0918c504da34a0feda20ee2817)
This commit is contained in:
stevenyomi
2023-01-25 11:34:31 +08:00
committed by Jobobby04
parent 1948545983
commit a0497d079d
30 changed files with 158 additions and 184 deletions
@@ -1,7 +1,7 @@
package exh.md.handlers
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.network.await
import eu.kanade.tachiyomi.network.awaitSuccess
import eu.kanade.tachiyomi.source.model.Page
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.jsonArray
@@ -24,7 +24,7 @@ class AzukiHandler(currentClient: OkHttpClient, userAgent: String) {
suspend fun fetchPageList(externalUrl: String): List<Page> {
val chapterId = externalUrl.substringAfterLast("/").substringBefore("?")
val request = pageListRequest(chapterId)
return pageListParse(client.newCall(request).await())
return pageListParse(client.newCall(request).awaitSuccess())
}
private fun pageListRequest(chapterId: String): Request {
@@ -2,7 +2,7 @@ package exh.md.handlers
import eu.kanade.tachiyomi.network.POST
import eu.kanade.tachiyomi.network.asObservableSuccess
import eu.kanade.tachiyomi.network.await
import eu.kanade.tachiyomi.network.awaitSuccess
import eu.kanade.tachiyomi.network.interceptor.rateLimit
import eu.kanade.tachiyomi.network.parseAs
import eu.kanade.tachiyomi.source.model.Page
@@ -92,7 +92,7 @@ class BilibiliHandler(currentClient: OkHttpClient) {
}
suspend fun getChapterList(mangaUrl: String): List<SChapter> {
val response = client.newCall(mangaDetailsApiRequest(mangaUrl)).await()
val response = client.newCall(mangaDetailsApiRequest(mangaUrl)).awaitSuccess()
return chapterListParse(response)
}
@@ -115,7 +115,7 @@ class BilibiliHandler(currentClient: OkHttpClient) {
)
private suspend fun fetchPageList(chapterUrl: String): List<Page> {
val response = client.newCall(pageListRequest(chapterUrl)).await()
val response = client.newCall(pageListRequest(chapterUrl)).awaitSuccess()
return pageListParse(response)
}
@@ -1,7 +1,7 @@
package exh.md.handlers
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.network.await
import eu.kanade.tachiyomi.network.awaitSuccess
import eu.kanade.tachiyomi.source.model.Page
import eu.kanade.tachiyomi.util.asJsoup
import kotlinx.serialization.json.Json
@@ -29,13 +29,13 @@ class ComikeyHandler(cloudflareClient: OkHttpClient, userAgent: String) {
suspend fun fetchPageList(externalUrl: String): List<Page> {
val httpUrl = externalUrl.toHttpUrl()
val mangaId = getMangaId(httpUrl.pathSegments[1])
val response = client.newCall(pageListRequest(mangaId, httpUrl.pathSegments[2])).await()
val response = client.newCall(pageListRequest(mangaId, httpUrl.pathSegments[2])).awaitSuccess()
val request = getActualPageList(response) ?: return listOf(Page(0, urlForbidden, urlForbidden))
return pageListParse(client.newCall(request).await())
return pageListParse(client.newCall(request).awaitSuccess())
}
suspend fun getMangaId(mangaUrl: String): Int {
val response = client.newCall(GET("$baseUrl/read/$mangaUrl")).await()
val response = client.newCall(GET("$baseUrl/read/$mangaUrl")).awaitSuccess()
val url = response.asJsoup().selectFirst("meta[property=og:url]")!!.attr("content")
return url.trimEnd('/').substringAfterLast('/').toInt()
}
@@ -1,7 +1,7 @@
package exh.md.handlers
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.network.await
import eu.kanade.tachiyomi.network.awaitSuccess
import eu.kanade.tachiyomi.source.model.Page
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.jsonArray
@@ -22,7 +22,7 @@ class MangaHotHandler(currentClient: OkHttpClient, userAgent: String) {
suspend fun fetchPageList(externalUrl: String): List<Page> {
val request = GET(externalUrl.substringBefore("?").replace(baseUrl, apiUrl).replace("viewer", "v1/works/storyDetail"), headers)
return pageListParse(client.newCall(request).await())
return pageListParse(client.newCall(request).awaitSuccess())
}
fun pageListParse(response: Response): List<Page> {
@@ -1,7 +1,7 @@
package exh.md.handlers
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.network.await
import eu.kanade.tachiyomi.network.awaitSuccess
import eu.kanade.tachiyomi.source.model.Page
import exh.md.dto.MangaPlusResponse
import kotlinx.serialization.decodeFromByteArray
@@ -28,7 +28,7 @@ class MangaPlusHandler(currentClient: OkHttpClient) {
.build()
suspend fun fetchPageList(chapterId: String): List<Page> {
val response = client.newCall(pageListRequest(chapterId.substringAfterLast("/"))).await()
val response = client.newCall(pageListRequest(chapterId.substringAfterLast("/"))).awaitSuccess()
return pageListParse(response)
}
@@ -4,7 +4,7 @@ import eu.kanade.domain.track.service.TrackPreferences
import eu.kanade.tachiyomi.data.track.mdlist.MdList
import eu.kanade.tachiyomi.data.track.myanimelist.OAuth
import eu.kanade.tachiyomi.network.POST
import eu.kanade.tachiyomi.network.await
import eu.kanade.tachiyomi.network.awaitSuccess
import eu.kanade.tachiyomi.network.parseAs
import eu.kanade.tachiyomi.util.system.logcat
import exh.md.utils.MdApi
@@ -35,7 +35,7 @@ class MangaDexLoginHelper(
.build()
val error = kotlin.runCatching {
val data = client.newCall(POST(MdApi.baseAuthUrl + MdApi.token, body = loginFormBody)).await().parseAs<OAuth>()
val data = client.newCall(POST(MdApi.baseAuthUrl + MdApi.token, body = loginFormBody)).awaitSuccess().parseAs<OAuth>()
mangaDexAuthInterceptor.setAuth(data)
}.exceptionOrNull()
@@ -72,7 +72,7 @@ class MangaDexLoginHelper(
.build(),
body = formBody,
),
).await()
).awaitSuccess()
mdList.logout()
}.exceptionOrNull()
@@ -2,7 +2,7 @@ package exh.md.service
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.network.POST
import eu.kanade.tachiyomi.network.await
import eu.kanade.tachiyomi.network.awaitSuccess
import eu.kanade.tachiyomi.network.parseAs
import exh.md.dto.MangaListDto
import exh.md.dto.RatingDto
@@ -32,7 +32,7 @@ class MangaDexAuthService(
headers,
CacheControl.FORCE_NETWORK,
),
).await().parseAs(MdUtil.jsonParser)
).awaitSuccess().parseAs(MdUtil.jsonParser)
}
suspend fun readingStatusForManga(mangaId: String): ReadingStatusDto {
@@ -42,7 +42,7 @@ class MangaDexAuthService(
headers,
CacheControl.FORCE_NETWORK,
),
).await().parseAs(MdUtil.jsonParser)
).awaitSuccess().parseAs(MdUtil.jsonParser)
}
suspend fun readChaptersForManga(mangaId: String): ReadChapterDto {
@@ -52,7 +52,7 @@ class MangaDexAuthService(
headers,
CacheControl.FORCE_NETWORK,
),
).await().parseAs(MdUtil.jsonParser)
).awaitSuccess().parseAs(MdUtil.jsonParser)
}
suspend fun updateReadingStatusForManga(
@@ -66,7 +66,7 @@ class MangaDexAuthService(
body = MdUtil.encodeToBody(readingStatusDto),
cache = CacheControl.FORCE_NETWORK,
),
).await().parseAs(MdUtil.jsonParser)
).awaitSuccess().parseAs(MdUtil.jsonParser)
}
suspend fun readingStatusAllManga(): ReadingStatusMapDto {
@@ -76,7 +76,7 @@ class MangaDexAuthService(
headers,
cache = CacheControl.FORCE_NETWORK,
),
).await().parseAs(MdUtil.jsonParser)
).awaitSuccess().parseAs(MdUtil.jsonParser)
}
suspend fun readingStatusByType(status: String): ReadingStatusMapDto {
@@ -86,7 +86,7 @@ class MangaDexAuthService(
headers,
cache = CacheControl.FORCE_NETWORK,
),
).await().parseAs(MdUtil.jsonParser)
).awaitSuccess().parseAs(MdUtil.jsonParser)
}
suspend fun markChapterRead(chapterId: String): ResultDto {
@@ -96,7 +96,7 @@ class MangaDexAuthService(
headers,
cache = CacheControl.FORCE_NETWORK,
),
).await().parseAs(MdUtil.jsonParser)
).awaitSuccess().parseAs(MdUtil.jsonParser)
}
suspend fun markChapterUnRead(chapterId: String): ResultDto {
@@ -107,7 +107,7 @@ class MangaDexAuthService(
.headers(headers)
.cacheControl(CacheControl.FORCE_NETWORK)
.build(),
).await().parseAs(MdUtil.jsonParser)
).awaitSuccess().parseAs(MdUtil.jsonParser)
}
suspend fun followManga(mangaId: String): ResultDto {
@@ -117,7 +117,7 @@ class MangaDexAuthService(
headers,
cache = CacheControl.FORCE_NETWORK,
),
).await().parseAs(MdUtil.jsonParser)
).awaitSuccess().parseAs(MdUtil.jsonParser)
}
suspend fun unfollowManga(mangaId: String): ResultDto {
@@ -128,7 +128,7 @@ class MangaDexAuthService(
.headers(headers)
.cacheControl(CacheControl.FORCE_NETWORK)
.build(),
).await().parseAs(MdUtil.jsonParser)
).awaitSuccess().parseAs(MdUtil.jsonParser)
}
suspend fun updateMangaRating(mangaId: String, rating: Int): ResultDto {
@@ -139,7 +139,7 @@ class MangaDexAuthService(
body = MdUtil.encodeToBody(RatingDto(rating)),
cache = CacheControl.FORCE_NETWORK,
),
).await().parseAs(MdUtil.jsonParser)
).awaitSuccess().parseAs(MdUtil.jsonParser)
}
suspend fun deleteMangaRating(mangaId: String): ResultDto {
@@ -150,7 +150,7 @@ class MangaDexAuthService(
.headers(headers)
.cacheControl(CacheControl.FORCE_NETWORK)
.build(),
).await().parseAs(MdUtil.jsonParser)
).awaitSuccess().parseAs(MdUtil.jsonParser)
}
suspend fun mangasRating(vararg mangaIds: String): RatingResponseDto {
@@ -167,6 +167,6 @@ class MangaDexAuthService(
headers,
cache = CacheControl.FORCE_NETWORK,
),
).await().parseAs(MdUtil.jsonParser)
).awaitSuccess().parseAs(MdUtil.jsonParser)
}
}
@@ -2,7 +2,7 @@ package exh.md.service
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.network.POST
import eu.kanade.tachiyomi.network.await
import eu.kanade.tachiyomi.network.awaitSuccess
import eu.kanade.tachiyomi.network.parseAs
import exh.md.dto.AggregateDto
import exh.md.dto.AtHomeDto
@@ -45,7 +45,7 @@ class MangaDexService(
.build(),
cache = CacheControl.FORCE_NETWORK,
),
).await().parseAs(MdUtil.jsonParser)
).awaitSuccess().parseAs(MdUtil.jsonParser)
}
suspend fun viewManga(
@@ -64,7 +64,7 @@ class MangaDexService(
.build(),
cache = CacheControl.FORCE_NETWORK,
),
).await().parseAs(MdUtil.jsonParser)
).awaitSuccess().parseAs(MdUtil.jsonParser)
}
suspend fun mangasRating(
@@ -82,7 +82,7 @@ class MangaDexService(
.build(),
cache = CacheControl.FORCE_NETWORK,
),
).await().parseAs(MdUtil.jsonParser)
).awaitSuccess().parseAs(MdUtil.jsonParser)
}
suspend fun aggregateChapters(
@@ -101,7 +101,7 @@ class MangaDexService(
.build(),
cache = CacheControl.FORCE_NETWORK,
),
).await().parseAs(MdUtil.jsonParser)
).awaitSuccess().parseAs(MdUtil.jsonParser)
}
private fun String.splitString() = replace("\n", "").split(',').trimAll().dropEmpty()
@@ -142,18 +142,18 @@ class MangaDexService(
url,
cache = CacheControl.FORCE_NETWORK,
),
).await().parseAs(MdUtil.jsonParser)
).awaitSuccess().parseAs(MdUtil.jsonParser)
}
suspend fun viewChapter(id: String): ChapterDto {
return client.newCall(GET("${MdApi.chapter}/$id", cache = CacheControl.FORCE_NETWORK))
.await()
.awaitSuccess()
.parseAs(MdUtil.jsonParser)
}
suspend fun randomManga(): MangaDto {
return client.newCall(GET("${MdApi.manga}/random", cache = CacheControl.FORCE_NETWORK))
.await()
.awaitSuccess()
.parseAs(MdUtil.jsonParser)
}
@@ -164,7 +164,7 @@ class MangaDexService(
body = MdUtil.encodeToBody(atHomeImageReportDto),
cache = CacheControl.FORCE_NETWORK,
),
).await().parseAs(MdUtil.jsonParser)
).awaitSuccess().parseAs(MdUtil.jsonParser)
}
suspend fun getAtHomeServer(
@@ -172,7 +172,7 @@ class MangaDexService(
headers: Headers,
): AtHomeDto {
return client.newCall(GET(atHomeRequestUrl, headers, CacheControl.FORCE_NETWORK))
.await()
.awaitSuccess()
.parseAs(MdUtil.jsonParser)
}
@@ -187,6 +187,6 @@ class MangaDexService(
.build(),
cache = CacheControl.FORCE_NETWORK,
),
).await().parseAs(MdUtil.jsonParser)
).awaitSuccess().parseAs(MdUtil.jsonParser)
}
}
@@ -1,7 +1,7 @@
package exh.md.service
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.network.await
import eu.kanade.tachiyomi.network.awaitSuccess
import eu.kanade.tachiyomi.network.parseAs
import exh.md.dto.SimilarMangaDto
import exh.md.utils.MdUtil
@@ -15,6 +15,6 @@ class SimilarService(
GET(
"${MdUtil.similarBaseApi}$mangaId.json",
),
).await().parseAs()
).awaitSuccess().parseAs()
}
}
@@ -7,7 +7,7 @@ import eu.kanade.tachiyomi.data.track.TrackManager
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.network.NetworkHelper
import eu.kanade.tachiyomi.network.POST
import eu.kanade.tachiyomi.network.await
import eu.kanade.tachiyomi.network.awaitSuccess
import eu.kanade.tachiyomi.network.parseAs
import eu.kanade.tachiyomi.source.CatalogueSource
import eu.kanade.tachiyomi.source.model.MangasPage
@@ -52,7 +52,7 @@ class MyAnimeList : API("https://api.jikan.moe/v4/") {
.addPathSegment("recommendations")
.build()
val data = client.newCall(GET(apiUrl)).await().parseAs<JsonObject>()
val data = client.newCall(GET(apiUrl)).awaitSuccess().parseAs<JsonObject>()
return data["data"]!!.jsonArray
.map { it.jsonObject["entry"]!!.jsonObject }
.map { rec ->
@@ -88,7 +88,7 @@ class MyAnimeList : API("https://api.jikan.moe/v4/") {
.addQueryParameter("q", search)
.build()
val data = client.newCall(GET(url)).await()
val data = client.newCall(GET(url)).awaitSuccess()
.parseAs<JsonObject>()
return getRecsById(data["data"]!!.jsonArray.first().jsonObject["mal_id"]!!.jsonPrimitive.content)
}
@@ -137,7 +137,7 @@ class Anilist : API("https://graphql.anilist.co/") {
}
val payloadBody = payload.toString().toRequestBody("application/json; charset=utf-8".toMediaType())
val data = client.newCall(POST(endpoint, body = payloadBody)).await()
val data = client.newCall(POST(endpoint, body = payloadBody)).awaitSuccess()
.parseAs<JsonObject>()
val media = data["data"]!!
@@ -3,7 +3,7 @@ package exh.uconfig
import android.content.Context
import eu.kanade.domain.UnsortedPreferences
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.network.await
import eu.kanade.tachiyomi.network.awaitSuccess
import eu.kanade.tachiyomi.source.SourceManager
import eu.kanade.tachiyomi.source.online.all.EHentai
import eu.kanade.tachiyomi.util.asJsoup
@@ -46,7 +46,7 @@ class EHConfigurator(val context: Context) {
)
.build(),
)
.await()
.awaitSuccess()
private val EHentai.uconfigUrl get() = baseUrl + UCONFIG_URL
@@ -60,7 +60,7 @@ class EHConfigurator(val context: Context) {
.url(HATH_PERKS_URL)
.build(),
)
.await().asJsoup()
.awaitSuccess().asJsoup()
val hathPerks = EHHathPerksResponse()
@@ -90,7 +90,7 @@ class EHConfigurator(val context: Context) {
private suspend fun configure(source: EHentai, hathPerks: EHHathPerksResponse) {
// Delete old app profiles
val scanReq = source.requestWithCreds().url(source.uconfigUrl).build()
val resp = configuratorClient.newCall(scanReq).await().asJsoup()
val resp = configuratorClient.newCall(scanReq).awaitSuccess().asJsoup()
var lastDoc = resp
resp.select(PROFILE_SELECTOR).forEach {
if (it.text() == PROFILE_NAME) {
@@ -129,7 +129,7 @@ class EHConfigurator(val context: Context) {
.url(source.uconfigUrl)
.post(form)
.build(),
).await()
).awaitSuccess()
// Persist slot + sk
source.spPref().set(slot)
@@ -1,17 +1,11 @@
package exh.util
import kotlinx.coroutines.suspendCancellableCoroutine
import okhttp3.Call
import okhttp3.Callback
import okhttp3.Response
import okhttp3.internal.closeQuietly
import rx.Observable
import rx.Producer
import rx.Subscription
import java.io.IOException
import java.util.concurrent.atomic.AtomicBoolean
import kotlin.coroutines.resume
import kotlin.coroutines.resumeWithException
fun Call.asObservableWithAsyncStacktrace(): Observable<Pair<Exception, Response>> {
// Record stacktrace at creation time for easier debugging
@@ -58,34 +52,3 @@ fun Call.asObservableWithAsyncStacktrace(): Observable<Pair<Exception, Response>
subscriber.setProducer(requestArbiter)
}
}
/**
* Similar to [Call.await] but it doesn't throw when the response is not successful
*/
suspend fun Call.awaitResponse(): Response {
return suspendCancellableCoroutine { continuation ->
enqueue(
object : Callback {
override fun onResponse(call: Call, response: Response) {
continuation.resume(response) {
response.closeQuietly()
}
}
override fun onFailure(call: Call, e: IOException) {
// Don't bother with resuming the continuation if it is already cancelled.
if (continuation.isCancelled) return
continuation.resumeWithException(e)
}
},
)
continuation.invokeOnCancellation {
try {
cancel()
} catch (ex: Throwable) {
// Ignore cancel exception
}
}
}
}