Toonily: fix search (#16172)
* Toonily: fix search * use CookieInterceptor instead
This commit is contained in:
parent
4c13f3836b
commit
dc9ba9e008
46
multisrc/overrides/madara/toonily/src/CookieInterceptor.kt
Normal file
46
multisrc/overrides/madara/toonily/src/CookieInterceptor.kt
Normal file
@ -0,0 +1,46 @@
|
||||
package eu.kanade.tachiyomi.extension.en.toonily
|
||||
|
||||
import android.util.Log
|
||||
import android.webkit.CookieManager
|
||||
import okhttp3.Interceptor
|
||||
import okhttp3.Response
|
||||
|
||||
class CookieInterceptor(
|
||||
private val domain: String,
|
||||
private val key: String,
|
||||
private val value: String,
|
||||
) : Interceptor {
|
||||
|
||||
init {
|
||||
val url = "https://$domain/"
|
||||
val cookie = "$key=$value; Domain=$domain; Path=/"
|
||||
setCookie(url, cookie)
|
||||
}
|
||||
|
||||
override fun intercept(chain: Interceptor.Chain): Response {
|
||||
val request = chain.request()
|
||||
if (!request.url.host.endsWith(domain)) return chain.proceed(request)
|
||||
|
||||
val cookie = "$key=$value"
|
||||
val cookieList = request.header("Cookie")?.split("; ") ?: emptyList()
|
||||
if (cookie in cookieList) return chain.proceed(request)
|
||||
|
||||
setCookie("https://$domain/", "$cookie; Domain=$domain; Path=/")
|
||||
val prefix = "$key="
|
||||
val newCookie = buildList(cookieList.size + 1) {
|
||||
cookieList.filterNotTo(this) { it.startsWith(prefix) }
|
||||
add(cookie)
|
||||
}.joinToString("; ")
|
||||
val newRequest = request.newBuilder().header("Cookie", newCookie).build()
|
||||
return chain.proceed(newRequest)
|
||||
}
|
||||
|
||||
private fun setCookie(url: String, value: String) {
|
||||
try {
|
||||
CookieManager.getInstance().setCookie(url, value)
|
||||
} catch (e: Exception) {
|
||||
// Probably running on Tachidesk
|
||||
Log.e("Toonily", "failed to set cookie", e)
|
||||
}
|
||||
}
|
||||
}
|
@ -1,16 +1,73 @@
|
||||
package eu.kanade.tachiyomi.extension.en.toonily
|
||||
|
||||
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
||||
import eu.kanade.tachiyomi.network.GET
|
||||
import eu.kanade.tachiyomi.source.model.FilterList
|
||||
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
|
||||
import okhttp3.OkHttpClient
|
||||
import okhttp3.Request
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.Locale
|
||||
|
||||
private const val domain = "toonily.com"
|
||||
class Toonily : Madara(
|
||||
"Toonily",
|
||||
"https://toonily.com",
|
||||
"https://$domain",
|
||||
"en",
|
||||
SimpleDateFormat("MMM d, yy", Locale.US),
|
||||
) {
|
||||
|
||||
private val cookieInterceptor = CookieInterceptor(domain, "toonily-mature", "1")
|
||||
override val client: OkHttpClient = super.client.newBuilder()
|
||||
.addNetworkInterceptor(cookieInterceptor)
|
||||
.build()
|
||||
|
||||
override val mangaSubString = "webtoons"
|
||||
|
||||
override fun searchPage(page: Int): String {
|
||||
return if (page > 1) {
|
||||
"page/$page/"
|
||||
} else {
|
||||
""
|
||||
}
|
||||
}
|
||||
|
||||
private fun searchPage(page: Int, query: String): String {
|
||||
val urlQuery = query.trim()
|
||||
.lowercase(Locale.US)
|
||||
.replace(titleSpecialCharactersRegex, "-")
|
||||
.replace(trailingHyphenRegex, "")
|
||||
.let { if (it.isNotEmpty()) "$it/" else it }
|
||||
return if (page > 1) {
|
||||
"search/${urlQuery}page/$page/"
|
||||
} else {
|
||||
"search/$urlQuery"
|
||||
}
|
||||
}
|
||||
|
||||
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
|
||||
val request = super.searchMangaRequest(page, query, filters)
|
||||
|
||||
val queries = request.url.queryParameterNames
|
||||
.filterNot { it == "s" }
|
||||
|
||||
val newUrl = "$baseUrl/${searchPage(page, query)}".toHttpUrlOrNull()!!.newBuilder().apply {
|
||||
queries.map { q ->
|
||||
request.url.queryParameterValues(q).map {
|
||||
this.addQueryParameter(q, it)
|
||||
}
|
||||
}
|
||||
}.build()
|
||||
|
||||
return request.newBuilder()
|
||||
.url(newUrl)
|
||||
.build()
|
||||
}
|
||||
|
||||
override fun genresRequest(): Request {
|
||||
return GET("$baseUrl/search/?post_type=wp-manga", headers)
|
||||
}
|
||||
|
||||
// The source customized the Madara theme and broke the filter.
|
||||
override val filterNonMangaItems = false
|
||||
|
||||
@ -24,4 +81,9 @@ class Toonily : Madara(
|
||||
val formattedDate = if (date?.contains("UP") == true) "today" else date
|
||||
return super.parseChapterDate(formattedDate)
|
||||
}
|
||||
|
||||
companion object {
|
||||
val titleSpecialCharactersRegex = "[^a-z0-9]+".toRegex()
|
||||
val trailingHyphenRegex = "-+$".toRegex()
|
||||
}
|
||||
}
|
||||
|
@ -407,7 +407,7 @@ class MadaraGenerator : ThemeSourceGenerator {
|
||||
SingleLang("TonizuToon", "https://tonizutoon.com", "tr", isNsfw = true),
|
||||
SingleLang("ToonChill", "https://toonchill.com", "en", overrideVersionCode = 1),
|
||||
SingleLang("ToonGod", "https://www.toongod.com", "en", isNsfw = true, overrideVersionCode = 4),
|
||||
SingleLang("Toonily", "https://toonily.com", "en", isNsfw = true, overrideVersionCode = 9),
|
||||
SingleLang("Toonily", "https://toonily.com", "en", isNsfw = true, overrideVersionCode = 10),
|
||||
SingleLang("Toonily.net", "https://toonily.net", "en", isNsfw = true, className = "Toonilynet", overrideVersionCode = 2),
|
||||
SingleLang("ToonMany", "https://toonmany.com", "en", isNsfw = true),
|
||||
SingleLang("Top Manhua", "https://topmanhua.com", "en", overrideVersionCode = 2),
|
||||
|
Loading…
x
Reference in New Issue
Block a user