parent
8194dd0096
commit
b6e923ac49
@ -2,11 +2,16 @@ package eu.kanade.tachiyomi.extension.es.mangasnosekai
|
|||||||
|
|
||||||
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
||||||
import eu.kanade.tachiyomi.network.GET
|
import eu.kanade.tachiyomi.network.GET
|
||||||
|
import eu.kanade.tachiyomi.network.POST
|
||||||
import eu.kanade.tachiyomi.network.interceptor.rateLimitHost
|
import eu.kanade.tachiyomi.network.interceptor.rateLimitHost
|
||||||
|
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.util.asJsoup
|
||||||
import okhttp3.CacheControl
|
import okhttp3.CacheControl
|
||||||
|
import okhttp3.FormBody
|
||||||
import okhttp3.HttpUrl.Companion.toHttpUrl
|
import okhttp3.HttpUrl.Companion.toHttpUrl
|
||||||
import okhttp3.Request
|
import okhttp3.Request
|
||||||
|
import okhttp3.Response
|
||||||
import org.jsoup.nodes.Document
|
import org.jsoup.nodes.Document
|
||||||
import org.jsoup.nodes.Element
|
import org.jsoup.nodes.Element
|
||||||
import java.text.SimpleDateFormat
|
import java.text.SimpleDateFormat
|
||||||
@ -72,13 +77,14 @@ class MangasNoSekai : Madara(
|
|||||||
|
|
||||||
override fun searchMangaNextPageSelector() = "nav.navigation a.next"
|
override fun searchMangaNextPageSelector() = "nav.navigation a.next"
|
||||||
|
|
||||||
override val mangaDetailsSelectorTitle = "div.summary-content h1.titleManga"
|
override val mangaDetailsSelectorTitle = "div.thumble-container p.titleMangaSingle"
|
||||||
override val mangaDetailsSelectorThumbnail = "div.tab-summary img.img-responsive"
|
override val mangaDetailsSelectorThumbnail = "div.thumble-container img.img-responsive"
|
||||||
override val mangaDetailsSelectorDescription = "div.summary-content div.artist-content"
|
override val mangaDetailsSelectorDescription = "section#section-sinopsis > p"
|
||||||
override val mangaDetailsSelectorStatus = "div.summary-content ul.general-List li:has(span:contains(Estado))"
|
override val mangaDetailsSelectorStatus = "section#section-sinopsis div.d-flex:has(div:contains(Estado)) p"
|
||||||
override val mangaDetailsSelectorAuthor = "div.summary-content ul.general-List li:has(span:contains(Autor))"
|
override val mangaDetailsSelectorAuthor = "section#section-sinopsis div.d-flex:has(div:contains(Autor)) p"
|
||||||
override val mangaDetailsSelectorArtist = "div.summary-content ul.general-List li:has(span:contains(Dibujante))"
|
override val mangaDetailsSelectorGenre = "section#section-sinopsis div.d-flex:has(div:contains(Generos)) p a"
|
||||||
override val seriesTypeSelector = "div.summary-content ul.general-List li:has(span:contains(Tipo))"
|
override val altNameSelector = "section#section-sinopsis div.d-flex:has(div:contains(Otros nombres)) p"
|
||||||
|
override val altName = "Otros nombres: "
|
||||||
|
|
||||||
override fun mangaDetailsParse(document: Document): SManga {
|
override fun mangaDetailsParse(document: Document): SManga {
|
||||||
val manga = SManga.create()
|
val manga = SManga.create()
|
||||||
@ -89,9 +95,6 @@ class MangasNoSekai : Madara(
|
|||||||
selectFirst(mangaDetailsSelectorAuthor)?.ownText()?.let {
|
selectFirst(mangaDetailsSelectorAuthor)?.ownText()?.let {
|
||||||
manga.author = it
|
manga.author = it
|
||||||
}
|
}
|
||||||
selectFirst(mangaDetailsSelectorArtist)?.ownText()?.let {
|
|
||||||
manga.artist = it
|
|
||||||
}
|
|
||||||
select(mangaDetailsSelectorDescription).let {
|
select(mangaDetailsSelectorDescription).let {
|
||||||
manga.description = it.text()
|
manga.description = it.text()
|
||||||
}
|
}
|
||||||
@ -111,13 +114,6 @@ class MangasNoSekai : Madara(
|
|||||||
.map { element -> element.text().lowercase(Locale.ROOT) }
|
.map { element -> element.text().lowercase(Locale.ROOT) }
|
||||||
.toMutableSet()
|
.toMutableSet()
|
||||||
|
|
||||||
// add manga/manhwa/manhua thinggy to genre
|
|
||||||
document.select(seriesTypeSelector).firstOrNull()?.ownText()?.let {
|
|
||||||
if (it.isEmpty().not() && it.notUpdating() && it != "-" && genres.contains(it).not()) {
|
|
||||||
genres.add(it.lowercase(Locale.ROOT))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
manga.genre = genres.toList().joinToString(", ") { genre ->
|
manga.genre = genres.toList().joinToString(", ") { genre ->
|
||||||
genre.replaceFirstChar {
|
genre.replaceFirstChar {
|
||||||
if (it.isLowerCase()) {
|
if (it.isLowerCase()) {
|
||||||
@ -130,7 +126,6 @@ class MangasNoSekai : Madara(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// add alternative name to manga description
|
|
||||||
document.select(altNameSelector).firstOrNull()?.ownText()?.let {
|
document.select(altNameSelector).firstOrNull()?.ownText()?.let {
|
||||||
if (it.isBlank().not() && it.notUpdating()) {
|
if (it.isBlank().not() && it.notUpdating()) {
|
||||||
manga.description = when {
|
manga.description = when {
|
||||||
@ -153,4 +148,64 @@ class MangasNoSekai : Madara(
|
|||||||
"views2",
|
"views2",
|
||||||
"new-manga",
|
"new-manga",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
private fun altChapterRequest(mangaId: String, page: Int): Request {
|
||||||
|
val form = FormBody.Builder()
|
||||||
|
.add("action", "load_chapters")
|
||||||
|
.add("mangaid", mangaId)
|
||||||
|
.add("page", page.toString())
|
||||||
|
.build()
|
||||||
|
|
||||||
|
val xhrHeaders = headersBuilder()
|
||||||
|
.add("Content-Length", form.contentLength().toString())
|
||||||
|
.add("Content-Type", form.contentType().toString())
|
||||||
|
.add("X-Requested-With", "XMLHttpRequest")
|
||||||
|
.build()
|
||||||
|
|
||||||
|
return POST("$baseUrl/wp-admin/admin-ajax.php", xhrHeaders, form)
|
||||||
|
}
|
||||||
|
|
||||||
|
private val altChapterListSelector = "div.wp-manga-chapter"
|
||||||
|
override fun chapterListParse(response: Response): List<SChapter> {
|
||||||
|
val document = response.asJsoup()
|
||||||
|
|
||||||
|
val mangaUrl = document.location().removeSuffix("/")
|
||||||
|
|
||||||
|
var xhrRequest = xhrChaptersRequest(mangaUrl)
|
||||||
|
var xhrResponse = client.newCall(xhrRequest).execute()
|
||||||
|
|
||||||
|
val chapterElements = xhrResponse.asJsoup().select(chapterListSelector())
|
||||||
|
if (chapterElements.isEmpty()) {
|
||||||
|
val mangaId = document.selectFirst("div.tab-summary > script:containsData(manga_id)")?.data()
|
||||||
|
?.let { MANGA_ID_REGEX.find(it)?.groupValues?.get(1) }
|
||||||
|
?: throw Exception("No se pudo obtener el id del manga")
|
||||||
|
|
||||||
|
var page = 1
|
||||||
|
do {
|
||||||
|
xhrRequest = altChapterRequest(mangaId, page)
|
||||||
|
xhrResponse = client.newCall(xhrRequest).execute()
|
||||||
|
val xhrDocument = xhrResponse.asJsoup()
|
||||||
|
chapterElements.addAll(xhrDocument.select(altChapterListSelector))
|
||||||
|
page++
|
||||||
|
} while (xhrDocument.select(altChapterListSelector).isNotEmpty())
|
||||||
|
|
||||||
|
countViews(document)
|
||||||
|
return chapterElements.map(::altChapterFromElement)
|
||||||
|
}
|
||||||
|
|
||||||
|
countViews(document)
|
||||||
|
return chapterElements.map(::chapterFromElement)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun altChapterFromElement(element: Element) = SChapter.create().apply {
|
||||||
|
setUrlWithoutDomain(element.selectFirst("a")!!.attr("abs:href"))
|
||||||
|
name = element.select("div.text-sm").text()
|
||||||
|
date_upload = element.select("time").firstOrNull()?.text()?.let {
|
||||||
|
parseChapterDate(it)
|
||||||
|
} ?: 0
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
val MANGA_ID_REGEX = """manga_id\s*=\s*(.*)\s*;""".toRegex()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -287,7 +287,7 @@ class MadaraGenerator : ThemeSourceGenerator {
|
|||||||
SingleLang("MangaRosie", "https://mangarosie.in", "en", isNsfw = true),
|
SingleLang("MangaRosie", "https://mangarosie.in", "en", isNsfw = true),
|
||||||
SingleLang("MangaRuby.com", "https://mangaruby.com", "en", isNsfw = true, className = "MangaRubyCom"),
|
SingleLang("MangaRuby.com", "https://mangaruby.com", "en", isNsfw = true, className = "MangaRubyCom"),
|
||||||
SingleLang("Mangaryu", "https://mangaryu.com", "en", isNsfw = true),
|
SingleLang("Mangaryu", "https://mangaryu.com", "en", isNsfw = true),
|
||||||
SingleLang("Mangas No Sekai", "https://mangasnosekai.com", "es", overrideVersionCode = 2),
|
SingleLang("Mangas No Sekai", "https://mangasnosekai.com", "es", overrideVersionCode = 3),
|
||||||
SingleLang("Mangas Origines", "https://mangas-origines.xyz", "fr", isNsfw = true, overrideVersionCode = 4),
|
SingleLang("Mangas Origines", "https://mangas-origines.xyz", "fr", isNsfw = true, overrideVersionCode = 4),
|
||||||
SingleLang("Mangas-Origines.fr", "https://mangas-origines.fr", "fr", className = "MangasOriginesFr"),
|
SingleLang("Mangas-Origines.fr", "https://mangas-origines.fr", "fr", className = "MangasOriginesFr"),
|
||||||
SingleLang("MangaSco", "https://manhwasco.net", "en", overrideVersionCode = 2),
|
SingleLang("MangaSco", "https://manhwasco.net", "en", overrideVersionCode = 2),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user