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' extName = 'ReadMangaToday'
pkgNameSuffix = 'en.readmangatoday' pkgNameSuffix = 'en.readmangatoday'
extClass = '.Readmangatoday' extClass = '.Readmangatoday'
extVersionCode = 9 extVersionCode = 10
} }
apply from: "$rootDir/common.gradle" 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.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 kotlinx.serialization.json.Json
import kotlinx.serialization.json.jsonArray
import kotlinx.serialization.json.jsonPrimitive
import okhttp3.Headers import okhttp3.Headers
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
import org.jsoup.nodes.Element import org.jsoup.nodes.Element
import uy.kohesive.injekt.injectLazy
import java.util.Calendar import java.util.Calendar
class Readmangatoday : ParsedHttpSource() { class Readmangatoday : ParsedHttpSource() {
@ -29,6 +34,8 @@ class Readmangatoday : ParsedHttpSource() {
override val client: OkHttpClient get() = network.cloudflareClient 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 * Search only returns data with user-agent and x-requeted-with set
* Referer needed due to some chapters linking images from other domains * 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) 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 { override fun popularMangaFromElement(element: Element): SManga {
val manga = SManga.create() 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.setUrlWithoutDomain(it.attr("href"))
manga.title = it.attr("title")
} }
manga.thumbnail_url = element.select("img").attr("src") manga.thumbnail_url = element.select("img").attr("src")
return manga return manga
@ -65,9 +74,9 @@ class Readmangatoday : ParsedHttpSource() {
return popularMangaFromElement(element) 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 { override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
val builder = okhttp3.FormBody.Builder() 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 { override fun searchMangaFromElement(element: Element): SManga {
val manga = SManga.create() return popularMangaFromElement(element)
element.select("div.title > h2 > a").first().let {
manga.setUrlWithoutDomain(it.attr("href"))
manga.title = it.attr("title")
}
return manga
} }
override fun searchMangaNextPageSelector() = "div.next-page > a.next" override fun searchMangaNextPageSelector() = "div.next-page > a.next"
override fun mangaDetailsParse(document: Document): SManga { override fun mangaDetailsParse(document: Document): SManga {
val detailElement = document.select("div.movie-meta").first() val detailElement = document.select("div.productDetail").first()
val genreElement = detailElement.select("dl.dl-horizontal > dd:eq(5) a") val genreElement = detailElement.select("b:contains(Genres)+span.mgen>a")
val manga = SManga.create() val manga = SManga.create()
manga.author = document.select("ul.cast-list li.director > ul a").first()?.text() manga.author = detailElement.select("div.productRight div.infox div.flex-wrap b:contains(Author)+span>a").first()?.text()
manga.artist = document.select("ul.cast-list li:not(.director) > ul 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("li.movie-detail").first()?.text() manga.description = detailElement.select("div.productRight div.infox h2:contains(Description)~p:eq(2)").first()?.text()
manga.status = detailElement.select("dl.dl-horizontal > dd:eq(3)").first()?.text().orEmpty().let { parseStatus(it) } manga.status = detailElement.select("div.imptdt:contains(Status)>i").first()?.text().orEmpty().let { parseStatus(it) }
manga.thumbnail_url = detailElement.select("img.img-responsive").first()?.attr("src") manga.thumbnail_url = detailElement.select("div.thumb img").first()?.attr("src")
val genres = mutableListOf<String>() val genres = mutableListOf<String>()
genreElement?.forEach { genres.add(it.text()) } genreElement?.forEach { genres.add(it.text()) }
@ -125,15 +129,15 @@ class Readmangatoday : ParsedHttpSource() {
else -> SManga.UNKNOWN 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 { override fun chapterFromElement(element: Element): SChapter {
val urlElement = element.select("a").first() val urlElement = element.select("a").first()
val chapter = SChapter.create() val chapter = SChapter.create()
chapter.setUrlWithoutDomain(urlElement.attr("href")) chapter.setUrlWithoutDomain(urlElement.attr("href"))
chapter.name = urlElement.select("span.val").text() chapter.name = urlElement.ownText()
chapter.date_upload = element.select("span.dte").first()?.text()?.let { parseChapterDate(it) } ?: 0 chapter.date_upload = element.select("i.upload-date").first()?.text()?.let { parseChapterDate(it) } ?: 0
return chapter return chapter
} }
@ -145,22 +149,22 @@ class Readmangatoday : ParsedHttpSource() {
val calendar = Calendar.getInstance() val calendar = Calendar.getInstance()
when { when {
dateWords[1].contains("Minute") -> { dateWords[1].contains("Minute", true) -> {
calendar.add(Calendar.MINUTE, -timeAgo) calendar.add(Calendar.MINUTE, -timeAgo)
} }
dateWords[1].contains("Hour") -> { dateWords[1].contains("Hour", true) -> {
calendar.add(Calendar.HOUR_OF_DAY, -timeAgo) calendar.add(Calendar.HOUR_OF_DAY, -timeAgo)
} }
dateWords[1].contains("Day") -> { dateWords[1].contains("Day", true) -> {
calendar.add(Calendar.DAY_OF_YEAR, -timeAgo) calendar.add(Calendar.DAY_OF_YEAR, -timeAgo)
} }
dateWords[1].contains("Week") -> { dateWords[1].contains("Week", true) -> {
calendar.add(Calendar.WEEK_OF_YEAR, -timeAgo) calendar.add(Calendar.WEEK_OF_YEAR, -timeAgo)
} }
dateWords[1].contains("Month") -> { dateWords[1].contains("Month", true) -> {
calendar.add(Calendar.MONTH, -timeAgo) calendar.add(Calendar.MONTH, -timeAgo)
} }
dateWords[1].contains("Year") -> { dateWords[1].contains("year", true) -> {
calendar.add(Calendar.YEAR, -timeAgo) calendar.add(Calendar.YEAR, -timeAgo)
} }
} }
@ -176,9 +180,19 @@ class Readmangatoday : ParsedHttpSource() {
} }
override fun pageListParse(document: Document): List<Page> { override fun pageListParse(document: Document): List<Page> {
return document.select("div.content-list > img").mapIndexed { i, img -> val docString = document.toString()
Page(i, "", img.attr("abs:src")) 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") override fun imageUrlParse(document: Document): String = throw UnsupportedOperationException("Not used")