From 4eeb879451957aa40efbf7903b4f65b0346ca00c Mon Sep 17 00:00:00 2001 From: Koitharu Date: Sun, 27 Jul 2025 19:04:18 +0300 Subject: [PATCH] Fix build --- .../kotatsu/parsers/site/all/BatoToParser.kt | 9 +- .../parsers/site/all/MangaFireParser.kt | 9 +- .../kotatsu/parsers/site/all/MangaPark.kt | 9 +- .../parsers/site/all/MangaReaderToParser.kt | 11 +- .../kotatsu/parsers/site/ar/FlixScans.kt | 9 +- .../parsers/site/en/AsuraScansParser.kt | 9 +- .../kotatsu/parsers/site/en/FlixScansOrg.kt | 9 +- .../parsers/site/madara/MadaraParser.kt | 34 ++- .../parsers/site/madara/en/Hentai4Free.kt | 1 + .../site/madara/en/IsekaiScanEuParser.kt | 1 + .../parsers/site/madara/vi/HentaiCube.kt | 241 +++++++++--------- .../parsers/site/nepnep/NepnepParser.kt | 8 +- .../kotatsu/parsers/site/ru/MangaWtfParser.kt | 1 + .../parsers/site/ru/rulib/LibSocialParser.kt | 8 +- .../parsers/site/ru/rulib/MangaLibParser.kt | 2 +- .../kotatsu/parsers/site/tr/EleceedTurkiye.kt | 30 +-- 16 files changed, 221 insertions(+), 170 deletions(-) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/BatoToParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/BatoToParser.kt index f74c2677..5179da7c 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/BatoToParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/BatoToParser.kt @@ -69,7 +69,13 @@ internal class BatoToParser(context: MangaLoaderContext) : PagedMangaParser( override suspend fun getFilterOptions() = MangaListFilterOptions( availableTags = fetchAvailableTags(), - availableStates = EnumSet.allOf(MangaState::class.java), + availableStates = EnumSet.of( + MangaState.ONGOING, + MangaState.FINISHED, + MangaState.ABANDONED, + MangaState.PAUSED, + MangaState.UPCOMING, + ), availableContentRating = EnumSet.of(ContentRating.SAFE), availableLocales = setOf( Locale.CHINESE, Locale.ENGLISH, Locale.US, Locale.FRENCH, Locale.GERMAN, Locale.ITALIAN, Locale.JAPANESE, @@ -153,6 +159,7 @@ internal class BatoToParser(context: MangaLoaderContext) : PagedMangaParser( MangaState.ABANDONED -> "cancelled" MangaState.PAUSED -> "hiatus" MangaState.UPCOMING -> "pending" + else -> throw IllegalArgumentException("$it not supported") }, ) } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaFireParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaFireParser.kt index 260ec3cf..63a5c0e9 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaFireParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaFireParser.kt @@ -81,7 +81,13 @@ internal abstract class MangaFireParser( override suspend fun getFilterOptions() = MangaListFilterOptions( availableTags = tags.get().values.toSet(), - availableStates = EnumSet.allOf(MangaState::class.java), + availableStates = EnumSet.of( + MangaState.ONGOING, + MangaState.FINISHED, + MangaState.ABANDONED, + MangaState.PAUSED, + MangaState.UPCOMING, + ), ) override suspend fun getListPage(page: Int, order: SortOrder, filter: MangaListFilter): List { @@ -128,6 +134,7 @@ internal abstract class MangaFireParser( MangaState.ABANDONED -> "discontinued" MangaState.PAUSED -> "on_hiatus" MangaState.UPCOMING -> "info" + else -> throw IllegalArgumentException("$state not supported") }, ) } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaPark.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaPark.kt index 8942026b..aa74ed39 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaPark.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaPark.kt @@ -53,7 +53,13 @@ internal class MangaPark(context: MangaLoaderContext) : override suspend fun getFilterOptions() = MangaListFilterOptions( availableTags = tagsMap.get().values.toSet(), - availableStates = EnumSet.allOf(MangaState::class.java), + availableStates = EnumSet.of( + MangaState.ONGOING, + MangaState.FINISHED, + MangaState.ABANDONED, + MangaState.PAUSED, + MangaState.UPCOMING, + ), availableContentRating = EnumSet.of(ContentRating.SAFE), availableLocales = setOf( Locale("af"), Locale("sq"), Locale("am"), Locale("ar"), Locale("hy"), @@ -120,6 +126,7 @@ internal class MangaPark(context: MangaLoaderContext) : MangaState.PAUSED -> "hiatus" MangaState.ABANDONED -> "cancelled" MangaState.UPCOMING -> "pending" + else -> throw IllegalArgumentException("$it not supported") }, ) } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaReaderToParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaReaderToParser.kt index 1d10763f..7d13e5f0 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaReaderToParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaReaderToParser.kt @@ -76,7 +76,13 @@ internal class MangaReaderToParser(context: MangaLoaderContext) : override suspend fun getFilterOptions() = MangaListFilterOptions( availableTags = tags.get().values.toSet(), - availableStates = EnumSet.allOf(MangaState::class.java), + availableStates = EnumSet.of( + MangaState.ONGOING, + MangaState.FINISHED, + MangaState.ABANDONED, + MangaState.PAUSED, + MangaState.UPCOMING, + ), ) override suspend fun getListPage(page: Int, order: SortOrder, filter: MangaListFilter): List { @@ -105,13 +111,14 @@ internal class MangaReaderToParser(context: MangaLoaderContext) : addQueryParameter("genres", filter.tags.joinToString(",") { it.key }) addQueryParameter( name = "status", - value = when (filter.states.oneOrThrowIfMany()) { + value = when (val state = filter.states.oneOrThrowIfMany()) { MangaState.ONGOING -> "2" MangaState.FINISHED -> "1" MangaState.ABANDONED -> "4" MangaState.PAUSED -> "3" MangaState.UPCOMING -> "5" null -> "" + else -> throw IllegalArgumentException("$state not supported") }, ) } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ar/FlixScans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ar/FlixScans.kt index c797ad34..752b0f4e 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ar/FlixScans.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ar/FlixScans.kt @@ -32,7 +32,13 @@ internal class FlixScans(context: MangaLoaderContext) : override suspend fun getFilterOptions() = MangaListFilterOptions( availableTags = fetchAvailableTags(), - availableStates = EnumSet.allOf(MangaState::class.java), + availableStates = EnumSet.of( + MangaState.ONGOING, + MangaState.FINISHED, + MangaState.ABANDONED, + MangaState.PAUSED, + MangaState.UPCOMING, + ), availableContentRating = EnumSet.of(ContentRating.ADULT), ) @@ -78,6 +84,7 @@ internal class FlixScans(context: MangaLoaderContext) : MangaState.ABANDONED -> "droped" MangaState.PAUSED -> "onhold" MangaState.UPCOMING -> "soon" + else -> throw IllegalArgumentException("$it not supported") }, ) } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/AsuraScansParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/AsuraScansParser.kt index 02c6570e..654ac19b 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/AsuraScansParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/AsuraScansParser.kt @@ -44,7 +44,13 @@ internal class AsuraScansParser(context: MangaLoaderContext) : override suspend fun getFilterOptions() = MangaListFilterOptions( availableTags = getOrCreateTagMap().values.toSet(), - availableStates = EnumSet.allOf(MangaState::class.java), + availableStates = EnumSet.of( + MangaState.ONGOING, + MangaState.FINISHED, + MangaState.ABANDONED, + MangaState.PAUSED, + MangaState.UPCOMING, + ), availableContentTypes = EnumSet.of( ContentType.MANGA, ContentType.MANHWA, @@ -78,6 +84,7 @@ internal class AsuraScansParser(context: MangaLoaderContext) : MangaState.ABANDONED -> "4" MangaState.PAUSED -> "2" MangaState.UPCOMING -> "6" + else -> throw IllegalArgumentException("$it not supported") }, ) } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/FlixScansOrg.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/FlixScansOrg.kt index 343c00c2..1306ca23 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/FlixScansOrg.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/FlixScansOrg.kt @@ -32,7 +32,13 @@ internal class FlixScansOrg(context: MangaLoaderContext) : override suspend fun getFilterOptions() = MangaListFilterOptions( availableTags = fetchAvailableTags(), - availableStates = EnumSet.allOf(MangaState::class.java), + availableStates = EnumSet.of( + MangaState.ONGOING, + MangaState.FINISHED, + MangaState.ABANDONED, + MangaState.PAUSED, + MangaState.UPCOMING, + ), availableContentRating = EnumSet.of(ContentRating.ADULT), ) @@ -67,6 +73,7 @@ internal class FlixScansOrg(context: MangaLoaderContext) : MangaState.ABANDONED -> "droped" MangaState.PAUSED -> "onhold" MangaState.UPCOMING -> "soon" + else -> throw IllegalArgumentException("$it not supported") }, ) } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/MadaraParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/MadaraParser.kt index 88a2b0e9..5d30294a 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/MadaraParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/MadaraParser.kt @@ -34,7 +34,7 @@ internal abstract class MadaraParser( // Change these values only if the site does not support manga listings via ajax protected open val withoutAjax = false - protected open val authorSearchSupported = false + protected open val authorSearchSupported = false override val availableSortOrders: Set = setupAvailableSortOrders() @@ -72,12 +72,18 @@ internal abstract class MadaraParser( isSearchSupported = true, isSearchWithFiltersSupported = true, isYearSupported = true, - isAuthorSearchSupported = authorSearchSupported + isAuthorSearchSupported = authorSearchSupported, ) override suspend fun getFilterOptions() = MangaListFilterOptions( availableTags = fetchAvailableTags(), - availableStates = EnumSet.allOf(MangaState::class.java), + availableStates = EnumSet.of( + MangaState.ONGOING, + MangaState.FINISHED, + MangaState.ABANDONED, + MangaState.PAUSED, + MangaState.UPCOMING, + ), availableContentRating = EnumSet.of(ContentRating.SAFE, ContentRating.ADULT), ) @@ -256,6 +262,7 @@ internal abstract class MadaraParser( MangaState.ABANDONED -> append("canceled") MangaState.PAUSED -> append("on-hold") MangaState.UPCOMING -> append("upcoming") + else -> throw IllegalArgumentException("$it not supported") } } @@ -275,13 +282,13 @@ internal abstract class MadaraParser( append(filter.year.toString()) } - if (!filter.author.isNullOrEmpty()) { - filter.author.let { - append("&author=") - // should be like "minamida-usuke" - append(it.lowercase().replace(" ", "-")) - } - } + if (!filter.author.isNullOrEmpty()) { + filter.author.let { + append("&author=") + // should be like "minamida-usuke" + append(it.lowercase().replace(" ", "-")) + } + } // Support artist //filter.artist?.let { @@ -435,6 +442,7 @@ internal abstract class MadaraParser( MangaState.ABANDONED -> "canceled" MangaState.PAUSED -> "on-hold" MangaState.UPCOMING -> "upcoming" + else -> throw IllegalArgumentException("$it not supported") } } @@ -462,12 +470,12 @@ internal abstract class MadaraParser( doc.select("div.page-item-detail") } - // Avoid "Content not found or removed" errors + // Avoid "Content not found or removed" errors if (elements.isEmpty()) { return emptyList() } - - return elements.map { div -> + + return elements.map { div -> val href = div.selectFirstOrThrow("a").attrAsRelativeUrl("href") val summary = div.selectFirst(".tab-summary") ?: div.selectFirst(".item-summary") val author = summary?.selectFirst(".mg_author")?.selectFirst("a")?.ownText() diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/Hentai4Free.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/Hentai4Free.kt index d99cbdef..76d4ee69 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/Hentai4Free.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/Hentai4Free.kt @@ -74,6 +74,7 @@ internal class Hentai4Free(context: MangaLoaderContext) : MangaState.ABANDONED -> append("canceled") MangaState.PAUSED -> append("on-hold") MangaState.UPCOMING -> append("upcoming") + else -> throw IllegalArgumentException("$it not supported") } } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/IsekaiScanEuParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/IsekaiScanEuParser.kt index 2ef4ec3b..40d36c18 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/IsekaiScanEuParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/IsekaiScanEuParser.kt @@ -62,6 +62,7 @@ internal class IsekaiScanEuParser(context: MangaLoaderContext) : MangaState.ABANDONED -> append("canceled") MangaState.PAUSED -> append("on-hold") MangaState.UPCOMING -> append("upcoming") + else -> throw IllegalArgumentException("$it not supported") } } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/vi/HentaiCube.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/vi/HentaiCube.kt index bbeada20..34532a89 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/vi/HentaiCube.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/vi/HentaiCube.kt @@ -4,23 +4,11 @@ import org.jsoup.nodes.Element import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.exception.ParseException -import org.koitharu.kotatsu.parsers.model.ContentType -import org.koitharu.kotatsu.parsers.model.MangaChapter -import org.koitharu.kotatsu.parsers.model.MangaPage -import org.koitharu.kotatsu.parsers.model.MangaTag -import org.koitharu.kotatsu.parsers.model.MangaListFilter -import org.koitharu.kotatsu.parsers.model.MangaListFilterOptions -import org.koitharu.kotatsu.parsers.model.MangaParserSource -import org.koitharu.kotatsu.parsers.model.Manga -import org.koitharu.kotatsu.parsers.model.MangaState -import org.koitharu.kotatsu.parsers.model.ContentRating -import org.koitharu.kotatsu.parsers.model.SortOrder +import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.site.madara.MadaraParser -import org.koitharu.kotatsu.parsers.config.ConfigKey import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.suspendlazy.getOrNull import org.koitharu.kotatsu.parsers.util.suspendlazy.suspendLazy -import java.util.* // Do not use "hentaicb.sbs" domain, may cause duplicate tags! @MangaSourceParser("HENTAICUBE", "CBHentai", "vi", ContentType.HENTAI) @@ -29,116 +17,117 @@ internal class HentaiCube(context: MangaLoaderContext) : override val datePattern = "dd/MM/yyyy" override val postReq = true - override val authorSearchSupported = true + override val authorSearchSupported = true override val postDataReq = "action=manga_views&manga=" - private val availableTags = suspendLazy(initializer = ::fetchTags) - + private val availableTags = suspendLazy(initializer = ::fetchTags) + override suspend fun getFilterOptions() = MangaListFilterOptions( availableTags = availableTags.get(), ) - override suspend fun getListPage(page: Int, order: SortOrder, filter: MangaListFilter): List { + override suspend fun getListPage(page: Int, order: SortOrder, filter: MangaListFilter): List { val pages = page + 1 - val url = buildString { - if (!filter.author.isNullOrEmpty()) { - clear() - append("https://") - append(domain) - append("/tacgia/") - append(filter.author.lowercase().replace(" ", "-")) - - if (pages > 1) { - append("/page/") - append(pages.toString()) - } - - append("/?m_orderby=") - when (order) { - SortOrder.POPULARITY -> append("views") - SortOrder.UPDATED -> append("latest") - SortOrder.NEWEST -> append("new-manga") - SortOrder.ALPHABETICAL -> {} - SortOrder.RATING -> append("trending") - SortOrder.RELEVANCE -> {} - else -> append("latest") // default - } - return@buildString - } - - append("https://") - append(domain) - - if (pages > 1) { - append("/page/") - append(pages.toString()) - } - - append("/?s=") - - filter.query?.let { - append(filter.query.urlEncoded()) - } - - append("&post_type=wp-manga") - - if (filter.tags.isNotEmpty()) { - filter.tags.forEach { - append("&genre[]=") - append(it.key) - } - } - - filter.states.forEach { - append("&status[]=") - when (it) { - MangaState.ONGOING -> append("on-going") - MangaState.FINISHED -> append("end") - MangaState.ABANDONED -> append("canceled") - MangaState.PAUSED -> append("on-hold") - MangaState.UPCOMING -> append("upcoming") - } - } - - filter.contentRating.oneOrThrowIfMany()?.let { - append("&adult=") - append( - when (it) { - ContentRating.SAFE -> "0" - ContentRating.ADULT -> "1" - else -> "" - }, - ) - } - - if (filter.year != 0) { - append("&release=") - append(filter.year.toString()) - } - - append("&m_orderby=") - when (order) { - SortOrder.POPULARITY -> append("views") - SortOrder.UPDATED -> append("latest") - SortOrder.NEWEST -> append("new-manga") - SortOrder.ALPHABETICAL -> append("alphabet") - SortOrder.RATING -> append("rating") - SortOrder.RELEVANCE -> {} - else -> {} - } - } - return parseMangaList(webClient.httpGet(url).parseHtml()) - } + val url = buildString { + if (!filter.author.isNullOrEmpty()) { + clear() + append("https://") + append(domain) + append("/tacgia/") + append(filter.author.lowercase().replace(" ", "-")) + + if (pages > 1) { + append("/page/") + append(pages.toString()) + } + + append("/?m_orderby=") + when (order) { + SortOrder.POPULARITY -> append("views") + SortOrder.UPDATED -> append("latest") + SortOrder.NEWEST -> append("new-manga") + SortOrder.ALPHABETICAL -> {} + SortOrder.RATING -> append("trending") + SortOrder.RELEVANCE -> {} + else -> append("latest") // default + } + return@buildString + } + + append("https://") + append(domain) + + if (pages > 1) { + append("/page/") + append(pages.toString()) + } + + append("/?s=") + + filter.query?.let { + append(filter.query.urlEncoded()) + } + + append("&post_type=wp-manga") + + if (filter.tags.isNotEmpty()) { + filter.tags.forEach { + append("&genre[]=") + append(it.key) + } + } + + filter.states.forEach { + append("&status[]=") + when (it) { + MangaState.ONGOING -> append("on-going") + MangaState.FINISHED -> append("end") + MangaState.ABANDONED -> append("canceled") + MangaState.PAUSED -> append("on-hold") + MangaState.UPCOMING -> append("upcoming") + else -> throw IllegalArgumentException("$it not supported") + } + } + + filter.contentRating.oneOrThrowIfMany()?.let { + append("&adult=") + append( + when (it) { + ContentRating.SAFE -> "0" + ContentRating.ADULT -> "1" + else -> "" + }, + ) + } + + if (filter.year != 0) { + append("&release=") + append(filter.year.toString()) + } + + append("&m_orderby=") + when (order) { + SortOrder.POPULARITY -> append("views") + SortOrder.UPDATED -> append("latest") + SortOrder.NEWEST -> append("new-manga") + SortOrder.ALPHABETICAL -> append("alphabet") + SortOrder.RATING -> append("rating") + SortOrder.RELEVANCE -> {} + else -> {} + } + } + return parseMangaList(webClient.httpGet(url).parseHtml()) + } override suspend fun createMangaTag(a: Element): MangaTag? { - val allTags = availableTags.getOrNull().orEmpty() - val title = a.text().replace(Regex("\\(\\d+\\)"), "").trim() // force trim to remove space - // compare to avoid duplicate tags with the same title - return allTags.find { - it.title.trim().equals(title, ignoreCase = true) // try to search with trim - } - } + val allTags = availableTags.getOrNull().orEmpty() + val title = a.text().replace(Regex("\\(\\d+\\)"), "").trim() // force trim to remove space + // compare to avoid duplicate tags with the same title + return allTags.find { + it.title.trim().equals(title, ignoreCase = true) // try to search with trim + } + } override suspend fun getPages(chapter: MangaChapter): List { val fullUrl = chapter.url.toAbsoluteUrl(domain) @@ -157,17 +146,17 @@ internal class HentaiCube(context: MangaLoaderContext) : } private suspend fun fetchTags(): Set { - val doc = webClient.httpGet("https://$domain/the-loai-genres").parseHtml() - val elements = doc.select("ul.list-unstyled li a") - return elements.mapToSet { element -> - val href = element.attr("href") - val key = href.substringAfter("/theloai/").removeSuffix("/") - val title = element.text().replace(Regex("\\(\\d+\\)"), "").trim() // force trim - MangaTag( - key = key, - title = title, - source = source, - ) - }.toSet() - } + val doc = webClient.httpGet("https://$domain/the-loai-genres").parseHtml() + val elements = doc.select("ul.list-unstyled li a") + return elements.mapToSet { element -> + val href = element.attr("href") + val key = href.substringAfter("/theloai/").removeSuffix("/") + val title = element.text().replace(Regex("\\(\\d+\\)"), "").trim() // force trim + MangaTag( + key = key, + title = title, + source = source, + ) + }.toSet() + } } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/nepnep/NepnepParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/nepnep/NepnepParser.kt index 700fe683..fe804d0c 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/nepnep/NepnepParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/nepnep/NepnepParser.kt @@ -47,7 +47,13 @@ internal abstract class NepnepParser( override suspend fun getFilterOptions() = MangaListFilterOptions( availableTags = fetchAvailableTags(), - availableStates = EnumSet.allOf(MangaState::class.java), + availableStates = EnumSet.of( + MangaState.ONGOING, + MangaState.FINISHED, + MangaState.ABANDONED, + MangaState.PAUSED, + MangaState.UPCOMING, + ), ) data class MangaWithLastUpdate( diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/MangaWtfParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/MangaWtfParser.kt index d3f67be8..1015466e 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/MangaWtfParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/MangaWtfParser.kt @@ -90,6 +90,7 @@ internal class MangaWtfParser( MangaState.ABANDONED -> "" MangaState.PAUSED -> "FROZEN" MangaState.UPCOMING -> "ANNOUNCE" + else -> throw IllegalArgumentException("$it not supported") } }, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/rulib/LibSocialParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/rulib/LibSocialParser.kt index b2999e9b..99ff846c 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/rulib/LibSocialParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/rulib/LibSocialParser.kt @@ -67,7 +67,13 @@ internal abstract class LibSocialParser( override suspend fun getFilterOptions() = MangaListFilterOptions( availableTags = fetchAvailableTags(), - availableStates = EnumSet.allOf(MangaState::class.java), + availableStates = EnumSet.of( + MangaState.ONGOING, + MangaState.FINISHED, + MangaState.ABANDONED, + MangaState.PAUSED, + MangaState.UPCOMING, + ), ) override fun intercept(chain: Interceptor.Chain): Response { diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/rulib/MangaLibParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/rulib/MangaLibParser.kt index 03aa2e42..10995b06 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/rulib/MangaLibParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/rulib/MangaLibParser.kt @@ -15,7 +15,7 @@ internal class MangaLibParser( context = context, source = MangaParserSource.MANGALIB, siteId = 1, - siteDomains = arrayOf("mangalib.me"), + siteDomains = arrayOf("mangalib.org", "mangalib.me"), ) { override suspend fun getPages(chapter: MangaChapter): List = try { diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/EleceedTurkiye.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/EleceedTurkiye.kt index 514a5000..0047bc2c 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/EleceedTurkiye.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/EleceedTurkiye.kt @@ -11,12 +11,12 @@ import java.text.SimpleDateFormat import java.util.* @MangaSourceParser("ELECEEDTURKIYE", "Eleceed Türkiye", "tr") -internal class EleceedTurkiye(context: MangaLoaderContext): +internal class EleceedTurkiye(context: MangaLoaderContext) : SinglePageMangaParser(context, MangaParserSource.ELECEEDTURKIYE) { override val configKeyDomain = ConfigKey.Domain( "eleceedturkiye.com", - "www.eleceedturkiye.com" + "www.eleceedturkiye.com", ) override val availableSortOrders: Set = EnumSet.of(SortOrder.UPDATED) @@ -42,8 +42,8 @@ internal class EleceedTurkiye(context: MangaLoaderContext): authors = setOf("Son Jae Ho", "ZHENA"), state = MangaState.ONGOING, source = source, - contentRating = ContentRating.ADULT - ) + contentRating = ContentRating.ADULT, + ), ) } @@ -55,23 +55,23 @@ internal class EleceedTurkiye(context: MangaLoaderContext): MangaTag("Aksiyon", "", source), MangaTag("Drama", "", source), MangaTag("Komedi", "", source), - MangaTag("Süper Güçler", "", source) + MangaTag("Süper Güçler", "", source), ), - chapters = doc.select("div.eph-num").map { div -> + chapters = doc.select("div.eph-num").mapChapters(reversed = true) { _, div -> val href = div.selectFirstOrThrow("a").attr("href") - val title = div.selectFirst("span.chapternum").text() + val title = div?.selectFirst("span.chapternum")?.textOrNull() MangaChapter( id = generateUid(href), title = title, - number = Regex("\\d+").find(title)?.value?.toFloatOrNull() ?: 0f, + number = title?.let { Regex("\\d+").find(it)?.value?.toFloatOrNull() } ?: 0f, url = href, - uploadDate = parseChapterDate(div.selectFirst("span.chapterdate")?.text()), + uploadDate = dateFormat.tryParse(div.selectFirst("span.chapterdate")?.text()), scanlator = null, branch = null, source = source, volume = 0, ) - }.reversed() + }, ) } @@ -104,14 +104,4 @@ internal class EleceedTurkiye(context: MangaLoaderContext): private val mangaId = "eleceed" private val dateFormat = SimpleDateFormat("MMMM d, yyyy", Locale("tr")) - - private fun parseChapterDate(dateString: String?): Long { - return dateString?.let { - try { - dateFormat.parse(it)?.time ?: 0 - } catch (e: Exception) { - 0 - } - } ?: 0 - } }