Clean up some code to follow best practices (#178)

* toHttpUrlOrNull()!! -> toHttpUrl()
* Jsoup.parse(response.body.string()) -> response.asJsoup()
* Some useless HttpUrl.newBuilder() calls
* extlib v1.4 GET(HttpUrl)
This commit is contained in:
stevenyomi 2024-01-12 23:56:53 +08:00 committed by Draff
parent 2b9b92ceaa
commit f612bc1c3f
97 changed files with 272 additions and 293 deletions

View File

@ -8,7 +8,6 @@ import eu.kanade.tachiyomi.multisrc.grouple.GroupLe
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.source.model.Filter
import eu.kanade.tachiyomi.source.model.FilterList
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.Request
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
@ -46,15 +45,13 @@ class AllHentai : GroupLe("AllHentai", "https://z.allhen.online", "ru") {
is OrderBy -> {
if (filter.state > 0) {
val ord = arrayOf("not", "year", "rate", "popularity", "votes", "created", "updated")[filter.state]
val ordUrl = "$baseUrl/list?sortType=$ord&offset=${70 * (page - 1)}".toHttpUrlOrNull()!!.newBuilder()
return GET(ordUrl.toString(), headers)
return GET("$baseUrl/list?sortType=$ord&offset=${70 * (page - 1)}", headers)
}
}
is Tags -> {
if (filter.state > 0) {
val tagName = getTagsList()[filter.state].url
val tagUrl = "$baseUrl/list/tag/$tagName?offset=${70 * (page - 1)}".toHttpUrlOrNull()!!.newBuilder()
return GET(tagUrl.toString(), headers)
return GET("$baseUrl/list/tag/$tagName?offset=${70 * (page - 1)}", headers)
}
}
else -> {}

View File

@ -8,7 +8,6 @@ import eu.kanade.tachiyomi.multisrc.grouple.GroupLe
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.source.model.Filter
import eu.kanade.tachiyomi.source.model.FilterList
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.Request
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
@ -57,8 +56,7 @@ class MintManga : GroupLe("MintManga", "https://mintmanga.com", "ru") {
url.addQueryParameter("sortType", arrayOf("RATING", "POPULARITY", "YEAR", "NAME", "DATE_CREATE", "DATE_UPDATE")[filter.state])
} else {
val ord = arrayOf("rate", "popularity", "year", "name", "created", "updated", "votes")[filter.state]
val ordUrl = "$baseUrl/list?sortType=$ord&offset=${70 * (page - 1)}".toHttpUrlOrNull()!!.newBuilder()
return GET(ordUrl.toString(), headers)
return GET("$baseUrl/list?sortType=$ord&offset=${70 * (page - 1)}", headers)
}
}
else -> {}

View File

@ -8,7 +8,6 @@ import eu.kanade.tachiyomi.multisrc.grouple.GroupLe
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.source.model.Filter
import eu.kanade.tachiyomi.source.model.FilterList
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.Request
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
@ -57,8 +56,7 @@ class ReadManga : GroupLe("ReadManga", "https://readmanga.live", "ru") {
url.addQueryParameter("sortType", arrayOf("RATING", "POPULARITY", "YEAR", "NAME", "DATE_CREATE", "DATE_UPDATE")[filter.state])
} else {
val ord = arrayOf("rate", "popularity", "year", "name", "created", "updated", "votes")[filter.state]
val ordUrl = "$baseUrl/list?sortType=$ord&offset=${70 * (page - 1)}".toHttpUrlOrNull()!!.newBuilder()
return GET(ordUrl.toString(), headers)
return GET("$baseUrl/list?sortType=$ord&offset=${70 * (page - 1)}", headers)
}
}
else -> {}

View File

@ -8,7 +8,6 @@ import eu.kanade.tachiyomi.multisrc.grouple.GroupLe
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.source.model.Filter
import eu.kanade.tachiyomi.source.model.FilterList
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.Request
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
@ -31,8 +30,7 @@ class RuMIX : GroupLe("RuMIX", "https://rumix.me", "ru") {
url.addQueryParameter("sortType", arrayOf("RATING", "POPULARITY", "YEAR", "NAME", "DATE_CREATE", "DATE_UPDATE")[filter.state])
} else {
val ord = arrayOf("rate", "popularity", "year", "name", "created", "updated", "votes")[filter.state]
val ordUrl = "$baseUrl/list?sortType=$ord&offset=${70 * (page - 1)}".toHttpUrlOrNull()!!.newBuilder()
return GET(ordUrl.toString(), headers)
return GET("$baseUrl/list?sortType=$ord&offset=${70 * (page - 1)}", headers)
}
}
else -> return@forEach

View File

@ -8,7 +8,6 @@ import eu.kanade.tachiyomi.multisrc.grouple.GroupLe
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.source.model.Filter
import eu.kanade.tachiyomi.source.model.FilterList
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.Request
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
@ -43,8 +42,7 @@ class SelfManga : GroupLe("SelfManga", "https://selfmanga.live", "ru") {
url.addQueryParameter("sortType", arrayOf("RATING", "POPULARITY", "YEAR", "NAME", "DATE_CREATE", "DATE_UPDATE")[filter.state])
} else {
val ord = arrayOf("rate", "popularity", "year", "name", "created", "updated", "votes")[filter.state]
val ordUrl = "$baseUrl/list?sortType=$ord&offset=${70 * (page - 1)}".toHttpUrlOrNull()!!.newBuilder()
return GET(ordUrl.toString(), headers)
return GET("$baseUrl/list?sortType=$ord&offset=${70 * (page - 1)}", headers)
}
}
else -> return@forEach

View File

@ -52,7 +52,7 @@ class DoujinHentai : Madara(
}
}
}
return GET(url.build().toString(), headers)
return GET(url.build(), headers)
}
override fun searchMangaSelector() = "div.c-tabs-item__content > div.c-tabs-item__content, ${popularMangaSelector()}"

View File

@ -5,7 +5,7 @@ import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.network.interceptor.rateLimit
import eu.kanade.tachiyomi.source.model.Filter
import eu.kanade.tachiyomi.source.model.FilterList
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient
import okhttp3.Request
import java.text.SimpleDateFormat
@ -23,7 +23,7 @@ class PojokManga : Madara("Pojok Manga", "https://pojokmanga.net", "id", SimpleD
override val mangaSubString = "komik"
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
var url = "$baseUrl/${searchPage(page)}".toHttpUrlOrNull()!!.newBuilder()
var url = "$baseUrl/${searchPage(page)}".toHttpUrl().newBuilder()
url.addQueryParameter("s", query)
url.addQueryParameter("post_type", "wp-manga")
filters.forEach { filter ->
@ -70,13 +70,13 @@ class PojokManga : Madara("Pojok Manga", "https://pojokmanga.net", "id", SimpleD
}
is ProjectFilter -> {
if (filter.toUriPart() == "project-filter-on") {
url = "$baseUrl/project/page/$page".toHttpUrlOrNull()!!.newBuilder()
url = "$baseUrl/project/page/$page".toHttpUrl().newBuilder()
}
}
else -> {}
}
}
return GET(url.toString(), headers)
return GET(url.build(), headers)
}
override fun searchMangaSelector() = "div.c-tabs-item__content, div.page-item-detail"

View File

@ -3,7 +3,7 @@ package eu.kanade.tachiyomi.extension.en.toonily
import eu.kanade.tachiyomi.multisrc.madara.Madara
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.source.model.FilterList
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient
import okhttp3.Request
import java.text.SimpleDateFormat
@ -51,7 +51,7 @@ class Toonily : Madara(
val queries = request.url.queryParameterNames
.filterNot { it == "s" }
val newUrl = "$baseUrl/${searchPage(page, query)}".toHttpUrlOrNull()!!.newBuilder().apply {
val newUrl = "$baseUrl/${searchPage(page, query)}".toHttpUrl().newBuilder().apply {
queries.map { q ->
request.url.queryParameterValues(q).map {
this.addQueryParameter(q, it)

View File

@ -38,7 +38,7 @@ class CosmicScansID : MangaThemesia("CosmicScans.id", "https://cosmicscans.id",
else -> { /* Do Nothing */ }
}
}
return GET(url.toString())
return GET(url.build())
}
override fun searchMangaSelector() = ".bixbox:not(.hothome):has(.hpage) .utao .uta .imgu, .bixbox:not(.hothome) .listupd .bs .bsx"

View File

@ -201,7 +201,7 @@ class KomikCast : MangaThemesia("Komik Cast", "https://komikcast.lol", "id", "/d
else -> { /* Do Nothing */ }
}
}
return GET(url.toString())
return GET(url.build())
}
private class StatusFilter : SelectFilter(

View File

@ -55,7 +55,7 @@ class Ngomik : MangaThemesia("Ngomik", "https://ngomik.net", "id", "/manga") {
else -> { /* Do Nothing */ }
}
}
return GET(url.toString())
return GET(url.build())
}
override fun headersBuilder(): Headers.Builder = Headers.Builder()

View File

@ -5,7 +5,7 @@ import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.source.model.Filter
import eu.kanade.tachiyomi.source.model.FilterList
import eu.kanade.tachiyomi.source.model.SManga
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.Request
import org.jsoup.nodes.Element
import java.text.SimpleDateFormat
@ -38,7 +38,7 @@ class Komikita : ZManga(
}
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
var url = "$baseUrl/${pagePathSegment(page)}".toHttpUrlOrNull()!!.newBuilder()
var url = "$baseUrl/${pagePathSegment(page)}".toHttpUrl().newBuilder()
url.addQueryParameter("s", query)
(if (filters.isEmpty()) getFilterList() else filters).forEach { filter ->
when (filter) {
@ -51,13 +51,13 @@ class Komikita : ZManga(
is ProjectFilter -> {
if (filter.toUriPart() == "project-filter-on") {
url =
"$baseUrl$projectPageString/page/$page".toHttpUrlOrNull()!!.newBuilder()
"$baseUrl$projectPageString/page/$page".toHttpUrl().newBuilder()
}
}
else -> {}
}
}
return GET(url.toString(), headers)
return GET(url.build(), headers)
}
override fun getFilterList(): FilterList {

View File

@ -5,7 +5,7 @@ import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.source.model.Filter
import eu.kanade.tachiyomi.source.model.FilterList
import eu.kanade.tachiyomi.source.model.SManga
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.Request
import org.jsoup.nodes.Element
import java.text.SimpleDateFormat
@ -32,20 +32,20 @@ class KomikPlay : ZManga("KomikPlay", "https://komikplay.com", "id", SimpleDateF
}
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
var url = "$baseUrl/${pagePathSegment(page)}".toHttpUrlOrNull()!!.newBuilder()
var url = "$baseUrl/${pagePathSegment(page)}".toHttpUrl().newBuilder()
url.addQueryParameter("s", query)
(if (filters.isEmpty()) getFilterList() else filters).forEach { filter ->
when (filter) {
// if site has project page, default value "hasProjectPage" = false
is ProjectFilter -> {
if (filter.toUriPart() == "project-filter-on") {
url = "$baseUrl$projectPageString/page/$page".toHttpUrlOrNull()!!.newBuilder()
url = "$baseUrl$projectPageString/page/$page".toHttpUrl().newBuilder()
}
}
else -> {}
}
}
return GET(url.toString(), headers)
return GET(url.build(), headers)
}
override fun getFilterList() = FilterList(

View File

@ -6,7 +6,7 @@ import eu.kanade.tachiyomi.network.interceptor.rateLimit
import eu.kanade.tachiyomi.source.model.Filter
import eu.kanade.tachiyomi.source.model.FilterList
import eu.kanade.tachiyomi.source.model.SManga
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient
import okhttp3.Request
import org.jsoup.nodes.Element
@ -58,20 +58,20 @@ class SekteKomik : ZManga("Sekte Komik", "https://sektekomik.com", "id") {
// search
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
var url = "$baseUrl/${pagePathSegment(page)}".toHttpUrlOrNull()!!.newBuilder()
var url = "$baseUrl/${pagePathSegment(page)}".toHttpUrl().newBuilder()
url.addQueryParameter("s", query)
(if (filters.isEmpty()) getFilterList() else filters).forEach { filter ->
when (filter) {
// if site has project page, default value "hasProjectPage" = false
is ProjectFilter -> {
if (filter.toUriPart() == "project-filter-on") {
url = "$baseUrl$projectPageString/${pagePathSegment(page)}".toHttpUrlOrNull()!!.newBuilder()
url = "$baseUrl$projectPageString/${pagePathSegment(page)}".toHttpUrl().newBuilder()
}
}
else -> {}
}
}
return GET(url.toString(), headers)
return GET(url.build(), headers)
}
override fun searchMangaSelector() = "div.flexbox2-item"

View File

@ -42,7 +42,7 @@ abstract class BakaManga(
return if (query.isNotEmpty()) {
val url = "$baseUrl/page/$page".toHttpUrl().newBuilder()
.addQueryParameter("s", query)
GET(url.toString(), headers)
GET(url.build(), headers)
} else {
val filterList = if (filters.isEmpty()) getFilterList() else filters
val genreFilter = filterList.find { it is GenreFilter } as GenreFilter

View File

@ -10,7 +10,7 @@ import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.HttpSource
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.Response
@ -59,7 +59,7 @@ open class EroMuse(override val name: String, override val baseUrl: String) : Ht
if (url.contains(pageQueryRegex)) {
url.replace(pageQueryRegex, "page=$int")
} else {
val httpUrl = url.toHttpUrlOrNull()!!
val httpUrl = url.toHttpUrl()
val builder = if (httpUrl.pathSegments.last().toIntOrNull() is Int) {
httpUrl.newBuilder().removePathSegment(httpUrl.pathSegments.lastIndex)
} else {
@ -165,7 +165,7 @@ open class EroMuse(override val name: String, override val baseUrl: String) : Ht
protected fun stackRequest(): Request {
stackItem = pageStack.removeLast()
val url = if (stackItem.pageType == AUTHOR && currentSortingMode.isNotEmpty() && !stackItem.url.contains("sort")) {
stackItem.url.toHttpUrlOrNull()!!.newBuilder().addQueryParameter("sort", currentSortingMode).toString()
stackItem.url.toHttpUrl().newBuilder().addQueryParameter("sort", currentSortingMode).toString()
} else {
stackItem.url
}
@ -208,14 +208,14 @@ open class EroMuse(override val name: String, override val baseUrl: String) : Ht
currentSortingMode = filterList.filterIsInstance<SortFilter>().first().toQueryValue()
if (query.isNotBlank()) {
val url = "$baseUrl/search?q=$query".toHttpUrlOrNull()!!.newBuilder().apply {
val url = "$baseUrl/search?q=$query".toHttpUrl().newBuilder().apply {
if (currentSortingMode.isNotEmpty()) addQueryParameter("sort", currentSortingMode)
addQueryParameter("page", "1")
}
pageStack.addLast(StackItem(url.toString(), SEARCH_RESULTS_OR_BASE))
} else {
val albumFilter = filterList.filterIsInstance<AlbumFilter>().first().selection()
val url = "$baseUrl/comics/${albumFilter.pathSegments}".toHttpUrlOrNull()!!.newBuilder().apply {
val url = "$baseUrl/comics/${albumFilter.pathSegments}".toHttpUrl().newBuilder().apply {
if (currentSortingMode.isNotEmpty()) addQueryParameter("sort", currentSortingMode)
if (albumFilter.pageType != AUTHOR) addQueryParameter("page", "1")
}

View File

@ -122,7 +122,7 @@ abstract class FansubsCat(
if (query.isNotBlank()) {
builder.addQueryParameter("query", query)
}
return GET(builder.toString(), headers)
return GET(builder.build(), headers)
}
override fun searchMangaParse(response: Response): MangasPage = parseMangaFromJson(response)

View File

@ -11,7 +11,7 @@ import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.Response
@ -65,7 +65,7 @@ abstract class FMReader(
GET("$baseUrl/$requestPath?listType=pagination&page=$page&$popularSort&sort_type=DESC", headers)
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
val url = "$baseUrl/$requestPath?".toHttpUrlOrNull()!!.newBuilder()
val url = "$baseUrl/$requestPath?".toHttpUrl().newBuilder()
.addQueryParameter("name", query)
.addQueryParameter("page", page.toString())
(if (filters.isEmpty()) getFilterList() else filters).forEach { filter ->
@ -101,7 +101,7 @@ abstract class FMReader(
else -> {}
}
}
return GET(url.toString(), headers)
return GET(url.build(), headers)
}
override fun latestUpdatesRequest(page: Int): Request =

View File

@ -8,7 +8,7 @@ import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.Response
@ -58,7 +58,7 @@ abstract class Gattsu(
override fun latestUpdatesNextPageSelector(): String = "ul.paginacao li.next > a"
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
val searchUrl = "$baseUrl/page/$page/".toHttpUrlOrNull()!!.newBuilder()
val searchUrl = "$baseUrl/page/$page/".toHttpUrl().newBuilder()
.addQueryParameter("s", query)
.addQueryParameter("post_type", "post")
.toString()

View File

@ -21,6 +21,7 @@ import kotlinx.serialization.json.jsonObject
import kotlinx.serialization.json.jsonPrimitive
import okhttp3.Call
import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.Interceptor
import okhttp3.MediaType.Companion.toMediaType
@ -92,10 +93,10 @@ abstract class GigaViewer(
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
if (query.isNotEmpty()) {
val url = "$baseUrl/search".toHttpUrlOrNull()!!.newBuilder()
val url = "$baseUrl/search".toHttpUrl().newBuilder()
.addQueryParameter("q", query)
return GET(url.toString(), headers)
return GET(url.build(), headers)
}
val collectionSelected = (filters[0] as CollectionFilter).selected
@ -138,7 +139,7 @@ abstract class GigaViewer(
val document = response.asJsoup()
val readableProductList = document.selectFirst("div.js-readable-product-list")!!
val firstListEndpoint = readableProductList.attr("data-first-list-endpoint")
.toHttpUrlOrNull()!!
.toHttpUrl()
val latestListEndpoint = readableProductList.attr("data-latest-list-endpoint")
.toHttpUrlOrNull() ?: firstListEndpoint
val numberSince = latestListEndpoint.queryParameter("number_since")!!.toFloat()
@ -214,7 +215,7 @@ abstract class GigaViewer(
return episode.readableProduct.pageStructure.pages
.filter { it.type == "main" }
.mapIndexed { i, page ->
val imageUrl = page.src.toHttpUrlOrNull()!!.newBuilder()
val imageUrl = page.src.toHttpUrl().newBuilder()
.addQueryParameter("width", page.width.toString())
.addQueryParameter("height", page.height.toString())
.toString()

View File

@ -15,7 +15,7 @@ import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.Response
@ -101,7 +101,7 @@ abstract class GroupLe(
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
val url =
"$baseUrl/search/advancedResults?offset=${50 * (page - 1)}".toHttpUrlOrNull()!!
"$baseUrl/search/advancedResults?offset=${50 * (page - 1)}".toHttpUrl()
.newBuilder()
if (query.isNotEmpty()) {
url.addQueryParameter("q", query)

View File

@ -24,7 +24,7 @@ import kotlinx.serialization.json.jsonArray
import kotlinx.serialization.json.jsonObject
import kotlinx.serialization.json.jsonPrimitive
import kotlinx.serialization.json.put
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.Interceptor
import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.Request
@ -79,7 +79,7 @@ abstract class HentaiHand(
}
override fun popularMangaRequest(page: Int): Request {
val url = "$baseUrl/api/comics".toHttpUrlOrNull()!!.newBuilder()
val url = "$baseUrl/api/comics".toHttpUrl().newBuilder()
.addQueryParameter("page", page.toString())
.addQueryParameter("sort", "popularity")
.addQueryParameter("order", "desc")
@ -88,7 +88,7 @@ abstract class HentaiHand(
url.addQueryParameter("languages[${-index - 1}]", it.toString())
}
// if (altLangId != null) url.addQueryParameter("languages", altLangId.toString())
return GET(url.toString())
return GET(url.build())
}
// Latest
@ -96,7 +96,7 @@ abstract class HentaiHand(
override fun latestUpdatesParse(response: Response): MangasPage = popularMangaParse(response)
override fun latestUpdatesRequest(page: Int): Request {
val url = "$baseUrl/api/comics".toHttpUrlOrNull()!!.newBuilder()
val url = "$baseUrl/api/comics".toHttpUrl().newBuilder()
.addQueryParameter("page", page.toString())
.addQueryParameter("sort", "uploaded_at")
.addQueryParameter("order", "desc")
@ -104,7 +104,7 @@ abstract class HentaiHand(
hhLangId.forEachIndexed { index, it ->
url.addQueryParameter("languages[${-index - 1}]", it.toString())
}
return GET(url.toString())
return GET(url.build())
}
// Search
@ -130,7 +130,7 @@ abstract class HentaiHand(
}
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
val url = "$baseUrl/api/comics".toHttpUrlOrNull()!!.newBuilder()
val url = "$baseUrl/api/comics".toHttpUrl().newBuilder()
.addQueryParameter("page", page.toString())
.addQueryParameter("q", query)
@ -162,7 +162,7 @@ abstract class HentaiHand(
}
}
return GET(url.toString())
return GET(url.build())
}
// Details

View File

@ -31,7 +31,7 @@ import kotlinx.serialization.json.jsonArray
import kotlinx.serialization.json.jsonObject
import kotlinx.serialization.json.jsonPrimitive
import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.Interceptor
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient
@ -544,7 +544,7 @@ abstract class LibGroup(
val resBody = tokenResponse.body.string()
csrfToken = "_token\" content=\"(.*)\"".toRegex().find(resBody)!!.groups[1]!!.value
}
val url = "$baseUrl/filterlist?page=$page&chapters[min]=1".toHttpUrlOrNull()!!.newBuilder()
val url = "$baseUrl/filterlist?page=$page&chapters[min]=1".toHttpUrl().newBuilder()
if (query.isNotEmpty()) {
url.addQueryParameter("name", query)
}

View File

@ -27,7 +27,7 @@ import kotlinx.serialization.json.jsonObject
import kotlinx.serialization.json.jsonPrimitive
import okhttp3.CacheControl
import okhttp3.FormBody
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.Response
@ -209,7 +209,7 @@ abstract class Madara(
protected open fun searchPage(page: Int): String = "page/$page/"
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
val url = "$baseUrl/${searchPage(page)}".toHttpUrlOrNull()!!.newBuilder()
val url = "$baseUrl/${searchPage(page)}".toHttpUrl().newBuilder()
url.addQueryParameter("s", query)
url.addQueryParameter("post_type", "wp-manga")
filters.forEach { filter ->
@ -257,7 +257,7 @@ abstract class Madara(
else -> {}
}
}
return GET(url.toString(), headers)
return GET(url.build(), headers)
}
protected open val authorFilterTitle: String = when (lang) {

View File

@ -114,7 +114,7 @@ abstract class MadTheme(
}
}
return GET(url.toString(), headers)
return GET(url.build(), headers)
}
override fun searchMangaSelector(): String = ".book-detailed-item"

View File

@ -10,7 +10,7 @@ import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.Response
@ -80,7 +80,7 @@ abstract class MangaBox(
return if (query.isNotBlank() && getAdvancedGenreFilters().isEmpty()) {
GET("$baseUrl/$simpleQueryPath${normalizeSearchQuery(query)}?page=$page", headers)
} else {
val url = baseUrl.toHttpUrlOrNull()!!.newBuilder()
val url = baseUrl.toHttpUrl().newBuilder()
if (getAdvancedGenreFilters().isNotEmpty()) {
url.addPathSegment("advanced_search")
url.addQueryParameter("page", page.toString())
@ -113,7 +113,7 @@ abstract class MangaBox(
}
}
}
GET(url.toString(), headers)
GET(url.build(), headers)
}
}
@ -210,7 +210,7 @@ abstract class MangaBox(
url = it.attr("abs:href").substringAfter(baseUrl) // intentionally not using setUrlWithoutDomain
name = it.text()
scanlator =
it.attr("abs:href").toHttpUrlOrNull()!!.host // show where chapters are actually from
it.attr("abs:href").toHttpUrl().host // show where chapters are actually from
}
date_upload = parseChapterDate(element.selectDateFromElement().text(), scanlator!!) ?: 0
}

View File

@ -163,7 +163,7 @@ abstract class MangaHub(
// search
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
val url = "$baseUrl/search/page/$page".toHttpUrlOrNull()!!.newBuilder()
val url = "$baseUrl/search/page/$page".toHttpUrl().newBuilder()
url.addQueryParameter("q", query)
(if (filters.isEmpty()) getFilterList() else filters).forEach { filter ->
when (filter) {
@ -178,7 +178,7 @@ abstract class MangaHub(
else -> {}
}
}
return GET(url.toString(), headers)
return GET(url.build(), headers)
}
override fun searchMangaSelector() = popularMangaSelector()

View File

@ -10,7 +10,7 @@ import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.Response
@ -78,7 +78,7 @@ abstract class MangaWorld(
override fun latestUpdatesParse(response: Response): MangasPage = searchMangaParse(response)
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
val url = "$baseUrl/archive?page=$page".toHttpUrlOrNull()!!.newBuilder()
val url = "$baseUrl/archive?page=$page".toHttpUrl().newBuilder()
url.addQueryParameter("keyword", query)
filters.forEach { filter ->
@ -100,7 +100,7 @@ abstract class MangaWorld(
else -> {}
}
}
return GET(url.toString(), headers)
return GET(url.build(), headers)
}
override fun mangaDetailsParse(document: Document): SManga {

View File

@ -8,7 +8,7 @@ import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.Response
@ -67,7 +67,7 @@ abstract class Paprika(
return if (query.isNotBlank()) {
GET("$baseUrl/search?q=$query&page=$page")
} else {
val url = "$baseUrl/mangas/".toHttpUrlOrNull()!!.newBuilder()
val url = "$baseUrl/mangas/".toHttpUrl().newBuilder()
filters.forEach { filter ->
when (filter) {
is GenreFilter -> url.addPathSegment(filter.toUriPart())
@ -76,7 +76,7 @@ abstract class Paprika(
}
}
url.addQueryParameter("page", page.toString())
GET(url.toString(), headers)
GET(url.build(), headers)
}
}

View File

@ -5,7 +5,7 @@ import eu.kanade.tachiyomi.source.model.FilterList
import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.Request
import okhttp3.Response
import org.jsoup.nodes.Document
@ -36,7 +36,7 @@ abstract class PaprikaAlt(
return if (query.isNotBlank()) {
GET("$baseUrl/search?s=$query&post_type=manga&page=$page")
} else {
val url = "$baseUrl/genres/".toHttpUrlOrNull()!!.newBuilder()
val url = "$baseUrl/genres/".toHttpUrl().newBuilder()
filters.forEach { filter ->
when (filter) {
is GenreFilter -> url.addPathSegment(filter.toUriPart())
@ -45,7 +45,7 @@ abstract class PaprikaAlt(
}
}
url.addQueryParameter("page", page.toString())
GET(url.toString(), headers)
GET(url.build(), headers)
}
}

View File

@ -18,6 +18,7 @@ import okhttp3.Cookie
import okhttp3.CookieJar
import okhttp3.Headers
import okhttp3.HttpUrl
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.Interceptor
import okhttp3.OkHttpClient
@ -178,13 +179,13 @@ open class Webtoons(
}
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
val url = "$baseUrl/$langCode/search?keyword=$query".toHttpUrlOrNull()?.newBuilder()!!
val url = "$baseUrl/$langCode/search?keyword=$query".toHttpUrl().newBuilder()
val uriPart = (filters.find { it is SearchType } as? SearchType)?.toUriPart() ?: ""
url.addQueryParameter("searchType", uriPart)
if (uriPart != "WEBTOON" && page > 1) url.addQueryParameter("page", page.toString())
return GET(url.toString(), headers)
return GET(url.build(), headers)
}
override fun searchMangaSelector() = "#content > div.card_wrap.search ul:not(#filterLayer) li a"

View File

@ -17,7 +17,7 @@ import kotlinx.serialization.json.jsonObject
import kotlinx.serialization.json.jsonPrimitive
import kotlinx.serialization.json.long
import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.Request
import okhttp3.Response
import org.jsoup.nodes.Document
@ -34,8 +34,8 @@ open class WebtoonsTranslate(
// popularMangaRequest already returns manga sorted by latest update
override val supportsLatest = false
private val apiBaseUrl = "https://global.apis.naver.com".toHttpUrlOrNull()!!
private val mobileBaseUrl = "https://m.webtoons.com".toHttpUrlOrNull()!!
private val apiBaseUrl = "https://global.apis.naver.com".toHttpUrl()
private val mobileBaseUrl = "https://m.webtoons.com".toHttpUrl()
private val thumbnailBaseUrl = "https://mwebtoon-phinf.pstatic.net"
private val pageSize = 24
@ -53,7 +53,7 @@ open class WebtoonsTranslate(
.addQueryParameter("size", "$requeztSize")
.addQueryParameter("languageCode", translateLangCode)
.build()
return GET(url.toString(), headers)
return GET(url, headers)
}
// Webtoons translations doesn't really have a "popular" sort; just "UPDATE", "TITLE_ASC",
@ -161,7 +161,7 @@ open class WebtoonsTranslate(
override fun pageListParse(document: Document): List<Page> = throw Exception("Not used")
override fun chapterListRequest(manga: SManga): Request {
val mangaUrl = manga.url.toHttpUrlOrNull()!!
val mangaUrl = manga.url.toHttpUrl()
val titleNo = mangaUrl.queryParameter("titleNo")
val teamVersion = mangaUrl.queryParameter("teamVersion")
val chapterListUrl = apiBaseUrl
@ -210,7 +210,7 @@ open class WebtoonsTranslate(
}
override fun pageListRequest(chapter: SChapter): Request {
return GET(apiBaseUrl.resolve(chapter.url).toString(), headers)
return GET(apiBaseUrl.resolve(chapter.url)!!, headers)
}
override fun pageListParse(response: Response): List<Page> {

View File

@ -8,7 +8,7 @@ import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient
import okhttp3.Request
import org.jsoup.nodes.Document
@ -78,7 +78,7 @@ abstract class WPComics(
return if (filterList.isEmpty()) {
GET("$baseUrl/?s=$query&post_type=comics&page=$page")
} else {
val url = "$baseUrl/$searchPath".toHttpUrlOrNull()!!.newBuilder()
val url = "$baseUrl/$searchPath".toHttpUrl().newBuilder()
filterList.forEach { filter ->
when (filter) {

View File

@ -7,7 +7,7 @@ import eu.kanade.tachiyomi.source.model.Page
import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient
import okhttp3.Request
import org.jsoup.nodes.Document
@ -58,7 +58,7 @@ abstract class ZManga(
// search
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
var url = "$baseUrl/advanced-search/${pagePathSegment(page)}".toHttpUrlOrNull()!!.newBuilder()
var url = "$baseUrl/advanced-search/${pagePathSegment(page)}".toHttpUrl().newBuilder()
url.addQueryParameter("title", query)
(if (filters.isEmpty()) getFilterList() else filters).forEach { filter ->
when (filter) {
@ -90,13 +90,13 @@ abstract class ZManga(
// if site has project page, default value "hasProjectPage" = false
is ProjectFilter -> {
if (filter.toUriPart() == "project-filter-on") {
url = "$baseUrl$projectPageString/page/$page".toHttpUrlOrNull()!!.newBuilder()
url = "$baseUrl$projectPageString/page/$page".toHttpUrl().newBuilder()
}
}
else -> {}
}
}
return GET(url.toString(), headers)
return GET(url.build(), headers)
}
open val projectPageString = "/project-list"

View File

@ -27,7 +27,6 @@ import kotlinx.serialization.json.jsonObject
import kotlinx.serialization.json.jsonPrimitive
import okhttp3.FormBody
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.Response
@ -160,13 +159,13 @@ open class BatoTo(
else -> { /* Do Nothing */ }
}
}
client.newCall(GET(url.build().toString(), headers)).asObservableSuccess()
client.newCall(GET(url.build(), headers)).asObservableSuccess()
.map { response ->
queryParse(response)
}
}
else -> {
val url = "$baseUrl/browse".toHttpUrlOrNull()!!.newBuilder()
val url = "$baseUrl/browse".toHttpUrl().newBuilder()
var min = ""
var max = ""
filters.forEach { filter ->
@ -232,7 +231,7 @@ open class BatoTo(
url.addQueryParameter("chapters", "$min-$max")
}
client.newCall(GET(url.build().toString(), headers)).asObservableSuccess()
client.newCall(GET(url.build(), headers)).asObservableSuccess()
.map { response ->
queryParse(response)
}

View File

@ -109,7 +109,7 @@ class Hennojin(override val lang: String, suffix: String) : ParsedHttpSource() {
private inline fun HttpUrl.request(
block: HttpUrl.Builder.() -> HttpUrl.Builder,
) = GET(newBuilder().block().toString(), headers)
) = GET(newBuilder().block().build(), headers)
private inline val Response.date: Long
get() = headers["Last-Modified"]?.run(httpDate::parse)?.time ?: 0L

View File

@ -11,7 +11,7 @@ import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.jsonObject
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.Response
@ -111,14 +111,14 @@ class IMHentai(override val lang: String, private val imhLang: String) : ParsedH
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
if (filters.any { it is LanguageFilters && it.state.any { it.name == LANGUAGE_SPEECHLESS && it.state } }) { // edge case for language = speechless
val url = "$baseUrl/language/speechless/".toHttpUrlOrNull()!!.newBuilder()
val url = "$baseUrl/language/speechless/".toHttpUrl().newBuilder()
if ((if (filters.isEmpty()) getFilterList() else filters).filterIsInstance<SortOrderFilter>()[0].state == 0) {
url.addPathSegment("popular")
}
return GET(url.toString())
return GET(url.build())
} else {
val url = "$baseUrl/search".toHttpUrlOrNull()!!.newBuilder()
val url = "$baseUrl/search".toHttpUrl().newBuilder()
.addQueryParameter("key", query)
.addQueryParameter("page", page.toString())
.addQueryParameter(getLanguageURIByName(imhLang).uri, toBinary(true)) // main language always enabled
@ -143,7 +143,7 @@ class IMHentai(override val lang: String, private val imhLang: String) : ParsedH
else -> {}
}
}
return GET(url.toString())
return GET(url.build())
}
}

View File

@ -29,7 +29,7 @@ import kotlinx.serialization.json.long
import kotlinx.serialization.json.put
import kotlinx.serialization.json.putJsonArray
import kotlinx.serialization.json.putJsonObject
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.Interceptor
import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.OkHttpClient
@ -206,7 +206,7 @@ abstract class Luscious(
private fun buildAlbumListRequest(page: Int, filters: FilterList, query: String = ""): Request {
val input = buildAlbumListRequestInput(page, filters, query)
val url = apiBaseUrl.toHttpUrlOrNull()!!.newBuilder()
val url = apiBaseUrl.toHttpUrl().newBuilder()
.addQueryParameter("operationName", "AlbumList")
.addQueryParameter("query", ALBUM_LIST_REQUEST_GQL)
.addQueryParameter("variables", input.toString())
@ -238,7 +238,7 @@ abstract class Luscious(
private fun buildAlbumInfoRequest(id: String): Request {
val input = buildAlbumInfoRequestInput(id)
val url = apiBaseUrl.toHttpUrlOrNull()!!.newBuilder()
val url = apiBaseUrl.toHttpUrl().newBuilder()
.addQueryParameter("operationName", "AlbumGet")
.addQueryParameter("query", albumInfoQuery)
.addQueryParameter("variables", input.toString())
@ -337,7 +337,7 @@ abstract class Luscious(
private fun buildAlbumPicturesPageUrl(id: String, page: Int): String {
val input = buildAlbumPicturesRequestInput(id, page)
return apiBaseUrl.toHttpUrlOrNull()!!.newBuilder()
return apiBaseUrl.toHttpUrl().newBuilder()
.addQueryParameter("operationName", "AlbumListOwnPictures")
.addQueryParameter("query", ALBUM_PICTURES_REQUEST_GQL)
.addQueryParameter("variables", input.toString())

View File

@ -27,7 +27,7 @@ import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.model.UpdateStrategy
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.Response
@ -146,13 +146,13 @@ open class NHentai(
filterList.findInstance<OffsetPageFilter>()?.state?.toIntOrNull()?.plus(page) ?: page
if (favoriteFilter?.state == true) {
val url = "$baseUrl/favorites".toHttpUrlOrNull()!!.newBuilder()
val url = "$baseUrl/favorites".toHttpUrl().newBuilder()
.addQueryParameter("q", "$fixedQuery $advQuery")
.addQueryParameter("page", offsetPage.toString())
return GET(url.toString(), headers)
return GET(url.build(), headers)
} else {
val url = "$baseUrl/search".toHttpUrlOrNull()!!.newBuilder()
val url = "$baseUrl/search".toHttpUrl().newBuilder()
.addQueryParameter("q", "$fixedQuery $nhLangSearch$advQuery")
.addQueryParameter("page", offsetPage.toString())
@ -162,7 +162,7 @@ open class NHentai(
}
}
return GET(url.toString(), headers)
return GET(url.build(), headers)
}
}

View File

@ -8,7 +8,7 @@ import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient
import okhttp3.Request
import org.jsoup.nodes.Document
@ -137,7 +137,7 @@ open class NineManga(
override fun imageUrlParse(document: Document) = document.select("div.pic_box img.manga_pic").first()!!.attr("src").orEmpty()
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
val url = "$baseUrl/search/".toHttpUrlOrNull()!!.newBuilder()
val url = "$baseUrl/search/".toHttpUrl().newBuilder()
url.addQueryParameter("wd", query)
url.addQueryParameter("page", page.toString())
@ -166,7 +166,7 @@ open class NineManga(
url.addQueryParameter("type", "high")
return GET(url.toString(), headers)
return GET(url.build(), headers)
}
override fun searchMangaSelector() = popularMangaSelector()

View File

@ -76,7 +76,7 @@ class Photos18 : HttpSource(), ConfigurableSource {
if (filter is QueryFilter) filter.addQueryTo(url)
}
return GET(url.toString(), headers)
return GET(url.build(), headers)
}
override fun searchMangaParse(response: Response) = popularMangaParse(response)

View File

@ -6,6 +6,7 @@ import eu.kanade.tachiyomi.source.model.Page
import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.HttpSource
import eu.kanade.tachiyomi.util.asJsoup
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.json.Json
import okhttp3.Headers
@ -13,7 +14,6 @@ import okhttp3.HttpUrl
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.Request
import okhttp3.Response
import org.jsoup.Jsoup
import rx.Observable
import uy.kohesive.injekt.injectLazy
@ -191,7 +191,7 @@ class Pixiv(override val lang: String) : HttpSource() {
for (p in countUp(start = 1)) {
searchUsers.url.setEncodedQueryParameter("p", p.toString())
val userIds = Jsoup.parse(searchUsers.execute().body.string())
val userIds = searchUsers.execute().asJsoup()
.select(".user-recommendation-item > a").eachAttr("href")
.map { it.substringAfterLast('/') }

View File

@ -80,7 +80,7 @@ class REManga : ParsedHttpSource() {
else -> {}
}
}
return GET(url.toString(), headers)
return GET(url.build(), headers)
}
override fun searchMangaSelector() = popularMangaSelector()

View File

@ -45,7 +45,7 @@ class MangaRok : ParsedHttpSource() {
.addQueryParameter("q", query)
.addQueryParameter("page", page.toString())
return GET(url.toString(), headers)
return GET(url.build(), headers)
}
override fun searchMangaSelector(): String =
".is-half > a.box"

View File

@ -8,7 +8,7 @@ import eu.kanade.tachiyomi.source.model.Page
import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.OkHttpClient
import okhttp3.Request
@ -70,7 +70,7 @@ class Comicastle : ParsedHttpSource() {
// Search
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
val url = "$baseUrl/library/search".toHttpUrlOrNull()!!.newBuilder()
val url = "$baseUrl/library/search".toHttpUrl().newBuilder()
var rBody: RequestBody? = null
(filters.let { if (it.isEmpty()) getFilterList() else filters })

View File

@ -10,7 +10,7 @@ import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.Response
@ -91,7 +91,7 @@ class Eggporncomics : ParsedHttpSource() {
return if (query.isNotBlank()) {
GET("$baseUrl/search/${query.replace(queryRegex, "-")}?page=$page", headers)
} else {
val url = baseUrl.toHttpUrlOrNull()!!.newBuilder()
val url = baseUrl.toHttpUrl().newBuilder()
val filterList = if (filters.isEmpty()) getFilterList() else filters
val category = filterList.find { it is CategoryFilter } as UriPartFilter
val comics = filterList.find { it is ComicsFilter } as UriPartFilter
@ -110,7 +110,7 @@ class Eggporncomics : ParsedHttpSource() {
url.addQueryParameter("page", page.toString())
GET(url.toString(), headers)
GET(url.build(), headers)
}
}

View File

@ -16,7 +16,7 @@ import kotlinx.serialization.json.JsonArray
import kotlinx.serialization.json.jsonPrimitive
import okhttp3.Credentials
import okhttp3.HttpUrl
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.Response
@ -87,7 +87,7 @@ class Madokami : ConfigurableSource, ParsedHttpSource() {
override fun searchMangaNextPageSelector(): String? = null
override fun mangaDetailsRequest(manga: SManga): Request {
val url = (baseUrl + manga.url).toHttpUrlOrNull()!!
val url = (baseUrl + manga.url).toHttpUrl()
if (url.pathSize > 5 && url.pathSegments[0] == "Manga" && url.pathSegments[1].length == 1) {
val builder = url.newBuilder()
for (i in 5 until url.pathSize) { builder.removePathSegment(5) }

View File

@ -7,7 +7,7 @@ import eu.kanade.tachiyomi.source.model.Page
import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.Response
@ -72,7 +72,7 @@ class Mangafreak : ParsedHttpSource() {
// Search
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
val url = baseUrl.toHttpUrlOrNull()!!.newBuilder()
val url = baseUrl.toHttpUrl().newBuilder()
if (query.isNotBlank()) {
url.addPathSegments("Find/$query")
@ -97,7 +97,7 @@ class Mangafreak : ParsedHttpSource() {
}
}
return GET(url.toString(), headers)
return GET(url.build(), headers)
}
override fun searchMangaNextPageSelector(): String? = null
override fun searchMangaSelector(): String = "div.manga_search_item , div.mangaka_search_item"

View File

@ -14,7 +14,7 @@ import kotlinx.serialization.json.jsonArray
import kotlinx.serialization.json.jsonObject
import kotlinx.serialization.json.jsonPrimitive
import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient
import okhttp3.Request
import org.jsoup.nodes.Document
@ -69,7 +69,7 @@ class Mangahasu : ParsedHttpSource() {
override fun latestUpdatesNextPageSelector() = popularMangaNextPageSelector()
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
val url = "$baseUrl/advanced-search.html".toHttpUrlOrNull()!!.newBuilder()
val url = "$baseUrl/advanced-search.html".toHttpUrl().newBuilder()
url.addQueryParameter("keyword", query)
url.addQueryParameter("page", page.toString())
@ -107,7 +107,7 @@ class Mangahasu : ParsedHttpSource() {
}
}
}
return GET(url.toString(), headers)
return GET(url.build(), headers)
}
override fun searchMangaSelector() = latestUpdatesSelector()

View File

@ -13,7 +13,7 @@ import okhttp3.Cookie
import okhttp3.CookieJar
import okhttp3.Headers
import okhttp3.HttpUrl
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient
import okhttp3.Request
import org.jsoup.nodes.Document
@ -91,7 +91,7 @@ class Mangahere : ParsedHttpSource() {
override fun latestUpdatesNextPageSelector() = "div.pager-list-left a:last-child"
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
val url = "$baseUrl/search".toHttpUrlOrNull()!!.newBuilder()
val url = "$baseUrl/search".toHttpUrl().newBuilder()
filters.forEach { filter ->
when (filter) {
@ -137,7 +137,7 @@ class Mangahere : ParsedHttpSource() {
addEncodedQueryParameter("name", null)
}
return GET(url.toString(), headers)
return GET(url.build(), headers)
}
override fun searchMangaSelector() = ".manga-list-4-list > li"

View File

@ -9,7 +9,7 @@ import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient
import okhttp3.Request
import org.jsoup.nodes.Document
@ -69,7 +69,7 @@ class MangaJar : ParsedHttpSource() {
val genreFilter = filterList.findInstance<GenreList>()
val genre = genreFilter?.let { f -> f.values[f.state] }
val url = (if (genre!!.isEmpty()) "$baseUrl/search" else "$baseUrl/genre/$genre").toHttpUrlOrNull()!!.newBuilder()
val url = (if (genre!!.isEmpty()) "$baseUrl/search" else "$baseUrl/genre/$genre").toHttpUrl().newBuilder()
url.addQueryParameter("q", query)
url.addQueryParameter("page", page.toString())
@ -85,7 +85,7 @@ class MangaJar : ParsedHttpSource() {
else -> {}
}
}
return GET(url.toString(), headers)
return GET(url.build(), headers)
}
override fun searchMangaSelector() = popularMangaSelector()

View File

@ -14,7 +14,7 @@ import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.OkHttpClient
import okhttp3.Request
@ -86,12 +86,12 @@ class MangaKatana : ConfigurableSource, ParsedHttpSource() {
if (query.isNotEmpty()) {
val type = filterList.find { it is TypeFilter } as TypeFilter
val url = "$baseUrl/page/$page".toHttpUrlOrNull()!!.newBuilder()
val url = "$baseUrl/page/$page".toHttpUrl().newBuilder()
.addQueryParameter("search", query)
.addQueryParameter("search_by", type.toUriPart())
return GET(url.toString(), headers)
return GET(url.build(), headers)
} else {
val url = "$baseUrl/manga/page/$page".toHttpUrlOrNull()!!.newBuilder()
val url = "$baseUrl/manga/page/$page".toHttpUrl().newBuilder()
.addQueryParameter("filter", "1")
for (filter in filterList) {
when (filter) {
@ -125,7 +125,7 @@ class MangaKatana : ConfigurableSource, ParsedHttpSource() {
else -> {}
}
}
return GET(url.toString(), headers)
return GET(url.build(), headers)
}
}

View File

@ -98,7 +98,7 @@ class MangaMiso : HttpSource() {
// If no filters selected, default to "all"
if (tagCount == 0) { url.addPathSegment("all") }
GET(url.toString(), headers)
GET(url.build(), headers)
}
}
}
@ -123,7 +123,7 @@ class MangaMiso : HttpSource() {
.addQueryParameter("perPage", MANGA_PER_PAGE.toString())
.addQueryParameter("page", page.toString())
return GET(url.toString(), headers)
return GET(url.build(), headers)
}
override fun latestUpdatesParse(response: Response): MangasPage {

View File

@ -7,7 +7,7 @@ import eu.kanade.tachiyomi.source.model.Page
import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient
import okhttp3.Request
import org.jsoup.nodes.Document
@ -95,7 +95,7 @@ class MangaPill : ParsedHttpSource() {
override fun imageUrlParse(document: Document) = ""
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
val url = "$baseUrl/search".toHttpUrlOrNull()!!.newBuilder()
val url = "$baseUrl/search".toHttpUrl().newBuilder()
.addQueryParameter("page", page.toString())
.addQueryParameter("q", query)
@ -119,7 +119,7 @@ class MangaPill : ParsedHttpSource() {
else -> {}
}
}
return GET(url.toString(), headers)
return GET(url.build(), headers)
}
private class Type : UriPartFilter(

View File

@ -8,7 +8,7 @@ import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import okhttp3.FormBody
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient
import okhttp3.Request
import org.jsoup.nodes.Document
@ -158,7 +158,7 @@ class MangaRawClub : ParsedHttpSource() {
}
// Filter search
val url = "$baseUrl/browse-comics/".toHttpUrlOrNull()!!.newBuilder()
val url = "$baseUrl/browse-comics/".toHttpUrl().newBuilder()
val requestBody = FormBody.Builder()
url.addQueryParameter("results", page.toString())
@ -176,7 +176,7 @@ class MangaRawClub : ParsedHttpSource() {
else -> {}
}
}
return GET(url.toString(), headers)
return GET(url.build(), headers)
// return POST("$baseUrl/search", headers, requestBody.build()) // csrfmiddlewaretoken required
}

View File

@ -111,7 +111,7 @@ class MangaSect : ParsedHttpSource() {
addPathSegment("")
}
return GET(url.toString(), headers)
return GET(url.build(), headers)
}
override fun searchMangaParse(response: Response): MangasPage = popularMangaParse(response)

View File

@ -78,7 +78,7 @@ class Multporn : ParsedHttpSource() {
}
}
return GET(url.toString(), headers)
return GET(url.build(), headers)
}
override fun latestUpdatesRequest(page: Int) = buildLatestMangaRequest(page - 1)
@ -116,7 +116,7 @@ class Multporn : ParsedHttpSource() {
}
}
return GET(url.toString(), headers)
return GET(url.build(), headers)
}
private fun buildTextSearchFilterRequests(page: Int, filters: List<TextSearchFilter>): List<Request> {

View File

@ -94,7 +94,7 @@ class MyHentaiGallery : ParsedHttpSource() {
}
url.addPathSegment("$page")
GET(url.toString(), headers)
GET(url.build(), headers)
}
}

View File

@ -8,7 +8,7 @@ import eu.kanade.tachiyomi.source.model.Page
import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.Response
@ -53,11 +53,11 @@ open class RainOfSnow() : ParsedHttpSource() {
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
if (query.isNotEmpty()) {
val url = "$baseUrl/".toHttpUrlOrNull()!!.newBuilder()
val url = "$baseUrl/".toHttpUrl().newBuilder()
url.addQueryParameter("s", query)
return GET(url.build().toString(), headers)
return GET(url.build(), headers)
}
val url = "$baseUrl/comics/".toHttpUrlOrNull()!!.newBuilder()
val url = "$baseUrl/comics/".toHttpUrl().newBuilder()
filters.forEach { filter ->
when (filter) {
is AlbumTypeSelectFilter -> {
@ -68,7 +68,7 @@ open class RainOfSnow() : ParsedHttpSource() {
else -> {}
}
}
return GET(url.build().toString(), headers)
return GET(url.build(), headers)
}
override fun searchMangaSelector() = popularMangaSelector()

View File

@ -25,7 +25,7 @@ import okhttp3.Cookie
import okhttp3.CookieJar
import okhttp3.Headers
import okhttp3.HttpUrl
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.Response
@ -213,14 +213,14 @@ class Tapastic : ConfigurableSource, ParsedHttpSource() {
val url: HttpUrl.Builder
// If there is any search text, use text search, ignoring filters
if (query.isNotBlank()) {
url = "$baseUrl/search".toHttpUrlOrNull()!!.newBuilder()
url = "$baseUrl/search".toHttpUrl().newBuilder()
.addQueryParameter("q", query)
.addQueryParameter("t", "COMICS")
} else {
// Checking mature filter
val matureFilter = filterList.find { it is MatureFilter } as MatureFilter
if (matureFilter.state) {
url = "$baseUrl/mature".toHttpUrlOrNull()!!.newBuilder()
url = "$baseUrl/mature".toHttpUrl().newBuilder()
// Append only mature uri filters
filterList.forEach {
if (it is UriFilter && it.isMature) {
@ -228,7 +228,7 @@ class Tapastic : ConfigurableSource, ParsedHttpSource() {
}
}
} else {
url = "$baseUrl/comics".toHttpUrlOrNull()!!.newBuilder()
url = "$baseUrl/comics".toHttpUrl().newBuilder()
// Append only non-mature uri filters
filterList.forEach {
if (it is UriFilter && !it.isMature) {
@ -244,7 +244,7 @@ class Tapastic : ConfigurableSource, ParsedHttpSource() {
}
// Append page number
url.addQueryParameter("pageNumber", page.toString())
return GET(url.toString(), headers)
return GET(url.build(), headers)
}
override fun searchMangaNextPageSelector() =

View File

@ -14,7 +14,6 @@ import kotlinx.serialization.json.Json
import okhttp3.CacheControl
import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.Interceptor
import okhttp3.OkHttpClient
import okhttp3.Request
@ -325,7 +324,7 @@ open class Viz(
.add("X-Requested-With", "XMLHttpRequest")
.build()
val authCheckUrl = "$baseUrl/$MANGA_AUTH_CHECK_URL".toHttpUrlOrNull()!!.newBuilder()
val authCheckUrl = "$baseUrl/$MANGA_AUTH_CHECK_URL".toHttpUrl().newBuilder()
.addQueryParameter("device_id", "3")
.addQueryParameter("manga_id", mangaId)
.toString()

View File

@ -45,7 +45,7 @@ class VyvyManga : ParsedHttpSource() {
.addQueryParameter("q", query)
.addQueryParameter("page", page.toString())
return GET(url.toString(), headers)
return GET(url.build(), headers)
}
override fun searchMangaSelector(): String = ".comic-item"

View File

@ -9,7 +9,7 @@ import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.Request
import okhttp3.Response
import org.jsoup.nodes.Document
@ -81,7 +81,7 @@ class Webcomics : ParsedHttpSource() {
override fun searchMangaSelector() = ".wiki-book-list > .row"
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
val url = "$baseUrl/wiki.html?search=$query&page=$page".toHttpUrlOrNull()?.newBuilder()
val url = "$baseUrl/wiki.html?search=$query&page=$page".toHttpUrl().newBuilder()
(if (filters.isEmpty()) getFilterList() else filters).forEach { filter ->
when (filter) {
is GenreFilter -> {
@ -91,7 +91,7 @@ class Webcomics : ParsedHttpSource() {
else -> {}
}
}
return GET(url.toString(), headers)
return GET(url.build(), headers)
}
override fun searchMangaParse(response: Response): MangasPage {

View File

@ -8,7 +8,7 @@ import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient
import okhttp3.Request
import org.jsoup.nodes.Document
@ -53,7 +53,7 @@ class Ikuhentai : ParsedHttpSource() {
}
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
val url = "$baseUrl/page/$page".toHttpUrlOrNull()!!.newBuilder()
val url = "$baseUrl/page/$page".toHttpUrl().newBuilder()
url.addQueryParameter("post_type", "wp-manga")
val pattern = "\\s+".toRegex()
val q = query.replace(pattern, "+")
@ -104,7 +104,7 @@ class Ikuhentai : ParsedHttpSource() {
}
}
return GET(url.toString(), headers)
return GET(url.build(), headers)
}
// max 200 results

View File

@ -19,7 +19,7 @@ import kotlinx.serialization.json.jsonObject
import kotlinx.serialization.json.jsonPrimitive
import okhttp3.FormBody
import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.Response
@ -210,7 +210,7 @@ class Kumanga : HttpSource() {
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
getKumangaToken()
val url = "$baseUrl/backend/ajax/searchengine.php?page=$page&perPage=10&keywords=$query&retrieveCategories=true&retrieveAuthors=false&contentType=manga&token=$kumangaToken".toHttpUrlOrNull()!!.newBuilder()
val url = "$baseUrl/backend/ajax/searchengine.php?page=$page&perPage=10&keywords=$query&retrieveCategories=true&retrieveAuthors=false&contentType=manga&token=$kumangaToken".toHttpUrl().newBuilder()
filters.forEach { filter ->
when (filter) {

View File

@ -22,7 +22,7 @@ import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.FormBody
import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.Response
@ -66,7 +66,7 @@ class LectorManga : ConfigurableSource, ParsedHttpSource() {
private fun OkHttpClient.Builder.rateLimitImageCDNs(hosts: Array<String>, permits: Int, period: Long): OkHttpClient.Builder {
hosts.forEach { host ->
rateLimitHost(host.toHttpUrlOrNull()!!, permits, period)
rateLimitHost(host.toHttpUrl(), permits, period)
}
return this
}
@ -74,7 +74,7 @@ class LectorManga : ConfigurableSource, ParsedHttpSource() {
private var loadWebView = true
override val client: OkHttpClient = network.client.newBuilder()
.rateLimitHost(
baseUrl.toHttpUrlOrNull()!!,
baseUrl.toHttpUrl(),
preferences.getString(WEB_RATELIMIT_PREF, WEB_RATELIMIT_PREF_DEFAULT_VALUE)!!.toInt(),
60,
)
@ -139,7 +139,7 @@ class LectorManga : ConfigurableSource, ParsedHttpSource() {
override fun latestUpdatesFromElement(element: Element) = popularMangaFromElement(element)
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
val url = "$baseUrl/library".toHttpUrlOrNull()!!.newBuilder()
val url = "$baseUrl/library".toHttpUrl().newBuilder()
url.addQueryParameter("title", query)
url.addQueryParameter("page", page.toString())
@ -213,7 +213,7 @@ class LectorManga : ConfigurableSource, ParsedHttpSource() {
}
}
return GET(url.build().toString(), headers)
return GET(url.build(), headers)
}
override fun searchMangaSelector() = popularMangaSelector()

View File

@ -55,7 +55,7 @@ class LeerCapitulo : ParsedHttpSource() {
val url = "$baseUrl/search-autocomplete".toHttpUrl().newBuilder()
.addQueryParameter("term", query)
return GET(url.toString(), headers)
return GET(url.build(), headers)
}
override fun searchMangaParse(response: Response): MangasPage {

View File

@ -10,7 +10,7 @@ import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.Cookie
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.Interceptor
import okhttp3.Request
import okhttp3.Response
@ -68,9 +68,9 @@ class ManhwasNet : ParsedHttpSource() {
.set("Referer", "$baseUrl/")
override fun popularMangaRequest(page: Int): Request {
val url = "$baseUrl/biblioteca".toHttpUrlOrNull()!!.newBuilder()
val url = "$baseUrl/biblioteca".toHttpUrl().newBuilder()
url.addQueryParameter("page", page.toString())
return GET(url.build().toString(), headers)
return GET(url.build(), headers)
}
override fun popularMangaSelector() = "ul > li > article.anime"
@ -98,7 +98,7 @@ class ManhwasNet : ParsedHttpSource() {
}
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
val url = "$baseUrl/biblioteca".toHttpUrlOrNull()!!.newBuilder()
val url = "$baseUrl/biblioteca".toHttpUrl().newBuilder()
if (query.isNotEmpty()) {
url.addQueryParameter("buscar", query)
} else {
@ -116,7 +116,7 @@ class ManhwasNet : ParsedHttpSource() {
}
}
url.addQueryParameter("page", page.toString())
return GET(url.build().toString(), headers)
return GET(url.build(), headers)
}
override fun searchMangaSelector() = popularMangaSelector()

View File

@ -114,7 +114,7 @@ class OlympusScanlation : HttpSource() {
}
url.addQueryParameter("type", "comic")
url.addQueryParameter("page", page.toString())
return GET(url.build().toString(), headers)
return GET(url.build(), headers)
}
override fun searchMangaParse(response: Response): MangasPage {

View File

@ -16,7 +16,6 @@ import eu.kanade.tachiyomi.source.model.UpdateStrategy
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.OkHttpClient
import okhttp3.Request
import org.jsoup.nodes.Document
@ -134,7 +133,7 @@ class TMOHentai : ConfigurableSource, ParsedHttpSource() {
override fun imageUrlParse(document: Document): String = document.select("div#content-images img.content-image").attr("abs:data-original")
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
val url = "$baseUrl/section/all?view=list".toHttpUrlOrNull()!!.newBuilder()
val url = "$baseUrl/section/all?view=list".toHttpUrl().newBuilder()
url.addQueryParameter("search[searchText]", query)
url.addQueryParameter("page", page.toString())
@ -165,7 +164,7 @@ class TMOHentai : ConfigurableSource, ParsedHttpSource() {
}
}
return GET(url.build().toString(), headers)
return GET(url.build(), headers)
}
override fun searchMangaSelector() = popularMangaSelector()

View File

@ -22,7 +22,7 @@ import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.FormBody
import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.Response
@ -61,7 +61,7 @@ class TuMangaOnline : ConfigurableSource, ParsedHttpSource() {
private fun OkHttpClient.Builder.rateLimitImageCDNs(hosts: Array<String>, permits: Int, period: Long): OkHttpClient.Builder {
hosts.forEach { host ->
rateLimitHost(host.toHttpUrlOrNull()!!, permits, period)
rateLimitHost(host.toHttpUrl(), permits, period)
}
return this
}
@ -104,7 +104,7 @@ class TuMangaOnline : ConfigurableSource, ParsedHttpSource() {
chain.proceed(request)
}
.rateLimitHost(
baseUrl.toHttpUrlOrNull()!!,
baseUrl.toHttpUrl(),
preferences.getString(WEB_RATELIMIT_PREF, WEB_RATELIMIT_PREF_DEFAULT_VALUE)!!.toInt(),
60,
)
@ -141,7 +141,7 @@ class TuMangaOnline : ConfigurableSource, ParsedHttpSource() {
override fun latestUpdatesFromElement(element: Element) = popularMangaFromElement(element)
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
val url = "$baseUrl/library".toHttpUrlOrNull()!!.newBuilder()
val url = "$baseUrl/library".toHttpUrl().newBuilder()
url.addQueryParameter("title", query)
if (getSFWModePref()) {
SFW_MODE_PREF_EXCLUDE_GENDERS.forEach { gender ->
@ -201,7 +201,7 @@ class TuMangaOnline : ConfigurableSource, ParsedHttpSource() {
else -> {}
}
}
return GET(url.build().toString(), headers)
return GET(url.build(), headers)
}
override fun searchMangaSelector() = popularMangaSelector()
override fun searchMangaNextPageSelector() = popularMangaNextPageSelector()

View File

@ -9,7 +9,7 @@ import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.model.UpdateStrategy
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.Request
import org.jsoup.nodes.Document
import org.jsoup.nodes.Element
@ -91,15 +91,15 @@ open class VCPVMP(override val name: String, override val baseUrl: String) : Par
protected open val genreSuffix = ""
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
var url = baseUrl.toHttpUrlOrNull()!!.newBuilder()
var url = baseUrl.toHttpUrl().newBuilder()
if (query.isNotBlank()) {
url = "$baseUrl/$urlSuffix".toHttpUrlOrNull()!!.newBuilder()
url = "$baseUrl/$urlSuffix".toHttpUrl().newBuilder()
url.addPathSegments("page")
url.addPathSegments(page.toString())
url.addQueryParameter("s", query)
return GET(url.build().toString(), headers)
return GET(url.build(), headers)
}
filters.forEach { filter ->
@ -117,7 +117,7 @@ open class VCPVMP(override val name: String, override val baseUrl: String) : Par
}
}
return GET(url.build().toString(), headers)
return GET(url.build(), headers)
}
override fun searchMangaSelector() = popularMangaSelector()

View File

@ -8,7 +8,7 @@ import eu.kanade.tachiyomi.source.model.Page
import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient
import okhttp3.Request
import org.jsoup.nodes.Document
@ -64,7 +64,7 @@ class BacaKomik : ParsedHttpSource() {
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
val builtUrl = if (page == 1) "$baseUrl/daftar-komik/" else "$baseUrl/daftar-komik/page/$page/?order="
val url = builtUrl.toHttpUrlOrNull()!!.newBuilder()
val url = builtUrl.toHttpUrl().newBuilder()
url.addQueryParameter("title", query)
url.addQueryParameter("page", page.toString())
filters.forEach { filter ->
@ -97,7 +97,7 @@ class BacaKomik : ParsedHttpSource() {
else -> {}
}
}
return GET(url.build().toString(), headers)
return GET(url.build(), headers)
}
override fun mangaDetailsParse(document: Document): SManga {
val infoElement = document.select("div.infoanime").first()!!

View File

@ -15,7 +15,7 @@ import kotlinx.serialization.json.jsonArray
import kotlinx.serialization.json.jsonObject
import kotlinx.serialization.json.jsonPrimitive
import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.Request
import okhttp3.Response
import org.jsoup.nodes.Document
@ -97,7 +97,7 @@ class ComicFx : ParsedHttpSource() {
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
val filterList = if (filters.isEmpty()) getFilterList() else filters
val url = "$baseUrl/filterList".toHttpUrlOrNull()!!.newBuilder()
val url = "$baseUrl/filterList".toHttpUrl().newBuilder()
for (filter in filterList) {
when (filter) {
@ -123,7 +123,7 @@ class ComicFx : ParsedHttpSource() {
url.addQueryParameter("page", page.toString())
// Unimplemented parameters: "alpha" (For filtering by alphabet) and "tag" (idk)
return GET(url.toString())
return GET(url.build())
}
override fun searchMangaSelector() = popularMangaSelector()

View File

@ -19,7 +19,7 @@ import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.FormBody
import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient
import okhttp3.Request
import org.jsoup.nodes.Document
@ -321,7 +321,7 @@ class DoujinDesu : ParsedHttpSource(), ConfigurableSource {
// Search & FIlter
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
val url = "$baseUrl/manga/page/$page/".toHttpUrlOrNull()?.newBuilder()!!
val url = "$baseUrl/manga/page/$page/".toHttpUrl().newBuilder()
.addQueryParameter("title", query)
(if (filters.isEmpty()) getFilterList() else filters).forEach { filter ->
when (filter) {
@ -349,7 +349,7 @@ class DoujinDesu : ParsedHttpSource(), ConfigurableSource {
else -> {}
}
}
return GET(url.toString(), headers)
return GET(url.build(), headers)
}
override fun searchMangaFromElement(element: Element): SManga =

View File

@ -7,7 +7,7 @@ import eu.kanade.tachiyomi.source.model.Page
import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient
import okhttp3.Request
import org.jsoup.nodes.Document
@ -55,7 +55,7 @@ class KomikIndoID : ParsedHttpSource() {
}
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
val url = "$baseUrl/daftar-manga/page/$page/".toHttpUrlOrNull()!!.newBuilder()
val url = "$baseUrl/daftar-manga/page/$page/".toHttpUrl().newBuilder()
.addQueryParameter("title", query)
filters.forEach { filter ->
when (filter) {
@ -120,7 +120,7 @@ class KomikIndoID : ParsedHttpSource() {
else -> {}
}
}
return GET(url.toString(), headers)
return GET(url.build(), headers)
}
override fun mangaDetailsParse(document: Document): SManga {
val infoElement = document.select("div.infoanime").first()!!

View File

@ -7,7 +7,7 @@ import eu.kanade.tachiyomi.source.model.Page
import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient
import okhttp3.Request
import org.jsoup.nodes.Document
@ -81,7 +81,7 @@ class Komiku : ParsedHttpSource() {
override fun searchMangaSelector() = popularMangaSelector()
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
var url = "$baseUrlData/page/$page/?post_type=manga".toHttpUrlOrNull()?.newBuilder()!!.addQueryParameter("s", query)
var url = "$baseUrlData/page/$page/?post_type=manga".toHttpUrl().newBuilder().addQueryParameter("s", query)
(if (filters.isEmpty()) getFilterList() else filters).forEach { filter ->
when (filter) {
is CategoryNames -> {
@ -107,13 +107,13 @@ class Komiku : ParsedHttpSource() {
is ProjectList -> {
val project = filter.values[filter.state]
if (project.key == "project-filter-on") {
url = ("$baseUrl/pustaka" + if (page > 1) "/page/$page/" else "" + "?tipe=projek").toHttpUrlOrNull()!!.newBuilder()
url = ("$baseUrl/pustaka" + if (page > 1) "/page/$page/" else "" + "?tipe=projek").toHttpUrl().newBuilder()
}
}
else -> {}
}
}
return GET(url.toString(), headers)
return GET(url.build(), headers)
}
override fun searchMangaFromElement(element: Element) = popularMangaFromElement(element)

View File

@ -10,7 +10,7 @@ import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.Response
@ -29,7 +29,7 @@ class AnimeGDRClub : ParsedHttpSource() {
override fun popularMangaRequest(page: Int): Request = GET("$baseUrl/serie.php", headers)
override fun latestUpdatesRequest(page: Int): Request = GET("$baseUrl/", headers)
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
val url = "$baseUrl/".toHttpUrlOrNull()!!.newBuilder()
val url = "$baseUrl/".toHttpUrl().newBuilder()
if (query.isNotEmpty()) {
url.addEncodedPathSegment("serie.php")
@ -118,7 +118,7 @@ class AnimeGDRClub : ParsedHttpSource() {
override fun latestUpdatesFromElement(element: Element): SManga {
val manga = SManga.create()
manga.setUrlWithoutDomain("http://www.agcscanlation.it/progetto.php?nome=${element.attr("href").toHttpUrlOrNull()!!.queryParameter("nome")}")
manga.setUrlWithoutDomain("http://www.agcscanlation.it/progetto.php?nome=${element.attr("href").toHttpUrl().queryParameter("nome")}")
manga.title = element.selectFirst(".titolo")!!.text()
manga.thumbnail_url = "$baseUrl/${element.selectFirst("img")!!.attr("src")}"

View File

@ -12,7 +12,7 @@ import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.FormBody
import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.Response
@ -36,7 +36,7 @@ class DemoneCeleste : ParsedHttpSource() {
override fun popularMangaRequest(page: Int): Request = GET("$baseUrl/manga", headers)
override fun latestUpdatesRequest(page: Int): Request = GET("$baseUrl/", headers)
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
val url = "$baseUrl/search?sez=serie".toHttpUrlOrNull()!!.newBuilder()
val url = "$baseUrl/search?sez=serie".toHttpUrl().newBuilder()
if (query.isNotEmpty()) {
url.addQueryParameter("key", query)

View File

@ -8,13 +8,13 @@ import eu.kanade.tachiyomi.source.model.Page
import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.HttpSource
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.Interceptor
import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.Response
import okhttp3.ResponseBody.Companion.toResponseBody
import org.jsoup.Jsoup
import uy.kohesive.injekt.injectLazy
import kotlin.experimental.xor
@ -31,7 +31,7 @@ class NicovideoSeiga : HttpSource() {
override fun latestUpdatesParse(response: Response): MangasPage {
val currentPage = response.request.url.queryParameter("page")!!.toInt()
val doc = Jsoup.parse(response.body.string())
val doc = response.asJsoup()
val mangaCount = doc.select("#main_title > h2 > span").text().trim().dropLast(1).toInt()
val mangaPerPage = 20
val mangaList = doc.select("#comic_list > ul > li")
@ -81,7 +81,7 @@ class NicovideoSeiga : HttpSource() {
override fun searchMangaParse(response: Response): MangasPage {
val currentPage = response.request.url.queryParameter("page")!!.toInt()
val doc = Jsoup.parse(response.body.string())
val doc = response.asJsoup()
val mangaCount =
doc.select("#mg_wrapper > div > div.header > div.header__result-summary").text().trim()
.split("")[1].toInt()
@ -118,7 +118,7 @@ class NicovideoSeiga : HttpSource() {
GET("$baseUrl/manga/search/?q=$query&page=$page&sort=score")
override fun mangaDetailsParse(response: Response): SManga = SManga.create().apply {
val doc = Jsoup.parse(response.body.string())
val doc = response.asJsoup()
// The description is a mix of synopsis and news announcements
// This is just how mangakas use this site
description =
@ -144,7 +144,7 @@ class NicovideoSeiga : HttpSource() {
}
override fun chapterListParse(response: Response): List<SChapter> {
val doc = Jsoup.parse(response.body.string())
val doc = response.asJsoup()
val chapters = ArrayList<SChapter>()
val chapterList = doc.select("#episode_list > ul > li")
val mangaId = response.request.url.toUrl().toString().substringAfterLast('/').substringBefore('?')
@ -184,7 +184,7 @@ class NicovideoSeiga : HttpSource() {
}
override fun pageListParse(response: Response): List<Page> {
val doc = Jsoup.parse(response.body.string())
val doc = response.asJsoup()
val pages = ArrayList<Page>()
// Nicovideo will refuse to serve any pages if the user has not logged in
if (!doc.select("#login_manga").isEmpty()) {

View File

@ -8,7 +8,7 @@ import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.Response
@ -57,7 +57,7 @@ class Rawdevart : ParsedHttpSource() {
override fun popularMangaNextPageSelector() = latestUpdatesNextPageSelector()
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
val url = "$baseUrl/search/".toHttpUrlOrNull()!!.newBuilder()
val url = "$baseUrl/search/".toHttpUrl().newBuilder()
url.addQueryParameter("page", page.toString())
url.addQueryParameter("title", query)
filters.forEach { filter ->
@ -150,7 +150,7 @@ class Rawdevart : ParsedHttpSource() {
}
}
return GET(url.build().toString(), headers)
return GET(url.build(), headers)
}
override fun searchMangaSelector() = latestUpdatesSelector()

View File

@ -9,7 +9,7 @@ import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.Request
import org.jsoup.nodes.Document
import org.jsoup.nodes.Element
@ -65,7 +65,7 @@ class SenManga : ParsedHttpSource() {
override fun latestUpdatesFromElement(element: Element) = popularMangaFromElement(element)
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
val url = "$baseUrl/search".toHttpUrlOrNull()!!.newBuilder()
val url = "$baseUrl/search".toHttpUrl().newBuilder()
.addQueryParameter("s", query)
.addQueryParameter("page", page.toString())
@ -82,7 +82,7 @@ class SenManga : ParsedHttpSource() {
else -> {}
}
}
return GET(url.toString(), headers)
return GET(url.build(), headers)
}
override fun latestUpdatesNextPageSelector() = popularMangaNextPageSelector()

View File

@ -9,6 +9,7 @@ import eu.kanade.tachiyomi.source.model.Page
import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.HttpSource
import eu.kanade.tachiyomi.util.asJsoup
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.jsonArray
import kotlinx.serialization.json.jsonObject
@ -16,7 +17,6 @@ import kotlinx.serialization.json.jsonPrimitive
import okhttp3.Headers
import okhttp3.Request
import okhttp3.Response
import org.jsoup.Jsoup
import rx.Observable
import uy.kohesive.injekt.injectLazy
@ -45,7 +45,7 @@ class Twi4 : HttpSource() {
// As the full catalog is consists of less than 50 manga, it is not worth implementing
// We'll just list all manga in the catalog instead
override fun popularMangaParse(response: Response): MangasPage {
val doc = Jsoup.parse(response.body.string())
val doc = response.asJsoup()
val ret = mutableListOf<SManga>()
// Manga that are recently updated don't show up on the full catalog
// So we'll need to parse the recent updates section as well
@ -89,7 +89,7 @@ class Twi4 : HttpSource() {
GET(getUrlDomain() + manga.url, getChromeHeaders())
override fun mangaDetailsParse(response: Response): SManga {
val document = Jsoup.parse(response.body.string())
val document = response.asJsoup()
return SManga.create().apply {
// We need to get the title and thumbnail again.
// This is only needed if you search by slug, as we have no information about the them.
@ -137,7 +137,7 @@ class Twi4 : HttpSource() {
// They have a <noscript> layout! This is surprising
// Though their manga pages fails to load as it relies on JS
override fun chapterListParse(response: Response): List<SChapter> {
val doc = Jsoup.parse(response.body.string())
val doc = response.asJsoup()
val chapterRegex = Regex(".+『(.+)』 #(\\d+)")
val allChapters = doc.select("#backnumbers > div > ul > li")
val ret = mutableListOf<SChapter>()
@ -175,7 +175,7 @@ class Twi4 : HttpSource() {
GET(getUrlDomain() + chapter.url, getChromeHeaders())
override fun pageListParse(response: Response): List<Page> {
val doc = Jsoup.parse(response.body.string())
val doc = response.asJsoup()
// The site interprets 1 page == 1 chapter
// There should only be 1 article in the document
val page = doc.select("article.comic:first-child")

View File

@ -75,7 +75,7 @@ object ManaToki : NewToki("ManaToki", "comic", manaTokiPreferences) {
url.removeAllQueryParameters("tag")
}
return GET(url.toString(), headers)
return GET(url.build(), headers)
}
private class SearchCheckBox(name: String, val id: String = name) : Filter.CheckBox(name)

View File

@ -61,7 +61,7 @@ object NewTokiWebtoon : NewToki("NewToki", "webtoon", newTokiPreferences) {
}
}
return GET(url.toString(), headers)
return GET(url.build(), headers)
}
private class SearchTargetTypeList : Filter.Select<String>("Type", arrayOf("전체", "일반웹툰", "성인웹툰", "BL/GL", "완결웹툰"))

View File

@ -11,7 +11,7 @@ import eu.kanade.tachiyomi.source.model.UpdateStrategy
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.Response
@ -64,7 +64,7 @@ class MundoHentai : ParsedHttpSource() {
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
if (query.isNotEmpty()) {
val url = baseUrl.toHttpUrlOrNull()!!.newBuilder()
val url = baseUrl.toHttpUrl().newBuilder()
.addQueryParameter("s", query)
.toString()

View File

@ -14,7 +14,6 @@ import kotlinx.serialization.json.jsonObject
import kotlinx.serialization.json.jsonPrimitive
import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.Interceptor
import okhttp3.OkHttpClient
import okhttp3.Request
@ -78,7 +77,7 @@ class OnePieceEx : ParsedHttpSource() {
element.select("div.volume-nome h3").text()
thumbnail_url = THUMBNAIL_URL_MAP[title.uppercase(Locale.ROOT)] ?: DEFAULT_THUMBNAIL
val customUrl = "$baseUrl/mangas/".toHttpUrlOrNull()!!.newBuilder()
val customUrl = "$baseUrl/mangas/".toHttpUrl().newBuilder()
.addQueryParameter("type", "special")
.addQueryParameter("title", title)
.toString()
@ -115,7 +114,7 @@ class OnePieceEx : ParsedHttpSource() {
}
override fun mangaDetailsParse(document: Document): SManga = SManga.create().apply {
val mangaUrl = document.location().toHttpUrlOrNull()!!
val mangaUrl = document.location().toHttpUrl()
when (mangaUrl.queryParameter("type")!!) {
"main" -> {
@ -174,7 +173,7 @@ class OnePieceEx : ParsedHttpSource() {
override fun chapterListSelector() = "div.capitulos li.volume-capitulo"
override fun chapterFromElement(element: Element): SChapter = SChapter.create().apply {
val mangaUrl = element.ownerDocument()!!.location().toHttpUrlOrNull()!!
val mangaUrl = element.ownerDocument()!!.location().toHttpUrl()
when (mangaUrl.queryParameter("type")!!) {
"main" -> {

View File

@ -10,7 +10,7 @@ import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.Response
@ -58,7 +58,7 @@ class MangaBook : ParsedHttpSource() {
val url = if (query.isNotBlank()) {
"$baseUrl/dosearch?query=$query&page=$page"
} else {
val url = "$baseUrl/filterList?page=$page&ftype[]=0&status[]=0".toHttpUrlOrNull()!!.newBuilder()
val url = "$baseUrl/filterList?page=$page&ftype[]=0&status[]=0".toHttpUrl().newBuilder()
(if (filters.isEmpty()) getFilterList() else filters).forEach { filter ->
when (filter) {
is OrderBy -> {
@ -84,7 +84,7 @@ class MangaBook : ParsedHttpSource() {
else -> {}
}
}
return GET(url.toString(), headers)
return GET(url.build(), headers)
}
return GET(url, headers)
}

View File

@ -10,7 +10,7 @@ import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.Request
import okhttp3.Response
import org.jsoup.nodes.Document
@ -43,7 +43,7 @@ class MangaPoisk : ParsedHttpSource() {
val url = if (query.isNotBlank()) {
"$baseUrl/search?q=$query&page=$page"
} else {
val url = "$baseUrl/manga?page=$page".toHttpUrlOrNull()!!.newBuilder()
val url = "$baseUrl/manga?page=$page".toHttpUrl().newBuilder()
(if (filters.isEmpty()) getFilterList() else filters).forEach { filter ->
when (filter) {
is OrderBy -> {
@ -64,7 +64,7 @@ class MangaPoisk : ParsedHttpSource() {
else -> {}
}
}
return GET(url.toString(), headers)
return GET(url.build(), headers)
}
return GET(url, headers)
}

View File

@ -197,7 +197,7 @@ class Remanga : ConfigurableSource, HttpSource() {
if (preferences.getBoolean(isLib_PREF, false)) {
url.addQueryParameter("exclude_bookmarks", "1")
}
return GET(url.toString(), headers)
return GET(url.build(), headers)
}
override fun popularMangaParse(response: Response): MangasPage = searchMangaParse(response)
@ -207,7 +207,7 @@ class Remanga : ConfigurableSource, HttpSource() {
if (preferences.getBoolean(isLib_PREF, false)) {
url.addQueryParameter("exclude_bookmarks", "1")
}
return GET(url.toString(), headers)
return GET(url.build(), headers)
}
override fun latestUpdatesParse(response: Response): MangasPage = searchMangaParse(response)
@ -307,8 +307,7 @@ class Remanga : ConfigurableSource, HttpSource() {
throw Exception("Пользователь не найден, необходима авторизация через WebView\uD83C\uDF0E")
}
val TypeQ = getMyList()[filter.state].id
val UserProfileUrl = "$baseUrl/api/users/$USER_ID/bookmarks/?type=$TypeQ&page=$page".toHttpUrl().newBuilder()
return GET(UserProfileUrl.toString(), headers)
return GET("$baseUrl/api/users/$USER_ID/bookmarks/?type=$TypeQ&page=$page", headers)
}
}
is RequireChapters -> {
@ -329,7 +328,7 @@ class Remanga : ConfigurableSource, HttpSource() {
url.addQueryParameter("exclude_bookmarks", "1")
}
return GET(url.toString(), headers)
return GET(url.build(), headers)
}
private fun parseStatus(status: Int): Int {

View File

@ -12,7 +12,7 @@ import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.Response
@ -59,10 +59,7 @@ class UniComics : ParsedHttpSource() {
is Publishers -> {
if (filter.state > 0) {
val publisherName = getPublishersList()[filter.state].url
val publisherUrl =
"$baseDefaultUrl$PATH_publishers/$publisherName/page/$page".toHttpUrlOrNull()!!
.newBuilder()
return GET(publisherUrl.toString(), headers)
return GET("$baseDefaultUrl$PATH_publishers/$publisherName/page/$page", headers)
}
}
else -> {}

View File

@ -9,7 +9,6 @@ import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.Request
import okhttp3.Response
import org.jsoup.nodes.Document
@ -60,15 +59,13 @@ class YagamiProject : ParsedHttpSource() {
is CategoryList -> {
if (filter.state > 0) {
val catQ = getCategoryList()[filter.state].name
val catUrl = "$baseUrl/tags/$catQ".toHttpUrlOrNull()!!.newBuilder()
return GET(catUrl.toString(), headers)
return GET("$baseUrl/tags/$catQ", headers)
}
}
is FormatList -> {
if (filter.state > 0) {
val formN = getFormatList()[filter.state].query
val formaUrl = "$baseUrl/$formN".toHttpUrlOrNull()!!.newBuilder()
return GET(formaUrl.toString(), headers)
return GET("$baseUrl/$formN", headers)
}
}
else -> {}

View File

@ -13,7 +13,7 @@ import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.Response
@ -38,7 +38,7 @@ class Baimangu : ConfigurableSource, ParsedHttpSource() {
override val client: OkHttpClient = network.cloudflareClient.newBuilder()
.rateLimitHost(
baseUrl.toHttpUrlOrNull()!!,
baseUrl.toHttpUrl(),
preferences.getString(MAINSITE_RATEPERMITS_PREF, MAINSITE_RATEPERMITS_PREF_DEFAULT)!!.toInt(),
preferences.getString(MAINSITE_RATEPERIOD_PREF, MAINSITE_RATEPERIOD_PREF_DEFAULT)!!.toLong(),
TimeUnit.MILLISECONDS,

View File

@ -15,7 +15,6 @@ import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.Response
@ -134,18 +133,18 @@ class Jinmantiantang : ParsedHttpSource(), ConfigurableSource {
newQuery = "$newQuery+%2B$keyword"
params = params.substringAfter("&")
}
"$baseUrl/search/photos?search_query=$newQuery&page=$page&$params".toHttpUrlOrNull()?.newBuilder()
"$baseUrl/search/photos?search_query=$newQuery&page=$page&$params"
} else {
params = if (params == "") "/albums?" else params
if (query == "") {
"$baseUrl$params&page=$page".toHttpUrlOrNull()?.newBuilder()
"$baseUrl$params&page=$page"
} else {
// 在搜索栏的关键词前添加-号来实现对筛选结果的过滤, 像 "-YAOI -扶他 -毛絨絨 -獵奇", 注意此时搜索功能不可用.
val removedGenres = query.split(" ").filter { it.startsWith("-") }.joinToString("+") { it.removePrefix("-") }
"$baseUrl$params&page=$page&screen=$removedGenres".toHttpUrlOrNull()?.newBuilder()
"$baseUrl$params&page=$page&screen=$removedGenres"
}
}
return GET(url.toString(), headers)
return GET(url, headers)
}
override fun searchMangaNextPageSelector(): String = popularMangaNextPageSelector()

View File

@ -27,7 +27,7 @@ import okhttp3.Call
import okhttp3.Callback
import okhttp3.Headers
import okhttp3.HttpUrl
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.Interceptor
import okhttp3.OkHttpClient
import okhttp3.Request
@ -69,22 +69,22 @@ class Manhuagui(
private val imageServer = arrayOf("https://i.hamreus.com", "https://cf.hamreus.com")
private val mobileWebsiteUrl = "https://m.$baseHost"
private val json: Json by injectLazy()
private val baseHttpUrl: HttpUrl = baseUrl.toHttpUrlOrNull()!!
private val baseHttpUrl: HttpUrl = baseUrl.toHttpUrl()
// Add rate limit to fix manga thumbnail load failure
override val client: OkHttpClient =
if (getShowR18()) {
network.client.newBuilder()
.rateLimitHost(baseHttpUrl, preferences.getString(MAINSITE_RATELIMIT_PREF, MAINSITE_RATELIMIT_DEFAULT_VALUE)!!.toInt(), 10)
.rateLimitHost(imageServer[0].toHttpUrlOrNull()!!, preferences.getString(IMAGE_CDN_RATELIMIT_PREF, IMAGE_CDN_RATELIMIT_DEFAULT_VALUE)!!.toInt())
.rateLimitHost(imageServer[1].toHttpUrlOrNull()!!, preferences.getString(IMAGE_CDN_RATELIMIT_PREF, IMAGE_CDN_RATELIMIT_DEFAULT_VALUE)!!.toInt())
.rateLimitHost(imageServer[0].toHttpUrl(), preferences.getString(IMAGE_CDN_RATELIMIT_PREF, IMAGE_CDN_RATELIMIT_DEFAULT_VALUE)!!.toInt())
.rateLimitHost(imageServer[1].toHttpUrl(), preferences.getString(IMAGE_CDN_RATELIMIT_PREF, IMAGE_CDN_RATELIMIT_DEFAULT_VALUE)!!.toInt())
.addNetworkInterceptor(AddCookieHeaderInterceptor(baseHttpUrl.host))
.build()
} else {
network.client.newBuilder()
.rateLimitHost(baseHttpUrl, preferences.getString(MAINSITE_RATELIMIT_PREF, MAINSITE_RATELIMIT_DEFAULT_VALUE)!!.toInt(), 10)
.rateLimitHost(imageServer[0].toHttpUrlOrNull()!!, preferences.getString(IMAGE_CDN_RATELIMIT_PREF, IMAGE_CDN_RATELIMIT_DEFAULT_VALUE)!!.toInt())
.rateLimitHost(imageServer[1].toHttpUrlOrNull()!!, preferences.getString(IMAGE_CDN_RATELIMIT_PREF, IMAGE_CDN_RATELIMIT_DEFAULT_VALUE)!!.toInt())
.rateLimitHost(imageServer[0].toHttpUrl(), preferences.getString(IMAGE_CDN_RATELIMIT_PREF, IMAGE_CDN_RATELIMIT_DEFAULT_VALUE)!!.toInt())
.rateLimitHost(imageServer[1].toHttpUrl(), preferences.getString(IMAGE_CDN_RATELIMIT_PREF, IMAGE_CDN_RATELIMIT_DEFAULT_VALUE)!!.toInt())
.build()
}

View File

@ -13,7 +13,7 @@ import eu.kanade.tachiyomi.source.online.HttpSource
import okhttp3.CacheControl
import okhttp3.Headers
import okhttp3.HttpUrl
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.Request
import okhttp3.RequestBody
@ -42,7 +42,7 @@ class Manhuaren : HttpSource() {
override val baseUrl = "http://mangaapi.manhuaren.com"
private val pageSize = 20
private val baseHttpUrl = baseUrl.toHttpUrlOrNull()!!
private val baseHttpUrl = baseUrl.toHttpUrl()
private val gsnSalt = "4e0a48e1c0b54041bce9c8f0e036124d"
private val encodedPublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmFCg289dTws27v8GtqIffkP4zgFR+MYIuUIeVO5AGiBV0rfpRh5gg7i8RrT12E9j6XwKoe3xJz1khDnPc65P5f7CJcNJ9A8bj7Al5K4jYGxz+4Q+n0YzSllXPit/Vz/iW5jFdlP6CTIgUVwvIoGEL2sS4cqqqSpCDKHSeiXh9CtMsktc6YyrSN+8mQbBvoSSew18r/vC07iQiaYkClcs7jIPq9tuilL//2uR9kWn5jsp8zHKVjmXuLtHDhM9lObZGCVJwdlN2KDKTh276u/pzQ1s5u8z/ARtK26N8e5w8mNlGcHcHfwyhjfEQurvrnkqYH37+12U3jGk5YNHGyOPcwIDAQAB"
@ -452,7 +452,7 @@ class Manhuaren : HttpSource() {
}
override fun mangaDetailsRequest(manga: SManga): Request {
return myGet((baseUrl + manga.url).toHttpUrlOrNull()!!)
return myGet((baseUrl + manga.url).toHttpUrl())
}
override fun chapterListRequest(manga: SManga) = mangaDetailsRequest(manga)
@ -504,7 +504,7 @@ class Manhuaren : HttpSource() {
}
override fun pageListRequest(chapter: SChapter): Request {
val url = (baseUrl + chapter.url).toHttpUrlOrNull()!!.newBuilder()
val url = (baseUrl + chapter.url).toHttpUrl().newBuilder()
.addQueryParameter("netType", "4")
.addQueryParameter("loadreal", "1")
.addQueryParameter("imageQuality", "2")

View File

@ -64,7 +64,7 @@ class wnacg : ParsedHttpSource(), ConfigurableSource {
.addQueryParameter("s", "create_time_DESC")
.addQueryParameter("q", query)
.addQueryParameter("p", page.toString())
return GET(builder.toString(), headers)
return GET(builder.build(), headers)
}
override fun headersBuilder(): Headers.Builder = super.headersBuilder()