From d8c32047d04c92f5a37cd6ef2a1475b78489da0c Mon Sep 17 00:00:00 2001 From: devi Date: Fri, 22 Dec 2023 17:23:52 +0100 Subject: [PATCH] Fix MangaATrend Add LerManga Remove ReaperScansPt.kt --- .../parsers/site/heancms/pt/ReaperScansPt.kt | 13 -- .../site/mangareader/ar/Mangaatrend.kt | 10 -- .../kotatsu/parsers/site/pt/LerManga.kt | 144 ++++++++++++++++++ .../parsers/site/zeistmanga/ar/Mangaatrend.kt | 12 ++ 4 files changed, 156 insertions(+), 23 deletions(-) delete mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/pt/ReaperScansPt.kt delete mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/ar/Mangaatrend.kt create mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/LerManga.kt create mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/zeistmanga/ar/Mangaatrend.kt diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/pt/ReaperScansPt.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/pt/ReaperScansPt.kt deleted file mode 100644 index 7fa8461d..00000000 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/pt/ReaperScansPt.kt +++ /dev/null @@ -1,13 +0,0 @@ -package org.koitharu.kotatsu.parsers.site.heancms.pt - -import org.koitharu.kotatsu.parsers.MangaLoaderContext -import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.model.MangaSource -import org.koitharu.kotatsu.parsers.site.heancms.HeanCms - -@MangaSourceParser("REAPERSCANSPT", "ReaperScans.net", "pt") -internal class ReaperScansPt(context: MangaLoaderContext) : - HeanCms(context, MangaSource.REAPERSCANSPT, "reaperscans.net") { - override val configKeyDomain = ConfigKey.Domain("reaperscans.net", "reaperbr.online") -} diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/ar/Mangaatrend.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/ar/Mangaatrend.kt deleted file mode 100644 index e36d349c..00000000 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/ar/Mangaatrend.kt +++ /dev/null @@ -1,10 +0,0 @@ -package org.koitharu.kotatsu.parsers.site.mangareader.ar - -import org.koitharu.kotatsu.parsers.MangaLoaderContext -import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.model.MangaSource -import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser - -@MangaSourceParser("MANGAATREND", "Manga A Trend", "ar") -internal class Mangaatrend(context: MangaLoaderContext) : - MangaReaderParser(context, MangaSource.MANGAATREND, "mangaatrend.net", pageSize = 40, searchPageSize = 20) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/LerManga.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/LerManga.kt new file mode 100644 index 00000000..477f8cf7 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/LerManga.kt @@ -0,0 +1,144 @@ +package org.koitharu.kotatsu.parsers.site.pt + +import org.koitharu.kotatsu.parsers.ErrorMessages +import org.koitharu.kotatsu.parsers.MangaLoaderContext +import org.koitharu.kotatsu.parsers.MangaSourceParser +import org.koitharu.kotatsu.parsers.PagedMangaParser +import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.model.* +import org.koitharu.kotatsu.parsers.util.* +import java.text.SimpleDateFormat +import java.util.* + +@MangaSourceParser("LERMANGA", "LerManga", "pt") +class LerManga(context: MangaLoaderContext) : PagedMangaParser(context, MangaSource.LERMANGA, 24) { + + override val availableSortOrders: Set = + EnumSet.of(SortOrder.UPDATED, SortOrder.POPULARITY, SortOrder.ALPHABETICAL, SortOrder.RATING) + + override val configKeyDomain = ConfigKey.Domain("lermanga.org") + + override val isMultipleTagsSupported = false + + override suspend fun getListPage(page: Int, filter: MangaListFilter?): List { + + val url = buildString { + append("https://") + append(domain) + append("/mangas") + + if (page > 1) { + append("/page/") + append(page.toString()) + } + + when (filter) { + + is MangaListFilter.Search -> { + throw IllegalArgumentException(ErrorMessages.SEARCH_NOT_SUPPORTED) + } + + is MangaListFilter.Advanced -> { + if (filter.tags.isNotEmpty()) { + filter.tags.oneOrThrowIfMany()?.let { + append("/genero/") + append(it.key) + } + } + + append("/?orderby=") + append( + when (filter.sortOrder) { + SortOrder.UPDATED -> "modified&order=desc" + SortOrder.POPULARITY -> "views&order=desc" + SortOrder.ALPHABETICAL -> "title&order=asc" + SortOrder.RATING -> "rating&order=desc" + else -> "modified&order=desc" + }, + ) + } + + null -> append("/?orderby=modified&order=desc") + } + } + val doc = webClient.httpGet(url).parseHtml() + return doc.select(".tab-content .flw-item").map { div -> + val a = div.selectFirstOrThrow("a.film-poster-ahref") + val href = a.attrAsAbsoluteUrl("href") + Manga( + id = generateUid(href), + url = href, + publicUrl = href, + title = div.selectLastOrThrow("h3.film-name").text(), + coverUrl = div.selectFirst("img.film-poster-img")?.src().orEmpty(), + altTitle = null, + rating = div.selectFirst(".item__rating")?.ownText()?.toFloatOrNull()?.div(5f) ?: RATING_UNKNOWN, + tags = emptySet(), + description = null, + state = null, + author = null, + isNsfw = div.selectFirst(".tick-itemadult") != null, + source = source, + ) + } + } + + override suspend fun getAvailableTags(): Set { + val doc = webClient.httpGet("https://$domain").parseHtml().requireElementById("menu-header") + return doc.select("#menu-item:contains(GÊNERO) ul li a").mapNotNullToSet { a -> + MangaTag( + key = a.attr("href").removeSuffix("/").substringAfterLast("/"), + title = a.text(), + source = source, + ) + } + } + + override suspend fun getDetails(manga: Manga): Manga { + val doc = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml() + val dateFormat = SimpleDateFormat("dd-MM-yyyy", sourceLocale) + return manga.copy( + description = doc.selectFirstOrThrow("div.boxAnimeSobreLast p").html(), + tags = doc.selectFirst("ul.genre-list")?.select("li a")?.mapNotNullToSet { a -> + MangaTag( + key = a.attr("href").removeSuffix("/").substringAfterLast("/"), + title = a.text(), + source = source, + ) + }.orEmpty(), + isNsfw = doc.select("ul.genre-list li").text().contains("Adulto"), + chapters = doc.select("div.manga-chapters div.single-chapter").mapChapters(reversed = true) { i, div -> + val a = div.selectFirstOrThrow("a") + val href = a.attrAsAbsoluteUrl("href") + MangaChapter( + id = generateUid(href), + name = a.text(), + number = i + 1, + url = href, + scanlator = null, + uploadDate = dateFormat.tryParse(div.selectFirstOrThrow("small small").text()), + branch = null, + source = source, + ) + }, + ) + } + + override suspend fun getPages(chapter: MangaChapter): List { + val fullUrl = chapter.url.toAbsoluteUrl(domain) + val doc = webClient.httpGet(fullUrl).parseHtml() + val script = doc.selectFirstOrThrow(".heading-header + script").attr("src") + val data = Base64.getDecoder().decode(script.replace("data:text/javascript;base64,", "")).decodeToString() + val images = + data.substringAfter("var imagens_cap=[").substringBeforeLast("]").replace("\\", "").replace("\"", "") + .split(",") + return images.map { img -> + MangaPage( + id = generateUid(img), + url = img, + preview = null, + source = source, + ) + } + } +} diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zeistmanga/ar/Mangaatrend.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zeistmanga/ar/Mangaatrend.kt new file mode 100644 index 00000000..e1f0b591 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zeistmanga/ar/Mangaatrend.kt @@ -0,0 +1,12 @@ +package org.koitharu.kotatsu.parsers.site.zeistmanga.ar + +import org.koitharu.kotatsu.parsers.MangaLoaderContext +import org.koitharu.kotatsu.parsers.MangaSourceParser +import org.koitharu.kotatsu.parsers.model.MangaSource +import org.koitharu.kotatsu.parsers.site.zeistmanga.ZeistMangaParser + +@MangaSourceParser("MANGAATREND", "MangaATrend", "ar") +internal class Mangaatrend(context: MangaLoaderContext) : + ZeistMangaParser(context, MangaSource.MANGAATREND, "mangaatrend.net") { + override val selectPage = "#seoneurons-target img" +}