|
|
|
|
@ -24,13 +24,9 @@ internal abstract class MangaReaderParser(
|
|
|
|
|
override val sortOrders: Set<SortOrder>
|
|
|
|
|
get() = EnumSet.of(SortOrder.UPDATED, SortOrder.POPULARITY, SortOrder.ALPHABETICAL, SortOrder.NEWEST)
|
|
|
|
|
|
|
|
|
|
protected val idLocale
|
|
|
|
|
get() = Locale("in", "ID")
|
|
|
|
|
|
|
|
|
|
abstract val listUrl: String
|
|
|
|
|
abstract val tableMode: Boolean
|
|
|
|
|
protected open val listUrl = "/manga"
|
|
|
|
|
protected open val isNsfwSource = false
|
|
|
|
|
open val chapterDateFormat = SimpleDateFormat("MMM d, yyyy", idLocale)
|
|
|
|
|
open val chapterDateFormat = SimpleDateFormat("MMM d, yyyy", Locale.ENGLISH)
|
|
|
|
|
|
|
|
|
|
private var tagCache: ArrayMap<String, MangaTag>? = null
|
|
|
|
|
private val mutex = Mutex()
|
|
|
|
|
@ -51,79 +47,60 @@ internal abstract class MangaReaderParser(
|
|
|
|
|
source = source,
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
return if (tableMode) parseInfoTable(docs, manga, chapters) else parseInfoList(docs, manga, chapters)
|
|
|
|
|
return parseInfo(docs, manga, chapters)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
open suspend fun parseInfoTable(docs: Document, manga: Manga, chapters: List<MangaChapter>): Manga {
|
|
|
|
|
val mangaInfo =
|
|
|
|
|
open suspend fun parseInfo(docs: Document, manga: Manga, chapters: List<MangaChapter>): Manga {
|
|
|
|
|
|
|
|
|
|
/// set if is table
|
|
|
|
|
val tablemode =
|
|
|
|
|
docs.selectFirst("div.seriestucontent > div.seriestucontentr") ?: docs.selectFirst("div.seriestucontentr")
|
|
|
|
|
?: docs.selectFirst("div.seriestucon")
|
|
|
|
|
|
|
|
|
|
val state_select =
|
|
|
|
|
docs.selectFirst(".tsinfo div:contains(Status)") ?: docs.selectFirst(".tsinfo div:contains(Statut)")
|
|
|
|
|
?: docs.selectFirst(".tsinfo div:contains(حالة العمل)") ?: docs.selectFirst(".tsinfo div:contains(Estado)")
|
|
|
|
|
?: docs.selectFirst(".tsinfo div:contains(สถานะ)") ?: docs.selectFirst(".tsinfo div:contains(Stato )")
|
|
|
|
|
?: docs.selectFirst(".tsinfo div:contains(Durum)")
|
|
|
|
|
|
|
|
|
|
val mangaState = state_select?.lastElementChild()?.let {
|
|
|
|
|
when (it.text()) {
|
|
|
|
|
"مستمرةا",
|
|
|
|
|
"En curso",
|
|
|
|
|
"Ongoing",
|
|
|
|
|
"On going",
|
|
|
|
|
"Ativo",
|
|
|
|
|
"En Cours",
|
|
|
|
|
"OnGoing",
|
|
|
|
|
"Đang tiến hành",
|
|
|
|
|
"em lançamento",
|
|
|
|
|
"Онгоінг",
|
|
|
|
|
"Publishing",
|
|
|
|
|
"Devam Ediyor",
|
|
|
|
|
"Em Andamento",
|
|
|
|
|
"In Corso",
|
|
|
|
|
-> MangaState.ONGOING
|
|
|
|
|
val tagMap = getOrCreateTagMap()
|
|
|
|
|
|
|
|
|
|
val selecttag = if(tablemode != null)
|
|
|
|
|
{
|
|
|
|
|
tablemode.select(".seriestugenre > a")
|
|
|
|
|
|
|
|
|
|
}else
|
|
|
|
|
{
|
|
|
|
|
docs.select(".wd-full .mgen > a")
|
|
|
|
|
|
|
|
|
|
"Completed",
|
|
|
|
|
"Completo",
|
|
|
|
|
"Complété",
|
|
|
|
|
"Fini",
|
|
|
|
|
"Terminé",
|
|
|
|
|
"Tamamlandı",
|
|
|
|
|
"Đã hoàn thành",
|
|
|
|
|
"مكتملة",
|
|
|
|
|
"Завершено",
|
|
|
|
|
"Finished",
|
|
|
|
|
"Finalizado",
|
|
|
|
|
"Completata",
|
|
|
|
|
-> MangaState.FINISHED
|
|
|
|
|
|
|
|
|
|
else -> null
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
val tagMap = getOrCreateTagMap()
|
|
|
|
|
val tags = mangaInfo?.select(".seriestugenre > a")?.mapNotNullToSet { tagMap[it.text()] }
|
|
|
|
|
val tags = selecttag.mapNotNullToSet { tagMap[it.text()] }
|
|
|
|
|
|
|
|
|
|
return manga.copy(
|
|
|
|
|
description = mangaInfo?.selectFirst("div.entry-content")?.html(),
|
|
|
|
|
state = mangaState,
|
|
|
|
|
author = mangaInfo?.selectFirst(".infotable td:contains(Author)")?.lastElementSibling()?.text(),
|
|
|
|
|
isNsfw = manga.isNsfw || docs.selectFirst(".restrictcontainer") != null,
|
|
|
|
|
tags = tags.orEmpty(),
|
|
|
|
|
chapters = chapters,
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
open suspend fun parseInfoList(docs: Document, manga: Manga, chapters: List<MangaChapter>): Manga {
|
|
|
|
|
val stateselect = if(tablemode != null)
|
|
|
|
|
{
|
|
|
|
|
tablemode.selectFirst(".infotable td:contains(Status)") ?: tablemode.selectFirst(".infotable td:contains(Statut)")
|
|
|
|
|
?: tablemode.selectFirst(".infotable td:contains(حالة العمل)") ?: tablemode.selectFirst(".infotable td:contains(Estado)")
|
|
|
|
|
?: docs.selectFirst(".infotable td:contains(สถานะ)") ?: tablemode.selectFirst(".infotable td:contains(Stato )")
|
|
|
|
|
?: tablemode.selectFirst(".infotable td:contains(Durum)") ?: tablemode.selectFirst(".infotable td:contains(Statüsü)")
|
|
|
|
|
|
|
|
|
|
val state_select =
|
|
|
|
|
}else
|
|
|
|
|
{
|
|
|
|
|
docs.selectFirst(".tsinfo div:contains(Status)") ?: docs.selectFirst(".tsinfo div:contains(Statut)")
|
|
|
|
|
?: docs.selectFirst(".tsinfo div:contains(حالة العمل)") ?: docs.selectFirst(".tsinfo div:contains(Estado)")
|
|
|
|
|
?: docs.selectFirst(".tsinfo div:contains(สถานะ)") ?: docs.selectFirst(".tsinfo div:contains(Stato )")
|
|
|
|
|
?: docs.selectFirst(".tsinfo div:contains(Durum)")
|
|
|
|
|
?: docs.selectFirst(".tsinfo div:contains(Durum)") ?: docs.selectFirst(".tsinfo div:contains(Statüsü)")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
val state = if(tablemode != null)
|
|
|
|
|
{
|
|
|
|
|
stateselect?.lastElementSibling()
|
|
|
|
|
|
|
|
|
|
}else
|
|
|
|
|
{
|
|
|
|
|
stateselect?.lastElementChild()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
val mangaState = state_select?.lastElementChild()?.let {
|
|
|
|
|
|
|
|
|
|
val mangaState = state?.let {
|
|
|
|
|
when (it.text()) {
|
|
|
|
|
"مستمرةا",
|
|
|
|
|
"مستمرة",
|
|
|
|
|
"En curso",
|
|
|
|
|
"Ongoing",
|
|
|
|
|
"On going",
|
|
|
|
|
@ -137,8 +114,9 @@ internal abstract class MangaReaderParser(
|
|
|
|
|
"Devam Ediyor",
|
|
|
|
|
"Em Andamento",
|
|
|
|
|
"In Corso",
|
|
|
|
|
"Güncel",
|
|
|
|
|
"Berjalan",
|
|
|
|
|
-> MangaState.ONGOING
|
|
|
|
|
|
|
|
|
|
"Completed",
|
|
|
|
|
"Completo",
|
|
|
|
|
"Complété",
|
|
|
|
|
@ -151,28 +129,32 @@ internal abstract class MangaReaderParser(
|
|
|
|
|
"Finished",
|
|
|
|
|
"Finalizado",
|
|
|
|
|
"Completata",
|
|
|
|
|
"One-Shot",
|
|
|
|
|
"Bitti",
|
|
|
|
|
"Tamat",
|
|
|
|
|
-> MangaState.FINISHED
|
|
|
|
|
|
|
|
|
|
else -> null
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
val tags = docs.select(".wd-full .mgen > a").mapNotNullToSet { getOrCreateTagMap()[it.text()] }
|
|
|
|
|
|
|
|
|
|
return manga.copy(
|
|
|
|
|
description =
|
|
|
|
|
docs.selectFirst("div.entry-content")?.html(),
|
|
|
|
|
|
|
|
|
|
state = mangaState,
|
|
|
|
|
author =
|
|
|
|
|
docs.selectFirst(".tsinfo div:contains(Author)")?.lastElementChild()?.text()
|
|
|
|
|
?: docs.selectFirst(".tsinfo div:contains(Auteur)")?.lastElementChild()?.text()
|
|
|
|
|
?: docs.selectFirst(".tsinfo div:contains(Artist)")?.lastElementChild()?.text()
|
|
|
|
|
?: docs.selectFirst(".tsinfo div:contains(Durum)")?.lastElementChild()?.text(),
|
|
|
|
|
val author = tablemode?.selectFirst(".infotable td:contains(Author)")?.lastElementSibling()?.text()?:
|
|
|
|
|
docs.selectFirst(".tsinfo div:contains(Author)")?.lastElementChild()?.text() ?:
|
|
|
|
|
docs.selectFirst(".tsinfo div:contains(Auteur)")?.lastElementChild()?.text() ?:
|
|
|
|
|
docs.selectFirst(".tsinfo div:contains(Artist)")?.lastElementChild()?.text() ?:
|
|
|
|
|
docs.selectFirst(".tsinfo div:contains(Durum)")?.lastElementChild()?.text()
|
|
|
|
|
|
|
|
|
|
isNsfw = manga.isNsfw
|
|
|
|
|
val nsfw = docs.selectFirst(".restrictcontainer") != null
|
|
|
|
|
|| docs.selectFirst(".info-right .alr") != null
|
|
|
|
|
|| docs.selectFirst(".postbody .alr") != null,
|
|
|
|
|
|| docs.selectFirst(".postbody .alr") != null
|
|
|
|
|
|
|
|
|
|
return manga.copy(
|
|
|
|
|
description = tablemode?.selectFirst("div.entry-content")?.html() ?:
|
|
|
|
|
docs.selectFirst("div.entry-content")?.html(),
|
|
|
|
|
state = mangaState,
|
|
|
|
|
author = author,
|
|
|
|
|
isNsfw = manga.isNsfw || nsfw,
|
|
|
|
|
tags = tags,
|
|
|
|
|
chapters = chapters,
|
|
|
|
|
)
|
|
|
|
|
|