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

View File

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

View File

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

View File

@ -8,7 +8,6 @@ import eu.kanade.tachiyomi.multisrc.grouple.GroupLe
import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.source.model.Filter import eu.kanade.tachiyomi.source.model.Filter
import eu.kanade.tachiyomi.source.model.FilterList import eu.kanade.tachiyomi.source.model.FilterList
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.Request import okhttp3.Request
import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get 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]) url.addQueryParameter("sortType", arrayOf("RATING", "POPULARITY", "YEAR", "NAME", "DATE_CREATE", "DATE_UPDATE")[filter.state])
} else { } else {
val ord = arrayOf("rate", "popularity", "year", "name", "created", "updated", "votes")[filter.state] 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("$baseUrl/list?sortType=$ord&offset=${70 * (page - 1)}", headers)
return GET(ordUrl.toString(), headers)
} }
} }
else -> return@forEach 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.network.GET
import eu.kanade.tachiyomi.source.model.Filter import eu.kanade.tachiyomi.source.model.Filter
import eu.kanade.tachiyomi.source.model.FilterList import eu.kanade.tachiyomi.source.model.FilterList
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.Request import okhttp3.Request
import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get 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]) url.addQueryParameter("sortType", arrayOf("RATING", "POPULARITY", "YEAR", "NAME", "DATE_CREATE", "DATE_UPDATE")[filter.state])
} else { } else {
val ord = arrayOf("rate", "popularity", "year", "name", "created", "updated", "votes")[filter.state] 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("$baseUrl/list?sortType=$ord&offset=${70 * (page - 1)}", headers)
return GET(ordUrl.toString(), headers)
} }
} }
else -> return@forEach 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()}" 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.network.interceptor.rateLimit
import eu.kanade.tachiyomi.source.model.Filter import eu.kanade.tachiyomi.source.model.Filter
import eu.kanade.tachiyomi.source.model.FilterList import eu.kanade.tachiyomi.source.model.FilterList
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
@ -23,7 +23,7 @@ class PojokManga : Madara("Pojok Manga", "https://pojokmanga.net", "id", SimpleD
override val mangaSubString = "komik" override val mangaSubString = "komik"
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { 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("s", query)
url.addQueryParameter("post_type", "wp-manga") url.addQueryParameter("post_type", "wp-manga")
filters.forEach { filter -> filters.forEach { filter ->
@ -70,13 +70,13 @@ class PojokManga : Madara("Pojok Manga", "https://pojokmanga.net", "id", SimpleD
} }
is ProjectFilter -> { is ProjectFilter -> {
if (filter.toUriPart() == "project-filter-on") { if (filter.toUriPart() == "project-filter-on") {
url = "$baseUrl/project/page/$page".toHttpUrlOrNull()!!.newBuilder() url = "$baseUrl/project/page/$page".toHttpUrl().newBuilder()
} }
} }
else -> {} else -> {}
} }
} }
return GET(url.toString(), headers) return GET(url.build(), headers)
} }
override fun searchMangaSelector() = "div.c-tabs-item__content, div.page-item-detail" 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.multisrc.madara.Madara
import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.source.model.FilterList import eu.kanade.tachiyomi.source.model.FilterList
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
@ -51,7 +51,7 @@ class Toonily : Madara(
val queries = request.url.queryParameterNames val queries = request.url.queryParameterNames
.filterNot { it == "s" } .filterNot { it == "s" }
val newUrl = "$baseUrl/${searchPage(page, query)}".toHttpUrlOrNull()!!.newBuilder().apply { val newUrl = "$baseUrl/${searchPage(page, query)}".toHttpUrl().newBuilder().apply {
queries.map { q -> queries.map { q ->
request.url.queryParameterValues(q).map { request.url.queryParameterValues(q).map {
this.addQueryParameter(q, it) this.addQueryParameter(q, it)

View File

@ -38,7 +38,7 @@ class CosmicScansID : MangaThemesia("CosmicScans.id", "https://cosmicscans.id",
else -> { /* Do Nothing */ } 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" 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 */ } else -> { /* Do Nothing */ }
} }
} }
return GET(url.toString()) return GET(url.build())
} }
private class StatusFilter : SelectFilter( private class StatusFilter : SelectFilter(

View File

@ -55,7 +55,7 @@ class Ngomik : MangaThemesia("Ngomik", "https://ngomik.net", "id", "/manga") {
else -> { /* Do Nothing */ } else -> { /* Do Nothing */ }
} }
} }
return GET(url.toString()) return GET(url.build())
} }
override fun headersBuilder(): Headers.Builder = Headers.Builder() 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.Filter
import eu.kanade.tachiyomi.source.model.FilterList import eu.kanade.tachiyomi.source.model.FilterList
import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.model.SManga
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.Request import okhttp3.Request
import org.jsoup.nodes.Element import org.jsoup.nodes.Element
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
@ -38,7 +38,7 @@ class Komikita : ZManga(
} }
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { 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) url.addQueryParameter("s", query)
(if (filters.isEmpty()) getFilterList() else filters).forEach { filter -> (if (filters.isEmpty()) getFilterList() else filters).forEach { filter ->
when (filter) { when (filter) {
@ -51,13 +51,13 @@ class Komikita : ZManga(
is ProjectFilter -> { is ProjectFilter -> {
if (filter.toUriPart() == "project-filter-on") { if (filter.toUriPart() == "project-filter-on") {
url = url =
"$baseUrl$projectPageString/page/$page".toHttpUrlOrNull()!!.newBuilder() "$baseUrl$projectPageString/page/$page".toHttpUrl().newBuilder()
} }
} }
else -> {} else -> {}
} }
} }
return GET(url.toString(), headers) return GET(url.build(), headers)
} }
override fun getFilterList(): FilterList { 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.Filter
import eu.kanade.tachiyomi.source.model.FilterList import eu.kanade.tachiyomi.source.model.FilterList
import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.model.SManga
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.Request import okhttp3.Request
import org.jsoup.nodes.Element import org.jsoup.nodes.Element
import java.text.SimpleDateFormat 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 { 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) url.addQueryParameter("s", query)
(if (filters.isEmpty()) getFilterList() else filters).forEach { filter -> (if (filters.isEmpty()) getFilterList() else filters).forEach { filter ->
when (filter) { when (filter) {
// if site has project page, default value "hasProjectPage" = false // if site has project page, default value "hasProjectPage" = false
is ProjectFilter -> { is ProjectFilter -> {
if (filter.toUriPart() == "project-filter-on") { if (filter.toUriPart() == "project-filter-on") {
url = "$baseUrl$projectPageString/page/$page".toHttpUrlOrNull()!!.newBuilder() url = "$baseUrl$projectPageString/page/$page".toHttpUrl().newBuilder()
} }
} }
else -> {} else -> {}
} }
} }
return GET(url.toString(), headers) return GET(url.build(), headers)
} }
override fun getFilterList() = FilterList( 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.Filter
import eu.kanade.tachiyomi.source.model.FilterList import eu.kanade.tachiyomi.source.model.FilterList
import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.model.SManga
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import org.jsoup.nodes.Element import org.jsoup.nodes.Element
@ -58,20 +58,20 @@ class SekteKomik : ZManga("Sekte Komik", "https://sektekomik.com", "id") {
// search // search
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { 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) url.addQueryParameter("s", query)
(if (filters.isEmpty()) getFilterList() else filters).forEach { filter -> (if (filters.isEmpty()) getFilterList() else filters).forEach { filter ->
when (filter) { when (filter) {
// if site has project page, default value "hasProjectPage" = false // if site has project page, default value "hasProjectPage" = false
is ProjectFilter -> { is ProjectFilter -> {
if (filter.toUriPart() == "project-filter-on") { if (filter.toUriPart() == "project-filter-on") {
url = "$baseUrl$projectPageString/${pagePathSegment(page)}".toHttpUrlOrNull()!!.newBuilder() url = "$baseUrl$projectPageString/${pagePathSegment(page)}".toHttpUrl().newBuilder()
} }
} }
else -> {} else -> {}
} }
} }
return GET(url.toString(), headers) return GET(url.build(), headers)
} }
override fun searchMangaSelector() = "div.flexbox2-item" override fun searchMangaSelector() = "div.flexbox2-item"

View File

@ -42,7 +42,7 @@ abstract class BakaManga(
return if (query.isNotEmpty()) { return if (query.isNotEmpty()) {
val url = "$baseUrl/page/$page".toHttpUrl().newBuilder() val url = "$baseUrl/page/$page".toHttpUrl().newBuilder()
.addQueryParameter("s", query) .addQueryParameter("s", query)
GET(url.toString(), headers) GET(url.build(), headers)
} else { } else {
val filterList = if (filters.isEmpty()) getFilterList() else filters val filterList = if (filters.isEmpty()) getFilterList() else filters
val genreFilter = filterList.find { it is GenreFilter } as GenreFilter 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.model.SManga
import eu.kanade.tachiyomi.source.online.HttpSource import eu.kanade.tachiyomi.source.online.HttpSource
import eu.kanade.tachiyomi.util.asJsoup import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import okhttp3.Response import okhttp3.Response
@ -59,7 +59,7 @@ open class EroMuse(override val name: String, override val baseUrl: String) : Ht
if (url.contains(pageQueryRegex)) { if (url.contains(pageQueryRegex)) {
url.replace(pageQueryRegex, "page=$int") url.replace(pageQueryRegex, "page=$int")
} else { } else {
val httpUrl = url.toHttpUrlOrNull()!! val httpUrl = url.toHttpUrl()
val builder = if (httpUrl.pathSegments.last().toIntOrNull() is Int) { val builder = if (httpUrl.pathSegments.last().toIntOrNull() is Int) {
httpUrl.newBuilder().removePathSegment(httpUrl.pathSegments.lastIndex) httpUrl.newBuilder().removePathSegment(httpUrl.pathSegments.lastIndex)
} else { } else {
@ -165,7 +165,7 @@ open class EroMuse(override val name: String, override val baseUrl: String) : Ht
protected fun stackRequest(): Request { protected fun stackRequest(): Request {
stackItem = pageStack.removeLast() stackItem = pageStack.removeLast()
val url = if (stackItem.pageType == AUTHOR && currentSortingMode.isNotEmpty() && !stackItem.url.contains("sort")) { 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 { } else {
stackItem.url stackItem.url
} }
@ -208,14 +208,14 @@ open class EroMuse(override val name: String, override val baseUrl: String) : Ht
currentSortingMode = filterList.filterIsInstance<SortFilter>().first().toQueryValue() currentSortingMode = filterList.filterIsInstance<SortFilter>().first().toQueryValue()
if (query.isNotBlank()) { 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) if (currentSortingMode.isNotEmpty()) addQueryParameter("sort", currentSortingMode)
addQueryParameter("page", "1") addQueryParameter("page", "1")
} }
pageStack.addLast(StackItem(url.toString(), SEARCH_RESULTS_OR_BASE)) pageStack.addLast(StackItem(url.toString(), SEARCH_RESULTS_OR_BASE))
} else { } else {
val albumFilter = filterList.filterIsInstance<AlbumFilter>().first().selection() 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 (currentSortingMode.isNotEmpty()) addQueryParameter("sort", currentSortingMode)
if (albumFilter.pageType != AUTHOR) addQueryParameter("page", "1") if (albumFilter.pageType != AUTHOR) addQueryParameter("page", "1")
} }

View File

@ -122,7 +122,7 @@ abstract class FansubsCat(
if (query.isNotBlank()) { if (query.isNotBlank()) {
builder.addQueryParameter("query", query) builder.addQueryParameter("query", query)
} }
return GET(builder.toString(), headers) return GET(builder.build(), headers)
} }
override fun searchMangaParse(response: Response): MangasPage = parseMangaFromJson(response) 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.source.online.ParsedHttpSource
import eu.kanade.tachiyomi.util.asJsoup import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.Headers import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import okhttp3.Response import okhttp3.Response
@ -65,7 +65,7 @@ abstract class FMReader(
GET("$baseUrl/$requestPath?listType=pagination&page=$page&$popularSort&sort_type=DESC", headers) GET("$baseUrl/$requestPath?listType=pagination&page=$page&$popularSort&sort_type=DESC", headers)
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { 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("name", query)
.addQueryParameter("page", page.toString()) .addQueryParameter("page", page.toString())
(if (filters.isEmpty()) getFilterList() else filters).forEach { filter -> (if (filters.isEmpty()) getFilterList() else filters).forEach { filter ->
@ -101,7 +101,7 @@ abstract class FMReader(
else -> {} else -> {}
} }
} }
return GET(url.toString(), headers) return GET(url.build(), headers)
} }
override fun latestUpdatesRequest(page: Int): Request = 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.source.online.ParsedHttpSource
import eu.kanade.tachiyomi.util.asJsoup import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.Headers import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import okhttp3.Response import okhttp3.Response
@ -58,7 +58,7 @@ abstract class Gattsu(
override fun latestUpdatesNextPageSelector(): String = "ul.paginacao li.next > a" override fun latestUpdatesNextPageSelector(): String = "ul.paginacao li.next > a"
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { 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("s", query)
.addQueryParameter("post_type", "post") .addQueryParameter("post_type", "post")
.toString() .toString()

View File

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

View File

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

View File

@ -31,7 +31,7 @@ import kotlinx.serialization.json.jsonArray
import kotlinx.serialization.json.jsonObject import kotlinx.serialization.json.jsonObject
import kotlinx.serialization.json.jsonPrimitive import kotlinx.serialization.json.jsonPrimitive
import okhttp3.Headers import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.Interceptor import okhttp3.Interceptor
import okhttp3.MediaType.Companion.toMediaType import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
@ -544,7 +544,7 @@ abstract class LibGroup(
val resBody = tokenResponse.body.string() val resBody = tokenResponse.body.string()
csrfToken = "_token\" content=\"(.*)\"".toRegex().find(resBody)!!.groups[1]!!.value 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()) { if (query.isNotEmpty()) {
url.addQueryParameter("name", query) url.addQueryParameter("name", query)
} }

View File

@ -27,7 +27,7 @@ import kotlinx.serialization.json.jsonObject
import kotlinx.serialization.json.jsonPrimitive import kotlinx.serialization.json.jsonPrimitive
import okhttp3.CacheControl import okhttp3.CacheControl
import okhttp3.FormBody import okhttp3.FormBody
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import okhttp3.Response import okhttp3.Response
@ -209,7 +209,7 @@ abstract class Madara(
protected open fun searchPage(page: Int): String = "page/$page/" protected open fun searchPage(page: Int): String = "page/$page/"
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { 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("s", query)
url.addQueryParameter("post_type", "wp-manga") url.addQueryParameter("post_type", "wp-manga")
filters.forEach { filter -> filters.forEach { filter ->
@ -257,7 +257,7 @@ abstract class Madara(
else -> {} else -> {}
} }
} }
return GET(url.toString(), headers) return GET(url.build(), headers)
} }
protected open val authorFilterTitle: String = when (lang) { 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" 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.source.online.ParsedHttpSource
import eu.kanade.tachiyomi.util.asJsoup import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.Headers import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import okhttp3.Response import okhttp3.Response
@ -80,7 +80,7 @@ abstract class MangaBox(
return if (query.isNotBlank() && getAdvancedGenreFilters().isEmpty()) { return if (query.isNotBlank() && getAdvancedGenreFilters().isEmpty()) {
GET("$baseUrl/$simpleQueryPath${normalizeSearchQuery(query)}?page=$page", headers) GET("$baseUrl/$simpleQueryPath${normalizeSearchQuery(query)}?page=$page", headers)
} else { } else {
val url = baseUrl.toHttpUrlOrNull()!!.newBuilder() val url = baseUrl.toHttpUrl().newBuilder()
if (getAdvancedGenreFilters().isNotEmpty()) { if (getAdvancedGenreFilters().isNotEmpty()) {
url.addPathSegment("advanced_search") url.addPathSegment("advanced_search")
url.addQueryParameter("page", page.toString()) 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 url = it.attr("abs:href").substringAfter(baseUrl) // intentionally not using setUrlWithoutDomain
name = it.text() name = it.text()
scanlator = 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 date_upload = parseChapterDate(element.selectDateFromElement().text(), scanlator!!) ?: 0
} }

View File

@ -163,7 +163,7 @@ abstract class MangaHub(
// search // search
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { 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) url.addQueryParameter("q", query)
(if (filters.isEmpty()) getFilterList() else filters).forEach { filter -> (if (filters.isEmpty()) getFilterList() else filters).forEach { filter ->
when (filter) { when (filter) {
@ -178,7 +178,7 @@ abstract class MangaHub(
else -> {} else -> {}
} }
} }
return GET(url.toString(), headers) return GET(url.build(), headers)
} }
override fun searchMangaSelector() = popularMangaSelector() 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.source.online.ParsedHttpSource
import eu.kanade.tachiyomi.util.asJsoup import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.Headers import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import okhttp3.Response import okhttp3.Response
@ -78,7 +78,7 @@ abstract class MangaWorld(
override fun latestUpdatesParse(response: Response): MangasPage = searchMangaParse(response) override fun latestUpdatesParse(response: Response): MangasPage = searchMangaParse(response)
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { 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) url.addQueryParameter("keyword", query)
filters.forEach { filter -> filters.forEach { filter ->
@ -100,7 +100,7 @@ abstract class MangaWorld(
else -> {} else -> {}
} }
} }
return GET(url.toString(), headers) return GET(url.build(), headers)
} }
override fun mangaDetailsParse(document: Document): SManga { 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.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import eu.kanade.tachiyomi.util.asJsoup import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import okhttp3.Response import okhttp3.Response
@ -67,7 +67,7 @@ abstract class Paprika(
return if (query.isNotBlank()) { return if (query.isNotBlank()) {
GET("$baseUrl/search?q=$query&page=$page") GET("$baseUrl/search?q=$query&page=$page")
} else { } else {
val url = "$baseUrl/mangas/".toHttpUrlOrNull()!!.newBuilder() val url = "$baseUrl/mangas/".toHttpUrl().newBuilder()
filters.forEach { filter -> filters.forEach { filter ->
when (filter) { when (filter) {
is GenreFilter -> url.addPathSegment(filter.toUriPart()) is GenreFilter -> url.addPathSegment(filter.toUriPart())
@ -76,7 +76,7 @@ abstract class Paprika(
} }
} }
url.addQueryParameter("page", page.toString()) 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.SChapter
import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.util.asJsoup import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.Request import okhttp3.Request
import okhttp3.Response import okhttp3.Response
import org.jsoup.nodes.Document import org.jsoup.nodes.Document
@ -36,7 +36,7 @@ abstract class PaprikaAlt(
return if (query.isNotBlank()) { return if (query.isNotBlank()) {
GET("$baseUrl/search?s=$query&post_type=manga&page=$page") GET("$baseUrl/search?s=$query&post_type=manga&page=$page")
} else { } else {
val url = "$baseUrl/genres/".toHttpUrlOrNull()!!.newBuilder() val url = "$baseUrl/genres/".toHttpUrl().newBuilder()
filters.forEach { filter -> filters.forEach { filter ->
when (filter) { when (filter) {
is GenreFilter -> url.addPathSegment(filter.toUriPart()) is GenreFilter -> url.addPathSegment(filter.toUriPart())
@ -45,7 +45,7 @@ abstract class PaprikaAlt(
} }
} }
url.addQueryParameter("page", page.toString()) 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.CookieJar
import okhttp3.Headers import okhttp3.Headers
import okhttp3.HttpUrl import okhttp3.HttpUrl
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.Interceptor import okhttp3.Interceptor
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
@ -178,13 +179,13 @@ open class Webtoons(
} }
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { 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() ?: "" val uriPart = (filters.find { it is SearchType } as? SearchType)?.toUriPart() ?: ""
url.addQueryParameter("searchType", uriPart) url.addQueryParameter("searchType", uriPart)
if (uriPart != "WEBTOON" && page > 1) url.addQueryParameter("page", page.toString()) 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" 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.jsonPrimitive
import kotlinx.serialization.json.long import kotlinx.serialization.json.long
import okhttp3.Headers import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.Request import okhttp3.Request
import okhttp3.Response import okhttp3.Response
import org.jsoup.nodes.Document import org.jsoup.nodes.Document
@ -34,8 +34,8 @@ open class WebtoonsTranslate(
// popularMangaRequest already returns manga sorted by latest update // popularMangaRequest already returns manga sorted by latest update
override val supportsLatest = false override val supportsLatest = false
private val apiBaseUrl = "https://global.apis.naver.com".toHttpUrlOrNull()!! private val apiBaseUrl = "https://global.apis.naver.com".toHttpUrl()
private val mobileBaseUrl = "https://m.webtoons.com".toHttpUrlOrNull()!! private val mobileBaseUrl = "https://m.webtoons.com".toHttpUrl()
private val thumbnailBaseUrl = "https://mwebtoon-phinf.pstatic.net" private val thumbnailBaseUrl = "https://mwebtoon-phinf.pstatic.net"
private val pageSize = 24 private val pageSize = 24
@ -53,7 +53,7 @@ open class WebtoonsTranslate(
.addQueryParameter("size", "$requeztSize") .addQueryParameter("size", "$requeztSize")
.addQueryParameter("languageCode", translateLangCode) .addQueryParameter("languageCode", translateLangCode)
.build() .build()
return GET(url.toString(), headers) return GET(url, headers)
} }
// Webtoons translations doesn't really have a "popular" sort; just "UPDATE", "TITLE_ASC", // 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 pageListParse(document: Document): List<Page> = throw Exception("Not used")
override fun chapterListRequest(manga: SManga): Request { override fun chapterListRequest(manga: SManga): Request {
val mangaUrl = manga.url.toHttpUrlOrNull()!! val mangaUrl = manga.url.toHttpUrl()
val titleNo = mangaUrl.queryParameter("titleNo") val titleNo = mangaUrl.queryParameter("titleNo")
val teamVersion = mangaUrl.queryParameter("teamVersion") val teamVersion = mangaUrl.queryParameter("teamVersion")
val chapterListUrl = apiBaseUrl val chapterListUrl = apiBaseUrl
@ -210,7 +210,7 @@ open class WebtoonsTranslate(
} }
override fun pageListRequest(chapter: SChapter): Request { 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> { 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.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import okhttp3.Headers import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import org.jsoup.nodes.Document import org.jsoup.nodes.Document
@ -78,7 +78,7 @@ abstract class WPComics(
return if (filterList.isEmpty()) { return if (filterList.isEmpty()) {
GET("$baseUrl/?s=$query&post_type=comics&page=$page") GET("$baseUrl/?s=$query&post_type=comics&page=$page")
} else { } else {
val url = "$baseUrl/$searchPath".toHttpUrlOrNull()!!.newBuilder() val url = "$baseUrl/$searchPath".toHttpUrl().newBuilder()
filterList.forEach { filter -> filterList.forEach { filter ->
when (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.SChapter
import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import org.jsoup.nodes.Document import org.jsoup.nodes.Document
@ -58,7 +58,7 @@ abstract class ZManga(
// search // search
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { 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) url.addQueryParameter("title", query)
(if (filters.isEmpty()) getFilterList() else filters).forEach { filter -> (if (filters.isEmpty()) getFilterList() else filters).forEach { filter ->
when (filter) { when (filter) {
@ -90,13 +90,13 @@ abstract class ZManga(
// if site has project page, default value "hasProjectPage" = false // if site has project page, default value "hasProjectPage" = false
is ProjectFilter -> { is ProjectFilter -> {
if (filter.toUriPart() == "project-filter-on") { if (filter.toUriPart() == "project-filter-on") {
url = "$baseUrl$projectPageString/page/$page".toHttpUrlOrNull()!!.newBuilder() url = "$baseUrl$projectPageString/page/$page".toHttpUrl().newBuilder()
} }
} }
else -> {} else -> {}
} }
} }
return GET(url.toString(), headers) return GET(url.build(), headers)
} }
open val projectPageString = "/project-list" open val projectPageString = "/project-list"

View File

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

View File

@ -109,7 +109,7 @@ class Hennojin(override val lang: String, suffix: String) : ParsedHttpSource() {
private inline fun HttpUrl.request( private inline fun HttpUrl.request(
block: HttpUrl.Builder.() -> HttpUrl.Builder, block: HttpUrl.Builder.() -> HttpUrl.Builder,
) = GET(newBuilder().block().toString(), headers) ) = GET(newBuilder().block().build(), headers)
private inline val Response.date: Long private inline val Response.date: Long
get() = headers["Last-Modified"]?.run(httpDate::parse)?.time ?: 0L 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 eu.kanade.tachiyomi.source.online.ParsedHttpSource
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json
import kotlinx.serialization.json.jsonObject import kotlinx.serialization.json.jsonObject
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import okhttp3.Response 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 { 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 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) { if ((if (filters.isEmpty()) getFilterList() else filters).filterIsInstance<SortOrderFilter>()[0].state == 0) {
url.addPathSegment("popular") url.addPathSegment("popular")
} }
return GET(url.toString()) return GET(url.build())
} else { } else {
val url = "$baseUrl/search".toHttpUrlOrNull()!!.newBuilder() val url = "$baseUrl/search".toHttpUrl().newBuilder()
.addQueryParameter("key", query) .addQueryParameter("key", query)
.addQueryParameter("page", page.toString()) .addQueryParameter("page", page.toString())
.addQueryParameter(getLanguageURIByName(imhLang).uri, toBinary(true)) // main language always enabled .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 -> {} 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.put
import kotlinx.serialization.json.putJsonArray import kotlinx.serialization.json.putJsonArray
import kotlinx.serialization.json.putJsonObject import kotlinx.serialization.json.putJsonObject
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.Interceptor import okhttp3.Interceptor
import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
@ -206,7 +206,7 @@ abstract class Luscious(
private fun buildAlbumListRequest(page: Int, filters: FilterList, query: String = ""): Request { private fun buildAlbumListRequest(page: Int, filters: FilterList, query: String = ""): Request {
val input = buildAlbumListRequestInput(page, filters, query) val input = buildAlbumListRequestInput(page, filters, query)
val url = apiBaseUrl.toHttpUrlOrNull()!!.newBuilder() val url = apiBaseUrl.toHttpUrl().newBuilder()
.addQueryParameter("operationName", "AlbumList") .addQueryParameter("operationName", "AlbumList")
.addQueryParameter("query", ALBUM_LIST_REQUEST_GQL) .addQueryParameter("query", ALBUM_LIST_REQUEST_GQL)
.addQueryParameter("variables", input.toString()) .addQueryParameter("variables", input.toString())
@ -238,7 +238,7 @@ abstract class Luscious(
private fun buildAlbumInfoRequest(id: String): Request { private fun buildAlbumInfoRequest(id: String): Request {
val input = buildAlbumInfoRequestInput(id) val input = buildAlbumInfoRequestInput(id)
val url = apiBaseUrl.toHttpUrlOrNull()!!.newBuilder() val url = apiBaseUrl.toHttpUrl().newBuilder()
.addQueryParameter("operationName", "AlbumGet") .addQueryParameter("operationName", "AlbumGet")
.addQueryParameter("query", albumInfoQuery) .addQueryParameter("query", albumInfoQuery)
.addQueryParameter("variables", input.toString()) .addQueryParameter("variables", input.toString())
@ -337,7 +337,7 @@ abstract class Luscious(
private fun buildAlbumPicturesPageUrl(id: String, page: Int): String { private fun buildAlbumPicturesPageUrl(id: String, page: Int): String {
val input = buildAlbumPicturesRequestInput(id, page) val input = buildAlbumPicturesRequestInput(id, page)
return apiBaseUrl.toHttpUrlOrNull()!!.newBuilder() return apiBaseUrl.toHttpUrl().newBuilder()
.addQueryParameter("operationName", "AlbumListOwnPictures") .addQueryParameter("operationName", "AlbumListOwnPictures")
.addQueryParameter("query", ALBUM_PICTURES_REQUEST_GQL) .addQueryParameter("query", ALBUM_PICTURES_REQUEST_GQL)
.addQueryParameter("variables", input.toString()) .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.model.UpdateStrategy
import eu.kanade.tachiyomi.source.online.ParsedHttpSource import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import eu.kanade.tachiyomi.util.asJsoup import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import okhttp3.Response import okhttp3.Response
@ -146,13 +146,13 @@ open class NHentai(
filterList.findInstance<OffsetPageFilter>()?.state?.toIntOrNull()?.plus(page) ?: page filterList.findInstance<OffsetPageFilter>()?.state?.toIntOrNull()?.plus(page) ?: page
if (favoriteFilter?.state == true) { if (favoriteFilter?.state == true) {
val url = "$baseUrl/favorites".toHttpUrlOrNull()!!.newBuilder() val url = "$baseUrl/favorites".toHttpUrl().newBuilder()
.addQueryParameter("q", "$fixedQuery $advQuery") .addQueryParameter("q", "$fixedQuery $advQuery")
.addQueryParameter("page", offsetPage.toString()) .addQueryParameter("page", offsetPage.toString())
return GET(url.toString(), headers) return GET(url.build(), headers)
} else { } else {
val url = "$baseUrl/search".toHttpUrlOrNull()!!.newBuilder() val url = "$baseUrl/search".toHttpUrl().newBuilder()
.addQueryParameter("q", "$fixedQuery $nhLangSearch$advQuery") .addQueryParameter("q", "$fixedQuery $nhLangSearch$advQuery")
.addQueryParameter("page", offsetPage.toString()) .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.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import okhttp3.Headers import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import org.jsoup.nodes.Document 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 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 { 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("wd", query)
url.addQueryParameter("page", page.toString()) url.addQueryParameter("page", page.toString())
@ -166,7 +166,7 @@ open class NineManga(
url.addQueryParameter("type", "high") url.addQueryParameter("type", "high")
return GET(url.toString(), headers) return GET(url.build(), headers)
} }
override fun searchMangaSelector() = popularMangaSelector() override fun searchMangaSelector() = popularMangaSelector()

View File

@ -76,7 +76,7 @@ class Photos18 : HttpSource(), ConfigurableSource {
if (filter is QueryFilter) filter.addQueryTo(url) if (filter is QueryFilter) filter.addQueryTo(url)
} }
return GET(url.toString(), headers) return GET(url.build(), headers)
} }
override fun searchMangaParse(response: Response) = popularMangaParse(response) 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.SChapter
import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.HttpSource import eu.kanade.tachiyomi.source.online.HttpSource
import eu.kanade.tachiyomi.util.asJsoup
import kotlinx.serialization.decodeFromString import kotlinx.serialization.decodeFromString
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json
import okhttp3.Headers import okhttp3.Headers
@ -13,7 +14,6 @@ import okhttp3.HttpUrl
import okhttp3.HttpUrl.Companion.toHttpUrl import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.Request import okhttp3.Request
import okhttp3.Response import okhttp3.Response
import org.jsoup.Jsoup
import rx.Observable import rx.Observable
import uy.kohesive.injekt.injectLazy import uy.kohesive.injekt.injectLazy
@ -191,7 +191,7 @@ class Pixiv(override val lang: String) : HttpSource() {
for (p in countUp(start = 1)) { for (p in countUp(start = 1)) {
searchUsers.url.setEncodedQueryParameter("p", p.toString()) 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") .select(".user-recommendation-item > a").eachAttr("href")
.map { it.substringAfterLast('/') } .map { it.substringAfterLast('/') }

View File

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

View File

@ -45,7 +45,7 @@ class MangaRok : ParsedHttpSource() {
.addQueryParameter("q", query) .addQueryParameter("q", query)
.addQueryParameter("page", page.toString()) .addQueryParameter("page", page.toString())
return GET(url.toString(), headers) return GET(url.build(), headers)
} }
override fun searchMangaSelector(): String = override fun searchMangaSelector(): String =
".is-half > a.box" ".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.SChapter
import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
@ -70,7 +70,7 @@ class Comicastle : ParsedHttpSource() {
// Search // Search
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { 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 var rBody: RequestBody? = null
(filters.let { if (it.isEmpty()) getFilterList() else filters }) (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.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import eu.kanade.tachiyomi.util.asJsoup import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import okhttp3.Response import okhttp3.Response
@ -91,7 +91,7 @@ class Eggporncomics : ParsedHttpSource() {
return if (query.isNotBlank()) { return if (query.isNotBlank()) {
GET("$baseUrl/search/${query.replace(queryRegex, "-")}?page=$page", headers) GET("$baseUrl/search/${query.replace(queryRegex, "-")}?page=$page", headers)
} else { } else {
val url = baseUrl.toHttpUrlOrNull()!!.newBuilder() val url = baseUrl.toHttpUrl().newBuilder()
val filterList = if (filters.isEmpty()) getFilterList() else filters val filterList = if (filters.isEmpty()) getFilterList() else filters
val category = filterList.find { it is CategoryFilter } as UriPartFilter val category = filterList.find { it is CategoryFilter } as UriPartFilter
val comics = filterList.find { it is ComicsFilter } as UriPartFilter val comics = filterList.find { it is ComicsFilter } as UriPartFilter
@ -110,7 +110,7 @@ class Eggporncomics : ParsedHttpSource() {
url.addQueryParameter("page", page.toString()) 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 kotlinx.serialization.json.jsonPrimitive
import okhttp3.Credentials import okhttp3.Credentials
import okhttp3.HttpUrl import okhttp3.HttpUrl
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import okhttp3.Response import okhttp3.Response
@ -87,7 +87,7 @@ class Madokami : ConfigurableSource, ParsedHttpSource() {
override fun searchMangaNextPageSelector(): String? = null override fun searchMangaNextPageSelector(): String? = null
override fun mangaDetailsRequest(manga: SManga): Request { 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) { if (url.pathSize > 5 && url.pathSegments[0] == "Manga" && url.pathSegments[1].length == 1) {
val builder = url.newBuilder() val builder = url.newBuilder()
for (i in 5 until url.pathSize) { builder.removePathSegment(5) } 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.SChapter
import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import okhttp3.Response import okhttp3.Response
@ -72,7 +72,7 @@ class Mangafreak : ParsedHttpSource() {
// Search // Search
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
val url = baseUrl.toHttpUrlOrNull()!!.newBuilder() val url = baseUrl.toHttpUrl().newBuilder()
if (query.isNotBlank()) { if (query.isNotBlank()) {
url.addPathSegments("Find/$query") 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 searchMangaNextPageSelector(): String? = null
override fun searchMangaSelector(): String = "div.manga_search_item , div.mangaka_search_item" 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.jsonObject
import kotlinx.serialization.json.jsonPrimitive import kotlinx.serialization.json.jsonPrimitive
import okhttp3.Headers import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import org.jsoup.nodes.Document import org.jsoup.nodes.Document
@ -69,7 +69,7 @@ class Mangahasu : ParsedHttpSource() {
override fun latestUpdatesNextPageSelector() = popularMangaNextPageSelector() override fun latestUpdatesNextPageSelector() = popularMangaNextPageSelector()
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { 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("keyword", query)
url.addQueryParameter("page", page.toString()) 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() override fun searchMangaSelector() = latestUpdatesSelector()

View File

@ -13,7 +13,7 @@ import okhttp3.Cookie
import okhttp3.CookieJar import okhttp3.CookieJar
import okhttp3.Headers import okhttp3.Headers
import okhttp3.HttpUrl import okhttp3.HttpUrl
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import org.jsoup.nodes.Document import org.jsoup.nodes.Document
@ -91,7 +91,7 @@ class Mangahere : ParsedHttpSource() {
override fun latestUpdatesNextPageSelector() = "div.pager-list-left a:last-child" override fun latestUpdatesNextPageSelector() = "div.pager-list-left a:last-child"
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { 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 -> filters.forEach { filter ->
when (filter) { when (filter) {
@ -137,7 +137,7 @@ class Mangahere : ParsedHttpSource() {
addEncodedQueryParameter("name", null) addEncodedQueryParameter("name", null)
} }
return GET(url.toString(), headers) return GET(url.build(), headers)
} }
override fun searchMangaSelector() = ".manga-list-4-list > li" 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.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import eu.kanade.tachiyomi.util.asJsoup import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import org.jsoup.nodes.Document import org.jsoup.nodes.Document
@ -69,7 +69,7 @@ class MangaJar : ParsedHttpSource() {
val genreFilter = filterList.findInstance<GenreList>() val genreFilter = filterList.findInstance<GenreList>()
val genre = genreFilter?.let { f -> f.values[f.state] } 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("q", query)
url.addQueryParameter("page", page.toString()) url.addQueryParameter("page", page.toString())
@ -85,7 +85,7 @@ class MangaJar : ParsedHttpSource() {
else -> {} else -> {}
} }
} }
return GET(url.toString(), headers) return GET(url.build(), headers)
} }
override fun searchMangaSelector() = popularMangaSelector() 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.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import eu.kanade.tachiyomi.util.asJsoup import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
@ -86,12 +86,12 @@ class MangaKatana : ConfigurableSource, ParsedHttpSource() {
if (query.isNotEmpty()) { if (query.isNotEmpty()) {
val type = filterList.find { it is TypeFilter } as TypeFilter 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", query)
.addQueryParameter("search_by", type.toUriPart()) .addQueryParameter("search_by", type.toUriPart())
return GET(url.toString(), headers) return GET(url.build(), headers)
} else { } else {
val url = "$baseUrl/manga/page/$page".toHttpUrlOrNull()!!.newBuilder() val url = "$baseUrl/manga/page/$page".toHttpUrl().newBuilder()
.addQueryParameter("filter", "1") .addQueryParameter("filter", "1")
for (filter in filterList) { for (filter in filterList) {
when (filter) { when (filter) {
@ -125,7 +125,7 @@ class MangaKatana : ConfigurableSource, ParsedHttpSource() {
else -> {} 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 no filters selected, default to "all"
if (tagCount == 0) { url.addPathSegment("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("perPage", MANGA_PER_PAGE.toString())
.addQueryParameter("page", page.toString()) .addQueryParameter("page", page.toString())
return GET(url.toString(), headers) return GET(url.build(), headers)
} }
override fun latestUpdatesParse(response: Response): MangasPage { 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.SChapter
import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import org.jsoup.nodes.Document import org.jsoup.nodes.Document
@ -95,7 +95,7 @@ class MangaPill : ParsedHttpSource() {
override fun imageUrlParse(document: Document) = "" override fun imageUrlParse(document: Document) = ""
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { 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("page", page.toString())
.addQueryParameter("q", query) .addQueryParameter("q", query)
@ -119,7 +119,7 @@ class MangaPill : ParsedHttpSource() {
else -> {} else -> {}
} }
} }
return GET(url.toString(), headers) return GET(url.build(), headers)
} }
private class Type : UriPartFilter( 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.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import okhttp3.FormBody import okhttp3.FormBody
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import org.jsoup.nodes.Document import org.jsoup.nodes.Document
@ -158,7 +158,7 @@ class MangaRawClub : ParsedHttpSource() {
} }
// Filter search // Filter search
val url = "$baseUrl/browse-comics/".toHttpUrlOrNull()!!.newBuilder() val url = "$baseUrl/browse-comics/".toHttpUrl().newBuilder()
val requestBody = FormBody.Builder() val requestBody = FormBody.Builder()
url.addQueryParameter("results", page.toString()) url.addQueryParameter("results", page.toString())
@ -176,7 +176,7 @@ class MangaRawClub : ParsedHttpSource() {
else -> {} else -> {}
} }
} }
return GET(url.toString(), headers) return GET(url.build(), headers)
// return POST("$baseUrl/search", headers, requestBody.build()) // csrfmiddlewaretoken required // return POST("$baseUrl/search", headers, requestBody.build()) // csrfmiddlewaretoken required
} }

View File

@ -111,7 +111,7 @@ class MangaSect : ParsedHttpSource() {
addPathSegment("") addPathSegment("")
} }
return GET(url.toString(), headers) return GET(url.build(), headers)
} }
override fun searchMangaParse(response: Response): MangasPage = popularMangaParse(response) 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) 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> { private fun buildTextSearchFilterRequests(page: Int, filters: List<TextSearchFilter>): List<Request> {

View File

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

View File

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

View File

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

View File

@ -45,7 +45,7 @@ class VyvyManga : ParsedHttpSource() {
.addQueryParameter("q", query) .addQueryParameter("q", query)
.addQueryParameter("page", page.toString()) .addQueryParameter("page", page.toString())
return GET(url.toString(), headers) return GET(url.build(), headers)
} }
override fun searchMangaSelector(): String = ".comic-item" 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.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import eu.kanade.tachiyomi.util.asJsoup import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.Request import okhttp3.Request
import okhttp3.Response import okhttp3.Response
import org.jsoup.nodes.Document import org.jsoup.nodes.Document
@ -81,7 +81,7 @@ class Webcomics : ParsedHttpSource() {
override fun searchMangaSelector() = ".wiki-book-list > .row" override fun searchMangaSelector() = ".wiki-book-list > .row"
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { 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 -> (if (filters.isEmpty()) getFilterList() else filters).forEach { filter ->
when (filter) { when (filter) {
is GenreFilter -> { is GenreFilter -> {
@ -91,7 +91,7 @@ class Webcomics : ParsedHttpSource() {
else -> {} else -> {}
} }
} }
return GET(url.toString(), headers) return GET(url.build(), headers)
} }
override fun searchMangaParse(response: Response): MangasPage { 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.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import okhttp3.Headers import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import org.jsoup.nodes.Document import org.jsoup.nodes.Document
@ -53,7 +53,7 @@ class Ikuhentai : ParsedHttpSource() {
} }
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { 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") url.addQueryParameter("post_type", "wp-manga")
val pattern = "\\s+".toRegex() val pattern = "\\s+".toRegex()
val q = query.replace(pattern, "+") 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 // max 200 results

View File

@ -19,7 +19,7 @@ import kotlinx.serialization.json.jsonObject
import kotlinx.serialization.json.jsonPrimitive import kotlinx.serialization.json.jsonPrimitive
import okhttp3.FormBody import okhttp3.FormBody
import okhttp3.Headers import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import okhttp3.Response import okhttp3.Response
@ -210,7 +210,7 @@ class Kumanga : HttpSource() {
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
getKumangaToken() 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 -> filters.forEach { filter ->
when (filter) { when (filter) {

View File

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

View File

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

View File

@ -114,7 +114,7 @@ class OlympusScanlation : HttpSource() {
} }
url.addQueryParameter("type", "comic") url.addQueryParameter("type", "comic")
url.addQueryParameter("page", page.toString()) url.addQueryParameter("page", page.toString())
return GET(url.build().toString(), headers) return GET(url.build(), headers)
} }
override fun searchMangaParse(response: Response): MangasPage { 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 eu.kanade.tachiyomi.source.online.ParsedHttpSource
import okhttp3.Headers import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrl import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import org.jsoup.nodes.Document 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 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 { 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("search[searchText]", query)
url.addQueryParameter("page", page.toString()) 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() override fun searchMangaSelector() = popularMangaSelector()

View File

@ -22,7 +22,7 @@ import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import eu.kanade.tachiyomi.util.asJsoup import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.FormBody import okhttp3.FormBody
import okhttp3.Headers import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import okhttp3.Response 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 { private fun OkHttpClient.Builder.rateLimitImageCDNs(hosts: Array<String>, permits: Int, period: Long): OkHttpClient.Builder {
hosts.forEach { host -> hosts.forEach { host ->
rateLimitHost(host.toHttpUrlOrNull()!!, permits, period) rateLimitHost(host.toHttpUrl(), permits, period)
} }
return this return this
} }
@ -104,7 +104,7 @@ class TuMangaOnline : ConfigurableSource, ParsedHttpSource() {
chain.proceed(request) chain.proceed(request)
} }
.rateLimitHost( .rateLimitHost(
baseUrl.toHttpUrlOrNull()!!, baseUrl.toHttpUrl(),
preferences.getString(WEB_RATELIMIT_PREF, WEB_RATELIMIT_PREF_DEFAULT_VALUE)!!.toInt(), preferences.getString(WEB_RATELIMIT_PREF, WEB_RATELIMIT_PREF_DEFAULT_VALUE)!!.toInt(),
60, 60,
) )
@ -141,7 +141,7 @@ class TuMangaOnline : ConfigurableSource, ParsedHttpSource() {
override fun latestUpdatesFromElement(element: Element) = popularMangaFromElement(element) override fun latestUpdatesFromElement(element: Element) = popularMangaFromElement(element)
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { 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("title", query)
if (getSFWModePref()) { if (getSFWModePref()) {
SFW_MODE_PREF_EXCLUDE_GENDERS.forEach { gender -> SFW_MODE_PREF_EXCLUDE_GENDERS.forEach { gender ->
@ -201,7 +201,7 @@ class TuMangaOnline : ConfigurableSource, ParsedHttpSource() {
else -> {} else -> {}
} }
} }
return GET(url.build().toString(), headers) return GET(url.build(), headers)
} }
override fun searchMangaSelector() = popularMangaSelector() override fun searchMangaSelector() = popularMangaSelector()
override fun searchMangaNextPageSelector() = popularMangaNextPageSelector() 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.model.UpdateStrategy
import eu.kanade.tachiyomi.source.online.ParsedHttpSource import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import okhttp3.Headers import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.Request import okhttp3.Request
import org.jsoup.nodes.Document import org.jsoup.nodes.Document
import org.jsoup.nodes.Element 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 = "" protected open val genreSuffix = ""
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
var url = baseUrl.toHttpUrlOrNull()!!.newBuilder() var url = baseUrl.toHttpUrl().newBuilder()
if (query.isNotBlank()) { if (query.isNotBlank()) {
url = "$baseUrl/$urlSuffix".toHttpUrlOrNull()!!.newBuilder() url = "$baseUrl/$urlSuffix".toHttpUrl().newBuilder()
url.addPathSegments("page") url.addPathSegments("page")
url.addPathSegments(page.toString()) url.addPathSegments(page.toString())
url.addQueryParameter("s", query) url.addQueryParameter("s", query)
return GET(url.build().toString(), headers) return GET(url.build(), headers)
} }
filters.forEach { filter -> 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() 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.SChapter
import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import org.jsoup.nodes.Document import org.jsoup.nodes.Document
@ -64,7 +64,7 @@ class BacaKomik : ParsedHttpSource() {
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { 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 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("title", query)
url.addQueryParameter("page", page.toString()) url.addQueryParameter("page", page.toString())
filters.forEach { filter -> filters.forEach { filter ->
@ -97,7 +97,7 @@ class BacaKomik : ParsedHttpSource() {
else -> {} else -> {}
} }
} }
return GET(url.build().toString(), headers) return GET(url.build(), headers)
} }
override fun mangaDetailsParse(document: Document): SManga { override fun mangaDetailsParse(document: Document): SManga {
val infoElement = document.select("div.infoanime").first()!! 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.jsonObject
import kotlinx.serialization.json.jsonPrimitive import kotlinx.serialization.json.jsonPrimitive
import okhttp3.Headers import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.Request import okhttp3.Request
import okhttp3.Response import okhttp3.Response
import org.jsoup.nodes.Document import org.jsoup.nodes.Document
@ -97,7 +97,7 @@ class ComicFx : ParsedHttpSource() {
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
val filterList = if (filters.isEmpty()) getFilterList() else filters val filterList = if (filters.isEmpty()) getFilterList() else filters
val url = "$baseUrl/filterList".toHttpUrlOrNull()!!.newBuilder() val url = "$baseUrl/filterList".toHttpUrl().newBuilder()
for (filter in filterList) { for (filter in filterList) {
when (filter) { when (filter) {
@ -123,7 +123,7 @@ class ComicFx : ParsedHttpSource() {
url.addQueryParameter("page", page.toString()) url.addQueryParameter("page", page.toString())
// Unimplemented parameters: "alpha" (For filtering by alphabet) and "tag" (idk) // Unimplemented parameters: "alpha" (For filtering by alphabet) and "tag" (idk)
return GET(url.toString()) return GET(url.build())
} }
override fun searchMangaSelector() = popularMangaSelector() override fun searchMangaSelector() = popularMangaSelector()

View File

@ -19,7 +19,7 @@ import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import eu.kanade.tachiyomi.util.asJsoup import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.FormBody import okhttp3.FormBody
import okhttp3.Headers import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import org.jsoup.nodes.Document import org.jsoup.nodes.Document
@ -321,7 +321,7 @@ class DoujinDesu : ParsedHttpSource(), ConfigurableSource {
// Search & FIlter // Search & FIlter
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { 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) .addQueryParameter("title", query)
(if (filters.isEmpty()) getFilterList() else filters).forEach { filter -> (if (filters.isEmpty()) getFilterList() else filters).forEach { filter ->
when (filter) { when (filter) {
@ -349,7 +349,7 @@ class DoujinDesu : ParsedHttpSource(), ConfigurableSource {
else -> {} else -> {}
} }
} }
return GET(url.toString(), headers) return GET(url.build(), headers)
} }
override fun searchMangaFromElement(element: Element): SManga = 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.SChapter
import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import org.jsoup.nodes.Document import org.jsoup.nodes.Document
@ -55,7 +55,7 @@ class KomikIndoID : ParsedHttpSource() {
} }
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { 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) .addQueryParameter("title", query)
filters.forEach { filter -> filters.forEach { filter ->
when (filter) { when (filter) {
@ -120,7 +120,7 @@ class KomikIndoID : ParsedHttpSource() {
else -> {} else -> {}
} }
} }
return GET(url.toString(), headers) return GET(url.build(), headers)
} }
override fun mangaDetailsParse(document: Document): SManga { override fun mangaDetailsParse(document: Document): SManga {
val infoElement = document.select("div.infoanime").first()!! 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.SChapter
import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import org.jsoup.nodes.Document import org.jsoup.nodes.Document
@ -81,7 +81,7 @@ class Komiku : ParsedHttpSource() {
override fun searchMangaSelector() = popularMangaSelector() override fun searchMangaSelector() = popularMangaSelector()
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { 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 -> (if (filters.isEmpty()) getFilterList() else filters).forEach { filter ->
when (filter) { when (filter) {
is CategoryNames -> { is CategoryNames -> {
@ -107,13 +107,13 @@ class Komiku : ParsedHttpSource() {
is ProjectList -> { is ProjectList -> {
val project = filter.values[filter.state] val project = filter.values[filter.state]
if (project.key == "project-filter-on") { 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 -> {} else -> {}
} }
} }
return GET(url.toString(), headers) return GET(url.build(), headers)
} }
override fun searchMangaFromElement(element: Element) = popularMangaFromElement(element) 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.source.online.ParsedHttpSource
import eu.kanade.tachiyomi.util.asJsoup import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.Headers import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import okhttp3.Response import okhttp3.Response
@ -29,7 +29,7 @@ class AnimeGDRClub : ParsedHttpSource() {
override fun popularMangaRequest(page: Int): Request = GET("$baseUrl/serie.php", headers) override fun popularMangaRequest(page: Int): Request = GET("$baseUrl/serie.php", headers)
override fun latestUpdatesRequest(page: Int): Request = GET("$baseUrl/", headers) override fun latestUpdatesRequest(page: Int): Request = GET("$baseUrl/", headers)
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
val url = "$baseUrl/".toHttpUrlOrNull()!!.newBuilder() val url = "$baseUrl/".toHttpUrl().newBuilder()
if (query.isNotEmpty()) { if (query.isNotEmpty()) {
url.addEncodedPathSegment("serie.php") url.addEncodedPathSegment("serie.php")
@ -118,7 +118,7 @@ class AnimeGDRClub : ParsedHttpSource() {
override fun latestUpdatesFromElement(element: Element): SManga { override fun latestUpdatesFromElement(element: Element): SManga {
val manga = SManga.create() 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.title = element.selectFirst(".titolo")!!.text()
manga.thumbnail_url = "$baseUrl/${element.selectFirst("img")!!.attr("src")}" 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 eu.kanade.tachiyomi.util.asJsoup
import okhttp3.FormBody import okhttp3.FormBody
import okhttp3.Headers import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import okhttp3.Response import okhttp3.Response
@ -36,7 +36,7 @@ class DemoneCeleste : ParsedHttpSource() {
override fun popularMangaRequest(page: Int): Request = GET("$baseUrl/manga", headers) override fun popularMangaRequest(page: Int): Request = GET("$baseUrl/manga", headers)
override fun latestUpdatesRequest(page: Int): Request = GET("$baseUrl/", headers) override fun latestUpdatesRequest(page: Int): Request = GET("$baseUrl/", headers)
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { 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()) { if (query.isNotEmpty()) {
url.addQueryParameter("key", query) 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.SChapter
import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.HttpSource import eu.kanade.tachiyomi.source.online.HttpSource
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.Interceptor import okhttp3.Interceptor
import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import okhttp3.Response import okhttp3.Response
import okhttp3.ResponseBody.Companion.toResponseBody import okhttp3.ResponseBody.Companion.toResponseBody
import org.jsoup.Jsoup
import uy.kohesive.injekt.injectLazy import uy.kohesive.injekt.injectLazy
import kotlin.experimental.xor import kotlin.experimental.xor
@ -31,7 +31,7 @@ class NicovideoSeiga : HttpSource() {
override fun latestUpdatesParse(response: Response): MangasPage { override fun latestUpdatesParse(response: Response): MangasPage {
val currentPage = response.request.url.queryParameter("page")!!.toInt() 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 mangaCount = doc.select("#main_title > h2 > span").text().trim().dropLast(1).toInt()
val mangaPerPage = 20 val mangaPerPage = 20
val mangaList = doc.select("#comic_list > ul > li") val mangaList = doc.select("#comic_list > ul > li")
@ -81,7 +81,7 @@ class NicovideoSeiga : HttpSource() {
override fun searchMangaParse(response: Response): MangasPage { override fun searchMangaParse(response: Response): MangasPage {
val currentPage = response.request.url.queryParameter("page")!!.toInt() val currentPage = response.request.url.queryParameter("page")!!.toInt()
val doc = Jsoup.parse(response.body.string()) val doc = response.asJsoup()
val mangaCount = val mangaCount =
doc.select("#mg_wrapper > div > div.header > div.header__result-summary").text().trim() doc.select("#mg_wrapper > div > div.header > div.header__result-summary").text().trim()
.split("")[1].toInt() .split("")[1].toInt()
@ -118,7 +118,7 @@ class NicovideoSeiga : HttpSource() {
GET("$baseUrl/manga/search/?q=$query&page=$page&sort=score") GET("$baseUrl/manga/search/?q=$query&page=$page&sort=score")
override fun mangaDetailsParse(response: Response): SManga = SManga.create().apply { 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 // The description is a mix of synopsis and news announcements
// This is just how mangakas use this site // This is just how mangakas use this site
description = description =
@ -144,7 +144,7 @@ class NicovideoSeiga : HttpSource() {
} }
override fun chapterListParse(response: Response): List<SChapter> { override fun chapterListParse(response: Response): List<SChapter> {
val doc = Jsoup.parse(response.body.string()) val doc = response.asJsoup()
val chapters = ArrayList<SChapter>() val chapters = ArrayList<SChapter>()
val chapterList = doc.select("#episode_list > ul > li") val chapterList = doc.select("#episode_list > ul > li")
val mangaId = response.request.url.toUrl().toString().substringAfterLast('/').substringBefore('?') val mangaId = response.request.url.toUrl().toString().substringAfterLast('/').substringBefore('?')
@ -184,7 +184,7 @@ class NicovideoSeiga : HttpSource() {
} }
override fun pageListParse(response: Response): List<Page> { override fun pageListParse(response: Response): List<Page> {
val doc = Jsoup.parse(response.body.string()) val doc = response.asJsoup()
val pages = ArrayList<Page>() val pages = ArrayList<Page>()
// Nicovideo will refuse to serve any pages if the user has not logged in // Nicovideo will refuse to serve any pages if the user has not logged in
if (!doc.select("#login_manga").isEmpty()) { 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.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import eu.kanade.tachiyomi.util.asJsoup import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import okhttp3.Response import okhttp3.Response
@ -57,7 +57,7 @@ class Rawdevart : ParsedHttpSource() {
override fun popularMangaNextPageSelector() = latestUpdatesNextPageSelector() override fun popularMangaNextPageSelector() = latestUpdatesNextPageSelector()
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { 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("page", page.toString())
url.addQueryParameter("title", query) url.addQueryParameter("title", query)
filters.forEach { filter -> 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() 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.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import eu.kanade.tachiyomi.util.asJsoup import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.Request import okhttp3.Request
import org.jsoup.nodes.Document import org.jsoup.nodes.Document
import org.jsoup.nodes.Element import org.jsoup.nodes.Element
@ -65,7 +65,7 @@ class SenManga : ParsedHttpSource() {
override fun latestUpdatesFromElement(element: Element) = popularMangaFromElement(element) override fun latestUpdatesFromElement(element: Element) = popularMangaFromElement(element)
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { 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("s", query)
.addQueryParameter("page", page.toString()) .addQueryParameter("page", page.toString())
@ -82,7 +82,7 @@ class SenManga : ParsedHttpSource() {
else -> {} else -> {}
} }
} }
return GET(url.toString(), headers) return GET(url.build(), headers)
} }
override fun latestUpdatesNextPageSelector() = popularMangaNextPageSelector() 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.SChapter
import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.HttpSource import eu.kanade.tachiyomi.source.online.HttpSource
import eu.kanade.tachiyomi.util.asJsoup
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json
import kotlinx.serialization.json.jsonArray import kotlinx.serialization.json.jsonArray
import kotlinx.serialization.json.jsonObject import kotlinx.serialization.json.jsonObject
@ -16,7 +17,6 @@ import kotlinx.serialization.json.jsonPrimitive
import okhttp3.Headers import okhttp3.Headers
import okhttp3.Request import okhttp3.Request
import okhttp3.Response import okhttp3.Response
import org.jsoup.Jsoup
import rx.Observable import rx.Observable
import uy.kohesive.injekt.injectLazy 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 // 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 // We'll just list all manga in the catalog instead
override fun popularMangaParse(response: Response): MangasPage { override fun popularMangaParse(response: Response): MangasPage {
val doc = Jsoup.parse(response.body.string()) val doc = response.asJsoup()
val ret = mutableListOf<SManga>() val ret = mutableListOf<SManga>()
// Manga that are recently updated don't show up on the full catalog // 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 // So we'll need to parse the recent updates section as well
@ -89,7 +89,7 @@ class Twi4 : HttpSource() {
GET(getUrlDomain() + manga.url, getChromeHeaders()) GET(getUrlDomain() + manga.url, getChromeHeaders())
override fun mangaDetailsParse(response: Response): SManga { override fun mangaDetailsParse(response: Response): SManga {
val document = Jsoup.parse(response.body.string()) val document = response.asJsoup()
return SManga.create().apply { return SManga.create().apply {
// We need to get the title and thumbnail again. // 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. // 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 // They have a <noscript> layout! This is surprising
// Though their manga pages fails to load as it relies on JS // Though their manga pages fails to load as it relies on JS
override fun chapterListParse(response: Response): List<SChapter> { override fun chapterListParse(response: Response): List<SChapter> {
val doc = Jsoup.parse(response.body.string()) val doc = response.asJsoup()
val chapterRegex = Regex(".+『(.+)』 #(\\d+)") val chapterRegex = Regex(".+『(.+)』 #(\\d+)")
val allChapters = doc.select("#backnumbers > div > ul > li") val allChapters = doc.select("#backnumbers > div > ul > li")
val ret = mutableListOf<SChapter>() val ret = mutableListOf<SChapter>()
@ -175,7 +175,7 @@ class Twi4 : HttpSource() {
GET(getUrlDomain() + chapter.url, getChromeHeaders()) GET(getUrlDomain() + chapter.url, getChromeHeaders())
override fun pageListParse(response: Response): List<Page> { 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 // The site interprets 1 page == 1 chapter
// There should only be 1 article in the document // There should only be 1 article in the document
val page = doc.select("article.comic:first-child") val page = doc.select("article.comic:first-child")

View File

@ -75,7 +75,7 @@ object ManaToki : NewToki("ManaToki", "comic", manaTokiPreferences) {
url.removeAllQueryParameters("tag") 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) 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", "완결웹툰")) 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.source.online.ParsedHttpSource
import eu.kanade.tachiyomi.util.asJsoup import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.Headers import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import okhttp3.Response import okhttp3.Response
@ -64,7 +64,7 @@ class MundoHentai : ParsedHttpSource() {
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
if (query.isNotEmpty()) { if (query.isNotEmpty()) {
val url = baseUrl.toHttpUrlOrNull()!!.newBuilder() val url = baseUrl.toHttpUrl().newBuilder()
.addQueryParameter("s", query) .addQueryParameter("s", query)
.toString() .toString()

View File

@ -14,7 +14,6 @@ import kotlinx.serialization.json.jsonObject
import kotlinx.serialization.json.jsonPrimitive import kotlinx.serialization.json.jsonPrimitive
import okhttp3.Headers import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrl import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.Interceptor import okhttp3.Interceptor
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
@ -78,7 +77,7 @@ class OnePieceEx : ParsedHttpSource() {
element.select("div.volume-nome h3").text() element.select("div.volume-nome h3").text()
thumbnail_url = THUMBNAIL_URL_MAP[title.uppercase(Locale.ROOT)] ?: DEFAULT_THUMBNAIL 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("type", "special")
.addQueryParameter("title", title) .addQueryParameter("title", title)
.toString() .toString()
@ -115,7 +114,7 @@ class OnePieceEx : ParsedHttpSource() {
} }
override fun mangaDetailsParse(document: Document): SManga = SManga.create().apply { override fun mangaDetailsParse(document: Document): SManga = SManga.create().apply {
val mangaUrl = document.location().toHttpUrlOrNull()!! val mangaUrl = document.location().toHttpUrl()
when (mangaUrl.queryParameter("type")!!) { when (mangaUrl.queryParameter("type")!!) {
"main" -> { "main" -> {
@ -174,7 +173,7 @@ class OnePieceEx : ParsedHttpSource() {
override fun chapterListSelector() = "div.capitulos li.volume-capitulo" override fun chapterListSelector() = "div.capitulos li.volume-capitulo"
override fun chapterFromElement(element: Element): SChapter = SChapter.create().apply { 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")!!) { when (mangaUrl.queryParameter("type")!!) {
"main" -> { "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.source.online.ParsedHttpSource
import eu.kanade.tachiyomi.util.asJsoup import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.Headers import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import okhttp3.Response import okhttp3.Response
@ -58,7 +58,7 @@ class MangaBook : ParsedHttpSource() {
val url = if (query.isNotBlank()) { val url = if (query.isNotBlank()) {
"$baseUrl/dosearch?query=$query&page=$page" "$baseUrl/dosearch?query=$query&page=$page"
} else { } 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 -> (if (filters.isEmpty()) getFilterList() else filters).forEach { filter ->
when (filter) { when (filter) {
is OrderBy -> { is OrderBy -> {
@ -84,7 +84,7 @@ class MangaBook : ParsedHttpSource() {
else -> {} else -> {}
} }
} }
return GET(url.toString(), headers) return GET(url.build(), headers)
} }
return GET(url, 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.source.online.ParsedHttpSource
import eu.kanade.tachiyomi.util.asJsoup import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.Headers import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.Request import okhttp3.Request
import okhttp3.Response import okhttp3.Response
import org.jsoup.nodes.Document import org.jsoup.nodes.Document
@ -43,7 +43,7 @@ class MangaPoisk : ParsedHttpSource() {
val url = if (query.isNotBlank()) { val url = if (query.isNotBlank()) {
"$baseUrl/search?q=$query&page=$page" "$baseUrl/search?q=$query&page=$page"
} else { } 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 -> (if (filters.isEmpty()) getFilterList() else filters).forEach { filter ->
when (filter) { when (filter) {
is OrderBy -> { is OrderBy -> {
@ -64,7 +64,7 @@ class MangaPoisk : ParsedHttpSource() {
else -> {} else -> {}
} }
} }
return GET(url.toString(), headers) return GET(url.build(), headers)
} }
return GET(url, headers) return GET(url, headers)
} }

View File

@ -197,7 +197,7 @@ class Remanga : ConfigurableSource, HttpSource() {
if (preferences.getBoolean(isLib_PREF, false)) { if (preferences.getBoolean(isLib_PREF, false)) {
url.addQueryParameter("exclude_bookmarks", "1") url.addQueryParameter("exclude_bookmarks", "1")
} }
return GET(url.toString(), headers) return GET(url.build(), headers)
} }
override fun popularMangaParse(response: Response): MangasPage = searchMangaParse(response) override fun popularMangaParse(response: Response): MangasPage = searchMangaParse(response)
@ -207,7 +207,7 @@ class Remanga : ConfigurableSource, HttpSource() {
if (preferences.getBoolean(isLib_PREF, false)) { if (preferences.getBoolean(isLib_PREF, false)) {
url.addQueryParameter("exclude_bookmarks", "1") url.addQueryParameter("exclude_bookmarks", "1")
} }
return GET(url.toString(), headers) return GET(url.build(), headers)
} }
override fun latestUpdatesParse(response: Response): MangasPage = searchMangaParse(response) override fun latestUpdatesParse(response: Response): MangasPage = searchMangaParse(response)
@ -307,8 +307,7 @@ class Remanga : ConfigurableSource, HttpSource() {
throw Exception("Пользователь не найден, необходима авторизация через WebView\uD83C\uDF0E") throw Exception("Пользователь не найден, необходима авторизация через WebView\uD83C\uDF0E")
} }
val TypeQ = getMyList()[filter.state].id val TypeQ = getMyList()[filter.state].id
val UserProfileUrl = "$baseUrl/api/users/$USER_ID/bookmarks/?type=$TypeQ&page=$page".toHttpUrl().newBuilder() return GET("$baseUrl/api/users/$USER_ID/bookmarks/?type=$TypeQ&page=$page", headers)
return GET(UserProfileUrl.toString(), headers)
} }
} }
is RequireChapters -> { is RequireChapters -> {
@ -329,7 +328,7 @@ class Remanga : ConfigurableSource, HttpSource() {
url.addQueryParameter("exclude_bookmarks", "1") url.addQueryParameter("exclude_bookmarks", "1")
} }
return GET(url.toString(), headers) return GET(url.build(), headers)
} }
private fun parseStatus(status: Int): Int { 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.source.online.ParsedHttpSource
import eu.kanade.tachiyomi.util.asJsoup import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.Headers import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import okhttp3.Response import okhttp3.Response
@ -59,10 +59,7 @@ class UniComics : ParsedHttpSource() {
is Publishers -> { is Publishers -> {
if (filter.state > 0) { if (filter.state > 0) {
val publisherName = getPublishersList()[filter.state].url val publisherName = getPublishersList()[filter.state].url
val publisherUrl = return GET("$baseDefaultUrl$PATH_publishers/$publisherName/page/$page", headers)
"$baseDefaultUrl$PATH_publishers/$publisherName/page/$page".toHttpUrlOrNull()!!
.newBuilder()
return GET(publisherUrl.toString(), headers)
} }
} }
else -> {} 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.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import okhttp3.Headers import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.Request import okhttp3.Request
import okhttp3.Response import okhttp3.Response
import org.jsoup.nodes.Document import org.jsoup.nodes.Document
@ -60,15 +59,13 @@ class YagamiProject : ParsedHttpSource() {
is CategoryList -> { is CategoryList -> {
if (filter.state > 0) { if (filter.state > 0) {
val catQ = getCategoryList()[filter.state].name val catQ = getCategoryList()[filter.state].name
val catUrl = "$baseUrl/tags/$catQ".toHttpUrlOrNull()!!.newBuilder() return GET("$baseUrl/tags/$catQ", headers)
return GET(catUrl.toString(), headers)
} }
} }
is FormatList -> { is FormatList -> {
if (filter.state > 0) { if (filter.state > 0) {
val formN = getFormatList()[filter.state].query val formN = getFormatList()[filter.state].query
val formaUrl = "$baseUrl/$formN".toHttpUrlOrNull()!!.newBuilder() return GET("$baseUrl/$formN", headers)
return GET(formaUrl.toString(), headers)
} }
} }
else -> {} 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.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import okhttp3.Headers import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import okhttp3.Response import okhttp3.Response
@ -38,7 +38,7 @@ class Baimangu : ConfigurableSource, ParsedHttpSource() {
override val client: OkHttpClient = network.cloudflareClient.newBuilder() override val client: OkHttpClient = network.cloudflareClient.newBuilder()
.rateLimitHost( .rateLimitHost(
baseUrl.toHttpUrlOrNull()!!, baseUrl.toHttpUrl(),
preferences.getString(MAINSITE_RATEPERMITS_PREF, MAINSITE_RATEPERMITS_PREF_DEFAULT)!!.toInt(), preferences.getString(MAINSITE_RATEPERMITS_PREF, MAINSITE_RATEPERMITS_PREF_DEFAULT)!!.toInt(),
preferences.getString(MAINSITE_RATEPERIOD_PREF, MAINSITE_RATEPERIOD_PREF_DEFAULT)!!.toLong(), preferences.getString(MAINSITE_RATEPERIOD_PREF, MAINSITE_RATEPERIOD_PREF_DEFAULT)!!.toLong(),
TimeUnit.MILLISECONDS, 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.source.online.ParsedHttpSource
import eu.kanade.tachiyomi.util.asJsoup import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.HttpUrl.Companion.toHttpUrl import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import okhttp3.Response import okhttp3.Response
@ -134,18 +133,18 @@ class Jinmantiantang : ParsedHttpSource(), ConfigurableSource {
newQuery = "$newQuery+%2B$keyword" newQuery = "$newQuery+%2B$keyword"
params = params.substringAfter("&") params = params.substringAfter("&")
} }
"$baseUrl/search/photos?search_query=$newQuery&page=$page&$params".toHttpUrlOrNull()?.newBuilder() "$baseUrl/search/photos?search_query=$newQuery&page=$page&$params"
} else { } else {
params = if (params == "") "/albums?" else params params = if (params == "") "/albums?" else params
if (query == "") { if (query == "") {
"$baseUrl$params&page=$page".toHttpUrlOrNull()?.newBuilder() "$baseUrl$params&page=$page"
} else { } else {
// 在搜索栏的关键词前添加-号来实现对筛选结果的过滤, 像 "-YAOI -扶他 -毛絨絨 -獵奇", 注意此时搜索功能不可用. // 在搜索栏的关键词前添加-号来实现对筛选结果的过滤, 像 "-YAOI -扶他 -毛絨絨 -獵奇", 注意此时搜索功能不可用.
val removedGenres = query.split(" ").filter { it.startsWith("-") }.joinToString("+") { it.removePrefix("-") } 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() override fun searchMangaNextPageSelector(): String = popularMangaNextPageSelector()

View File

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

View File

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

View File

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