|
|
|
@ -30,31 +30,31 @@ internal class ScansMangasMe(context: MangaLoaderContext) :
|
|
|
|
.add("User-Agent", UserAgents.CHROME_DESKTOP)
|
|
|
|
.add("User-Agent", UserAgents.CHROME_DESKTOP)
|
|
|
|
.build()
|
|
|
|
.build()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
override val isMultipleTagsSupported = false
|
|
|
|
|
|
|
|
|
|
|
|
override suspend fun getListPage(
|
|
|
|
override suspend fun getListPage(page: Int, filter: MangaListFilter?): List<Manga> {
|
|
|
|
page: Int,
|
|
|
|
if (page > 1) {
|
|
|
|
query: String?,
|
|
|
|
return emptyList()
|
|
|
|
tags: Set<MangaTag>?,
|
|
|
|
}
|
|
|
|
sortOrder: SortOrder,
|
|
|
|
|
|
|
|
): List<Manga> {
|
|
|
|
|
|
|
|
val url = buildString {
|
|
|
|
val url = buildString {
|
|
|
|
append("https://")
|
|
|
|
append("https://")
|
|
|
|
append(domain)
|
|
|
|
append(domain)
|
|
|
|
if (page == 1) {
|
|
|
|
when (filter) {
|
|
|
|
if (!query.isNullOrEmpty()) {
|
|
|
|
is MangaListFilter.Search -> {
|
|
|
|
append("/?s=")
|
|
|
|
append("/?s=")
|
|
|
|
append(query.urlEncoded())
|
|
|
|
append(filter.query.urlEncoded())
|
|
|
|
append("&post_type=manga")
|
|
|
|
append("&post_type=manga")
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
} else if (!tags.isNullOrEmpty()) {
|
|
|
|
is MangaListFilter.Advanced -> {
|
|
|
|
|
|
|
|
if (filter.tags.isNotEmpty()) {
|
|
|
|
append("/genres/")
|
|
|
|
append("/genres/")
|
|
|
|
for (tag in tags) {
|
|
|
|
filter.tags.oneOrThrowIfMany()?.let {
|
|
|
|
append(tag.key)
|
|
|
|
append(it.key)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
append("/tous-nos-mangas/")
|
|
|
|
append("/tous-nos-mangas/?order=")
|
|
|
|
append("?order=")
|
|
|
|
when (filter.sortOrder) {
|
|
|
|
when (sortOrder) {
|
|
|
|
|
|
|
|
SortOrder.POPULARITY -> append("popular")
|
|
|
|
SortOrder.POPULARITY -> append("popular")
|
|
|
|
SortOrder.UPDATED -> append("update")
|
|
|
|
SortOrder.UPDATED -> append("update")
|
|
|
|
SortOrder.ALPHABETICAL -> append("title")
|
|
|
|
SortOrder.ALPHABETICAL -> append("title")
|
|
|
|
@ -62,14 +62,13 @@ internal class ScansMangasMe(context: MangaLoaderContext) :
|
|
|
|
else -> append("update")
|
|
|
|
else -> append("update")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
|
|
|
|
return emptyList()
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
null -> append("/tous-nos-mangas/?order=update")
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
val doc = webClient.httpGet(url).parseHtml()
|
|
|
|
val doc = webClient.httpGet(url).parseHtml()
|
|
|
|
|
|
|
|
|
|
|
|
return doc.select("div.postbody .bs .bsx").map { div ->
|
|
|
|
return doc.select("div.postbody .bs .bsx").map { div ->
|
|
|
|
val href = div.selectFirstOrThrow("a").attrAsRelativeUrl("href")
|
|
|
|
val href = div.selectFirstOrThrow("a").attrAsRelativeUrl("href")
|
|
|
|
Manga(
|
|
|
|
Manga(
|
|
|
|
@ -90,7 +89,6 @@ internal class ScansMangasMe(context: MangaLoaderContext) :
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
override suspend fun getAvailableTags(): Set<MangaTag> {
|
|
|
|
override suspend fun getAvailableTags(): Set<MangaTag> {
|
|
|
|
val doc = webClient.httpGet("https://$domain/tous-nos-mangas/").parseHtml()
|
|
|
|
val doc = webClient.httpGet("https://$domain/tous-nos-mangas/").parseHtml()
|
|
|
|
return doc.select("ul.genre li").mapNotNullToSet { li ->
|
|
|
|
return doc.select("ul.genre li").mapNotNullToSet { li ->
|
|
|
|
@ -104,25 +102,18 @@ internal class ScansMangasMe(context: MangaLoaderContext) :
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
override suspend fun getDetails(manga: Manga): Manga = coroutineScope {
|
|
|
|
override suspend fun getDetails(manga: Manga): Manga = coroutineScope {
|
|
|
|
val fullUrl = manga.url.toAbsoluteUrl(domain)
|
|
|
|
val fullUrl = manga.url.toAbsoluteUrl(domain)
|
|
|
|
val doc = webClient.httpGet(fullUrl).parseHtml()
|
|
|
|
val doc = webClient.httpGet(fullUrl).parseHtml()
|
|
|
|
|
|
|
|
|
|
|
|
val chaptersDeferred = getChapters(doc)
|
|
|
|
val chaptersDeferred = getChapters(doc)
|
|
|
|
|
|
|
|
|
|
|
|
val desc = doc.selectFirstOrThrow("div.desc").html()
|
|
|
|
val desc = doc.selectFirstOrThrow("div.desc").html()
|
|
|
|
|
|
|
|
|
|
|
|
val state = if (doc.select("div.spe span:contains(En cours)").isNullOrEmpty()) {
|
|
|
|
val state = if (doc.select("div.spe span:contains(En cours)").isNullOrEmpty()) {
|
|
|
|
MangaState.FINISHED
|
|
|
|
MangaState.FINISHED
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
MangaState.ONGOING
|
|
|
|
MangaState.ONGOING
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
val alt = doc.body().select("div.infox span.alter").text()
|
|
|
|
val alt = doc.body().select("div.infox span.alter").text()
|
|
|
|
|
|
|
|
|
|
|
|
val aut = doc.select("div.spe span")[2].text().replace("Auteur:", "")
|
|
|
|
val aut = doc.select("div.spe span")[2].text().replace("Auteur:", "")
|
|
|
|
|
|
|
|
|
|
|
|
manga.copy(
|
|
|
|
manga.copy(
|
|
|
|
tags = doc.select("div.spe span:contains(Genres) a").mapNotNullToSet { a ->
|
|
|
|
tags = doc.select("div.spe span:contains(Genres) a").mapNotNullToSet { a ->
|
|
|
|
MangaTag(
|
|
|
|
MangaTag(
|
|
|
|
@ -140,7 +131,6 @@ internal class ScansMangasMe(context: MangaLoaderContext) :
|
|
|
|
)
|
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private fun getChapters(doc: Document): List<MangaChapter> {
|
|
|
|
private fun getChapters(doc: Document): List<MangaChapter> {
|
|
|
|
return doc.body().requireElementById("chapter_list").select("li").mapChapters(reversed = true) { i, li ->
|
|
|
|
return doc.body().requireElementById("chapter_list").select("li").mapChapters(reversed = true) { i, li ->
|
|
|
|
val a = li.selectFirstOrThrow("a")
|
|
|
|
val a = li.selectFirstOrThrow("a")
|
|
|
|
@ -161,10 +151,8 @@ internal class ScansMangasMe(context: MangaLoaderContext) :
|
|
|
|
override suspend fun getPages(chapter: MangaChapter): List<MangaPage> {
|
|
|
|
override suspend fun getPages(chapter: MangaChapter): List<MangaPage> {
|
|
|
|
val fullUrl = chapter.url.toAbsoluteUrl(domain)
|
|
|
|
val fullUrl = chapter.url.toAbsoluteUrl(domain)
|
|
|
|
val doc = webClient.httpGet(fullUrl).parseHtml()
|
|
|
|
val doc = webClient.httpGet(fullUrl).parseHtml()
|
|
|
|
|
|
|
|
|
|
|
|
val script = doc.selectFirstOrThrow("script:containsData(page_image)")
|
|
|
|
val script = doc.selectFirstOrThrow("script:containsData(page_image)")
|
|
|
|
val images = JSONArray(script.data().substringAfterLast("var pages = ").substringBefore(';'))
|
|
|
|
val images = JSONArray(script.data().substringAfterLast("var pages = ").substringBefore(';'))
|
|
|
|
|
|
|
|
|
|
|
|
val pages = ArrayList<MangaPage>(images.length())
|
|
|
|
val pages = ArrayList<MangaPage>(images.length())
|
|
|
|
for (i in 0 until images.length()) {
|
|
|
|
for (i in 0 until images.length()) {
|
|
|
|
val pageTake = images.getJSONObject(i)
|
|
|
|
val pageTake = images.getJSONObject(i)
|
|
|
|
@ -177,7 +165,6 @@ internal class ScansMangasMe(context: MangaLoaderContext) :
|
|
|
|
),
|
|
|
|
),
|
|
|
|
)
|
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return pages
|
|
|
|
return pages
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|