fix: readmangatoday changed theme (#11755)

This commit is contained in:
Alexander Chernov 2022-05-06 18:17:25 +01:00 committed by GitHub
parent a53b7b3c1e
commit 7d7e3d6f03
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 47 additions and 33 deletions

View File

@ -5,7 +5,7 @@ ext {
extName = 'ReadMangaToday'
pkgNameSuffix = 'en.readmangatoday'
extClass = '.Readmangatoday'
extVersionCode = 9
extVersionCode = 10
}
apply from: "$rootDir/common.gradle"

View File

@ -8,11 +8,16 @@ import eu.kanade.tachiyomi.source.model.Page
import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.jsonArray
import kotlinx.serialization.json.jsonPrimitive
import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient
import okhttp3.Request
import org.jsoup.nodes.Document
import org.jsoup.nodes.Element
import uy.kohesive.injekt.injectLazy
import java.util.Calendar
class Readmangatoday : ParsedHttpSource() {
@ -29,6 +34,8 @@ class Readmangatoday : ParsedHttpSource() {
override val client: OkHttpClient get() = network.cloudflareClient
private val json: Json by injectLazy()
/**
* Search only returns data with user-agent and x-requeted-with set
* Referer needed due to some chapters linking images from other domains
@ -47,15 +54,17 @@ class Readmangatoday : ParsedHttpSource() {
return GET("$baseUrl/latest-releases/$page", headers)
}
override fun popularMangaSelector() = "div.hot-manga > div.style-list > div.box"
override fun popularMangaSelector() = "div.categoryContent > div.galeriContent > div.mangaSliderCard"
override fun latestUpdatesSelector() = "div.hot-manga > div.style-grid > div.box"
override fun latestUpdatesSelector() = "div.listUpdates > div.miniListCard"
override fun popularMangaFromElement(element: Element): SManga {
val manga = SManga.create()
element.select("div.title > h2 > a").first().let {
element.selectFirst("h2")?.let {
manga.title = it.text()
}
element.select("a").first().let {
manga.setUrlWithoutDomain(it.attr("href"))
manga.title = it.attr("title")
}
manga.thumbnail_url = element.select("img").attr("src")
return manga
@ -65,9 +74,9 @@ class Readmangatoday : ParsedHttpSource() {
return popularMangaFromElement(element)
}
override fun popularMangaNextPageSelector() = "div.hot-manga > ul.pagination > li > a:contains(»)"
override fun popularMangaNextPageSelector() = "div.categoryContent a.page-link:contains(»)"
override fun latestUpdatesNextPageSelector() = "div.hot-manga > ul.pagination > li > a:contains(»)"
override fun latestUpdatesNextPageSelector() = "div.popularToday a.page-link:contains(»)"
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
val builder = okhttp3.FormBody.Builder()
@ -85,32 +94,27 @@ class Readmangatoday : ParsedHttpSource() {
}
}
}
return POST("$baseUrl/service/advanced_search", headers, builder.build())
return POST("$baseUrl/advanced-search", headers, builder.build())
}
override fun searchMangaSelector() = "div.style-list > div.box"
override fun searchMangaSelector() = "div.mangaSliderCard"
override fun searchMangaFromElement(element: Element): SManga {
val manga = SManga.create()
element.select("div.title > h2 > a").first().let {
manga.setUrlWithoutDomain(it.attr("href"))
manga.title = it.attr("title")
}
return manga
return popularMangaFromElement(element)
}
override fun searchMangaNextPageSelector() = "div.next-page > a.next"
override fun mangaDetailsParse(document: Document): SManga {
val detailElement = document.select("div.movie-meta").first()
val genreElement = detailElement.select("dl.dl-horizontal > dd:eq(5) a")
val detailElement = document.select("div.productDetail").first()
val genreElement = detailElement.select("b:contains(Genres)+span.mgen>a")
val manga = SManga.create()
manga.author = document.select("ul.cast-list li.director > ul a").first()?.text()
manga.artist = document.select("ul.cast-list li:not(.director) > ul a").first()?.text()
manga.description = detailElement.select("li.movie-detail").first()?.text()
manga.status = detailElement.select("dl.dl-horizontal > dd:eq(3)").first()?.text().orEmpty().let { parseStatus(it) }
manga.thumbnail_url = detailElement.select("img.img-responsive").first()?.attr("src")
manga.author = detailElement.select("div.productRight div.infox div.flex-wrap b:contains(Author)+span>a").first()?.text()
manga.artist = detailElement.select("div.productRight div.infox div.flex-wrap b:contains(Artist)+span>a").first()?.text()
manga.description = detailElement.select("div.productRight div.infox h2:contains(Description)~p:eq(2)").first()?.text()
manga.status = detailElement.select("div.imptdt:contains(Status)>i").first()?.text().orEmpty().let { parseStatus(it) }
manga.thumbnail_url = detailElement.select("div.thumb img").first()?.attr("src")
val genres = mutableListOf<String>()
genreElement?.forEach { genres.add(it.text()) }
@ -125,15 +129,15 @@ class Readmangatoday : ParsedHttpSource() {
else -> SManga.UNKNOWN
}
override fun chapterListSelector() = "ul.chp_lst > li"
override fun chapterListSelector() = "div#chapters-tabContent div.cardFlex div.checkBoxCard"
override fun chapterFromElement(element: Element): SChapter {
val urlElement = element.select("a").first()
val chapter = SChapter.create()
chapter.setUrlWithoutDomain(urlElement.attr("href"))
chapter.name = urlElement.select("span.val").text()
chapter.date_upload = element.select("span.dte").first()?.text()?.let { parseChapterDate(it) } ?: 0
chapter.name = urlElement.ownText()
chapter.date_upload = element.select("i.upload-date").first()?.text()?.let { parseChapterDate(it) } ?: 0
return chapter
}
@ -145,22 +149,22 @@ class Readmangatoday : ParsedHttpSource() {
val calendar = Calendar.getInstance()
when {
dateWords[1].contains("Minute") -> {
dateWords[1].contains("Minute", true) -> {
calendar.add(Calendar.MINUTE, -timeAgo)
}
dateWords[1].contains("Hour") -> {
dateWords[1].contains("Hour", true) -> {
calendar.add(Calendar.HOUR_OF_DAY, -timeAgo)
}
dateWords[1].contains("Day") -> {
dateWords[1].contains("Day", true) -> {
calendar.add(Calendar.DAY_OF_YEAR, -timeAgo)
}
dateWords[1].contains("Week") -> {
dateWords[1].contains("Week", true) -> {
calendar.add(Calendar.WEEK_OF_YEAR, -timeAgo)
}
dateWords[1].contains("Month") -> {
dateWords[1].contains("Month", true) -> {
calendar.add(Calendar.MONTH, -timeAgo)
}
dateWords[1].contains("Year") -> {
dateWords[1].contains("year", true) -> {
calendar.add(Calendar.YEAR, -timeAgo)
}
}
@ -176,9 +180,19 @@ class Readmangatoday : ParsedHttpSource() {
}
override fun pageListParse(document: Document): List<Page> {
return document.select("div.content-list > img").mapIndexed { i, img ->
Page(i, "", img.attr("abs:src"))
val docString = document.toString()
val imageListRegex = Regex("\\\"images.*?:.*?(\\[.*?\\])")
val imageListJson = imageListRegex.find(docString)!!.destructured.toList()[0]
val imageList = json.parseToJsonElement(imageListJson).jsonArray
val baseResolver = baseUrl.toHttpUrl()
val scriptPages = imageList.mapIndexed { i, jsonEl ->
val imageUrl = jsonEl.jsonPrimitive.content
Page(i, "", baseResolver.resolve(imageUrl).toString())
}
return scriptPages.distinctBy { it.imageUrl }
}
override fun imageUrlParse(document: Document): String = throw UnsupportedOperationException("Not used")