mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-10-31 06:17:57 +01:00 
			
		
		
		
	Fix network unsubscription crashes, refactor network methods
This commit is contained in:
		| @@ -28,7 +28,7 @@ class AppGlideModule : GlideModule { | ||||
|     override fun registerComponents(context: Context, glide: Glide) { | ||||
|         App.get(context).component.inject(this) | ||||
|         glide.register(GlideUrl::class.java, InputStream::class.java, | ||||
|                 OkHttpUrlLoader.Factory(networkHelper.defaultClient)) | ||||
|                 OkHttpUrlLoader.Factory(networkHelper.client)) | ||||
|         glide.register(Manga::class.java, InputStream::class.java, MangaModelLoader.Factory()) | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -6,8 +6,8 @@ import android.util.Xml | ||||
| import eu.kanade.tachiyomi.R | ||||
| import eu.kanade.tachiyomi.data.database.models.MangaSync | ||||
| import eu.kanade.tachiyomi.data.mangasync.base.MangaSyncService | ||||
| import eu.kanade.tachiyomi.data.network.get | ||||
| import eu.kanade.tachiyomi.data.network.post | ||||
| import eu.kanade.tachiyomi.data.network.GET | ||||
| import eu.kanade.tachiyomi.data.network.POST | ||||
| import eu.kanade.tachiyomi.util.selectInt | ||||
| import eu.kanade.tachiyomi.util.selectText | ||||
| import okhttp3.* | ||||
| @@ -65,7 +65,8 @@ class MyAnimeList(private val context: Context, id: Int) : MangaSyncService(cont | ||||
|  | ||||
|     override fun login(username: String, password: String): Observable<Boolean> { | ||||
|         createHeaders(username, password) | ||||
|         return networkService.request(get(getLoginUrl(), headers)) | ||||
|         return networkService.request(GET(getLoginUrl(), headers)) | ||||
|                 .doOnNext { it.close() } | ||||
|                 .map { it.code() == 200 } | ||||
|     } | ||||
|  | ||||
| @@ -77,7 +78,7 @@ class MyAnimeList(private val context: Context, id: Int) : MangaSyncService(cont | ||||
|     } | ||||
|  | ||||
|     fun search(query: String): Observable<List<MangaSync>> { | ||||
|         return networkService.request(get(getSearchUrl(query), headers)) | ||||
|         return networkService.request(GET(getSearchUrl(query), headers)) | ||||
|                 .map { Jsoup.parse(it.body().string()) } | ||||
|                 .flatMap { Observable.from(it.select("entry")) } | ||||
|                 .filter { it.select("type").text() != "Novel" } | ||||
| @@ -102,7 +103,7 @@ class MyAnimeList(private val context: Context, id: Int) : MangaSyncService(cont | ||||
|  | ||||
|     // MAL doesn't support score with decimals | ||||
|     fun getList(): Observable<List<MangaSync>> { | ||||
|         return networkService.request(get(getListUrl(username), headers), networkService.forceCacheClient) | ||||
|         return networkService.request(GET(getListUrl(username), headers), networkService.forceCacheClient) | ||||
|                 .map { Jsoup.parse(it.body().string()) } | ||||
|                 .flatMap { Observable.from(it.select("manga")) } | ||||
|                 .map { | ||||
| @@ -130,7 +131,7 @@ class MyAnimeList(private val context: Context, id: Int) : MangaSyncService(cont | ||||
|             if (manga.total_chapters != 0 && manga.last_chapter_read == manga.total_chapters) { | ||||
|                 manga.status = COMPLETED | ||||
|             } | ||||
|             networkService.request(post(getUpdateUrl(manga), headers, getMangaPostPayload(manga))) | ||||
|             networkService.request(POST(getUpdateUrl(manga), headers, getMangaPostPayload(manga))) | ||||
|         } | ||||
|  | ||||
|     } | ||||
| @@ -144,7 +145,7 @@ class MyAnimeList(private val context: Context, id: Int) : MangaSyncService(cont | ||||
|  | ||||
|     override fun add(manga: MangaSync): Observable<Response> { | ||||
|         return Observable.defer { | ||||
|             networkService.request(post(getAddUrl(manga), headers, getMangaPostPayload(manga))) | ||||
|             networkService.request(POST(getAddUrl(manga), headers, getMangaPostPayload(manga))) | ||||
|         } | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -22,7 +22,7 @@ class CloudflareInterceptor(private val cookies: PersistentCookieStore) : Interc | ||||
|  | ||||
|         // Check if we already solved a challenge | ||||
|         if (response.code() != 502 && | ||||
|                 cookies.get(response.request().url()).find { it.name() == "cf_clearance" } != null) { | ||||
|                 cookies.get(response.request().url()).any { it.name() == "cf_clearance" }) { | ||||
|             return response | ||||
|         } | ||||
|  | ||||
| @@ -72,7 +72,7 @@ class CloudflareInterceptor(private val cookies: PersistentCookieStore) : Interc | ||||
|                     .toString() | ||||
|  | ||||
|             val referer = originalRequest.url().toString() | ||||
|             return get(url, originalRequest.headers().newBuilder().add("Referer", referer).build()) | ||||
|             return GET(url, originalRequest.headers().newBuilder().add("Referer", referer).build()) | ||||
|         } finally { | ||||
|             duktape.close() | ||||
|         } | ||||
|   | ||||
| @@ -1,12 +1,12 @@ | ||||
| package eu.kanade.tachiyomi.data.network | ||||
|  | ||||
| import android.content.Context | ||||
| import okhttp3.* | ||||
| import okhttp3.Cache | ||||
| import okhttp3.OkHttpClient | ||||
| import okhttp3.Request | ||||
| import okhttp3.Response | ||||
| import rx.Observable | ||||
| import rx.subscriptions.Subscriptions | ||||
| import timber.log.Timber | ||||
| import java.io.File | ||||
| import java.io.IOException | ||||
|  | ||||
| class NetworkHelper(context: Context) { | ||||
|  | ||||
| @@ -16,74 +16,30 @@ class NetworkHelper(context: Context) { | ||||
|  | ||||
|     private val cookieManager = PersistentCookieJar(context) | ||||
|  | ||||
|     val defaultClient = OkHttpClient.Builder() | ||||
|     val client = OkHttpClient.Builder() | ||||
|             .cookieJar(cookieManager) | ||||
|             .cache(Cache(cacheDir, cacheSize)) | ||||
|             .build() | ||||
|  | ||||
|     val forceCacheClient = defaultClient.newBuilder() | ||||
|             .addNetworkInterceptor({ chain -> | ||||
|     val forceCacheClient = client.newBuilder() | ||||
|             .addNetworkInterceptor { chain -> | ||||
|                 val originalResponse = chain.proceed(chain.request()) | ||||
|                 originalResponse.newBuilder() | ||||
|                         .removeHeader("Pragma") | ||||
|                         .header("Cache-Control", "max-age=" + 600) | ||||
|                         .header("Cache-Control", "max-age=600") | ||||
|                         .build() | ||||
|             }) | ||||
|             } | ||||
|             .build() | ||||
|  | ||||
|     val cloudflareClient = defaultClient.newBuilder() | ||||
|     val cloudflareClient = client.newBuilder() | ||||
|             .addInterceptor(CloudflareInterceptor(cookies)) | ||||
|             .build() | ||||
|  | ||||
|     val cookies: PersistentCookieStore | ||||
|         get() = cookieManager.store | ||||
|  | ||||
|     fun request(request: Request, client: OkHttpClient = defaultClient): Observable<Response> { | ||||
|         return Observable.create { subscriber -> | ||||
|             val call = client.newCall(request) | ||||
|             subscriber.add(Subscriptions.create { | ||||
|                 call.cancel() | ||||
|                 Timber.i("Cancel call on thread ${Thread.currentThread().id}") | ||||
|             }) | ||||
|  | ||||
|             call.enqueue(object : Callback { | ||||
|                 override fun onResponse(call: Call, response: Response) { | ||||
|                     if (!subscriber.isUnsubscribed) { | ||||
|                         subscriber.add(Subscriptions.create { | ||||
|                             response.body().close() | ||||
|                             Timber.i("Close body on thread ${Thread.currentThread().id}") | ||||
|                         }) | ||||
|                         subscriber.onNext(response) | ||||
|                         Timber.i("Emit response on thread ${Thread.currentThread().id}") | ||||
|                         subscriber.onCompleted() | ||||
|                     } | ||||
|                 } | ||||
|  | ||||
|                 override fun onFailure(call: Call, error: IOException) { | ||||
|                     if (!subscriber.isUnsubscribed) { | ||||
|                         subscriber.onError(error) | ||||
|                     } | ||||
|                 } | ||||
|             }) | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     fun requestBodyProgress(request: Request, listener: ProgressListener): Observable<Response> { | ||||
|         return Observable.fromCallable { requestBodyProgressBlocking(request, listener) } | ||||
|     } | ||||
|  | ||||
|     fun requestBodyProgressBlocking(request: Request, listener: ProgressListener): Response { | ||||
|         val progressClient = defaultClient.newBuilder() | ||||
|                 .cache(null) | ||||
|                 .addNetworkInterceptor { chain -> | ||||
|                     val originalResponse = chain.proceed(chain.request()) | ||||
|                     originalResponse.newBuilder() | ||||
|                             .body(ProgressResponseBody(originalResponse.body(), listener)) | ||||
|                             .build() | ||||
|                 } | ||||
|                 .build() | ||||
|  | ||||
|         return progressClient.newCall(request).execute() | ||||
|     fun request(request: Request, client: OkHttpClient = this.client): Observable<Response> { | ||||
|         return client.newCall(request).asObservable() | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -0,0 +1,41 @@ | ||||
| package eu.kanade.tachiyomi.data.network | ||||
|  | ||||
| import okhttp3.Call | ||||
| import okhttp3.OkHttpClient | ||||
| import okhttp3.Request | ||||
| import okhttp3.Response | ||||
| import rx.Observable | ||||
| import rx.subscriptions.Subscriptions | ||||
| import java.io.IOException | ||||
|  | ||||
| fun Call.asObservable(): Observable<Response> { | ||||
|     return Observable.create { subscriber -> | ||||
|         subscriber.add(Subscriptions.create { cancel() }) | ||||
|  | ||||
|         try { | ||||
|             val response = execute() | ||||
|             if (!subscriber.isUnsubscribed) { | ||||
|                 subscriber.onNext(response) | ||||
|                 subscriber.onCompleted() | ||||
|             } | ||||
|         } catch (error: IOException) { | ||||
|             if (!subscriber.isUnsubscribed) { | ||||
|                 subscriber.onError(error) | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| fun OkHttpClient.newCallWithProgress(request: Request, listener: ProgressListener): Call { | ||||
|     val progressClient = newBuilder() | ||||
|             .cache(null) | ||||
|             .addNetworkInterceptor { chain -> | ||||
|                 val originalResponse = chain.proceed(chain.request()) | ||||
|                 originalResponse.newBuilder() | ||||
|                         .body(ProgressResponseBody(originalResponse.body(), listener)) | ||||
|                         .build() | ||||
|             } | ||||
|             .build() | ||||
|  | ||||
|     return progressClient.newCall(request) | ||||
| } | ||||
| @@ -70,6 +70,6 @@ class PersistentCookieStore(context: Context) { | ||||
|         return cookieMap[url].orEmpty().filter { !it.hasExpired() } | ||||
|     } | ||||
|  | ||||
|     fun Cookie.hasExpired() = System.currentTimeMillis() >= expiresAt() | ||||
|     private fun Cookie.hasExpired() = System.currentTimeMillis() >= expiresAt() | ||||
|  | ||||
| } | ||||
| @@ -7,8 +7,7 @@ private val DEFAULT_CACHE_CONTROL = CacheControl.Builder().maxAge(10, MINUTES).b | ||||
| private val DEFAULT_HEADERS = Headers.Builder().build() | ||||
| private val DEFAULT_BODY: RequestBody = FormBody.Builder().build() | ||||
| 
 | ||||
| @JvmOverloads | ||||
| fun get(url: String, | ||||
| fun GET(url: String, | ||||
|         headers: Headers = DEFAULT_HEADERS, | ||||
|         cache: CacheControl = DEFAULT_CACHE_CONTROL): Request { | ||||
| 
 | ||||
| @@ -19,8 +18,7 @@ fun get(url: String, | ||||
|             .build() | ||||
| } | ||||
| 
 | ||||
| @JvmOverloads | ||||
| fun post(url: String, | ||||
| fun POST(url: String, | ||||
|          headers: Headers = DEFAULT_HEADERS, | ||||
|          body: RequestBody = DEFAULT_BODY, | ||||
|          cache: CacheControl = DEFAULT_CACHE_CONTROL): Request { | ||||
| @@ -5,8 +5,10 @@ import eu.kanade.tachiyomi.App | ||||
| import eu.kanade.tachiyomi.data.cache.ChapterCache | ||||
| import eu.kanade.tachiyomi.data.database.models.Chapter | ||||
| import eu.kanade.tachiyomi.data.database.models.Manga | ||||
| import eu.kanade.tachiyomi.data.network.GET | ||||
| import eu.kanade.tachiyomi.data.network.NetworkHelper | ||||
| import eu.kanade.tachiyomi.data.network.get | ||||
| import eu.kanade.tachiyomi.data.network.asObservable | ||||
| import eu.kanade.tachiyomi.data.network.newCallWithProgress | ||||
| import eu.kanade.tachiyomi.data.preference.PreferencesHelper | ||||
| import eu.kanade.tachiyomi.data.source.Language | ||||
| import eu.kanade.tachiyomi.data.source.Source | ||||
| @@ -57,7 +59,7 @@ abstract class OnlineSource(context: Context) : Source { | ||||
|      * Default network client for doing requests. | ||||
|      */ | ||||
|     open val client: OkHttpClient | ||||
|         get() = network.defaultClient | ||||
|         get() = network.client | ||||
|  | ||||
|     init { | ||||
|         // Inject dependencies. | ||||
| @@ -114,7 +116,7 @@ abstract class OnlineSource(context: Context) : Source { | ||||
|         if (page.page == 1) { | ||||
|             page.url = popularMangaInitialUrl() | ||||
|         } | ||||
|         return get(page.url, headers) | ||||
|         return GET(page.url, headers) | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| @@ -159,7 +161,7 @@ abstract class OnlineSource(context: Context) : Source { | ||||
|         if (page.page == 1) { | ||||
|             page.url = searchMangaInitialUrl(query) | ||||
|         } | ||||
|         return get(page.url, headers) | ||||
|         return GET(page.url, headers) | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| @@ -201,7 +203,7 @@ abstract class OnlineSource(context: Context) : Source { | ||||
|      * @param manga the manga to be updated. | ||||
|      */ | ||||
|     open protected fun mangaDetailsRequest(manga: Manga): Request { | ||||
|         return get(baseUrl + manga.url, headers) | ||||
|         return GET(baseUrl + manga.url, headers) | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| @@ -236,7 +238,7 @@ abstract class OnlineSource(context: Context) : Source { | ||||
|      * @param manga the manga to look for chapters. | ||||
|      */ | ||||
|     open protected fun chapterListRequest(manga: Manga): Request { | ||||
|         return get(baseUrl + manga.url, headers) | ||||
|         return GET(baseUrl + manga.url, headers) | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| @@ -281,7 +283,7 @@ abstract class OnlineSource(context: Context) : Source { | ||||
|      * @param chapter the chapter whose page list has to be fetched | ||||
|      */ | ||||
|     open protected fun pageListRequest(chapter: Chapter): Request { | ||||
|         return get(baseUrl + chapter.url, headers) | ||||
|         return GET(baseUrl + chapter.url, headers) | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| @@ -321,7 +323,7 @@ abstract class OnlineSource(context: Context) : Source { | ||||
|      * @param page the chapter whose page list has to be fetched | ||||
|      */ | ||||
|     open protected fun imageUrlRequest(page: Page): Request { | ||||
|         return get(page.url, headers) | ||||
|         return GET(page.url, headers) | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| @@ -347,11 +349,12 @@ abstract class OnlineSource(context: Context) : Source { | ||||
|      * | ||||
|      * @param page the page whose source image has to be downloaded. | ||||
|      */ | ||||
|     fun imageResponse(page: Page): Observable<Response> = network | ||||
|             .requestBodyProgress(imageRequest(page), page) | ||||
|     fun imageResponse(page: Page): Observable<Response> = client | ||||
|             .newCallWithProgress(imageRequest(page), page) | ||||
|             .asObservable() | ||||
|             .doOnNext { | ||||
|                 if (!it.isSuccessful) { | ||||
|                     it.body().close() | ||||
|                     it.close() | ||||
|                     throw RuntimeException("Not a valid response") | ||||
|                 } | ||||
|             } | ||||
| @@ -363,7 +366,7 @@ abstract class OnlineSource(context: Context) : Source { | ||||
|      * @param page the chapter whose page list has to be fetched | ||||
|      */ | ||||
|     open protected fun imageRequest(page: Page): Request { | ||||
|         return get(page.imageUrl, headers) | ||||
|         return GET(page.imageUrl, headers) | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|   | ||||
| @@ -3,8 +3,8 @@ package eu.kanade.tachiyomi.data.source.online | ||||
| import android.content.Context | ||||
| import eu.kanade.tachiyomi.data.database.models.Chapter | ||||
| import eu.kanade.tachiyomi.data.database.models.Manga | ||||
| import eu.kanade.tachiyomi.data.network.get | ||||
| import eu.kanade.tachiyomi.data.network.post | ||||
| import eu.kanade.tachiyomi.data.network.GET | ||||
| import eu.kanade.tachiyomi.data.network.POST | ||||
| import eu.kanade.tachiyomi.data.source.getLanguages | ||||
| import eu.kanade.tachiyomi.data.source.model.MangasPage | ||||
| import eu.kanade.tachiyomi.data.source.model.Page | ||||
| @@ -32,7 +32,7 @@ class YamlOnlineSource(context: Context, mappings: Map<*, *>) : OnlineSource(con | ||||
|  | ||||
|     override val client = when(map.client) { | ||||
|         "cloudflare" -> network.cloudflareClient | ||||
|         else -> network.defaultClient | ||||
|         else -> network.client | ||||
|     } | ||||
|  | ||||
|     override val id = map.id.let { | ||||
| @@ -44,8 +44,8 @@ class YamlOnlineSource(context: Context, mappings: Map<*, *>) : OnlineSource(con | ||||
|             page.url = popularMangaInitialUrl() | ||||
|         } | ||||
|         return when (map.popular.method?.toLowerCase()) { | ||||
|             "post" -> post(page.url, headers, map.popular.createForm()) | ||||
|             else -> get(page.url, headers) | ||||
|             "post" -> POST(page.url, headers, map.popular.createForm()) | ||||
|             else -> GET(page.url, headers) | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @@ -74,8 +74,8 @@ class YamlOnlineSource(context: Context, mappings: Map<*, *>) : OnlineSource(con | ||||
|             page.url = searchMangaInitialUrl(query) | ||||
|         } | ||||
|         return when (map.search.method?.toLowerCase()) { | ||||
|             "post" -> post(page.url, headers, map.search.createForm()) | ||||
|             else -> get(page.url, headers) | ||||
|             "post" -> POST(page.url, headers, map.search.createForm()) | ||||
|             else -> GET(page.url, headers) | ||||
|         } | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -5,8 +5,8 @@ import android.net.Uri | ||||
| import android.text.Html | ||||
| import eu.kanade.tachiyomi.data.database.models.Chapter | ||||
| import eu.kanade.tachiyomi.data.database.models.Manga | ||||
| import eu.kanade.tachiyomi.data.network.get | ||||
| import eu.kanade.tachiyomi.data.network.post | ||||
| import eu.kanade.tachiyomi.data.network.GET | ||||
| import eu.kanade.tachiyomi.data.network.POST | ||||
| import eu.kanade.tachiyomi.data.source.EN | ||||
| import eu.kanade.tachiyomi.data.source.Language | ||||
| import eu.kanade.tachiyomi.data.source.model.MangasPage | ||||
| @@ -20,7 +20,6 @@ import org.jsoup.nodes.Document | ||||
| import org.jsoup.nodes.Element | ||||
| import rx.Observable | ||||
| import java.net.URI | ||||
| import java.net.URISyntaxException | ||||
| import java.text.ParseException | ||||
| import java.text.SimpleDateFormat | ||||
| import java.util.* | ||||
| @@ -58,12 +57,12 @@ class Batoto(context: Context, override val id: Int) : ParsedOnlineSource(contex | ||||
|  | ||||
|     override fun mangaDetailsRequest(manga: Manga): Request { | ||||
|         val mangaId = manga.url.substringAfterLast("r") | ||||
|         return get("$baseUrl/comic_pop?id=$mangaId", headers) | ||||
|         return GET("$baseUrl/comic_pop?id=$mangaId", headers) | ||||
|     } | ||||
|  | ||||
|     override fun pageListRequest(chapter: Chapter): Request { | ||||
|         val id = chapter.url.substringAfterLast("#") | ||||
|         return get("$baseUrl/areader?id=$id&p=1", headers) | ||||
|         return GET("$baseUrl/areader?id=$id&p=1", headers) | ||||
|     } | ||||
|  | ||||
|     override fun imageUrlRequest(page: Page): Request { | ||||
| @@ -71,7 +70,7 @@ class Batoto(context: Context, override val id: Int) : ParsedOnlineSource(contex | ||||
|         val start = pageUrl.indexOf("#") + 1 | ||||
|         val end = pageUrl.indexOf("_", start) | ||||
|         val id = pageUrl.substring(start, end) | ||||
|         return get("$baseUrl/areader?id=$id&p=${pageUrl.substring(end+1)}", headers) | ||||
|         return GET("$baseUrl/areader?id=$id&p=${pageUrl.substring(end+1)}", headers) | ||||
|     } | ||||
|  | ||||
|     override fun popularMangaParse(response: Response, page: MangasPage) { | ||||
| @@ -216,9 +215,8 @@ class Batoto(context: Context, override val id: Int) : ParsedOnlineSource(contex | ||||
|     } | ||||
|  | ||||
|     override fun login(username: String, password: String) = | ||||
|         network.request(get("$baseUrl/forums/index.php?app=core&module=global§ion=login", headers)) | ||||
|                 .map { it.body().string() } | ||||
|                 .flatMap { doLogin(it, username, password) } | ||||
|         network.request(GET("$baseUrl/forums/index.php?app=core&module=global§ion=login", headers)) | ||||
|                 .flatMap { doLogin(it.body().string(), username, password) } | ||||
|                 .map { isAuthenticationSuccessful(it) } | ||||
|  | ||||
|     private fun doLogin(response: String, username: String, password: String): Observable<Response> { | ||||
| @@ -235,7 +233,7 @@ class Batoto(context: Context, override val id: Int) : ParsedOnlineSource(contex | ||||
|             add("rememberMe", "1") | ||||
|         }.build() | ||||
|  | ||||
|         return network.request(post(url, headers, payload)) | ||||
|         return network.request(POST(url, headers, payload)) | ||||
|     } | ||||
|  | ||||
|     override fun isLoginRequired() = true | ||||
| @@ -244,12 +242,7 @@ class Batoto(context: Context, override val id: Int) : ParsedOnlineSource(contex | ||||
|         response.priorResponse() != null && response.priorResponse().code() == 302 | ||||
|  | ||||
|     override fun isLogged(): Boolean { | ||||
|         try { | ||||
|             return network.cookies.get(URI(baseUrl)).find { it.name() == "pass_hash" } != null | ||||
|         } catch (e: URISyntaxException) { | ||||
|             // Ignore | ||||
|         } | ||||
|         return false | ||||
|         return network.cookies.get(URI(baseUrl)).any { it.name() == "pass_hash" } | ||||
|     } | ||||
|  | ||||
|     override fun fetchChapterList(manga: Manga): Observable<List<Chapter>> { | ||||
|   | ||||
| @@ -3,8 +3,8 @@ package eu.kanade.tachiyomi.data.source.online.english | ||||
| import android.content.Context | ||||
| import eu.kanade.tachiyomi.data.database.models.Chapter | ||||
| import eu.kanade.tachiyomi.data.database.models.Manga | ||||
| import eu.kanade.tachiyomi.data.network.get | ||||
| import eu.kanade.tachiyomi.data.network.post | ||||
| import eu.kanade.tachiyomi.data.network.GET | ||||
| import eu.kanade.tachiyomi.data.network.POST | ||||
| import eu.kanade.tachiyomi.data.source.EN | ||||
| import eu.kanade.tachiyomi.data.source.Language | ||||
| import eu.kanade.tachiyomi.data.source.model.MangasPage | ||||
| @@ -54,7 +54,7 @@ class Kissmanga(context: Context, override val id: Int) : ParsedOnlineSource(con | ||||
|             add("genres", "") | ||||
|         }.build() | ||||
|  | ||||
|         return post(page.url, headers, form) | ||||
|         return POST(page.url, headers, form) | ||||
|     } | ||||
|  | ||||
|     override fun searchMangaInitialUrl(query: String) = "$baseUrl/AdvanceSearch" | ||||
| @@ -95,7 +95,7 @@ class Kissmanga(context: Context, override val id: Int) : ParsedOnlineSource(con | ||||
|         } ?: 0 | ||||
|     } | ||||
|  | ||||
|     override fun pageListRequest(chapter: Chapter) = post(baseUrl + chapter.url, headers) | ||||
|     override fun pageListRequest(chapter: Chapter) = POST(baseUrl + chapter.url, headers) | ||||
|  | ||||
|     override fun pageListParse(response: Response, pages: MutableList<Page>) { | ||||
|         //language=RegExp | ||||
| @@ -111,7 +111,7 @@ class Kissmanga(context: Context, override val id: Int) : ParsedOnlineSource(con | ||||
|     // Not used | ||||
|     override fun pageListParse(document: Document, pages: MutableList<Page>) {} | ||||
|  | ||||
|     override fun imageUrlRequest(page: Page) = get(page.url) | ||||
|     override fun imageUrlRequest(page: Page) = GET(page.url) | ||||
|  | ||||
|     override fun imageUrlParse(document: Document) = "" | ||||
|  | ||||
|   | ||||
| @@ -3,7 +3,7 @@ package eu.kanade.tachiyomi.data.source.online.english | ||||
| import android.content.Context | ||||
| import eu.kanade.tachiyomi.data.database.models.Chapter | ||||
| import eu.kanade.tachiyomi.data.database.models.Manga | ||||
| import eu.kanade.tachiyomi.data.network.post | ||||
| import eu.kanade.tachiyomi.data.network.POST | ||||
| import eu.kanade.tachiyomi.data.source.EN | ||||
| import eu.kanade.tachiyomi.data.source.Language | ||||
| import eu.kanade.tachiyomi.data.source.model.MangasPage | ||||
| @@ -47,7 +47,7 @@ class Readmangatoday(context: Context, override val id: Int) : ParsedOnlineSourc | ||||
|         var builder = okhttp3.FormBody.Builder() | ||||
|         builder.add("query", query) | ||||
|  | ||||
|         return post(page.url, headers, builder.build()) | ||||
|         return POST(page.url, headers, builder.build()) | ||||
|     } | ||||
|  | ||||
|     override fun searchMangaSelector() = "div.content-list > div.style-list > div.box" | ||||
|   | ||||
| @@ -11,9 +11,10 @@ import android.support.v4.app.NotificationCompat | ||||
| import eu.kanade.tachiyomi.App | ||||
| import eu.kanade.tachiyomi.Constants | ||||
| import eu.kanade.tachiyomi.R | ||||
| import eu.kanade.tachiyomi.data.network.GET | ||||
| import eu.kanade.tachiyomi.data.network.NetworkHelper | ||||
| import eu.kanade.tachiyomi.data.network.ProgressListener | ||||
| import eu.kanade.tachiyomi.data.network.get | ||||
| import eu.kanade.tachiyomi.data.network.newCallWithProgress | ||||
| import eu.kanade.tachiyomi.util.notificationManager | ||||
| import eu.kanade.tachiyomi.util.saveTo | ||||
| import timber.log.Timber | ||||
| @@ -100,12 +101,14 @@ class UpdateDownloader(private val context: Context) : | ||||
|  | ||||
|         try { | ||||
|             // Make the request and download the file | ||||
|             val response = network.requestBodyProgressBlocking(get(result.url), progressListener) | ||||
|             val response = network.client.newCallWithProgress(GET(result.url), progressListener).execute() | ||||
|  | ||||
|             if (response.isSuccessful) { | ||||
|                 response.body().source().saveTo(apkFile) | ||||
|                 // Set download successful | ||||
|                 result.successful = true | ||||
|             } else { | ||||
|                 response.close() | ||||
|             } | ||||
|         } catch (e: Exception) { | ||||
|             Timber.e(e, e.message) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user