|
|
|
@ -46,13 +46,13 @@ internal class WaMangaParser(
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private fun parseSmallMangaObject(doc: JSONObject): Manga {
|
|
|
|
private fun parseSmallMangaObject(doc: JSONObject): Manga {
|
|
|
|
val url = "https://$domain${doc.getString("url")}"
|
|
|
|
val url = doc.getString("url")
|
|
|
|
return Manga(
|
|
|
|
return Manga(
|
|
|
|
id = generateUid(doc.getString("url")),
|
|
|
|
id = generateUid(url),
|
|
|
|
url = doc.getString("url"),
|
|
|
|
url = url,
|
|
|
|
title = doc.getString("title"),
|
|
|
|
title = doc.getString("title"),
|
|
|
|
altTitle = null,
|
|
|
|
altTitle = null,
|
|
|
|
publicUrl = url,
|
|
|
|
publicUrl = "https://$domain$url",
|
|
|
|
rating = doc.getFloatOrDefault("rating", 0f),
|
|
|
|
rating = doc.getFloatOrDefault("rating", 0f),
|
|
|
|
coverUrl = doc.getString("thumbnail_small"),
|
|
|
|
coverUrl = doc.getString("thumbnail_small"),
|
|
|
|
tags = doc.getJSONArray("genres").mapJSONToSet { tag -> parseMangaTag(tag) },
|
|
|
|
tags = doc.getJSONArray("genres").mapJSONToSet { tag -> parseMangaTag(tag) },
|
|
|
|
@ -70,17 +70,22 @@ internal class WaMangaParser(
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
override suspend fun getDetails(manga: Manga): Manga {
|
|
|
|
override suspend fun getDetails(manga: Manga): Manga {
|
|
|
|
|
|
|
|
|
|
|
|
val url = "https://$domain/api${manga.url}"
|
|
|
|
val url = "https://$domain/api${manga.url}"
|
|
|
|
val doc = webClient.httpGet(url).parseJson().getJSONObject("comic")
|
|
|
|
val doc = webClient.httpGet(url).parseJson().getJSONObject("comic")
|
|
|
|
|
|
|
|
|
|
|
|
val dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", sourceLocale)
|
|
|
|
|
|
|
|
val thumbnailUrl = doc.getString("thumbnail")
|
|
|
|
val thumbnailUrl = doc.getString("thumbnail")
|
|
|
|
val mangaNamePath =
|
|
|
|
val mangaNamePath =
|
|
|
|
thumbnailUrl.slice(thumbnailUrl.indexOf(doc.getString("slug"))..<thumbnailUrl.length).split('/')[0]
|
|
|
|
thumbnailUrl.slice(thumbnailUrl.indexOf(doc.getString("slug"))..<thumbnailUrl.length).split('/')[0]
|
|
|
|
|
|
|
|
|
|
|
|
val chapterBaseUrl = "https://$domain/public/storage/comics/$mangaNamePath"
|
|
|
|
val mangaFolderUrl = "https://$domain/public/storage/comics/$mangaNamePath"
|
|
|
|
val html = webClient.httpGet(chapterBaseUrl).parseHtml()
|
|
|
|
val chapters = webClient
|
|
|
|
val chapters = html.getElementsByTag("a").map { it.ownText() }
|
|
|
|
.httpGet(mangaFolderUrl)
|
|
|
|
|
|
|
|
.parseHtml()
|
|
|
|
|
|
|
|
.getElementsByTag("a")
|
|
|
|
|
|
|
|
.map { it.ownText() }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
val dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", sourceLocale)
|
|
|
|
return manga.copy(
|
|
|
|
return manga.copy(
|
|
|
|
id = generateUid(manga.url),
|
|
|
|
id = generateUid(manga.url),
|
|
|
|
url = doc.getString("url"),
|
|
|
|
url = doc.getString("url"),
|
|
|
|
@ -89,19 +94,17 @@ internal class WaMangaParser(
|
|
|
|
description = doc.getString("description") ?: manga.description,
|
|
|
|
description = doc.getString("description") ?: manga.description,
|
|
|
|
chapters = doc.getJSONArray("chapters").mapJSONNotNull {
|
|
|
|
chapters = doc.getJSONArray("chapters").mapJSONNotNull {
|
|
|
|
val chapterPrefix = it.getString("slug_lang_vol_ch_sub")
|
|
|
|
val chapterPrefix = it.getString("slug_lang_vol_ch_sub")
|
|
|
|
val chapUrl = chapters.first { chap -> chap.startsWith(chapterPrefix) }
|
|
|
|
val chapterName = chapters.first { chap -> chap.startsWith(chapterPrefix) }
|
|
|
|
val fullChapUrl = "$chapterBaseUrl/$chapUrl"
|
|
|
|
val chapterUrl = "$mangaFolderUrl/$chapterName"
|
|
|
|
MangaChapter(
|
|
|
|
MangaChapter(
|
|
|
|
id = generateUid(fullChapUrl),
|
|
|
|
id = generateUid(chapterUrl),
|
|
|
|
url = fullChapUrl,
|
|
|
|
url = chapterUrl,
|
|
|
|
source = source,
|
|
|
|
source = source,
|
|
|
|
number = it.getIntOrDefault("chapter", 0).toFloat(),
|
|
|
|
number = it.getIntOrDefault("chapter", 0).toFloat(),
|
|
|
|
volume = it.getIntOrDefault("volume", 0),
|
|
|
|
volume = it.getIntOrDefault("volume", 0),
|
|
|
|
name = it.getStringOrNull("full_title") ?: manga.title,
|
|
|
|
name = it.getStringOrNull("full_title") ?: manga.title,
|
|
|
|
scanlator = it.getJSONArray("teams").optJSONObject(0, null)?.getStringOrNull("name"),
|
|
|
|
scanlator = it.getJSONArray("teams").optJSONObject(0, null)?.getStringOrNull("name"),
|
|
|
|
uploadDate = dateFormat.tryParse(
|
|
|
|
uploadDate = dateFormat.tryParse(it.getStringOrNull("published_on")),
|
|
|
|
it.getStringOrNull("published_on"),
|
|
|
|
|
|
|
|
),
|
|
|
|
|
|
|
|
branch = null,
|
|
|
|
branch = null,
|
|
|
|
)
|
|
|
|
)
|
|
|
|
},
|
|
|
|
},
|
|
|
|
@ -110,12 +113,15 @@ internal class WaMangaParser(
|
|
|
|
|
|
|
|
|
|
|
|
override suspend fun getPages(chapter: MangaChapter): List<MangaPage> {
|
|
|
|
override suspend fun getPages(chapter: MangaChapter): List<MangaPage> {
|
|
|
|
val doc = webClient.httpGet(chapter.url).parseHtml()
|
|
|
|
val doc = webClient.httpGet(chapter.url).parseHtml()
|
|
|
|
val pages = doc.getElementsByTag("a").map { it.ownText() }
|
|
|
|
val images = doc.getElementsByTag("a").map { it.ownText() }
|
|
|
|
return pages.drop(1).map { img ->
|
|
|
|
|
|
|
|
val url = "${chapter.url}$img"
|
|
|
|
return images
|
|
|
|
|
|
|
|
.drop(1) // drop first, because of first is "Parent directory" link
|
|
|
|
|
|
|
|
.map { img ->
|
|
|
|
|
|
|
|
val imageUrl = "${chapter.url}$img"
|
|
|
|
MangaPage(
|
|
|
|
MangaPage(
|
|
|
|
id = generateUid(url),
|
|
|
|
id = generateUid(imageUrl),
|
|
|
|
url = url,
|
|
|
|
url = imageUrl,
|
|
|
|
preview = null,
|
|
|
|
preview = null,
|
|
|
|
source = source,
|
|
|
|
source = source,
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|