pull/32/head
kunfei 6 years ago
parent 10e88b592c
commit a385977aca
  1. 4
      app/src/main/java/io/legado/app/data/api/IHttpGetApi.kt
  2. 4
      app/src/main/java/io/legado/app/data/api/IHttpPostApi.kt
  3. 29
      app/src/main/java/io/legado/app/model/WebBook.kt
  4. 22
      app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt
  5. 3
      app/src/main/java/io/legado/app/model/webbook/BookInfo.kt

@ -14,13 +14,13 @@ import retrofit2.http.Url
interface IHttpGetApi { interface IHttpGetApi {
@GET @GET
operator fun get( fun getAsync(
@Url url: String, @Url url: String,
@HeaderMap headers: Map<String, String> @HeaderMap headers: Map<String, String>
): Deferred<Response<String>> ): Deferred<Response<String>>
@GET @GET
fun getMap( fun getMapAsync(
@Url url: String, @Url url: String,
@QueryMap(encoded = true) queryMap: Map<String, String>, @QueryMap(encoded = true) queryMap: Map<String, String>,
@HeaderMap headers: Map<String, String> @HeaderMap headers: Map<String, String>

@ -14,14 +14,14 @@ interface IHttpPostApi {
@FormUrlEncoded @FormUrlEncoded
@POST @POST
fun postMap( fun postMapAsync(
@Url url: String, @Url url: String,
@FieldMap(encoded = true) fieldMap: Map<String, String>, @FieldMap(encoded = true) fieldMap: Map<String, String>,
@HeaderMap headers: Map<String, String> @HeaderMap headers: Map<String, String>
): Deferred<Response<String>> ): Deferred<Response<String>>
@POST @POST
fun postBody( fun postBodyAsync(
@Url url: String, @Url url: String,
@Body body: RequestBody, @Body body: RequestBody,
@HeaderMap headers: Map<String, String> @HeaderMap headers: Map<String, String>

@ -1,12 +1,11 @@
package io.legado.app.model package io.legado.app.model
import io.legado.app.data.api.IHttpGetApi import io.legado.app.data.entities.Book
import io.legado.app.data.api.IHttpPostApi
import io.legado.app.data.entities.BookSource import io.legado.app.data.entities.BookSource
import io.legado.app.data.entities.SearchBook import io.legado.app.data.entities.SearchBook
import io.legado.app.help.coroutine.Coroutine import io.legado.app.help.coroutine.Coroutine
import io.legado.app.help.http.HttpHelper
import io.legado.app.model.analyzeRule.AnalyzeUrl import io.legado.app.model.analyzeRule.AnalyzeUrl
import io.legado.app.model.webbook.BookInfo
import io.legado.app.model.webbook.BookList import io.legado.app.model.webbook.BookList
class WebBook(private val bookSource: BookSource) { class WebBook(private val bookSource: BookSource) {
@ -15,25 +14,19 @@ class WebBook(private val bookSource: BookSource) {
return Coroutine.async { return Coroutine.async {
bookSource.getSearchRule().searchUrl?.let { searchUrl -> bookSource.getSearchRule().searchUrl?.let { searchUrl ->
val analyzeUrl = AnalyzeUrl(searchUrl, key, page) val analyzeUrl = AnalyzeUrl(searchUrl, key, page)
val response = when { val response = analyzeUrl.getResponseAsync().await()
analyzeUrl.method == AnalyzeUrl.Method.POST -> HttpHelper.getApiService<IHttpPostApi>(
analyzeUrl.baseUrl
).postBody(
analyzeUrl.url,
analyzeUrl.body,
analyzeUrl.headerMap
).await()
analyzeUrl.fieldMap.isEmpty() -> HttpHelper.getApiService<IHttpGetApi>(
analyzeUrl.baseUrl
)[analyzeUrl.url, analyzeUrl.headerMap].await()
else -> HttpHelper.getApiService<IHttpGetApi>(analyzeUrl.baseUrl)
.getMap(analyzeUrl.url, analyzeUrl.fieldMap, analyzeUrl.headerMap).await()
}
return@async BookList.analyzeBookList(response, bookSource, analyzeUrl) return@async BookList.analyzeBookList(response, bookSource, analyzeUrl)
} }
return@async arrayListOf<SearchBook>() return@async arrayListOf<SearchBook>()
} }
} }
fun getBookInfo(book: Book): Coroutine<Book> {
return Coroutine.async {
val analyzeUrl = AnalyzeUrl(book = book, ruleUrl = book.bookUrl)
val response = analyzeUrl.getResponseAsync().await()
BookInfo.analyzeBookInfo(book, response.body(), bookSource, analyzeUrl)
return@async book
}
}
} }

@ -5,11 +5,16 @@ import android.text.TextUtils
import androidx.annotation.Keep import androidx.annotation.Keep
import io.legado.app.constant.AppConst.SCRIPT_ENGINE import io.legado.app.constant.AppConst.SCRIPT_ENGINE
import io.legado.app.constant.Pattern.EXP_PATTERN import io.legado.app.constant.Pattern.EXP_PATTERN
import io.legado.app.data.api.IHttpGetApi
import io.legado.app.data.api.IHttpPostApi
import io.legado.app.data.entities.Book import io.legado.app.data.entities.Book
import io.legado.app.help.http.HttpHelper
import io.legado.app.utils.* import io.legado.app.utils.*
import kotlinx.coroutines.Deferred
import okhttp3.FormBody import okhttp3.FormBody
import okhttp3.MediaType import okhttp3.MediaType
import okhttp3.RequestBody import okhttp3.RequestBody
import retrofit2.Response
import java.net.URLEncoder import java.net.URLEncoder
import java.util.* import java.util.*
import java.util.regex.Pattern import java.util.regex.Pattern
@ -204,4 +209,21 @@ class AnalyzeUrl(
enum class Method { enum class Method {
GET, POST GET, POST
} }
fun getResponseAsync(): Deferred<Response<String>> {
return when {
method == AnalyzeUrl.Method.POST -> HttpHelper.getApiService<IHttpPostApi>(
baseUrl
).postBodyAsync(
url,
body,
headerMap
)
fieldMap.isEmpty() -> HttpHelper.getApiService<IHttpGetApi>(
baseUrl
).getAsync(url, headerMap)
else -> HttpHelper.getApiService<IHttpGetApi>(baseUrl)
.getMapAsync(url, fieldMap, headerMap)
}
}
} }

@ -14,8 +14,7 @@ object BookInfo {
book: Book, book: Book,
body: String?, body: String?,
bookSource: BookSource, bookSource: BookSource,
analyzeUrl: AnalyzeUrl, analyzeUrl: AnalyzeUrl
isSearch: Boolean = true
) { ) {
val baseUrl = analyzeUrl.url val baseUrl = analyzeUrl.url
body ?: throw Exception( body ?: throw Exception(

Loading…
Cancel
Save