MangaReader - update parsing (#4152)

* MangaReader - update parsing

* Update build.gradle
This commit is contained in:
Mike 2020-08-17 15:02:51 -04:00 committed by GitHub
parent 48cdd49994
commit 524562993c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 78 additions and 61 deletions

View File

@ -5,7 +5,7 @@ ext {
extName = 'Mangareader & Mangapanda' extName = 'Mangareader & Mangapanda'
pkgNameSuffix = 'en.mangareader' pkgNameSuffix = 'en.mangareader'
extClass = '.MRPFactory' extClass = '.MRPFactory'
extVersionCode = 5 extVersionCode = 6
libVersion = '1.2' libVersion = '1.2'
} }

View File

@ -27,54 +27,11 @@ abstract class MRP(
override val client: OkHttpClient = network.cloudflareClient override val client: OkHttpClient = network.cloudflareClient
override fun popularMangaSelector() = "div.mangaresultitem"
override fun popularMangaRequest(page: Int): Request { override fun popularMangaRequest(page: Int): Request {
return if (page == 1) { return GET("$baseUrl/popular" + if (page > 1) "/${(page - 1) * 30}" else "", headers)
GET("$baseUrl/popular/")
} else {
GET("$baseUrl/popular/$nextPageNumber")
}
} }
// Site's page numbering is weird, have to do some work to get the right page number for additional requests override fun popularMangaSelector() = "div.mangaresultitem"
private lateinit var nextPageNumber: String
private val nextPageSelector = "div#sp a:contains(>)"
override fun popularMangaParse(response: Response): MangasPage {
val document = response.asJsoup()
nextPageNumber = document.select(nextPageSelector).attr("href")
.substringAfterLast("/").substringBefore("\"")
val manga = mutableListOf<SManga>()
document.select(popularMangaSelector()).map { manga.add(popularMangaFromElement(it)) }
return MangasPage(manga, document.select(nextPageSelector).hasText())
}
override fun latestUpdatesParse(response: Response): MangasPage {
val document = response.asJsoup()
nextPageNumber = document.select(nextPageSelector).attr("href")
.substringAfterLast("/").substringBefore("\"")
val manga = mutableListOf<SManga>()
document.select(latestUpdatesSelector()).map { manga.add(latestUpdatesFromElement(it)) }
return MangasPage(manga, document.select(nextPageSelector).hasText())
}
override fun latestUpdatesSelector() = "tr.c3"
override fun latestUpdatesRequest(page: Int): Request {
return if (page == 1) {
GET("$baseUrl/latest/")
} else {
GET("$baseUrl/latest/$nextPageNumber")
}
}
override fun popularMangaFromElement(element: Element): SManga { override fun popularMangaFromElement(element: Element): SManga {
val manga = SManga.create() val manga = SManga.create()
@ -86,6 +43,30 @@ abstract class MRP(
return manga return manga
} }
override fun popularMangaNextPageSelector() = "div#sp strong + a"
private var nextLatestPage: String? = null
override fun latestUpdatesRequest(page: Int): Request {
return if (page == 1) {
nextLatestPage = null
GET("$baseUrl/latest", headers)
} else {
GET(nextLatestPage!!, headers)
}
}
override fun latestUpdatesParse(response: Response): MangasPage {
val document = response.asJsoup()
val mangas = document.select(latestUpdatesSelector()).map { latestUpdatesFromElement(it) }
nextLatestPage = document.select(latestUpdatesNextPageSelector()).firstOrNull()?.attr("abs:href")
return MangasPage(mangas, nextLatestPage != null)
}
override fun latestUpdatesSelector() = "tr.c3"
override fun latestUpdatesFromElement(element: Element): SManga { override fun latestUpdatesFromElement(element: Element): SManga {
val manga = SManga.create() val manga = SManga.create()
element.select("a.chapter").first().let { element.select("a.chapter").first().let {
@ -95,20 +76,12 @@ abstract class MRP(
return manga return manga
} }
override fun popularMangaNextPageSelector() = "Not using this" override fun latestUpdatesNextPageSelector() = popularMangaNextPageSelector()
override fun latestUpdatesNextPageSelector() = "Not using this"
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
return if (page == 1) { return GET("$baseUrl/search/?w=$query" + if (page > 1) "&p=${(page - 1) * 30}" else "", headers)
GET("$baseUrl/search/?w=$query&p", headers)
} else {
GET("$baseUrl/search/?w=$query&p=$nextPageNumber", headers)
}
} }
override fun searchMangaParse(response: Response) = popularMangaParse(response)
override fun searchMangaSelector() = popularMangaSelector() override fun searchMangaSelector() = popularMangaSelector()
override fun searchMangaFromElement(element: Element) = popularMangaFromElement(element) override fun searchMangaFromElement(element: Element) = popularMangaFromElement(element)
@ -130,7 +103,7 @@ abstract class MRP(
return manga return manga
} }
private fun parseStatus(status: String?) = when { protected fun parseStatus(status: String?) = when {
status == null -> SManga.UNKNOWN status == null -> SManga.UNKNOWN
status.contains("Ongoing") -> SManga.ONGOING status.contains("Ongoing") -> SManga.ONGOING
status.contains("Completed") -> SManga.COMPLETED status.contains("Completed") -> SManga.COMPLETED
@ -173,8 +146,6 @@ abstract class MRP(
// Get the image from the requested page // Get the image from the requested page
override fun imageUrlParse(document: Document): String { override fun imageUrlParse(document: Document): String {
return document.select("a img").attr("src") return document.select("a img").attr("abs:src")
} }
override fun getFilterList() = FilterList()
} }

View File

@ -1,7 +1,16 @@
package eu.kanade.tachiyomi.extension.en.mangareader package eu.kanade.tachiyomi.extension.en.mangareader
import com.github.salomonbrys.kotson.fromJson
import com.github.salomonbrys.kotson.get
import com.github.salomonbrys.kotson.string
import com.google.gson.Gson
import com.google.gson.JsonObject
import eu.kanade.tachiyomi.source.Source import eu.kanade.tachiyomi.source.Source
import eu.kanade.tachiyomi.source.SourceFactory import eu.kanade.tachiyomi.source.SourceFactory
import eu.kanade.tachiyomi.source.model.Page
import eu.kanade.tachiyomi.source.model.SManga
import org.jsoup.nodes.Document
import org.jsoup.nodes.Element
class MRPFactory : SourceFactory { class MRPFactory : SourceFactory {
override fun createSources(): List<Source> = listOf( override fun createSources(): List<Source> = listOf(
@ -9,5 +18,42 @@ class MRPFactory : SourceFactory {
Mangapanda()) Mangapanda())
} }
class Mangareader : MRP("Mangareader", "https://www.mangareader.net") class Mangareader : MRP("Mangareader", "https://www.mangareader.net") {
override fun popularMangaSelector() = "div > div > table"
override fun popularMangaFromElement(element: Element): SManga {
return SManga.create().apply {
element.select("a").let {
setUrlWithoutDomain(it.attr("href"))
title = it.text()
}
thumbnail_url = element.select("div[data-src]").attr("abs:data-src")
}
}
override fun popularMangaNextPageSelector() = "li:has(.pcur) + li a"
override fun latestUpdatesSelector() = "div:has(i) + div div > a"
override fun latestUpdatesFromElement(element: Element): SManga {
return SManga.create().apply {
setUrlWithoutDomain(element.attr("href"))
title = element.text()
}
}
override fun mangaDetailsParse(document: Document): SManga {
return SManga.create().apply {
thumbnail_url = document.select("div > img[alt]").attr("abs:src")
status = parseStatus(document.select("div > table tr td:contains(Status:) + td").text())
author = document.select("div > table tr td:contains(Author:) + td").text()
artist = document.select("div > table tr td:contains(Artist:) + td").text()
genre = document.select("div > table tr td:contains(Genre:) + td").joinToString { it.text() }
description = document.select("div > div + p").text()
}
}
override fun chapterListSelector() = "tr:has(i)"
private val gson by lazy { Gson() }
override fun pageListParse(document: Document): List<Page> {
val script = document.select("script:containsData(document[)").firstOrNull()?.data() ?: throw Exception("script not found")
return gson.fromJson<JsonObject>(script.substringAfterLast("="))["im"].asJsonArray.mapIndexed { i, json ->
Page(i, "", "https:" + json["u"].string)
}
}
}
class Mangapanda : MRP("Mangapanda", "https://www.mangapanda.com") class Mangapanda : MRP("Mangapanda", "https://www.mangapanda.com")