AwkwardPeak7 50b5d33614
Random User-Agent Refactor (#17059)
* lib-randomua

* NHentai: Random mobile ua

* Madara random UA overhaul

* MangaThemesia random UA overhaul

* MangaHub random UA overhaul

* build errors and warnings

* remove preference from Constellar

* change to singleton object

* network.client

* fix copy paste and chapter deep link

* exit early

* use data class and enum options

* missing import

* suggested changes

Co-authored-by: AntsyLich <59261191+AntsyLich@users.noreply.github.com>

* re-add empty check to filters

* convert to interceptor

* update comment

Co-authored-by: Alessandro Jean <14254807+alessandrojean@users.noreply.github.com>

* update error message

* initialize client by lazy

* dont check on excluded Filters

Co-authored-by: AntsyLich <59261191+AntsyLich@users.noreply.github.com>

* newlines

* move preference helper function into lib

* move preference helper function into lib x2

* move check to lib too

* move defaultRandomUserAgentType to constructor

* rename the interceptor

* organize the interceptor and preference stuff in different files

* hide custom ua setting when random ua is enabled

* English

Co-authored-by: AntsyLich <59261191+AntsyLich@users.noreply.github.com>

* catch specific exception

Co-authored-by: AntsyLich <59261191+AntsyLich@users.noreply.github.com>

* setVisible()

fresh stuff

* setVisible()

fresh stuff

* change summary

* workaround

* Update error message

Co-authored-by: Alessandro Jean <14254807+alessandrojean@users.noreply.github.com>

* Update comment

Co-authored-by: Alessandro Jean <14254807+alessandrojean@users.noreply.github.com>

---------

Co-authored-by: AntsyLich <59261191+AntsyLich@users.noreply.github.com>
Co-authored-by: Alessandro Jean <14254807+alessandrojean@users.noreply.github.com>
2023-07-15 19:52:35 -03:00

134 lines
4.7 KiB
Kotlin

package eu.kanade.tachiyomi.extension.en.manga18fx
import eu.kanade.tachiyomi.multisrc.madara.Madara
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.source.model.Filter
import eu.kanade.tachiyomi.source.model.FilterList
import eu.kanade.tachiyomi.source.model.MangasPage
import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.Request
import okhttp3.Response
import org.jsoup.nodes.Document
import org.jsoup.nodes.Element
import org.jsoup.select.Evaluator
import java.text.SimpleDateFormat
import java.util.Locale
// The site isn't actually based on Madara but reproduces it very well
class Manga18fx : Madara(
"Manga18fx",
"https://manga18fx.com",
"en",
SimpleDateFormat("dd MMM yy", Locale.ENGLISH),
) {
override val id = 3157287889751723714
override val fetchGenres = false
override val sendViewCount = false
override fun popularMangaRequest(page: Int) = GET(baseUrl, headers)
override fun popularMangaParse(response: Response): MangasPage {
val document = response.asJsoup()
loadGenres(document)
val block = document.selectFirst(Evaluator.Class("trending-block"))!!
val mangas = block.select(Evaluator.Tag("a")).map(::mangaFromElement)
return MangasPage(mangas, false)
}
private fun mangaFromElement(element: Element) = SManga.create().apply {
url = element.attr("href")
title = element.attr("title")
thumbnail_url = element.selectFirst(Evaluator.Tag("img"))!!.attr("data-src")
}
override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/page/$page", headers)
override fun latestUpdatesParse(response: Response): MangasPage {
val document = response.asJsoup()
loadGenres(document)
val mangas = document.select(Evaluator.Class("bsx-item")).map {
mangaFromElement(it.selectFirst(Evaluator.Tag("a"))!!)
}
val nextButton = document.selectFirst(Evaluator.Class("next"))
val hasNextPage = nextButton != null && nextButton.hasClass("disabled").not()
return MangasPage(mangas, hasNextPage)
}
override fun fetchSearchManga(page: Int, query: String, filters: FilterList) =
super.fetchSearchManga(page, query, filters).doOnNext {
for (manga in it.mangas)
manga.url = manga.url.removeSuffix("/")
}
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
if (query.isEmpty()) {
filters.forEach { filter ->
if (filter is GenreFilter) {
return GET(filter.vals[filter.state].second, headers)
}
}
return latestUpdatesRequest(page)
}
val url = "$baseUrl/search".toHttpUrl().newBuilder()
.addQueryParameter("q", query)
.addQueryParameter("page", page.toString())
.build()
return GET(url, headers)
}
override fun searchMangaParse(response: Response) = latestUpdatesParse(response)
override val mangaDetailsSelectorDescription = ".dsct"
override fun chapterListParse(response: Response): List<SChapter> {
val document = response.asJsoup()
val container = document.selectFirst(Evaluator.Class("row-content-chapter"))!!
return container.children().map(::chapterFromElement)
}
override fun chapterDateSelector() = "span.chapter-time"
class GenreFilter(val vals: List<Pair<String, String>>) :
Filter.Select<String>("Genre", vals.map { it.first }.toTypedArray())
private fun loadGenres(document: Document) {
genresList = document.select(".header-bottom li a").map {
val href = it.attr("href")
val url = if (href.startsWith("http")) href else "$baseUrl/$href"
Pair(it.text(), url)
}
}
private var genresList: List<Pair<String, String>> = emptyList()
private var hardCodedTypes: List<Pair<String, String>> = listOf(
Pair("Manhwa", "$baseUrl/manga-genre/manhwa"),
Pair("Manhua", "$baseUrl/manga-genre/manhua"),
Pair("Raw", "$baseUrl/manga-genre/raw"),
)
override fun getFilterList(): FilterList {
val filters = buildList(2) {
add(Filter.Header("Filters are ignored for text search!"))
if (genresList.isNotEmpty()) {
add(
GenreFilter(hardCodedTypes + genresList),
)
} else {
add(
Filter.Header("Wait for mangas to load then tap Reset"),
)
}
}
return FilterList(filters)
}
}