|
|
|
@ -1,6 +1,7 @@
|
|
|
|
package org.koitharu.kotatsu.parsers.site.fr
|
|
|
|
package org.koitharu.kotatsu.parsers.site.fr
|
|
|
|
|
|
|
|
|
|
|
|
import okhttp3.Headers
|
|
|
|
import okhttp3.Headers
|
|
|
|
|
|
|
|
import org.json.JSONObject
|
|
|
|
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
|
|
|
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
|
|
|
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
|
|
|
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
|
|
|
import org.koitharu.kotatsu.parsers.PagedMangaParser
|
|
|
|
import org.koitharu.kotatsu.parsers.PagedMangaParser
|
|
|
|
@ -16,9 +17,7 @@ import java.util.*
|
|
|
|
internal class LegacyScansParser(context: MangaLoaderContext) :
|
|
|
|
internal class LegacyScansParser(context: MangaLoaderContext) :
|
|
|
|
PagedMangaParser(context, MangaSource.LEGACY_SCANS, 18) {
|
|
|
|
PagedMangaParser(context, MangaSource.LEGACY_SCANS, 18) {
|
|
|
|
|
|
|
|
|
|
|
|
override val availableSortOrders: Set<SortOrder> = EnumSet.of(
|
|
|
|
override val availableSortOrders: Set<SortOrder> = EnumSet.of(SortOrder.POPULARITY)
|
|
|
|
SortOrder.POPULARITY,
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
override val configKeyDomain = ConfigKey.Domain("legacy-scans.com")
|
|
|
|
override val configKeyDomain = ConfigKey.Domain("legacy-scans.com")
|
|
|
|
|
|
|
|
|
|
|
|
@ -26,86 +25,96 @@ internal class LegacyScansParser(context: MangaLoaderContext) :
|
|
|
|
.add("User-Agent", UserAgents.CHROME_MOBILE)
|
|
|
|
.add("User-Agent", UserAgents.CHROME_MOBILE)
|
|
|
|
.build()
|
|
|
|
.build()
|
|
|
|
|
|
|
|
|
|
|
|
override suspend fun getListPage(
|
|
|
|
override suspend fun getListPage(page: Int, filter: MangaListFilter?): List<Manga> {
|
|
|
|
page: Int,
|
|
|
|
|
|
|
|
query: String?,
|
|
|
|
|
|
|
|
tags: Set<MangaTag>?,
|
|
|
|
|
|
|
|
sortOrder: SortOrder,
|
|
|
|
|
|
|
|
): List<Manga> {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
val end = page * pageSize
|
|
|
|
val end = page * pageSize
|
|
|
|
val start = end - (pageSize - 1)
|
|
|
|
val start = end - (pageSize - 1)
|
|
|
|
val url = if (!query.isNullOrEmpty()) {
|
|
|
|
|
|
|
|
if (page > 1) {
|
|
|
|
when (filter) {
|
|
|
|
return emptyList()
|
|
|
|
is MangaListFilter.Search -> {
|
|
|
|
}
|
|
|
|
if (page > 1) {
|
|
|
|
buildString {
|
|
|
|
return emptyList()
|
|
|
|
append("https://api.$domain/misc/home/search?title=")
|
|
|
|
|
|
|
|
append(query.urlEncoded())
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
buildString {
|
|
|
|
|
|
|
|
append("https://api.$domain/misc/comic/search/query?status=&order=&genreNames=")
|
|
|
|
|
|
|
|
if (!tags.isNullOrEmpty()) {
|
|
|
|
|
|
|
|
for (tag in tags) {
|
|
|
|
|
|
|
|
append(tag.key)
|
|
|
|
|
|
|
|
append(',')
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
append("&type=&start=")
|
|
|
|
val url = buildString {
|
|
|
|
append(start)
|
|
|
|
append("https://api.$domain/misc/home/search?title=")
|
|
|
|
append("&end=")
|
|
|
|
append(filter.query.urlEncoded())
|
|
|
|
append(end)
|
|
|
|
}
|
|
|
|
|
|
|
|
return parseMangaListQuery(webClient.httpGet(url).parseJson())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
is MangaListFilter.Advanced -> {
|
|
|
|
val json = webClient.httpGet(url).parseJson()
|
|
|
|
val url = buildString {
|
|
|
|
return if (!query.isNullOrEmpty()) {
|
|
|
|
append("https://api.")
|
|
|
|
json.getJSONArray("results").mapJSON { j ->
|
|
|
|
append(domain)
|
|
|
|
val slug = j.getString("slug")
|
|
|
|
append("/misc/comic/search/query?status=&order=&genreNames=")
|
|
|
|
val urlManga = "https://$domain/comics/$slug"
|
|
|
|
append(filter.tags.joinToString(",") { it.key })
|
|
|
|
Manga(
|
|
|
|
append("&type=&start=")
|
|
|
|
id = generateUid(urlManga),
|
|
|
|
append(start)
|
|
|
|
title = j.getString("title"),
|
|
|
|
append("&end=")
|
|
|
|
altTitle = null,
|
|
|
|
append(end)
|
|
|
|
url = urlManga,
|
|
|
|
}
|
|
|
|
publicUrl = urlManga,
|
|
|
|
return parseMangaList(webClient.httpGet(url).parseJson())
|
|
|
|
rating = RATING_UNKNOWN,
|
|
|
|
|
|
|
|
isNsfw = false,
|
|
|
|
|
|
|
|
coverUrl = "",
|
|
|
|
|
|
|
|
tags = setOf(),
|
|
|
|
|
|
|
|
state = null,
|
|
|
|
|
|
|
|
author = null,
|
|
|
|
|
|
|
|
source = source,
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
|
|
|
|
json.getJSONArray("comics").mapJSON { j ->
|
|
|
|
null -> {
|
|
|
|
val slug = j.getString("slug")
|
|
|
|
val url = buildString {
|
|
|
|
val urlManga = "https://$domain/comics/$slug"
|
|
|
|
append("https://api.")
|
|
|
|
Manga(
|
|
|
|
append(domain)
|
|
|
|
id = generateUid(urlManga),
|
|
|
|
append("/misc/comic/search/query?status=&order=&genreNames=&type=&start=")
|
|
|
|
title = j.getString("title"),
|
|
|
|
append(start)
|
|
|
|
altTitle = null,
|
|
|
|
append("&end=")
|
|
|
|
url = urlManga,
|
|
|
|
append(end)
|
|
|
|
publicUrl = urlManga,
|
|
|
|
}
|
|
|
|
rating = RATING_UNKNOWN,
|
|
|
|
return parseMangaList(webClient.httpGet(url).parseJson())
|
|
|
|
isNsfw = false,
|
|
|
|
|
|
|
|
coverUrl = "https://api.$domain/" + j.getString("cover"),
|
|
|
|
|
|
|
|
tags = setOf(),
|
|
|
|
|
|
|
|
state = null,
|
|
|
|
|
|
|
|
author = null,
|
|
|
|
|
|
|
|
source = source,
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private fun parseMangaList(json: JSONObject): List<Manga> {
|
|
|
|
|
|
|
|
return json.getJSONArray("comics").mapJSON { j ->
|
|
|
|
|
|
|
|
val slug = j.getString("slug")
|
|
|
|
|
|
|
|
val urlManga = "https://$domain/comics/$slug"
|
|
|
|
|
|
|
|
Manga(
|
|
|
|
|
|
|
|
id = generateUid(urlManga),
|
|
|
|
|
|
|
|
title = j.getString("title"),
|
|
|
|
|
|
|
|
altTitle = null,
|
|
|
|
|
|
|
|
url = urlManga,
|
|
|
|
|
|
|
|
publicUrl = urlManga,
|
|
|
|
|
|
|
|
rating = RATING_UNKNOWN,
|
|
|
|
|
|
|
|
isNsfw = false,
|
|
|
|
|
|
|
|
coverUrl = "https://api.$domain/" + j.getString("cover"),
|
|
|
|
|
|
|
|
tags = setOf(),
|
|
|
|
|
|
|
|
state = null,
|
|
|
|
|
|
|
|
author = null,
|
|
|
|
|
|
|
|
source = source,
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private fun parseMangaListQuery(json: JSONObject): List<Manga> {
|
|
|
|
|
|
|
|
return json.getJSONArray("results").mapJSON { j ->
|
|
|
|
|
|
|
|
val slug = j.getString("slug")
|
|
|
|
|
|
|
|
val urlManga = "https://$domain/comics/$slug"
|
|
|
|
|
|
|
|
Manga(
|
|
|
|
|
|
|
|
id = generateUid(urlManga),
|
|
|
|
|
|
|
|
title = j.getString("title"),
|
|
|
|
|
|
|
|
altTitle = null,
|
|
|
|
|
|
|
|
url = urlManga,
|
|
|
|
|
|
|
|
publicUrl = urlManga,
|
|
|
|
|
|
|
|
rating = RATING_UNKNOWN,
|
|
|
|
|
|
|
|
isNsfw = false,
|
|
|
|
|
|
|
|
coverUrl = "",
|
|
|
|
|
|
|
|
tags = setOf(),
|
|
|
|
|
|
|
|
state = null,
|
|
|
|
|
|
|
|
author = null,
|
|
|
|
|
|
|
|
source = source,
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
override suspend fun getDetails(manga: Manga): Manga {
|
|
|
|
override suspend fun getDetails(manga: Manga): Manga {
|
|
|
|
val root = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml()
|
|
|
|
val root = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml()
|
|
|
|
val dateFormat = SimpleDateFormat("dd/MM/yyyy", Locale.FRENCH)
|
|
|
|
val dateFormat = SimpleDateFormat("dd/MM/yyyy", Locale.FRENCH)
|
|
|
|
|
|
|
|
|
|
|
|
return manga.copy(
|
|
|
|
return manga.copy(
|
|
|
|
altTitle = null,
|
|
|
|
altTitle = null,
|
|
|
|
tags = root.select("div.serieGenre span").mapNotNullToSet { span ->
|
|
|
|
tags = root.select("div.serieGenre span").mapNotNullToSet { span ->
|
|
|
|
@ -156,7 +165,6 @@ internal class LegacyScansParser(context: MangaLoaderContext) :
|
|
|
|
val script = doc.requireElementById("__NUXT_DATA__").data()
|
|
|
|
val script = doc.requireElementById("__NUXT_DATA__").data()
|
|
|
|
.substringAfterLast("\"genres\"").substringBeforeLast("\"comics\"")
|
|
|
|
.substringAfterLast("\"genres\"").substringBeforeLast("\"comics\"")
|
|
|
|
.split("\",\"").drop(1)
|
|
|
|
.split("\",\"").drop(1)
|
|
|
|
|
|
|
|
|
|
|
|
return script.mapNotNullToSet { tag ->
|
|
|
|
return script.mapNotNullToSet { tag ->
|
|
|
|
MangaTag(
|
|
|
|
MangaTag(
|
|
|
|
key = tag.substringBeforeLast("\",{"),
|
|
|
|
key = tag.substringBeforeLast("\",{"),
|
|
|
|
|