From 52db07a33b78147254e0540a686d24a4f172e522 Mon Sep 17 00:00:00 2001 From: devi Date: Sat, 22 Jun 2024 18:18:19 +0200 Subject: [PATCH 01/25] MiHentai Closes #829 MrBenne Closes #627 Closes #555 Norterose Closes #625 Closes #564 Closes #483 MaidSecret Closes #623 Closes #550 HentaiOrigines Fix SortOrder On MmrcmsParser --- .../parsers/site/madara/fr/HentaiOrigines.kt | 11 +++++ .../parsers/site/madara/pt/MaidSecret.kt | 12 ++++++ .../kotatsu/parsers/site/madara/pt/MrBenne.kt | 42 +++++++++++++++++++ .../parsers/site/madara/pt/Norterose.kt | 13 ++++++ .../parsers/site/mangareader/id/MiHentai.kt | 14 +++++++ .../parsers/site/mmrcms/MmrcmsParser.kt | 3 +- 6 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/fr/HentaiOrigines.kt create mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/MaidSecret.kt create mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/MrBenne.kt create mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/Norterose.kt create mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/id/MiHentai.kt diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/fr/HentaiOrigines.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/fr/HentaiOrigines.kt new file mode 100644 index 00000000..1a10bc90 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/fr/HentaiOrigines.kt @@ -0,0 +1,11 @@ +package org.koitharu.kotatsu.parsers.site.madara.fr + +import org.koitharu.kotatsu.parsers.MangaLoaderContext +import org.koitharu.kotatsu.parsers.MangaSourceParser +import org.koitharu.kotatsu.parsers.model.ContentType +import org.koitharu.kotatsu.parsers.model.MangaSource +import org.koitharu.kotatsu.parsers.site.madara.MadaraParser + +@MangaSourceParser("HENTAIORIGINES", "HentaiOrigines", "fr", ContentType.HENTAI) +internal class HentaiOrigines(context: MangaLoaderContext) : + MadaraParser(context, MangaSource.HENTAIORIGINES, "hentai-origines.fr") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/MaidSecret.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/MaidSecret.kt new file mode 100644 index 00000000..b7586f18 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/MaidSecret.kt @@ -0,0 +1,12 @@ +package org.koitharu.kotatsu.parsers.site.madara.pt + +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.madara.MadaraParser + +@MangaSourceParser("MAIDSECRET", "MaidSecret", "pt") +internal class MaidSecret(context: MangaLoaderContext) : + MadaraParser(context, MangaSource.MAIDSECRET, "maidsecret.com", 10) { + override val datePattern: String = "dd/MM/yyyy" +} diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/MrBenne.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/MrBenne.kt new file mode 100644 index 00000000..72e48837 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/MrBenne.kt @@ -0,0 +1,42 @@ +package org.koitharu.kotatsu.parsers.site.madara.pt + +import org.koitharu.kotatsu.parsers.MangaLoaderContext +import org.koitharu.kotatsu.parsers.MangaSourceParser +import org.koitharu.kotatsu.parsers.model.ContentType +import org.koitharu.kotatsu.parsers.model.MangaSource +import org.koitharu.kotatsu.parsers.model.MangaTag +import org.koitharu.kotatsu.parsers.site.madara.MadaraParser +import org.koitharu.kotatsu.parsers.util.domain +import org.koitharu.kotatsu.parsers.util.mapNotNullToSet +import org.koitharu.kotatsu.parsers.util.parseHtml +import org.koitharu.kotatsu.parsers.util.toTitleCase +import java.util.HashSet + +@MangaSourceParser("MRBENNE", "MrBenne", "pt", ContentType.HENTAI) +internal class MrBenne(context: MangaLoaderContext) : + MadaraParser(context, MangaSource.MRBENNE, "mrbenne.com", 10) { + override val datePattern: String = "dd/MM/yyyy" + + override suspend fun getAvailableTags(): Set { + val doc = webClient.httpGet("https://$domain/?s=&post_type=wp-manga").parseHtml() + val body = doc.body() + val root = body.selectFirst("div.form-group.checkbox-group") + val list = root?.select("div.checkbox").orEmpty() + val keySet = HashSet(list.size) + return list.mapNotNullToSet { div -> + val input = div.selectFirst("input") ?: return@mapNotNullToSet null + val label = div.selectFirst("label") ?: return@mapNotNullToSet null + val tag = input.attr("value") + if (tag.isEmpty() || !keySet.add(tag)) { + return@mapNotNullToSet null + } + MangaTag( + key = tag, + title = label.ownText().ifEmpty { + tag + }.toTitleCase(sourceLocale), + source = source, + ) + } + } +} diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/Norterose.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/Norterose.kt new file mode 100644 index 00000000..d7ce724b --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/Norterose.kt @@ -0,0 +1,13 @@ +package org.koitharu.kotatsu.parsers.site.madara.pt + +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.madara.MadaraParser + +@MangaSourceParser("NORTEROSE", "Norterose", "pt") +internal class Norterose(context: MangaLoaderContext) : + MadaraParser(context, MangaSource.NORTEROSE, "norterose.com.br", 10) { + override val datePattern: String = "dd/MM/yyyy" + override val withoutAjax = true +} diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/id/MiHentai.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/id/MiHentai.kt new file mode 100644 index 00000000..75f6e159 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/id/MiHentai.kt @@ -0,0 +1,14 @@ +package org.koitharu.kotatsu.parsers.site.mangareader.id + +import org.koitharu.kotatsu.parsers.MangaLoaderContext +import org.koitharu.kotatsu.parsers.MangaSourceParser +import org.koitharu.kotatsu.parsers.model.ContentType +import org.koitharu.kotatsu.parsers.model.MangaSource +import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser + +@MangaSourceParser("MIHENTAI", "MiHentai", "id", ContentType.HENTAI) +internal class MiHentai(context: MangaLoaderContext) : + MangaReaderParser(context, MangaSource.MIHENTAI, "mihentai.com", pageSize = 30, searchPageSize = 10) { + override val datePattern = "MMM d, yyyy" + override val isTagsExclusionSupported = false +} diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/MmrcmsParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/MmrcmsParser.kt index 90e4f189..776150d0 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/MmrcmsParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/MmrcmsParser.kt @@ -24,6 +24,7 @@ internal abstract class MmrcmsParser( SortOrder.POPULARITY, SortOrder.UPDATED, SortOrder.ALPHABETICAL, + SortOrder.ALPHABETICAL_DESC, ) protected open val listUrl = "filterList" @@ -103,7 +104,7 @@ internal abstract class MmrcmsParser( } append("&sortBy=") when (filter.sortOrder) { - SortOrder.POPULARITY -> append("views&asc=true") + SortOrder.POPULARITY -> append("views&asc=false") SortOrder.ALPHABETICAL -> append("name&asc=true") SortOrder.ALPHABETICAL_DESC -> append("name&asc=false") else -> append("name") From 26519c71a63b7d3706b870c8216665a628539287 Mon Sep 17 00:00:00 2001 From: Naga <94557604+NagaYZ@users.noreply.github.com> Date: Tue, 25 Jun 2024 21:44:40 +0200 Subject: [PATCH 02/25] fix #852 --- .../org/koitharu/kotatsu/parsers/site/it/MangaWorld.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/it/MangaWorld.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/it/MangaWorld.kt index 4af96e61..12fe02b9 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/it/MangaWorld.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/it/MangaWorld.kt @@ -132,7 +132,10 @@ internal class MangaWorld( override suspend fun getPages(chapter: MangaChapter): List { val doc = webClient.httpGet(chapter.url.toAbsoluteUrl(domain)).parseHtml() - return doc.select("img.page-image").map { img -> + val selectWebtoonPages = "img.page-image" + val selectMangaPages = "#page .img-fluid" + val imgSelector = if (doc.select(selectWebtoonPages).isNotEmpty()) selectWebtoonPages else selectMangaPages + return doc.select(imgSelector).map { img -> val urlPage = img.src()?.toRelativeUrl(domain) ?: img.parseFailed("Image src not found") MangaPage( id = generateUid(urlPage), From c03b0fc981b35179e7b1f109c0c912c2b46d1408 Mon Sep 17 00:00:00 2001 From: devi Date: Wed, 3 Jul 2024 21:50:18 +0200 Subject: [PATCH 03/25] Fix search on MangaDexParser Fix State on ScansMangasMe --- .../kotatsu/parsers/site/all/MangaDexParser.kt | 1 + .../kotatsu/parsers/site/fr/ScansMangasMe.kt | 12 ++++++------ 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaDexParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaDexParser.kt index 3bb37a45..67acf346 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaDexParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaDexParser.kt @@ -52,6 +52,7 @@ internal class MangaDexParser(context: MangaLoaderContext) : MangaParser(context is MangaListFilter.Search -> { append("&title=") append(filter.query) + append("&contentRating[]=safe&contentRating[]=suggestive&contentRating[]=erotica&contentRating[]=pornographic") } is MangaListFilter.Advanced -> { diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/ScansMangasMe.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/ScansMangasMe.kt index 1e9e892e..7cf0e1b1 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/ScansMangasMe.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/ScansMangasMe.kt @@ -107,11 +107,6 @@ internal class ScansMangasMe(context: MangaLoaderContext) : val doc = webClient.httpGet(fullUrl).parseHtml() val chaptersDeferred = getChapters(doc) val desc = doc.selectFirstOrThrow("div.desc").html() - val state = if (doc.select("div.spe span:contains(En cours)").isNullOrEmpty()) { - MangaState.FINISHED - } else { - MangaState.ONGOING - } val alt = doc.body().select("div.infox span.alter").text() val aut = doc.select("div.spe span")[2].text().replace("Auteur:", "") manga.copy( @@ -125,7 +120,12 @@ internal class ScansMangasMe(context: MangaLoaderContext) : description = desc, altTitle = alt, author = aut, - state = state, + state = when (doc.selectFirstOrThrow("div.spe span:contains(Statut:)").textOrNull() + ?.substringAfterLast(':')) { + " En cours" -> MangaState.ONGOING + " Terminé" -> MangaState.FINISHED + else -> null + }, chapters = chaptersDeferred, isNsfw = manga.isNsfw, ) From bb9902e3b2499fcb1f9d28e87f53abd4b00149b4 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Fri, 5 Jul 2024 12:17:16 +0300 Subject: [PATCH 04/25] [LibSoc] Add split by translations config option --- .../kotatsu/parsers/site/ru/rulib/LibSocialParser.kt | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) 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 d5afad35..aa5fa8ec 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 @@ -37,6 +37,7 @@ internal abstract class LibSocialParser( 5, MangaState.ABANDONED, ) private val imageServers = SuspendLazy(::fetchServers) + private val splitTranslationsKey = ConfigKey.SplitByTranslations(true) override suspend fun getListPage(page: Int, filter: MangaListFilter?): List { val urlBuilder = urlBuilder("api") @@ -167,6 +168,11 @@ internal abstract class LibSocialParser( } } + override fun onCreateConfig(keys: MutableCollection>) { + super.onCreateConfig(keys) + keys.add(splitTranslationsKey) + } + private fun parseManga(jo: JSONObject): Manga { val cover = jo.getJSONObject("cover") return Manga( @@ -197,6 +203,7 @@ internal abstract class LibSocialParser( val json = webClient.httpGet(url).parseJson().getJSONArray("data") val builder = ChaptersListBuilder(json.length()) val dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US) + val useBranching = config[splitTranslationsKey] for (i in 0 until json.length()) { val jo = json.getJSONObject(i) val volume = jo.getIntOrDefault("volume", 0) @@ -219,7 +226,7 @@ internal abstract class LibSocialParser( url = "${manga.url}/chapter?number=$numberString&volume=$volume", scanlator = team, uploadDate = dateFormat.tryParse(bjo.getStringOrNull("created_at")), - branch = team, + branch = if (useBranching) team else null, source = source, ) } From 0f73f745399dc3258acc357055722f1b5cd11d6d Mon Sep 17 00:00:00 2001 From: Koitharu Date: Fri, 5 Jul 2024 13:23:47 +0300 Subject: [PATCH 05/25] [LibSoc] Default image server config option --- .../kotatsu/parsers/config/ConfigKey.kt | 5 ++++ .../parsers/site/ru/rulib/LibSocialParser.kt | 25 ++++++++++++++++--- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/config/ConfigKey.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/config/ConfigKey.kt index 49422e65..45c86648 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/config/ConfigKey.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/config/ConfigKey.kt @@ -29,4 +29,9 @@ sealed class ConfigKey( class SplitByTranslations( override val defaultValue: Boolean, ) : ConfigKey("split_translations") + + class PreferredImageServer( + val presetValues: Map, + override val defaultValue: String?, + ) : ConfigKey("img_server") } 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 aa5fa8ec..619092f9 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 @@ -38,6 +38,16 @@ internal abstract class LibSocialParser( ) private val imageServers = SuspendLazy(::fetchServers) private val splitTranslationsKey = ConfigKey.SplitByTranslations(true) + private val preferredServerKey = ConfigKey.PreferredImageServer( + presetValues = mapOf( + SERVER_MAIN to "Первый", + SERVER_SECONDARY to "Второй", + SERVER_COMPRESS to "Сжатия", + SERVER_DOWNLOAD to "Загрузки", + SERVER_CROP to "Обрезки", + ), + defaultValue = null, + ) override suspend fun getListPage(page: Int, filter: MangaListFilter?): List { val urlBuilder = urlBuilder("api") @@ -133,10 +143,7 @@ internal abstract class LibSocialParser( } val servers = imageServers.get() val json = pages.await() - val primaryServer = - checkNotNull(servers[SERVER_MAIN] ?: servers[SERVER_DOWNLOAD] ?: servers[SERVER_SECONDARY]) { - "No available images servers" - } + val primaryServer = getPrimaryImageServer(servers) json.getJSONArray("pages").mapJSON { jo -> val url = jo.getString("url") MangaPage( @@ -193,6 +200,16 @@ internal abstract class LibSocialParser( ) } + private fun getPrimaryImageServer(servers: ScatterMap): String { + val preferred = config[preferredServerKey] + if (preferred != null) { + servers[preferred]?.let { return it } + } + return checkNotNull(servers[SERVER_MAIN] ?: servers[SERVER_DOWNLOAD] ?: servers[SERVER_SECONDARY]) { + "No available images servers" + } + } + private suspend fun fetchChapters(manga: Manga): List { val url = urlBuilder("api") .addPathSegment("api") From 41ced8edee21931e4501e5c1de62049fd7f57c54 Mon Sep 17 00:00:00 2001 From: Naga <94557604+NagaYZ@users.noreply.github.com> Date: Sun, 23 Jun 2024 18:37:44 +0200 Subject: [PATCH 06/25] added states , fixed title, added types --- .../kotatsu/parsers/site/it/MangaWorld.kt | 24 ++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/it/MangaWorld.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/it/MangaWorld.kt index 12fe02b9..96cc2b72 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/it/MangaWorld.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/it/MangaWorld.kt @@ -1,5 +1,6 @@ package org.koitharu.kotatsu.parsers.site.it +import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.PagedMangaParser @@ -9,15 +10,17 @@ import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat import java.util.* -@MangaSourceParser("MANGAWORLD", "mangaworld.ac", "it") +@MangaSourceParser("MANGAWORLD", "MangaWorld", "it") internal class MangaWorld( context: MangaLoaderContext, ) : PagedMangaParser(context, MangaSource.MANGAWORLD, pageSize = 16) { override val availableSortOrders: Set = - EnumSet.of(SortOrder.POPULARITY, SortOrder.ALPHABETICAL, SortOrder.NEWEST, SortOrder.ALPHABETICAL_DESC) + EnumSet.of(SortOrder.POPULARITY, SortOrder.ALPHABETICAL, SortOrder.NEWEST, SortOrder.ALPHABETICAL_DESC, SortOrder.UPDATED) override val configKeyDomain = ConfigKey.Domain("mangaworld.ac") + override val availableStates: Set = EnumSet.of(MangaState.ONGOING, MangaState.FINISHED, MangaState.ABANDONED, MangaState.PAUSED) + override val isMultipleTagsSupported = true override suspend fun getListPage( @@ -61,6 +64,10 @@ internal class MangaWorld( append("&page=$page") } val doc = webClient.httpGet(url).parseHtml() + return parseMangaList(doc) + } + + private fun parseMangaList(doc: Document): List { return doc.select(".comics-grid .entry").map { div -> val href = div.selectFirstOrThrow("a.thumb").attrAsRelativeUrl("href") val tags = div.select(".genres a[href*=/archive?genre=]") @@ -89,15 +96,26 @@ internal class MangaWorld( } } + override suspend fun getAvailableTags(): Set { val doc = webClient.httpGet("https://$domain/").parseHtml() - return doc.select("div[aria-labelledby=genresDropdown] a").mapNotNullToSet { + val genres = doc.select("div[aria-labelledby=genresDropdown] a").mapNotNullToSet { + MangaTag( + key = it.attr("href"), + title = it.text().toTitleCase(sourceLocale), + source = source, + ) + } + + val tags = doc.select("div[aria-labelledby=typesDropdown] a").mapNotNullToSet { MangaTag( key = it.attr("href"), title = it.text().toTitleCase(sourceLocale), source = source, ) } + + return genres + tags } override suspend fun getDetails(manga: Manga): Manga { From a88a861d821c4c9edae10f1afa0c69d8d4347444 Mon Sep 17 00:00:00 2001 From: Naga <94557604+NagaYZ@users.noreply.github.com> Date: Sun, 23 Jun 2024 18:51:51 +0200 Subject: [PATCH 07/25] added main page sortby updated --- .../org/koitharu/kotatsu/parsers/site/it/MangaWorld.kt | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/it/MangaWorld.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/it/MangaWorld.kt index 96cc2b72..79fb5cd6 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/it/MangaWorld.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/it/MangaWorld.kt @@ -17,6 +17,9 @@ internal class MangaWorld( override val availableSortOrders: Set = EnumSet.of(SortOrder.POPULARITY, SortOrder.ALPHABETICAL, SortOrder.NEWEST, SortOrder.ALPHABETICAL_DESC, SortOrder.UPDATED) + override val defaultSortOrder: SortOrder + get() = SortOrder.ALPHABETICAL + override val configKeyDomain = ConfigKey.Domain("mangaworld.ac") override val availableStates: Set = EnumSet.of(MangaState.ONGOING, MangaState.FINISHED, MangaState.ABANDONED, MangaState.PAUSED) @@ -39,6 +42,8 @@ internal class MangaWorld( } is MangaListFilter.Advanced -> { + if(filter.tags.isEmpty() && filter.states.isEmpty() && filter.sortOrder == SortOrder.UPDATED) return parseMangaList(webClient.httpGet("https://$domain/?page=$page").parseHtml()) + if (filter.tags.isNotEmpty()) { filter.tags.joinTo(this, "&") { it.key.substringAfter("archive?") } } @@ -107,7 +112,7 @@ internal class MangaWorld( ) } - val tags = doc.select("div[aria-labelledby=typesDropdown] a").mapNotNullToSet { + val types = doc.select("div[aria-labelledby=typesDropdown] a").mapNotNullToSet { MangaTag( key = it.attr("href"), title = it.text().toTitleCase(sourceLocale), @@ -115,7 +120,7 @@ internal class MangaWorld( ) } - return genres + tags + return genres + types } override suspend fun getDetails(manga: Manga): Manga { From b1ac1cf2386d294db65f047c400c70ccca05565d Mon Sep 17 00:00:00 2001 From: Koitharu Date: Sat, 6 Jul 2024 11:53:18 +0300 Subject: [PATCH 08/25] [LibSoc] Fix image server option --- .../kotatsu/parsers/site/ru/rulib/LibSocialParser.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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 619092f9..de4ead15 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 @@ -40,6 +40,7 @@ internal abstract class LibSocialParser( private val splitTranslationsKey = ConfigKey.SplitByTranslations(true) private val preferredServerKey = ConfigKey.PreferredImageServer( presetValues = mapOf( + null to null, SERVER_MAIN to "Первый", SERVER_SECONDARY to "Второй", SERVER_COMPRESS to "Сжатия", @@ -86,7 +87,7 @@ internal abstract class LibSocialParser( SortOrder.NEWEST -> "created_at" SortOrder.ALPHABETICAL, SortOrder.ALPHABETICAL_DESC, - -> "rus_name" + -> "rus_name" }, ) urlBuilder.addQueryParameter( @@ -97,7 +98,7 @@ internal abstract class LibSocialParser( SortOrder.RATING, SortOrder.NEWEST, SortOrder.ALPHABETICAL_DESC, - -> "desc" + -> "desc" SortOrder.ALPHABETICAL -> "asc" }, From 7433fb8fa0cbaf628daba02adc6d78d0ce7e3e7c Mon Sep 17 00:00:00 2001 From: Koitharu Date: Sat, 6 Jul 2024 12:23:37 +0300 Subject: [PATCH 09/25] [LibSoc] Fix image server option --- .../koitharu/kotatsu/parsers/site/ru/rulib/LibSocialParser.kt | 1 + 1 file changed, 1 insertion(+) 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 de4ead15..b81aa404 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 @@ -179,6 +179,7 @@ internal abstract class LibSocialParser( override fun onCreateConfig(keys: MutableCollection>) { super.onCreateConfig(keys) keys.add(splitTranslationsKey) + keys.add(preferredServerKey) } private fun parseManga(jo: JSONObject): Manga { From 0bcac0c639952b615b3a27db74fc0811a85a73be Mon Sep 17 00:00:00 2001 From: devi Date: Sat, 6 Jul 2024 17:37:32 +0200 Subject: [PATCH 10/25] Add @Broken on some Dead Sources Urls Changes repair sources Remove Duplicate Source Add volume on some parser --- .../koitharu/kotatsu/parsers/MangaParser.kt | 1 - .../kotatsu/parsers/site/all/BatoToParser.kt | 4 +- .../parsers/site/all/ExHentaiParser.kt | 3 +- .../parsers/site/all/HitomiLaParser.kt | 3 +- .../kotatsu/parsers/site/all/ImHentai.kt | 3 +- .../parsers/site/all/LineWebtoonsParser.kt | 3 +- .../parsers/site/all/MangaFireParser.kt | 26 +-- .../kotatsu/parsers/site/all/MangaPark.kt | 3 +- .../parsers/site/all/MangaPlusParser.kt | 2 +- .../parsers/site/all/NineMangaParser.kt | 3 +- .../parsers/site/all/WebtoonsParser.kt | 6 +- .../animebootstrap/AnimeBootstrapParser.kt | 3 +- .../parsers/site/animebootstrap/fr/PapScan.kt | 5 +- .../kotatsu/parsers/site/ar/FlixScans.kt | 3 +- .../kotatsu/parsers/site/ar/MangaStorm.kt | 3 +- .../kotatsu/parsers/site/ar/TeamXNovel.kt | 3 +- .../kotatsu/parsers/site/be/AnibelParser.kt | 3 +- .../kotatsu/parsers/site/en/BeeToon.kt | 3 +- .../parsers/site/en/CloneMangaParser.kt | 3 +- .../kotatsu/parsers/site/en/ComicExtra.kt | 3 +- .../kotatsu/parsers/site/en/DynastyScans.kt | 3 +- .../kotatsu/parsers/site/en/FlixScansOrg.kt | 3 +- .../kotatsu/parsers/site/en/MangaGeko.kt | 3 +- .../parsers/site/en/MangaTownParser.kt | 14 +- .../kotatsu/parsers/site/en/Mangaowl.kt | 3 +- .../kotatsu/parsers/site/en/Manhwa18Parser.kt | 3 +- .../kotatsu/parsers/site/en/ManhwasMen.kt | 3 +- .../kotatsu/parsers/site/en/Po2Scans.kt | 3 +- .../kotatsu/parsers/site/en/Pururin.kt | 3 +- .../kotatsu/parsers/site/es/TempleScanEsp.kt | 3 +- .../parsers/site/fmreader/FmreaderParser.kt | 3 +- .../parsers/site/fmreader/en/Manhwa18Com.kt | 3 +- .../kotatsu/parsers/site/fmreader/ja/Klz9.kt | 3 +- .../parsers/site/fmreader/ja/WeLoveManga.kt | 3 +- .../parsers/site/foolslide/FoolSlideParser.kt | 3 +- .../parsers/site/foolslide/fr/HniScantrad.kt | 3 +- .../parsers/site/fr/BentomangaParser.kt | 2 + .../kotatsu/parsers/site/fr/FuryoSociety.kt | 3 +- .../parsers/site/fr/LegacyScansParser.kt | 5 +- .../kotatsu/parsers/site/fr/LireScan.kt | 6 +- .../kotatsu/parsers/site/fr/LugnicaScans.kt | 3 +- .../kotatsu/parsers/site/fr/ScansMangasMe.kt | 3 +- .../kotatsu/parsers/site/fr/ScantradUnion.kt | 3 +- .../kotatsu/parsers/site/heancms/HeanCms.kt | 17 +- .../parsers/site/heancms/en/OmegaScans.kt | 4 +- .../parsers/site/heancms/es/YugenMangasEs.kt | 4 +- .../parsers/site/heancms/fr/PerfScan.kt | 157 +++++++++++++++++- .../parsers/site/heancms/pt/ModeScanlator.kt | 4 +- .../parsers/site/heancmsalt/HeanCmsAlt.kt | 3 +- .../parsers/site/heancmsalt/es/Brakeout.kt | 3 +- .../kotatsu/parsers/site/it/MangaWorld.kt | 3 +- .../parsers/site/ja/NicovideoSeigaParser.kt | 3 +- .../parsers/site/likemanga/en/ZinManga.kt | 10 -- .../parsers/site/madara/MadaraParser.kt | 6 +- .../kotatsu/parsers/site/madara/all/Ero18x.kt | 3 +- .../parsers/site/madara/all/ManhwaRaw.kt | 3 +- .../parsers/site/madara/ar/LekMangaCom.kt | 3 +- .../site/madara/{ => ar}/RocksManga.kt | 0 .../parsers/site/madara/en/AnshScans.kt | 2 + .../parsers/site/madara/en/Hentaixdickgirl.kt | 3 +- .../parsers/site/madara/en/InstaManhwa.kt | 3 +- .../parsers/site/madara/en/IsekaiScan.kt | 3 +- .../parsers/site/madara/en/MangaDass.kt | 3 +- .../parsers/site/madara/en/MangaDistrict.kt | 3 +- .../parsers/site/madara/en/MangaDna.kt | 3 +- .../parsers/site/madara/en/MangaPure.kt | 3 +- .../parsers/site/madara/en/ManhwaTop.kt | 3 +- .../parsers/site/madara/en/Zinmanga.kt | 5 +- .../parsers/site/madara/es/ManhwaEs.kt | 3 +- .../parsers/site/madara/es/ManhwaLatino.kt | 3 +- .../parsers/site/madara/es/TmoManga.kt | 3 +- .../parsers/site/madara/fr/BlueSolo.kt | 2 + .../parsers/site/madara/fr/Hentaizone.kt | 3 +- .../parsers/site/madara/fr/LunarHentai.kt | 2 + .../parsers/site/madara/fr/ScanHentaiMenu.kt | 2 +- .../parsers/site/madara/fr/ScantradVf.kt | 2 + .../kotatsu/parsers/site/madara/fr/ToonFr.kt | 3 +- .../parsers/site/madara/id/Shinigami.kt | 2 - .../parsers/site/madara/pt/Neoxscans.kt | 3 +- .../parsers/site/madara/tr/TitanManga.kt | 3 +- .../site/madara/vi/TruyenTranhDamMyy.kt | 3 +- .../parsers/site/madtheme/MadthemeParser.kt | 3 +- .../parsers/site/madtheme/en/MangaJinx.kt | 3 +- .../parsers/site/madtheme/en/ManhuaScan.kt | 3 +- .../parsers/site/manga18/Manga18Parser.kt | 3 +- .../parsers/site/manga18/zh/Hanman18.kt | 3 +- .../parsers/site/mangabox/MangaboxParser.kt | 3 +- .../parsers/site/mangabox/en/Mangakakalot.kt | 3 +- .../site/mangadventure/en/ArcRelight.kt | 1 - .../site/mangareader/MangaReaderParser.kt | 10 +- .../site/mangareader/ar/ArAreaScans.kt | 2 +- .../parsers/site/mangareader/ar/Eliton.kt | 12 -- .../parsers/site/mangareader/ar/MangaPro.kt | 2 +- .../parsers/site/mangareader/ar/Manjanoon.kt | 3 +- .../parsers/site/mangareader/ar/Normoyun.kt | 3 +- .../site/mangareader/ar/ThunderScans.kt | 4 +- .../parsers/site/mangareader/ar/UmiManga.kt | 2 +- .../parsers/site/mangareader/ar/VexManga.kt | 3 +- .../site/mangareader/en/Constellarcomic.kt | 3 +- .../parsers/site/mangareader/en/MagusManga.kt | 2 +- .../site/mangareader/en/MangaGalaxy.kt | 2 +- .../site/mangareader/en/ManhwaFreak.kt | 3 +- .../parsers/site/mangareader/en/RizzComic.kt | 22 ++- .../parsers/site/mangareader/es/TuManhwas.kt | 3 +- .../parsers/site/mangareader/fr/BananaScan.kt | 2 + .../site/mangareader/fr/EpsilonscanParser.kt | 3 +- .../parsers/site/mangareader/fr/LunarScans.kt | 2 + .../site/mangareader/fr/SushiScanFR.kt | 4 +- .../parsers/site/mangareader/id/Komikcast.kt | 3 +- .../parsers/site/mmrcms/MmrcmsParser.kt | 3 +- .../parsers/site/mmrcms/en/BananaScan.kt | 10 ++ .../parsers/site/mmrcms/fr/BentoScan.kt | 1 + .../parsers/site/mmrcms/fr/FrScansCom.kt | 2 + .../parsers/site/mmrcms/fr/JpMangas.kt | 2 + .../parsers/site/mmrcms/fr/JpScanVf.kt | 3 +- .../parsers/site/mmrcms/fr/MangaScan.kt | 2 +- .../parsers/site/mmrcms/fr/ScanManga.kt | 2 + .../parsers/site/mmrcms/fr/ScanMangaVfWs.kt | 2 +- .../parsers/site/nepnep/NepnepParser.kt | 3 +- .../site/pizzareader/PizzaReaderParser.kt | 3 +- .../kotatsu/parsers/site/pt/BrMangas.kt | 3 +- .../kotatsu/parsers/site/pt/LerManga.kt | 3 +- .../kotatsu/parsers/site/pt/LerMangaOnline.kt | 3 +- .../kotatsu/parsers/site/pt/MangaOnline.kt | 3 +- .../kotatsu/parsers/site/pt/MuitoHentai.kt | 3 +- .../kotatsu/parsers/site/pt/OnePieceEx.kt | 6 +- .../kotatsu/parsers/site/ru/MangaWtfParser.kt | 22 +-- .../kotatsu/parsers/site/ru/RemangaParser.kt | 1 - .../parsers/site/ru/multichan/ChanParser.kt | 3 +- .../site/ru/multichan/YaoiChanParser.kt | 3 +- .../kotatsu/parsers/site/scan/ScanParser.kt | 3 +- .../kotatsu/parsers/site/sinmh/SinmhParser.kt | 3 +- .../kotatsu/parsers/site/tr/MangaAy.kt | 3 +- .../kotatsu/parsers/site/tr/SadScans.kt | 3 +- .../kotatsu/parsers/site/tr/TrWebtoon.kt | 3 +- .../kotatsu/parsers/site/tr/YaoiFlix.kt | 3 +- .../kotatsu/parsers/site/vi/Truyenqq.kt | 3 +- .../kotatsu/parsers/site/vi/YurinekoParser.kt | 3 +- .../parsers/site/wpcomics/WpComicsParser.kt | 3 +- .../parsers/site/wpcomics/en/XoxoComics.kt | 2 +- .../site/zeistmanga/ZeistMangaParser.kt | 3 +- .../parsers/site/zeistmanga/id/KomikGes.kt | 3 +- .../parsers/site/zeistmanga/id/MonzeeKomik.kt | 3 +- .../parsers/site/zeistmanga/id/ToonCubus.kt | 3 +- .../parsers/site/zeistmanga/pt/AnimeXNovel.kt | 3 +- .../kotatsu/parsers/site/zh/Baozimh.kt | 42 ++--- .../parsers/site/zmanga/ZMangaParser.kt | 3 +- .../kotatsu/parsers/site/zmanga/id/MaidId.kt | 3 +- .../parsers/site/zmanga/id/ShiroDoujin.kt | 3 +- 149 files changed, 522 insertions(+), 226 deletions(-) delete mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/likemanga/en/ZinManga.kt rename src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/{ => ar}/RocksManga.kt (100%) delete mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/ar/Eliton.kt create mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/en/BananaScan.kt diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/MangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/MangaParser.kt index 8936ab74..739637f5 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/MangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/MangaParser.kt @@ -6,7 +6,6 @@ import okhttp3.Headers import org.koitharu.kotatsu.parsers.config.ConfigKey import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.network.OkHttpWebClient -import org.koitharu.kotatsu.parsers.network.UserAgents import org.koitharu.kotatsu.parsers.network.WebClient import org.koitharu.kotatsu.parsers.util.FaviconParser import org.koitharu.kotatsu.parsers.util.RelatedMangaFinder 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 b0229f13..1d6d60d6 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 @@ -11,7 +11,6 @@ import org.koitharu.kotatsu.parsers.config.ConfigKey import org.koitharu.kotatsu.parsers.exception.ParseException import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* -import org.koitharu.kotatsu.parsers.util.json.isNullOrEmpty import java.nio.charset.StandardCharsets import java.security.MessageDigest import java.util.* @@ -319,7 +318,8 @@ internal class BatoToParser(context: MangaLoaderContext) : PagedMangaParser( return MangaChapter( id = generateUid(href), name = a.text(), - number = index + 1, + number = index + 1f, + volume = 0, url = href, scanlator = extra?.getElementsByAttributeValueContaining("href", "/group/")?.text(), uploadDate = runCatching { diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/ExHentaiParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/ExHentaiParser.kt index d9541c60..73bd8ff1 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/ExHentaiParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/ExHentaiParser.kt @@ -212,7 +212,8 @@ internal class ExHentaiParser( chapters += MangaChapter( id = generateUid(url), name = "${manga.title} #$i", - number = i, + number = i.toFloat(), + volume = 0, url = url, uploadDate = 0L, source = source, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/HitomiLaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/HitomiLaParser.kt index 27ac2306..7d3a7f2a 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/HitomiLaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/HitomiLaParser.kt @@ -540,7 +540,8 @@ class HitomiLaParser(context: MangaLoaderContext) : MangaParser(context, MangaSo url = manga.url, name = json.getString("title"), scanlator = json.getString("type").toTitleCase(), - number = 1, + number = 1f, + volume = 0, branch = json.getString("language_localname"), source = source, uploadDate = dateFormat.tryParse(json.getString("date").substringBeforeLast("-")), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/ImHentai.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/ImHentai.kt index c19a8312..8160cd15 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/ImHentai.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/ImHentai.kt @@ -130,7 +130,8 @@ internal class ImHentai(context: MangaLoaderContext) : MangaChapter( id = manga.id, name = manga.title, - number = 1, + number = 1f, + volume = 0, url = manga.url, scanlator = null, uploadDate = 0, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/LineWebtoonsParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/LineWebtoonsParser.kt index 80120a6d..a946d0f0 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/LineWebtoonsParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/LineWebtoonsParser.kt @@ -94,7 +94,8 @@ internal abstract class LineWebtoonsParser( MangaChapter( id = generateUid("$titleNo-$i"), name = jo.getString("episodeTitle"), - number = jo.getInt("episodeSeq"), + number = jo.getInt("episodeSeq").toFloat(), + volume = 0, url = "$titleNo-${jo.get("episodeNo")}", uploadDate = jo.getLong("modifyYmdt"), branch = null, 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 b3a6c05d..77b7e35f 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 @@ -23,8 +23,8 @@ private const val MIN_SPLIT_COUNT = 5 internal abstract class MangaFireParser( context: MangaLoaderContext, source: MangaSource, - private val siteLang: String -): PagedMangaParser(context, source, 30), Interceptor { + private val siteLang: String, +) : PagedMangaParser(context, source, 30), Interceptor { override val configKeyDomain: ConfigKey.Domain = ConfigKey.Domain("mangafire.to") @@ -44,7 +44,7 @@ internal abstract class MangaFireParser( MangaTag( title = it.selectFirstOrThrow("label").ownText().toTitleCase(sourceLocale), key = it.selectFirstOrThrow("input").attr("value"), - source = source + source = source, ) }.associateBy { it.title } } @@ -73,7 +73,7 @@ internal abstract class MangaFireParser( SortOrder.NEWEST -> "release_date" SortOrder.ALPHABETICAL -> "title_az" else -> "" - } + }, ) } } @@ -97,7 +97,7 @@ internal abstract class MangaFireParser( MangaState.ABANDONED -> "discontinued" MangaState.PAUSED -> "on_hiatus" MangaState.UPCOMING -> "info" - } + }, ) } addQueryParameter( @@ -109,7 +109,7 @@ internal abstract class MangaFireParser( SortOrder.NEWEST -> "release_date" SortOrder.ALPHABETICAL -> "title_az" else -> "" - } + }, ) } @@ -176,14 +176,14 @@ internal abstract class MangaFireParser( author = document.select("div.meta a[href*=/author/]") .joinToString { it.ownText().trim() }, description = document.selectFirstOrThrow("#synopsis div.modal-content").html(), - chapters = getChapters(manga.url, document) + chapters = getChapters(manga.url, document), ) } private data class ChapterBranch( val type: String, val langCode: String, - val langTitle: String + val langTitle: String, ) private suspend fun getChapters(mangaUrl: String, document: Document): List { @@ -252,7 +252,7 @@ internal abstract class MangaFireParser( scanlator = null, uploadDate = dateFormat.tryParse(it.attr("upload-date")), branch = "${branch.langTitle} ${branch.type.toTitleCase()}", - source = source + source = source, ) } } @@ -263,7 +263,7 @@ internal abstract class MangaFireParser( override suspend fun getRelatedManga(seed: Manga): List = coroutineScope { val document = webClient.httpGet(seed.url.toAbsoluteUrl(domain)).parseHtml() val total = document.select( - "section.m-related a[href*=/manga/], .side-manga:not(:has(.head:contains(trending))) .unit" + "section.m-related a[href*=/manga/], .side-manga:not(:has(.head:contains(trending))) .unit", ).size val mangas = ArrayList(total) @@ -322,7 +322,7 @@ internal abstract class MangaFireParser( rating = RATING_UNKNOWN, state = null, tags = emptySet(), - ) + ), ) } @@ -366,8 +366,8 @@ internal abstract class MangaFireParser( "$url#scrambled_$offset" }, preview = null, - source = source - ) + source = source, + ), ) } 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 8f8b2166..28cdfc86 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 @@ -193,7 +193,8 @@ internal class MangaPark(context: MangaLoaderContext) : MangaChapter( id = generateUid(href), name = a.text(), - number = i + 1, + number = i + 1f, + volume = 0, url = href, uploadDate = parseChapterDate( dateFormat, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaPlusParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaPlusParser.kt index 5cf1650c..ba5e9a16 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaPlusParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaPlusParser.kt @@ -324,6 +324,6 @@ internal abstract class MangaPlusParser( class German(context: MangaLoaderContext) : MangaPlusParser( context, MangaSource.MANGAPLUSPARSER_DE, - "GERMAN" + "GERMAN", ) } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/NineMangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/NineMangaParser.kt index f67177f9..5d136283 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/NineMangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/NineMangaParser.kt @@ -145,7 +145,8 @@ internal abstract class NineMangaParser( MangaChapter( id = generateUid(href), name = a.text(), - number = i + 1, + number = i + 1f, + volume = 0, url = href, uploadDate = parseChapterDateByLang(li.selectFirst("span")?.text().orEmpty()), source = source, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/WebtoonsParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/WebtoonsParser.kt index f75e9ce8..64730052 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/WebtoonsParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/WebtoonsParser.kt @@ -109,7 +109,8 @@ internal abstract class WebtoonsParser( MangaChapter( id = generateUid("$titleNo-$i"), name = jo.getString("episodeTitle"), - number = jo.getInt("episodeSeq"), + number = jo.getInt("episodeSeq").toFloat(), + volume = 0, url = "$titleNo-${jo.get("episodeNo")}", uploadDate = jo.getLong("registerYmdt"), branch = null, @@ -223,7 +224,8 @@ internal abstract class WebtoonsParser( description = null, state = null, source = source, - )) + ), + ) } } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/animebootstrap/AnimeBootstrapParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/animebootstrap/AnimeBootstrapParser.kt index 22c570b2..4f9115c3 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/animebootstrap/AnimeBootstrapParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/animebootstrap/AnimeBootstrapParser.kt @@ -146,7 +146,8 @@ internal abstract class AnimeBootstrapParser( MangaChapter( id = generateUid(href), name = a.text(), - number = i + 1, + number = i + 1f, + volume = 0, url = href, uploadDate = 0, source = source, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/animebootstrap/fr/PapScan.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/animebootstrap/fr/PapScan.kt index 940ac7b3..d82508d5 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/animebootstrap/fr/PapScan.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/animebootstrap/fr/PapScan.kt @@ -3,6 +3,7 @@ package org.koitharu.kotatsu.parsers.site.animebootstrap.fr import kotlinx.coroutines.async import kotlinx.coroutines.coroutineScope import org.jsoup.nodes.Document +import org.koitharu.kotatsu.parsers.Broken import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.model.* @@ -12,6 +13,7 @@ import java.text.SimpleDateFormat import java.util.EnumSet import java.util.Locale +@Broken @MangaSourceParser("PAPSCAN", "PapScan", "fr") internal class PapScan(context: MangaLoaderContext) : AnimeBootstrapParser(context, MangaSource.PAPSCAN, "papscan.com") { @@ -126,7 +128,8 @@ internal class PapScan(context: MangaLoaderContext) : MangaChapter( id = generateUid(href), name = li.selectFirstOrThrow("span em").text(), - number = i + 1, + number = i + 1f, + volume = 0, url = href, uploadDate = dateFormat.tryParse(dateText), source = source, 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 04c0e5d0..74ed7c70 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 @@ -180,7 +180,8 @@ internal class FlixScans(context: MangaLoaderContext) : PagedMangaParser(context id = generateUid(url), url = url, name = j.getString("slug").replace('-', ' '), - number = i + 1, + number = i + 1f, + volume = 0, branch = null, uploadDate = dateFormat.tryParse(date), scanlator = null, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ar/MangaStorm.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ar/MangaStorm.kt index 4859e841..dc0f301b 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ar/MangaStorm.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ar/MangaStorm.kt @@ -101,7 +101,8 @@ internal class MangaStorm(context: MangaLoaderContext) : PagedMangaParser(contex MangaChapter( id = generateUid(url), name = a.text(), - number = i + 1, + number = i + 1f, + volume = 0, url = url, scanlator = null, uploadDate = 0, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ar/TeamXNovel.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ar/TeamXNovel.kt index 9db6249f..0322983b 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ar/TeamXNovel.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ar/TeamXNovel.kt @@ -183,7 +183,8 @@ internal class TeamXNovel(context: MangaLoaderContext) : PagedMangaParser(contex MangaChapter( id = generateUid(url), name = li.selectFirstOrThrow(".epl-title").text(), - number = url.substringAfterLast('/').toIntOrNull() ?: 0, + number = url.substringAfterLast('/').toFloatOrNull() ?: 0f, + volume = 0, url = url, scanlator = null, uploadDate = dateFormat.tryParse(li.selectFirstOrThrow(".epl-date").text()), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/be/AnibelParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/be/AnibelParser.kt index 833ef395..3df028ac 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/be/AnibelParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/be/AnibelParser.kt @@ -144,7 +144,8 @@ internal class AnibelParser(context: MangaLoaderContext) : MangaParser(context, MangaChapter( id = generateUid(jo.getString("id")), name = "Глава $number", - number = number, + number = number.toFloat(), + volume = 0, url = "${manga.url}/read/$number", scanlator = null, uploadDate = jo.getLong("released"), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/BeeToon.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/BeeToon.kt index 121a62da..2f819f5f 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/BeeToon.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/BeeToon.kt @@ -109,7 +109,8 @@ internal class BeeToon(context: MangaLoaderContext) : MangaChapter( id = generateUid(url), name = a.selectFirstOrThrow(".chap").text(), - number = i + 1, + number = i + 1f, + volume = 0, url = url, scanlator = null, uploadDate = SimpleDateFormat("MM/dd/yyyy HH:mm:ss", Locale.ENGLISH) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/CloneMangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/CloneMangaParser.kt index e01e0060..58636336 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/CloneMangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/CloneMangaParser.kt @@ -76,7 +76,8 @@ internal class CloneMangaParser(context: MangaLoaderContext) : MangaParser(conte val chapter = MangaChapter( id = generateUid("$series&page=$i"), name = "Chapter ${i + 1}", - number = i + 1, + number = i + 1f, + volume = 0, url = "$series&page=$i", scanlator = null, branch = null, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/ComicExtra.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/ComicExtra.kt index 245d8028..11d246d1 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/ComicExtra.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/ComicExtra.kt @@ -149,7 +149,8 @@ internal class ComicExtra(context: MangaLoaderContext) : PagedMangaParser(contex MangaChapter( id = generateUid(url), name = name, - number = i + 1, + number = i + 1f, + volume = 0, url = url, scanlator = null, uploadDate = dateFormat.tryParse(dateText), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/DynastyScans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/DynastyScans.kt index 2200b663..e8d52f1b 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/DynastyScans.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/DynastyScans.kt @@ -181,7 +181,8 @@ internal class DynastyScans(context: MangaLoaderContext) : PagedMangaParser(cont MangaChapter( id = generateUid(href), name = a.text(), - number = i + 1, + number = i + 1f, + volume = 0, url = href, uploadDate = dateFormat.tryParse(dateText), source = source, 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 85ec3a8e..07629010 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 @@ -165,7 +165,8 @@ internal class FlixScansOrg(context: MangaLoaderContext) : PagedMangaParser(cont id = generateUid(url), url = url, name = j.getString("slug").replace('-', ' '), - number = i + 1, + number = i + 1f, + volume = 0, branch = null, uploadDate = dateFormat.tryParse(date), scanlator = null, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MangaGeko.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MangaGeko.kt index 37248d35..a3212738 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MangaGeko.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MangaGeko.kt @@ -137,7 +137,8 @@ internal class MangaGeko(context: MangaLoaderContext) : PagedMangaParser(context MangaChapter( id = generateUid(url), name = name, - number = i + 1, + number = i + 1f, + volume = 0, url = url, scanlator = null, uploadDate = dateFormat.tryParse(dateText), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MangaTownParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MangaTownParser.kt index 55deddb2..4353adca 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MangaTownParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MangaTownParser.kt @@ -27,7 +27,7 @@ internal class MangaTownParser(context: MangaLoaderContext) : PagedMangaParser(c override val isMultipleTagsSupported = false - override suspend fun getListPage(page: Int, filter: MangaListFilter?): List { + override suspend fun getListPage(page: Int, filter: MangaListFilter?): List { val url = buildString { append("https://") append(domain) @@ -157,7 +157,8 @@ internal class MangaTownParser(context: MangaLoaderContext) : PagedMangaParser(c id = generateUid(href), url = href, source = MangaSource.MANGATOWN, - number = i + 1, + number = i + 1f, + volume = 0, uploadDate = parseChapterDate( dateFormat, li.selectFirst("span.time")?.text(), @@ -176,7 +177,7 @@ internal class MangaTownParser(context: MangaLoaderContext) : PagedMangaParser(c val root = doc.body().selectFirstOrThrow("div.page_select") val isManga = root.select("select") - if(isManga.isEmpty()){//Webtoon + if (isManga.isEmpty()) {//Webtoon val imgElements = doc.select("div#viewer.read_img img.image") return imgElements.map { val href = it.attr("src") @@ -188,7 +189,7 @@ internal class MangaTownParser(context: MangaLoaderContext) : PagedMangaParser(c ) } - }else{ //Manga + } else { //Manga return isManga.select("option").mapNotNull { val href = it.attrAsRelativeUrlOrNull("value") if (href == null || href.endsWith("featured.html")) { @@ -205,7 +206,7 @@ internal class MangaTownParser(context: MangaLoaderContext) : PagedMangaParser(c } override suspend fun getPageUrl(page: MangaPage): String { - if(page.url.startsWith("//")){//Webtoon + if (page.url.startsWith("//")) {//Webtoon return page.url.toAbsoluteUrl(domain) } @@ -253,7 +254,8 @@ internal class MangaTownParser(context: MangaLoaderContext) : PagedMangaParser(c id = generateUid(href), url = href, source = MangaSource.MANGATOWN, - number = i + 1, + number = i + 1f, + volume = 0, uploadDate = parseChapterDate( dateFormat, li.selectFirst("span.time")?.text(), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Mangaowl.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Mangaowl.kt index 90951280..3556c697 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Mangaowl.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Mangaowl.kt @@ -155,7 +155,8 @@ internal class Mangaowl(context: MangaLoaderContext) : MangaChapter( id = generateUid(url), name = name, - number = i + 1, + number = i + 1f, + volume = 0, url = url, uploadDate = dateFormat.tryParse(date), source = source, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Manhwa18Parser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Manhwa18Parser.kt index bab5242b..5ddee824 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Manhwa18Parser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Manhwa18Parser.kt @@ -161,7 +161,8 @@ class Manhwa18Parser(context: MangaLoaderContext) : MangaChapter( id = generateUid(chapterUrl), name = element.selectFirst(".chapter-name")?.text().orEmpty(), - number = index + 1, + number = index + 1f, + volume = 0, url = chapterUrl, scanlator = null, uploadDate = uploadDate, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/ManhwasMen.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/ManhwasMen.kt index 1272c1c1..e571fa47 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/ManhwasMen.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/ManhwasMen.kt @@ -113,7 +113,8 @@ class ManhwasMen(context: MangaLoaderContext) : MangaChapter( id = generateUid(url), name = li.selectFirstOrThrow(".flex-grow-1 span").text(), - number = i + 1, + number = i + 1f, + volume = 0, url = url, scanlator = null, uploadDate = parseChapterDate( diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Po2Scans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Po2Scans.kt index bbd415dd..ccc3ceb3 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Po2Scans.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Po2Scans.kt @@ -76,7 +76,8 @@ internal class Po2Scans(context: MangaLoaderContext) : MangaParser(context, Mang MangaChapter( id = generateUid(url), name = a.text(), - number = i + 1, + number = i + 1f, + volume = 0, url = url, scanlator = null, uploadDate = dateFormat.tryParse(div.select(".detail span").last()?.text()), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Pururin.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Pururin.kt index ce48030f..7c88841b 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Pururin.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Pururin.kt @@ -126,7 +126,8 @@ internal class Pururin(context: MangaLoaderContext) : MangaChapter( id = manga.id, name = manga.title, - number = 1, + number = 1f, + volume = 0, url = manga.url, scanlator = null, uploadDate = 0, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/es/TempleScanEsp.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/es/TempleScanEsp.kt index d7478d2e..55fa2013 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/es/TempleScanEsp.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/es/TempleScanEsp.kt @@ -96,7 +96,8 @@ internal class TempleScanEsp(context: MangaLoaderContext) : MangaChapter( id = generateUid(href), name = div.requireElementById("name").text(), - number = i + 1, + number = i + 1f, + volume = 0, url = href, uploadDate = date, source = source, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fmreader/FmreaderParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fmreader/FmreaderParser.kt index 2f025e25..581e1ce5 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fmreader/FmreaderParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fmreader/FmreaderParser.kt @@ -203,7 +203,8 @@ internal abstract class FmreaderParser( MangaChapter( id = generateUid(href), name = a.selectFirstOrThrow("div.chapter-name").text(), - number = i + 1, + number = i + 1f, + volume = 0, url = href, uploadDate = parseChapterDate( dateFormat, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fmreader/en/Manhwa18Com.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fmreader/en/Manhwa18Com.kt index f57b1147..79420961 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fmreader/en/Manhwa18Com.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fmreader/en/Manhwa18Com.kt @@ -125,7 +125,8 @@ internal class Manhwa18Com(context: MangaLoaderContext) : MangaChapter( id = generateUid(href), name = a.selectFirstOrThrow("div.chapter-name").text(), - number = i + 1, + number = i + 1f, + volume = 0, url = href, uploadDate = parseChapterDate( dateFormat, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fmreader/ja/Klz9.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fmreader/ja/Klz9.kt index 131053f9..4255761b 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fmreader/ja/Klz9.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fmreader/ja/Klz9.kt @@ -66,7 +66,8 @@ internal class Klz9(context: MangaLoaderContext) : MangaChapter( id = generateUid(href), name = a.selectFirstOrThrow("a").text(), - number = i + 1, + number = i + 1f, + volume = 0, url = href, uploadDate = parseChapterDate( dateFormat, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fmreader/ja/WeLoveManga.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fmreader/ja/WeLoveManga.kt index 7256194c..98aac571 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fmreader/ja/WeLoveManga.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fmreader/ja/WeLoveManga.kt @@ -25,7 +25,8 @@ internal class WeLoveManga(context: MangaLoaderContext) : MangaChapter( id = generateUid(href), name = a.selectFirstOrThrow("a").text(), - number = i + 1, + number = i + 1f, + volume = 0, url = href, uploadDate = parseChapterDate( dateFormat, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/foolslide/FoolSlideParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/foolslide/FoolSlideParser.kt index 70bf7e34..7c6b12ec 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/foolslide/FoolSlideParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/foolslide/FoolSlideParser.kt @@ -155,7 +155,8 @@ internal abstract class FoolSlideParser( MangaChapter( id = generateUid(href), name = a.text(), - number = i + 1, + number = i + 1f, + volume = 0, url = href, uploadDate = if (div.selectFirstOrThrow(selectDate).text().contains(", ")) { dateFormat.tryParse(dateText) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/foolslide/fr/HniScantrad.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/foolslide/fr/HniScantrad.kt index bd069d28..d8a5f3ef 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/foolslide/fr/HniScantrad.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/foolslide/fr/HniScantrad.kt @@ -5,9 +5,10 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.site.foolslide.FoolSlideParser +// The source has changed template so for the moment it is dead. @MangaSourceParser("HNISCANTRAD", "HniScantrad", "fr") internal class HniScantrad(context: MangaLoaderContext) : - FoolSlideParser(context, MangaSource.HNISCANTRAD, "hni-scantrad.com") { + FoolSlideParser(context, MangaSource.HNISCANTRAD, "hni-scantrad.net") { override val pagination = false override val searchUrl = "lel/search/" override val listUrl = "lel/directory/" diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/BentomangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/BentomangaParser.kt index b1b64ddd..f747b227 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/BentomangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/BentomangaParser.kt @@ -5,6 +5,7 @@ import kotlinx.coroutines.awaitAll import kotlinx.coroutines.coroutineScope import okhttp3.Headers import org.jsoup.nodes.Element +import org.koitharu.kotatsu.parsers.Broken import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.PagedMangaParser @@ -15,6 +16,7 @@ import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.getIntOrDefault import java.util.* +@Broken @MangaSourceParser("BENTOMANGA", "BentoManga", "fr") internal class BentomangaParser(context: MangaLoaderContext) : PagedMangaParser(context, MangaSource.BENTOMANGA, 10) { diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/FuryoSociety.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/FuryoSociety.kt index 910add0e..676a5a2f 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/FuryoSociety.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/FuryoSociety.kt @@ -109,7 +109,8 @@ internal class FuryoSociety(context: MangaLoaderContext) : MangaChapter( id = generateUid(href), name = div.selectFirstOrThrow("div.title").text() + " : " + div.selectFirstOrThrow("div.name").text(), - number = i + 1, + number = i + 1f, + volume = 0, url = href, uploadDate = parseChapterDate( dateFormat, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/LegacyScansParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/LegacyScansParser.kt index c8349bce..05318126 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/LegacyScansParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/LegacyScansParser.kt @@ -1,13 +1,11 @@ package org.koitharu.kotatsu.parsers.site.fr -import okhttp3.Headers import org.json.JSONObject 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.network.UserAgents import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.mapJSON import java.text.SimpleDateFormat @@ -146,7 +144,8 @@ internal class LegacyScansParser(context: MangaLoaderContext) : MangaChapter( id = generateUid(href), name = name, - number = i + 1, + number = i + 1f, + volume = 0, url = href, scanlator = null, uploadDate = dateFormat.tryParse(dateText), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/LireScan.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/LireScan.kt index 5821aa85..9b68da1f 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/LireScan.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/LireScan.kt @@ -1,12 +1,11 @@ package org.koitharu.kotatsu.parsers.site.fr -import okhttp3.Headers + 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.network.UserAgents import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat import java.util.* @@ -115,7 +114,8 @@ internal class LireScan(context: MangaLoaderContext) : PagedMangaParser(context, MangaChapter( id = generateUid(href), name = name, - number = i, + number = i.toFloat(), + volume = 0, url = href, scanlator = null, uploadDate = dateFormat.tryParse(dateText), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/LugnicaScans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/LugnicaScans.kt index 11eb6f27..0cb1eebc 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/LugnicaScans.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/LugnicaScans.kt @@ -182,7 +182,8 @@ internal class LugnicaScans(context: MangaLoaderContext) : PagedMangaParser(cont MangaChapter( id = generateUid(url), name = "Chapitre : $id", - number = i, + number = i.toFloat(), + volume = 0, url = url, scanlator = null, uploadDate = dateFormat.tryParse(date), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/ScansMangasMe.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/ScansMangasMe.kt index 7cf0e1b1..f2bd90d0 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/ScansMangasMe.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/ScansMangasMe.kt @@ -138,7 +138,8 @@ internal class ScansMangasMe(context: MangaLoaderContext) : MangaChapter( id = generateUid(href), name = li.selectFirstOrThrow("span.mobile chapter").text(), - number = i + 1, + number = li.selectFirstOrThrow("span.mobile chapter").text().substringAfterLast(" ").toFloat(), + volume = 0, url = href, uploadDate = 0, source = source, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/ScantradUnion.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/ScantradUnion.kt index d61b10e0..6661c220 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/ScantradUnion.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/ScantradUnion.kt @@ -151,7 +151,8 @@ internal class ScantradUnion(context: MangaLoaderContext) : PagedMangaParser(con MangaChapter( id = generateUid(href), name = name, - number = i, + number = i.toFloat(), + volume = 0, url = href, scanlator = null, uploadDate = dateFormat.tryParse(date), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/HeanCms.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/HeanCms.kt index 23f736e8..415dd427 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/HeanCms.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/HeanCms.kt @@ -1,11 +1,9 @@ package org.koitharu.kotatsu.parsers.site.heancms -import okhttp3.Headers import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.PagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey import org.koitharu.kotatsu.parsers.model.* -import org.koitharu.kotatsu.parsers.network.UserAgents import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.mapJSON import java.text.SimpleDateFormat @@ -20,8 +18,16 @@ internal abstract class HeanCms( override val configKeyDomain = ConfigKey.Domain(domain) + private val userAgentKey = ConfigKey.UserAgent(context.getDefaultUserAgent()) + + override fun onCreateConfig(keys: MutableCollection>) { + super.onCreateConfig(keys) + keys.add(userAgentKey) + } + override val availableSortOrders: Set = EnumSet.of( SortOrder.ALPHABETICAL, + SortOrder.ALPHABETICAL_DESC, SortOrder.UPDATED, SortOrder.NEWEST, SortOrder.POPULARITY, @@ -30,15 +36,11 @@ internal abstract class HeanCms( override val availableStates: Set = EnumSet.of(MangaState.ONGOING, MangaState.FINISHED, MangaState.PAUSED, MangaState.ABANDONED) - override val headers: Headers = Headers.Builder() - .add("User-Agent", UserAgents.CHROME_DESKTOP) - .build() protected open val pathManga = "series" protected open val apiPath get() = getDomain("api") - //For some sources, you need to send a json. For the moment, this part only works in Get. ( ex source need json gloriousscan.com , omegascans.org ) override suspend fun getListPage(page: Int, filter: MangaListFilter?): List { val url = buildString { append("https://") @@ -147,7 +149,8 @@ internal abstract class HeanCms( MangaChapter( id = generateUid(url), name = name, - number = i + 1, + number = i + 1f, + volume = 0, url = url, scanlator = null, uploadDate = dateFormat.tryParse(date), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/en/OmegaScans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/en/OmegaScans.kt index dfadba46..14ab5753 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/en/OmegaScans.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/en/OmegaScans.kt @@ -45,8 +45,8 @@ internal class OmegaScans(context: MangaLoaderContext) : HeanCms(context, MangaS SortOrder.POPULARITY -> append("total_views&order=desc") SortOrder.UPDATED -> append("latest&order=desc") SortOrder.NEWEST -> append("created_at&order=desc") - SortOrder.ALPHABETICAL -> append("title&order=desc") - SortOrder.ALPHABETICAL_DESC -> append("title&order=asc") + SortOrder.ALPHABETICAL -> append("title&order=asc") + SortOrder.ALPHABETICAL_DESC -> append("title&order=desc") else -> append("latest&order=desc") } append("&series_type=All&perPage=$pageSize") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/es/YugenMangasEs.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/es/YugenMangasEs.kt index 0b73d6a0..8e37063d 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/es/YugenMangasEs.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/es/YugenMangasEs.kt @@ -43,8 +43,8 @@ internal class YugenMangasEs(context: MangaLoaderContext) : SortOrder.POPULARITY -> append("total_views&order=desc") SortOrder.UPDATED -> append("latest&order=desc") SortOrder.NEWEST -> append("created_at&order=desc") - SortOrder.ALPHABETICAL -> append("title&order=desc") - SortOrder.ALPHABETICAL_DESC -> append("title&order=asc") + SortOrder.ALPHABETICAL -> append("title&order=asc") + SortOrder.ALPHABETICAL_DESC -> append("title&order=desc") else -> append("latest&order=desc") } append("&series_type=Comic&perPage=12") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/fr/PerfScan.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/fr/PerfScan.kt index 633b07cb..6688d165 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/fr/PerfScan.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/fr/PerfScan.kt @@ -1,10 +1,165 @@ package org.koitharu.kotatsu.parsers.site.heancms.fr +import org.json.JSONArray import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser +import org.koitharu.kotatsu.parsers.model.Manga +import org.koitharu.kotatsu.parsers.model.MangaChapter +import org.koitharu.kotatsu.parsers.model.MangaListFilter import org.koitharu.kotatsu.parsers.model.MangaSource +import org.koitharu.kotatsu.parsers.model.MangaState +import org.koitharu.kotatsu.parsers.model.MangaTag +import org.koitharu.kotatsu.parsers.model.RATING_UNKNOWN +import org.koitharu.kotatsu.parsers.model.SortOrder import org.koitharu.kotatsu.parsers.site.heancms.HeanCms +import org.koitharu.kotatsu.parsers.util.domain +import org.koitharu.kotatsu.parsers.util.json.getFloatOrDefault +import org.koitharu.kotatsu.parsers.util.json.getStringOrNull +import org.koitharu.kotatsu.parsers.util.json.mapJSON +import org.koitharu.kotatsu.parsers.util.json.mapJSONToSet +import org.koitharu.kotatsu.parsers.util.json.unescapeJson +import org.koitharu.kotatsu.parsers.util.oneOrThrowIfMany +import org.koitharu.kotatsu.parsers.util.parseHtml +import org.koitharu.kotatsu.parsers.util.parseJson +import org.koitharu.kotatsu.parsers.util.toRelativeUrl +import org.koitharu.kotatsu.parsers.util.toTitleCase +import org.koitharu.kotatsu.parsers.util.tryParse +import org.koitharu.kotatsu.parsers.util.urlEncoded +import java.text.SimpleDateFormat +import java.util.Locale @MangaSourceParser("PERF_SCAN", "PerfScan", "fr") internal class PerfScan(context: MangaLoaderContext) : - HeanCms(context, MangaSource.PERF_SCAN, "perf-scan.fr") + HeanCms(context, MangaSource.PERF_SCAN, "perf-scan.fr") { + + override suspend fun getListPage(page: Int, filter: MangaListFilter?): List { + val url = buildString { + append("https://api.") + append(domain) + append("/query?adult=true&query_string=") + when (filter) { + is MangaListFilter.Search -> { + append(filter.query.urlEncoded()) + } + + is MangaListFilter.Advanced -> { + + filter.states.oneOrThrowIfMany()?.let { + append("&status=") + append( + when (it) { + MangaState.ONGOING -> "Ongoing" + MangaState.FINISHED -> "Completed" + MangaState.ABANDONED -> "Dropped" + MangaState.PAUSED -> "Hiatus" + else -> "" + }, + ) + + } + append("&orderBy=") + when (filter.sortOrder) { + SortOrder.POPULARITY -> append("total_views&order=desc") + SortOrder.UPDATED -> append("latest&order=desc") + SortOrder.NEWEST -> append("created_at&order=desc") + SortOrder.ALPHABETICAL -> append("title&order=asc") + SortOrder.ALPHABETICAL_DESC -> append("title&order=desc") + else -> append("latest&order=desc") + } + append("&series_type=All&perPage=") + append(pageSize) + append("&tags_ids=") + append("[".urlEncoded()) + filter.tags.joinTo(this, ",") { it.key } + append("]".urlEncoded()) + + } + + null -> {} + } + append("&page=") + append(page) + } + val json = webClient.httpGet(url).parseJson() + return json.getJSONArray("data").mapJSON { j -> + val slug = j.getString("series_slug") + val urlManga = "https://$domain/$pathManga/$slug" + val cover = if (j.getString("thumbnail").contains('/')) { + j.getString("thumbnail") + } else { + "https://api.$domain/${j.getString("thumbnail")}" + } + Manga( + id = j.getLong("id"), + title = j.getString("title"), + altTitle = null, + url = urlManga.toRelativeUrl(domain), + publicUrl = urlManga, + rating = j.getFloatOrDefault("rating", RATING_UNKNOWN) / 5f, + isNsfw = isNsfwSource, + coverUrl = cover, + tags = setOf(), + state = when (j.getStringOrNull("status")) { + "Ongoing" -> MangaState.ONGOING + "Completed" -> MangaState.FINISHED + "Dropped" -> MangaState.ABANDONED + "Hiatus" -> MangaState.PAUSED + else -> null + }, + author = j.getStringOrNull("author"), + source = source, + description = j.getString("description"), + ) + } + + } + + override suspend fun getDetails(manga: Manga): Manga { + val url = buildString { + append("https://api.") + append(domain) + append("/chapter/query?perPage=9999&series_id=") + append(manga.id) + } + val json = webClient.httpGet(url).parseJson() + val dateFormat = SimpleDateFormat(datePattern, Locale.ENGLISH) + + val chaptersJsonArray = json.getJSONArray("data") + var totalChapters = json.getJSONObject("meta").getInt("total") + val chapters = chaptersJsonArray.mapJSON { j -> + val slug = j.getJSONObject("series").getString("series_slug") + val chapterUrl = "https://$domain/$pathManga/$slug/${j.getString("chapter_slug")}" + val date = j.getString("created_at").substringBeforeLast("T") + MangaChapter( + id = j.getLong("id"), + url = chapterUrl, + name = j.getString("chapter_name"), + number = totalChapters--, + branch = null, + uploadDate = dateFormat.tryParse(date), + scanlator = null, + source = source, + ) + } + + return manga.copy( + chapters = chapters.reversed(), + ) + } + + override suspend fun getAvailableTags(): Set { + val doc = webClient.httpGet("https://$domain/comics").parseHtml() + + val regex = Regex("\"tags\\\\.*?(\\[.+?])") + val tags = doc.select("script").firstNotNullOf { script -> + regex.find(script.html())?.groupValues?.getOrNull(1) + }.unescapeJson() + return JSONArray(tags).mapJSONToSet { + MangaTag( + key = it.getInt("id").toString(), + title = it.getString("name").toTitleCase(sourceLocale), + source = source, + ) + } + } +} diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/pt/ModeScanlator.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/pt/ModeScanlator.kt index da4b1f78..d1a1b764 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/pt/ModeScanlator.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/pt/ModeScanlator.kt @@ -45,8 +45,8 @@ internal class ModeScanlator( SortOrder.POPULARITY -> append("total_views&order=desc") SortOrder.UPDATED -> append("latest&order=desc") SortOrder.NEWEST -> append("created_at&order=desc") - SortOrder.ALPHABETICAL -> append("title&order=desc") - SortOrder.ALPHABETICAL_DESC -> append("title&order=asc") + SortOrder.ALPHABETICAL -> append("title&order=asc") + SortOrder.ALPHABETICAL_DESC -> append("title&order=desc") else -> append("latest&order=desc") } append("&series_type=All&perPage=") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancmsalt/HeanCmsAlt.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancmsalt/HeanCmsAlt.kt index 89dace41..f2318dbf 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancmsalt/HeanCmsAlt.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancmsalt/HeanCmsAlt.kt @@ -99,7 +99,8 @@ internal abstract class HeanCmsAlt( MangaChapter( id = generateUid(url), name = a.selectFirstOrThrow(selectChapterTitle).text(), - number = i + 1, + number = i + 1f, + volume = 0, url = url, scanlator = null, uploadDate = parseChapterDate( diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancmsalt/es/Brakeout.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancmsalt/es/Brakeout.kt index 6cd5ef63..7a0e781d 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancmsalt/es/Brakeout.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancmsalt/es/Brakeout.kt @@ -41,7 +41,8 @@ internal class Brakeout(context: MangaLoaderContext) : MangaChapter( id = generateUid(url), name = div.selectFirstOrThrow(selectChapterTitle).text(), - number = i + 1, + number = i + 1f, + volume = 0, url = url, scanlator = null, uploadDate = parseChapterDate( diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/it/MangaWorld.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/it/MangaWorld.kt index 12fe02b9..c9ca68cf 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/it/MangaWorld.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/it/MangaWorld.kt @@ -116,7 +116,8 @@ internal class MangaWorld( MangaChapter( id = generateUid(url), name = a.selectFirstOrThrow("span.d-inline-block").text(), - number = i + 1, + number = i + 1f, + volume = 0, url = url, scanlator = null, uploadDate = diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ja/NicovideoSeigaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ja/NicovideoSeigaParser.kt index 06eafe33..f12c8d0f 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ja/NicovideoSeigaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ja/NicovideoSeigaParser.kt @@ -126,7 +126,8 @@ class NicovideoSeigaParser(context: MangaLoaderContext) : MangaChapter( id = generateUid(href), name = li.select("div > div.description > div.title > a").text(), - number = i + 1, + number = i + 1f, + volume = 0, url = href, scanlator = null, branch = null, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/likemanga/en/ZinManga.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/likemanga/en/ZinManga.kt deleted file mode 100644 index ecb35f1e..00000000 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/likemanga/en/ZinManga.kt +++ /dev/null @@ -1,10 +0,0 @@ -package org.koitharu.kotatsu.parsers.site.likemanga.en - -import org.koitharu.kotatsu.parsers.MangaLoaderContext -import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.model.* -import org.koitharu.kotatsu.parsers.site.likemanga.LikeMangaParser - -@MangaSourceParser("ZINMANGA_COM", "ZinManga.com", "en") -internal class ZinManga(context: MangaLoaderContext) : - LikeMangaParser(context, MangaSource.ZINMANGA_COM, "zinmanga.com") 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 08394ffb..f811530f 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 @@ -472,7 +472,8 @@ internal abstract class MadaraParser( MangaChapter( id = generateUid(href), name = name, - number = i + 1, + number = i + 1f, + volume = 0, url = link, uploadDate = parseChapterDate( dateFormat, @@ -506,7 +507,8 @@ internal abstract class MadaraParser( id = generateUid(href), url = link, name = name, - number = i + 1, + number = i + 1f, + volume = 0, branch = null, uploadDate = parseChapterDate( dateFormat, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/all/Ero18x.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/all/Ero18x.kt index 94d2d948..9a06fd7e 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/all/Ero18x.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/all/Ero18x.kt @@ -27,7 +27,8 @@ internal class Ero18x(context: MangaLoaderContext) : MangaChapter( id = generateUid(href), name = name, - number = i + 1, + number = i + 1f, + volume = 0, url = link, uploadDate = if (dateText == "Newly Published!") { parseChapterDate( diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/all/ManhwaRaw.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/all/ManhwaRaw.kt index d3230605..1ee299a8 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/all/ManhwaRaw.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/all/ManhwaRaw.kt @@ -31,7 +31,8 @@ internal class ManhwaRaw(context: MangaLoaderContext) : MangaChapter( id = generateUid(href), name = name, - number = i + 1, + number = i + 1f, + volume = 0, url = link, uploadDate = if (dateText == "Newly Published!") { parseChapterDate( diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/ar/LekMangaCom.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/ar/LekMangaCom.kt index 8ba1633e..38a10da0 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/ar/LekMangaCom.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/ar/LekMangaCom.kt @@ -36,7 +36,8 @@ internal class LekMangaCom(context: MangaLoaderContext) : id = generateUid(href), url = link, name = name, - number = i + 1, + number = i + 1f, + volume = 0, branch = null, uploadDate = parseChapterDate( dateFormat, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/RocksManga.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/ar/RocksManga.kt similarity index 100% rename from src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/RocksManga.kt rename to src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/ar/RocksManga.kt diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/AnshScans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/AnshScans.kt index 55291d8b..fb7f57d2 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/AnshScans.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/AnshScans.kt @@ -1,10 +1,12 @@ package org.koitharu.kotatsu.parsers.site.madara.en +import org.koitharu.kotatsu.parsers.Broken 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.madara.MadaraParser +@Broken @MangaSourceParser("ANSHSCANS", "AnshScans", "en") internal class AnshScans(context: MangaLoaderContext) : MadaraParser(context, MangaSource.ANSHSCANS, "anshscans.org", 10) { diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/Hentaixdickgirl.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/Hentaixdickgirl.kt index e30f4962..3676ab24 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/Hentaixdickgirl.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/Hentaixdickgirl.kt @@ -28,7 +28,8 @@ internal class Hentaixdickgirl(context: MangaLoaderContext) : MangaChapter( id = generateUid(href), name = name, - number = i + 1, + number = i + 1f, + volume = 0, url = link, uploadDate = parseChapterDate( dateFormat, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/InstaManhwa.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/InstaManhwa.kt index 9ac5467d..8ad77e57 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/InstaManhwa.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/InstaManhwa.kt @@ -121,7 +121,8 @@ internal class InstaManhwa(context: MangaLoaderContext) : id = generateUid(href), url = link, name = name, - number = i + 1, + number = i + 1f, + volume = 0, branch = null, uploadDate = parseChapterDate( dateFormat, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/IsekaiScan.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/IsekaiScan.kt index d04c2290..3c54c490 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/IsekaiScan.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/IsekaiScan.kt @@ -125,7 +125,8 @@ internal class IsekaiScan(context: MangaLoaderContext) : id = generateUid(href), url = link, name = a.ownText(), - number = i + 1, + number = i + 1f, + volume = 0, branch = null, uploadDate = parseChapterDate( dateFormat, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/MangaDass.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/MangaDass.kt index 9fb679e1..443c3f0c 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/MangaDass.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/MangaDass.kt @@ -161,7 +161,8 @@ internal class MangaDass(context: MangaLoaderContext) : MangaChapter( id = generateUid(href), name = name, - number = i + 1, + number = i + 1f, + volume = 0, url = link, uploadDate = parseChapterDate( dateFormat, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/MangaDistrict.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/MangaDistrict.kt index 42468686..36a2e9c3 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/MangaDistrict.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/MangaDistrict.kt @@ -33,7 +33,8 @@ internal class MangaDistrict(context: MangaLoaderContext) : MangaChapter( id = generateUid(href), name = a.ownText(), - number = i + 1, + number = i + 1f, + volume = 0, url = href, uploadDate = parseChapterDate( dateFormat, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/MangaDna.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/MangaDna.kt index c5bccd15..1efcdef8 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/MangaDna.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/MangaDna.kt @@ -151,7 +151,8 @@ internal class MangaDna(context: MangaLoaderContext) : MangaChapter( id = generateUid(href), name = name, - number = i + 1, + number = i + 1f, + volume = 0, url = link, uploadDate = parseChapterDate( dateFormat, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/MangaPure.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/MangaPure.kt index 64dda2fd..336782c8 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/MangaPure.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/MangaPure.kt @@ -127,7 +127,8 @@ internal class MangaPure(context: MangaLoaderContext) : id = generateUid(href), url = link, name = a.ownText(), - number = i + 1, + number = i + 1f, + volume = 0, branch = null, uploadDate = parseChapterDate( dateFormat, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/ManhwaTop.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/ManhwaTop.kt index 10846c05..3484f3df 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/ManhwaTop.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/ManhwaTop.kt @@ -39,7 +39,8 @@ internal class ManhwaTop(context: MangaLoaderContext) : id = generateUid(href), url = link, name = name, - number = i + 1, + number = i + 1f, + volume = 0, branch = null, uploadDate = parseChapterDate( dateFormat, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/Zinmanga.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/Zinmanga.kt index 352a7353..c240eb40 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/Zinmanga.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/Zinmanga.kt @@ -5,7 +5,8 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.site.madara.MadaraParser -@MangaSourceParser("ZINMANGA", "ZinManga.com", "en") -internal class Zinmanga(context: MangaLoaderContext) : MadaraParser(context, MangaSource.ZINMANGA, "zinmanga.com") { +@MangaSourceParser("ZINMANGA", "ZinManga", "en") +internal class Zinmanga(context: MangaLoaderContext) : MadaraParser(context, MangaSource.ZINMANGA, "zinmanga.net") { override val datePattern = "MM/dd/yyyy" + override val withoutAjax = true } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/es/ManhwaEs.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/es/ManhwaEs.kt index 9ecbdfaa..c45b0023 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/es/ManhwaEs.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/es/ManhwaEs.kt @@ -27,7 +27,8 @@ internal class ManhwaEs(context: MangaLoaderContext) : MangaChapter( id = generateUid(href), name = name, - number = i + 1, + number = i + 1f, + volume = 0, url = link, uploadDate = if (dateText == "¡Recién publicado!") { parseChapterDate( diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/es/ManhwaLatino.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/es/ManhwaLatino.kt index 71679f05..30c546d6 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/es/ManhwaLatino.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/es/ManhwaLatino.kt @@ -35,7 +35,8 @@ internal class ManhwaLatino(context: MangaLoaderContext) : MangaChapter( id = generateUid(href), name = name, - number = i + 1, + number = i + 1f, + volume = 0, url = link, uploadDate = parseChapterDate( dateFormat, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/es/TmoManga.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/es/TmoManga.kt index e1e29d31..3893d6db 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/es/TmoManga.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/es/TmoManga.kt @@ -99,7 +99,8 @@ internal class TmoManga(context: MangaLoaderContext) : MangaChapter( id = generateUid(href), name = name, - number = i + 1, + number = i + 1f, + volume = 0, url = link, uploadDate = 0, source = source, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/fr/BlueSolo.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/fr/BlueSolo.kt index 766163f8..36b650dc 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/fr/BlueSolo.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/fr/BlueSolo.kt @@ -1,10 +1,12 @@ package org.koitharu.kotatsu.parsers.site.madara.fr +import org.koitharu.kotatsu.parsers.Broken 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.madara.MadaraParser +@Broken @MangaSourceParser("BLUESOLO", "BlueSolo", "fr") internal class BlueSolo(context: MangaLoaderContext) : MadaraParser(context, MangaSource.BLUESOLO, "www1.bluesolo.org", 10) { diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/fr/Hentaizone.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/fr/Hentaizone.kt index 615855b7..fa78dcaf 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/fr/Hentaizone.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/fr/Hentaizone.kt @@ -32,7 +32,8 @@ internal class Hentaizone(context: MangaLoaderContext) : MangaChapter( id = generateUid(href), name = name, - number = i + 1, + number = i + 1f, + volume = 0, url = link, uploadDate = parseChapterDate( dateFormat, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/fr/LunarHentai.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/fr/LunarHentai.kt index 53a2b87e..bedfade9 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/fr/LunarHentai.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/fr/LunarHentai.kt @@ -1,11 +1,13 @@ package org.koitharu.kotatsu.parsers.site.madara.fr +import org.koitharu.kotatsu.parsers.Broken import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.model.ContentType import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.site.madara.MadaraParser +@Broken @MangaSourceParser("LUNARHENTAI", "LunarHentai", "fr", ContentType.HENTAI) internal class LunarHentai(context: MangaLoaderContext) : MadaraParser(context, MangaSource.LUNARHENTAI, "hentai.lunarscans.fr") { diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/fr/ScanHentaiMenu.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/fr/ScanHentaiMenu.kt index 31a58f4e..ea88c6c9 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/fr/ScanHentaiMenu.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/fr/ScanHentaiMenu.kt @@ -8,4 +8,4 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser @MangaSourceParser("SCANHENTAIMENU", "ScanHentai.Menu", "fr", ContentType.HENTAI) internal class ScanHentaiMenu(context: MangaLoaderContext) : - MadaraParser(context, MangaSource.SCANHENTAIMENU, "scan.hentai.menu") + MadaraParser(context, MangaSource.SCANHENTAIMENU, "x-manga.net") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/fr/ScantradVf.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/fr/ScantradVf.kt index f6452399..a172385e 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/fr/ScantradVf.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/fr/ScantradVf.kt @@ -1,10 +1,12 @@ package org.koitharu.kotatsu.parsers.site.madara.fr +import org.koitharu.kotatsu.parsers.Broken 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.madara.MadaraParser +@Broken @MangaSourceParser("SCANTRADVF", "Scantrad-Vf", "fr") internal class ScantradVf(context: MangaLoaderContext) : MadaraParser(context, MangaSource.SCANTRADVF, "scantrad-vf.me") { diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/fr/ToonFr.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/fr/ToonFr.kt index 20aec5d7..8c96e8e7 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/fr/ToonFr.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/fr/ToonFr.kt @@ -32,7 +32,8 @@ internal class ToonFr(context: MangaLoaderContext) : id = generateUid(href), url = href, name = a.text(), - number = i + 1, + number = i + 1f, + volume = 0, branch = null, uploadDate = parseChapterDate( dateFormat, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/id/Shinigami.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/id/Shinigami.kt index 57031394..43e2d309 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/id/Shinigami.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/id/Shinigami.kt @@ -2,9 +2,7 @@ package org.koitharu.kotatsu.parsers.site.madara.id 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.network.UserAgents import org.koitharu.kotatsu.parsers.site.madara.MadaraParser import java.util.* diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/Neoxscans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/Neoxscans.kt index b7d00107..9d5f7568 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/Neoxscans.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/Neoxscans.kt @@ -28,7 +28,8 @@ internal class Neoxscans(context: MangaLoaderContext) : id = generateUid(href), url = link, name = name, - number = i + 1, + number = i + 1f, + volume = 0, branch = null, uploadDate = parseChapterDate( dateFormat, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/tr/TitanManga.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/tr/TitanManga.kt index 3248eaf2..999430e1 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/tr/TitanManga.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/tr/TitanManga.kt @@ -24,7 +24,8 @@ internal class TitanManga(context: MangaLoaderContext) : id = generateUid(href), url = link, name = name, - number = i + 1, + number = i + 1f, + volume = 0, branch = null, uploadDate = 0, scanlator = null, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/vi/TruyenTranhDamMyy.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/vi/TruyenTranhDamMyy.kt index 3516b23c..beba7c85 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/vi/TruyenTranhDamMyy.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/vi/TruyenTranhDamMyy.kt @@ -26,7 +26,8 @@ internal class TruyenTranhDamMyy(context: MangaLoaderContext) : id = generateUid(href), url = link, name = name, - number = i + 1, + number = i + 1f, + volume = 0, branch = null, uploadDate = 0, // Correct datePattern not found. scanlator = null, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madtheme/MadthemeParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madtheme/MadthemeParser.kt index 7b458f29..c4ace344 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madtheme/MadthemeParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madtheme/MadthemeParser.kt @@ -207,7 +207,8 @@ internal abstract class MadthemeParser( MangaChapter( id = generateUid(href), name = li.selectFirstOrThrow(".chapter-title").text(), - number = i + 1, + number = i + 1f, + volume = 0, url = href, uploadDate = parseChapterDate( dateFormat, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madtheme/en/MangaJinx.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madtheme/en/MangaJinx.kt index 26ac2c4e..9645918d 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madtheme/en/MangaJinx.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madtheme/en/MangaJinx.kt @@ -26,7 +26,8 @@ internal class MangaJinx(context: MangaLoaderContext) : MangaChapter( id = generateUid(href), name = li.selectFirstOrThrow(".chapter-title").text(), - number = i + 1, + number = i + 1f, + volume = 0, url = href, uploadDate = parseChapterDate( dateFormat, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madtheme/en/ManhuaScan.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madtheme/en/ManhuaScan.kt index 16b8f934..9d1dadf1 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madtheme/en/ManhuaScan.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madtheme/en/ManhuaScan.kt @@ -108,7 +108,8 @@ internal class ManhuaScan(context: MangaLoaderContext) : MangaChapter( id = generateUid(href), name = li.selectFirstOrThrow(".chapter-title").text(), - number = i + 1, + number = i + 1f, + volume = 0, url = href, uploadDate = parseChapterDate( dateFormat, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/manga18/Manga18Parser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/manga18/Manga18Parser.kt index 7703908d..3c8255ed 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/manga18/Manga18Parser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/manga18/Manga18Parser.kt @@ -182,7 +182,8 @@ internal abstract class Manga18Parser( MangaChapter( id = generateUid(href), name = a.text(), - number = i + 1, + number = i + 1f, + volume = 0, url = href, uploadDate = dateFormat.tryParse(dateText), source = source, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/manga18/zh/Hanman18.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/manga18/zh/Hanman18.kt index a46b7e27..6e2e0895 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/manga18/zh/Hanman18.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/manga18/zh/Hanman18.kt @@ -24,7 +24,8 @@ internal class Hanman18(context: MangaLoaderContext) : MangaChapter( id = generateUid(href), name = a.text(), - number = i + 1, + number = i + 1f, + volume = 0, url = href, uploadDate = 0, source = source, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangabox/MangaboxParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangabox/MangaboxParser.kt index 8d89a6e1..ba27313c 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangabox/MangaboxParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangabox/MangaboxParser.kt @@ -200,7 +200,8 @@ internal abstract class MangaboxParser( MangaChapter( id = generateUid(href), name = a.text(), - number = i + 1, + number = i + 1f, + volume = 0, url = href, uploadDate = parseChapterDate( dateFormat, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangabox/en/Mangakakalot.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangabox/en/Mangakakalot.kt index d052a289..09d7f52c 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangabox/en/Mangakakalot.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangabox/en/Mangakakalot.kt @@ -125,7 +125,8 @@ internal class Mangakakalot(context: MangaLoaderContext) : MangaChapter( id = generateUid(href), name = a.text(), - number = i + 1, + number = i + 1f, + volume = 0, url = href, uploadDate = parseChapterDate( dateFormat, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangadventure/en/ArcRelight.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangadventure/en/ArcRelight.kt index 6af81ddd..03b90a28 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangadventure/en/ArcRelight.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangadventure/en/ArcRelight.kt @@ -5,7 +5,6 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.site.mangadventure.MangAdventureParser -import org.koitharu.kotatsu.parsers.util.urlEncoded @MangaSourceParser("ARCRELIGHT", "Arc-Relight", "en") internal class ArcRelight(context: MangaLoaderContext) : diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/MangaReaderParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/MangaReaderParser.kt index 67442cf2..29f37e6e 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/MangaReaderParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/MangaReaderParser.kt @@ -29,6 +29,13 @@ internal abstract class MangaReaderParser( override val configKeyDomain = ConfigKey.Domain(domain) + private val userAgentKey = ConfigKey.UserAgent(context.getDefaultUserAgent()) + + override fun onCreateConfig(keys: MutableCollection>) { + super.onCreateConfig(keys) + keys.add(userAgentKey) + } + override val availableSortOrders: Set get() = EnumSet.of( SortOrder.UPDATED, @@ -156,7 +163,8 @@ internal abstract class MangaReaderParser( id = generateUid(url), name = element.selectFirst(".chapternum")?.text() ?: "Chapter ${index + 1}", url = url, - number = index + 1, + number = index + 1f, + volume = 0, scanlator = null, uploadDate = dateFormat.tryParse(element.selectFirst(".chapterdate")?.text()), branch = null, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/ar/ArAreaScans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/ar/ArAreaScans.kt index e788cc21..670c6ed9 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/ar/ArAreaScans.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/ar/ArAreaScans.kt @@ -9,4 +9,4 @@ import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser internal class ArAreaScans(context: MangaLoaderContext) : MangaReaderParser(context, MangaSource.ARAREASCANS, "ar.areascans.org", pageSize = 20, searchPageSize = 10) { override val isTagsExclusionSupported = false - } +} diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/ar/Eliton.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/ar/Eliton.kt deleted file mode 100644 index b6d5504d..00000000 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/ar/Eliton.kt +++ /dev/null @@ -1,12 +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("ELITON", "ThunderScans", "ar") -internal class Eliton(context: MangaLoaderContext) : - MangaReaderParser(context, MangaSource.ELITON, "thunderscans.com", pageSize = 20, searchPageSize = 10) { - override val isTagsExclusionSupported = false -} diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/ar/MangaPro.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/ar/MangaPro.kt index f09fa212..a3d2cede 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/ar/MangaPro.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/ar/MangaPro.kt @@ -9,4 +9,4 @@ import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser internal class MangaPro(context: MangaLoaderContext) : MangaReaderParser(context, MangaSource.MANGAPRO, "promanga.pro", pageSize = 20, searchPageSize = 10) { override val isTagsExclusionSupported = false - } +} diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/ar/Manjanoon.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/ar/Manjanoon.kt index 81aca1c8..1d1d7a8a 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/ar/Manjanoon.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/ar/Manjanoon.kt @@ -25,7 +25,8 @@ internal class Manjanoon(context: MangaLoaderContext) : id = generateUid(url), name = element.selectFirst(".chapternum")?.text() ?: "Chapter ${index + 1}", url = url, - number = index + 1, + number = index + 1f, + volume = 0, scanlator = null, uploadDate = 0, branch = null, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/ar/Normoyun.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/ar/Normoyun.kt index b7434f77..542c1d76 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/ar/Normoyun.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/ar/Normoyun.kt @@ -86,7 +86,8 @@ internal class Normoyun(context: MangaLoaderContext) : id = generateUid(url), name = element.selectFirst("a")?.text() ?: "Chapter ${index + 1}", url = url, - number = index + 1, + number = index + 1f, + volume = 0, scanlator = null, uploadDate = dateFormat.tryParse(element.selectFirst(".chapter-date")?.text()), branch = null, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/ar/ThunderScans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/ar/ThunderScans.kt index 110494d1..400fa3f1 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/ar/ThunderScans.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/ar/ThunderScans.kt @@ -7,4 +7,6 @@ import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser @MangaSourceParser("THUNDERSCANS", "ThunderScans", "ar") internal class ThunderScans(context: MangaLoaderContext) : - MangaReaderParser(context, MangaSource.THUNDERSCANS, "thunderscans.com", pageSize = 32, searchPageSize = 10) + MangaReaderParser(context, MangaSource.THUNDERSCANS, "thunderscans.com", pageSize = 32, searchPageSize = 10) { + override val isTagsExclusionSupported = false +} diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/ar/UmiManga.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/ar/UmiManga.kt index 8d951f09..266c73cb 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/ar/UmiManga.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/ar/UmiManga.kt @@ -6,7 +6,7 @@ import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser @MangaSourceParser("UMIMANGA", "UmiManga", "ar") -internal class BeastScans(context: MangaLoaderContext) : +internal class UmiManga(context: MangaLoaderContext) : MangaReaderParser(context, MangaSource.UMIMANGA, "www.umimanga.com", pageSize = 20, searchPageSize = 10) { override val isTagsExclusionSupported = false } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/ar/VexManga.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/ar/VexManga.kt index f87e7af2..035325e1 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/ar/VexManga.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/ar/VexManga.kt @@ -25,7 +25,8 @@ internal class VexManga(context: MangaLoaderContext) : id = generateUid(url), name = element.selectFirst(".chapternum")?.text() ?: "Chapter ${index + 1}", url = url, - number = index + 1, + number = index + 1f, + volume = 0, scanlator = null, uploadDate = parseChapterDate( dateFormat, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/Constellarcomic.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/Constellarcomic.kt index c0bf3fd9..12f17b2d 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/Constellarcomic.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/Constellarcomic.kt @@ -20,7 +20,8 @@ internal class Constellarcomic(context: MangaLoaderContext) : id = generateUid(url), name = element.selectFirst(".chapternum")?.textOrNull() ?: "Chapter ${index + 1}", url = url, - number = index + 1, + number = index + 1f, + volume = 0, scanlator = null, uploadDate = 0, branch = null, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/MagusManga.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/MagusManga.kt index d6d2d05c..89e0b69f 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/MagusManga.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/MagusManga.kt @@ -7,6 +7,6 @@ import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser @MangaSourceParser("MAGUSMANGA", "MagusManga", "en") internal class MagusManga(context: MangaLoaderContext) : - MangaReaderParser(context, MangaSource.MAGUSMANGA, "vofeg.com", pageSize = 20, searchPageSize = 10){ + MangaReaderParser(context, MangaSource.MAGUSMANGA, "vofeg.com", pageSize = 20, searchPageSize = 10) { override val listUrl = "/series" } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/MangaGalaxy.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/MangaGalaxy.kt index e6cfb0c5..1bd0be33 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/MangaGalaxy.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/MangaGalaxy.kt @@ -8,5 +8,5 @@ import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser @MangaSourceParser("MANGAGALAXY", "MangaGalaxy", "en") internal class MangaGalaxy(context: MangaLoaderContext) : MangaReaderParser(context, MangaSource.MANGAGALAXY, "mangagalaxy.me", 20, 16) { - override val listUrl = "/series" + override val listUrl = "/series" } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/ManhwaFreak.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/ManhwaFreak.kt index 988e6b4f..aa37348e 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/ManhwaFreak.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/ManhwaFreak.kt @@ -90,7 +90,8 @@ internal class ManhwaFreak(context: MangaLoaderContext) : id = generateUid(url), name = a.selectFirst(".chapter-info p:contains(Chapter)")?.text() ?: "Chapter ${index + 1}", url = url, - number = index + 1, + number = index + 1f, + volume = 0, scanlator = null, uploadDate = if (dateText == "NEW") { parseChapterDate( diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/RizzComic.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/RizzComic.kt index 2213e050..c0f1659f 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/RizzComic.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/RizzComic.kt @@ -14,11 +14,18 @@ import java.util.* @MangaSourceParser("RIZZCOMIC", "RizzComic", "en") internal class RizzComic(context: MangaLoaderContext) : - MangaReaderParser(context, MangaSource.RIZZCOMIC, "rizzfables.com", pageSize = 50, searchPageSize = 20){ + MangaReaderParser(context, MangaSource.RIZZCOMIC, "rizzfables.com", pageSize = 50, searchPageSize = 20) { override val datePattern = "dd MMM yyyy" override val listUrl = "/series" - override val availableSortOrders: Set = EnumSet.of(SortOrder.ALPHABETICAL, SortOrder.UPDATED, SortOrder.NEWEST, SortOrder.POPULARITY, SortOrder.ALPHABETICAL_DESC) - override val availableStates: Set = EnumSet.of(MangaState.ONGOING, MangaState.FINISHED, MangaState.PAUSED) + override val availableSortOrders: Set = EnumSet.of( + SortOrder.ALPHABETICAL, + SortOrder.UPDATED, + SortOrder.NEWEST, + SortOrder.POPULARITY, + SortOrder.ALPHABETICAL_DESC, + ) + override val availableStates: Set = + EnumSet.of(MangaState.ONGOING, MangaState.FINISHED, MangaState.PAUSED) override val isMultipleTagsSupported = true override val isSearchSupported = true override val isTagsExclusionSupported = false @@ -64,7 +71,8 @@ internal class RizzComic(context: MangaLoaderContext) : null } } - is MangaListFilter.Advanced ->{ + + is MangaListFilter.Advanced -> { val state = filter.states.oneOrThrowIfMany()?.toPayloadValue() ?: "all" val genres = filter.tags.map { it.key } @@ -79,6 +87,7 @@ internal class RizzComic(context: MangaLoaderContext) : } formBuilder.build() } + else -> { FormBody.Builder() .add("StatusValue", "all") @@ -100,7 +109,7 @@ internal class RizzComic(context: MangaLoaderContext) : val response = context.httpClient.newCall(request).execute().parseJsonArray() return response.mapJSON { j -> val title = j.getString("title") - val urlManga = "https://$domain$listUrl/${randomPartCache.get()}-" + title.trim().lowercase() + val urlManga = "https://$domain$listUrl/${randomPartCache.get()}-" + title.trim().lowercase() .replace(slugRegex, "-") .replace("-s-", "s-") .replace("-ll-", "ll-") @@ -113,7 +122,7 @@ internal class RizzComic(context: MangaLoaderContext) : publicUrl = urlManga, rating = j.getFloatOrDefault("rating", RATING_UNKNOWN) / 10f, isNsfw = false, - coverUrl = "https://$domain/assets/images/"+ j.getString("image_url"), + coverUrl = "https://$domain/assets/images/" + j.getString("image_url"), tags = setOf(), state = when (j.getString("status")) { "ongoing" -> MangaState.ONGOING @@ -146,6 +155,7 @@ internal class RizzComic(context: MangaLoaderContext) : MangaState.PAUSED -> "hiatus" else -> "all" } + override suspend fun getAvailableTags(): Set { val url = "https://$domain/series" val doc = webClient.httpGet(url).parseHtml() diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/es/TuManhwas.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/es/TuManhwas.kt index 246087a3..c584280d 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/es/TuManhwas.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/es/TuManhwas.kt @@ -60,7 +60,8 @@ internal class TuManhwas(context: MangaLoaderContext) : id = generateUid(url), name = element.selectFirst(".chapternum")?.textOrNull() ?: "Chapter ${index + 1}", url = url, - number = index + 1, + number = index + 1f, + volume = 0, scanlator = null, uploadDate = parseChapterDate( dateFormat, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/fr/BananaScan.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/fr/BananaScan.kt index 6345976d..1499434b 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/fr/BananaScan.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/fr/BananaScan.kt @@ -1,10 +1,12 @@ package org.koitharu.kotatsu.parsers.site.mangareader.fr +import org.koitharu.kotatsu.parsers.Broken 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 +@Broken @MangaSourceParser("BANANASCAN", "BananaScan", "fr") internal class BananaScan(context: MangaLoaderContext) : MangaReaderParser(context, MangaSource.BANANASCAN, "banana-scan.com", pageSize = 20, searchPageSize = 20) { diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/fr/EpsilonscanParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/fr/EpsilonscanParser.kt index 851ee487..563d3a05 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/fr/EpsilonscanParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/fr/EpsilonscanParser.kt @@ -6,7 +6,8 @@ import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.site.madara.MadaraParser @MangaSourceParser("EPSILONSCAN", "EpsilonScan", "fr", ContentType.HENTAI) -internal class EpsilonscanParser(context: MangaLoaderContext) : MadaraParser(context, MangaSource.EPSILONSCAN, "epsilonscan.fr") { +internal class EpsilonscanParser(context: MangaLoaderContext) : + MadaraParser(context, MangaSource.EPSILONSCAN, "epsilonscan.fr") { override val withoutAjax = true override val isTagsExclusionSupported = false } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/fr/LunarScans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/fr/LunarScans.kt index b0dc2146..6f796bd7 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/fr/LunarScans.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/fr/LunarScans.kt @@ -1,10 +1,12 @@ package org.koitharu.kotatsu.parsers.site.mangareader.fr +import org.koitharu.kotatsu.parsers.Broken 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 +@Broken @MangaSourceParser("LUNARSCANS", "LunarScans", "fr") internal class LunarScans(context: MangaLoaderContext) : MangaReaderParser(context, MangaSource.LUNARSCANS, "lunarscans.fr", pageSize = 20, searchPageSize = 10) { diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/fr/SushiScanFR.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/fr/SushiScanFR.kt index 0d78fc28..b578e9f7 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/fr/SushiScanFR.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/fr/SushiScanFR.kt @@ -5,6 +5,6 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser -@MangaSourceParser("SUSHISCANFR", "Anime-Sama.me", "fr") +@MangaSourceParser("SUSHISCANFR", "SushiScan.fr", "fr") internal class SushiScanFR(context: MangaLoaderContext) : - MangaReaderParser(context, MangaSource.SUSHISCANFR, "anime-sama.me", pageSize = 36, searchPageSize = 10) + MangaReaderParser(context, MangaSource.SUSHISCANFR, "sushiscan.fr", pageSize = 36, searchPageSize = 10) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/id/Komikcast.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/id/Komikcast.kt index 07313def..eec44203 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/id/Komikcast.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/id/Komikcast.kt @@ -90,7 +90,8 @@ internal class Komikcast(context: MangaLoaderContext) : id = generateUid(url), name = element.selectFirst("a.chapter-link-item")?.ownText().orEmpty(), url = url, - number = index + 1, + number = index + 1f, + volume = 0, scanlator = null, uploadDate = parseChapterDate( dateFormat, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/MmrcmsParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/MmrcmsParser.kt index 776150d0..cbbde2c4 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/MmrcmsParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/MmrcmsParser.kt @@ -232,7 +232,8 @@ internal abstract class MmrcmsParser( MangaChapter( id = generateUid(href), name = li.selectFirstOrThrow("h5").text(), - number = i + 1, + number = i + 1f, + volume = 0, url = href, uploadDate = dateFormat.tryParse(dateText), source = source, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/en/BananaScan.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/en/BananaScan.kt new file mode 100644 index 00000000..83a6cc90 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/en/BananaScan.kt @@ -0,0 +1,10 @@ +package org.koitharu.kotatsu.parsers.site.mmrcms.en + +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.mmrcms.MmrcmsParser + +@MangaSourceParser("BANANASCAN_COM", "BananaScan.Com", "en") +internal class BananaScan(context: MangaLoaderContext) : + MmrcmsParser(context, MangaSource.BANANASCAN_COM, "bananascans.com") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/fr/BentoScan.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/fr/BentoScan.kt index 274e4c0f..cdbc705a 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/fr/BentoScan.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/fr/BentoScan.kt @@ -10,4 +10,5 @@ import java.util.Locale internal class BentoScan(context: MangaLoaderContext) : MmrcmsParser(context, MangaSource.BENTOSCAN, "bentoscan.com") { override val sourceLocale: Locale = Locale.ENGLISH + override val imgUpdated = ".jpg" } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/fr/FrScansCom.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/fr/FrScansCom.kt index f6978563..4923fdcc 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/fr/FrScansCom.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/fr/FrScansCom.kt @@ -1,11 +1,13 @@ package org.koitharu.kotatsu.parsers.site.mmrcms.fr +import org.koitharu.kotatsu.parsers.Broken 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.mmrcms.MmrcmsParser import java.util.Locale +@Broken @MangaSourceParser("FRSCANSCOM", "FrScans.com", "fr") internal class FrScansCom(context: MangaLoaderContext) : MmrcmsParser(context, MangaSource.FRSCANSCOM, "frscans.com") { diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/fr/JpMangas.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/fr/JpMangas.kt index fda3469d..6d4afecc 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/fr/JpMangas.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/fr/JpMangas.kt @@ -1,11 +1,13 @@ package org.koitharu.kotatsu.parsers.site.mmrcms.fr +import org.koitharu.kotatsu.parsers.Broken 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.mmrcms.MmrcmsParser import java.util.* +@Broken @MangaSourceParser("JPMANGAS", "JpMangas", "fr") internal class JpMangas(context: MangaLoaderContext) : MmrcmsParser(context, MangaSource.JPMANGAS, "jpmangas.xyz") { diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/fr/JpScanVf.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/fr/JpScanVf.kt index 6adc09be..9eff63b8 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/fr/JpScanVf.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/fr/JpScanVf.kt @@ -1,12 +1,13 @@ package org.koitharu.kotatsu.parsers.site.mmrcms.fr +import org.koitharu.kotatsu.parsers.Broken 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.mmrcms.MmrcmsParser import java.util.* -//the search doesn't work on the source. +@Broken @MangaSourceParser("JPSCANVF", "LireScanVf.com", "fr") internal class JpScanVf(context: MangaLoaderContext) : MmrcmsParser(context, MangaSource.JPSCANVF, "lirescanvf.com") { diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/fr/MangaScan.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/fr/MangaScan.kt index c80fc242..e0202bfd 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/fr/MangaScan.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/fr/MangaScan.kt @@ -8,7 +8,7 @@ import java.util.Locale @MangaSourceParser("MANGA_SCAN", "MangaScan", "fr") internal class MangaScan(context: MangaLoaderContext) : - MmrcmsParser(context, MangaSource.MANGA_SCAN, "mangascan-fr.com") { + MmrcmsParser(context, MangaSource.MANGA_SCAN, "mangascan-fr.co") { override val imgUpdated = ".jpg" override val sourceLocale: Locale = Locale.ENGLISH } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/fr/ScanManga.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/fr/ScanManga.kt index f2f79905..40ab7585 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/fr/ScanManga.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/fr/ScanManga.kt @@ -1,11 +1,13 @@ package org.koitharu.kotatsu.parsers.site.mmrcms.fr +import org.koitharu.kotatsu.parsers.Broken 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.mmrcms.MmrcmsParser import java.util.Locale +@Broken @MangaSourceParser("SCANMANGA", "ScanManga", "fr") internal class ScanManga(context: MangaLoaderContext) : MmrcmsParser(context, MangaSource.SCANMANGA, "scan-manga.me") { diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/fr/ScanMangaVfWs.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/fr/ScanMangaVfWs.kt index 7a095477..5a22aba5 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/fr/ScanMangaVfWs.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/fr/ScanMangaVfWs.kt @@ -8,7 +8,7 @@ import java.util.Locale @MangaSourceParser("SCANMANGAVF_WS", "ScanMangaVf.ws", "fr") internal class ScanMangaVfWs(context: MangaLoaderContext) : - MmrcmsParser(context, MangaSource.SCANMANGAVF_WS, "scanmanga-vf.ws") { + MmrcmsParser(context, MangaSource.SCANMANGAVF_WS, "scanmanga-vf.me") { override val imgUpdated = ".jpg" override val selectTag = "dt:contains(Genres)" override val selectAlt = "dt:contains(Appelé aussi)" 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 2b41dd23..079c1d3f 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 @@ -223,7 +223,8 @@ internal abstract class NepnepParser( MangaChapter( id = generateUid(url), name = name, - number = i + 1, + number = i + 1f, + volume = 0, url = url, scanlator = null, uploadDate = dateFormat.tryParse(date), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pizzareader/PizzaReaderParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pizzareader/PizzaReaderParser.kt index 40578608..95635d74 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pizzareader/PizzaReaderParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pizzareader/PizzaReaderParser.kt @@ -229,7 +229,8 @@ internal abstract class PizzaReaderParser( MangaChapter( id = generateUid(url), name = name, - number = i + 1, + number = i + 1f, + volume = 0, url = url, scanlator = null, uploadDate = dateFormat.tryParse(date), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/BrMangas.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/BrMangas.kt index f51e1d62..abf5bcfb 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/BrMangas.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/BrMangas.kt @@ -141,7 +141,8 @@ internal class BrMangas(context: MangaLoaderContext) : PagedMangaParser(context, MangaChapter( id = generateUid(url), name = name, - number = i + 1, + number = i + 1f, + volume = 0, url = url, scanlator = null, uploadDate = 0, 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 index cd5dc7cb..5f60138d 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/LerManga.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/LerManga.kt @@ -121,7 +121,8 @@ class LerManga(context: MangaLoaderContext) : PagedMangaParser(context, MangaSou MangaChapter( id = generateUid(href), name = a.text(), - number = i + 1, + number = i + 1f, + volume = 0, url = href, scanlator = null, uploadDate = dateFormat.tryParse(div.selectFirstOrThrow("small small").text()), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/LerMangaOnline.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/LerMangaOnline.kt index 9a8e824f..1558df4b 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/LerMangaOnline.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/LerMangaOnline.kt @@ -114,7 +114,8 @@ class LerMangaOnline(context: MangaLoaderContext) : PagedMangaParser(context, Ma MangaChapter( id = generateUid(href), name = title, - number = i + 1, + number = i + 1f, + volume = 0, url = href, scanlator = null, uploadDate = dateFormat.tryParse(dateText), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/MangaOnline.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/MangaOnline.kt index c7f4a735..b33d8eca 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/MangaOnline.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/MangaOnline.kt @@ -104,7 +104,8 @@ class MangaOnline(context: MangaLoaderContext) : PagedMangaParser(context, Manga MangaChapter( id = generateUid(href), name = title, - number = i + 1, + number = i + 1f, + volume = 0, url = href, scanlator = null, uploadDate = dateFormat.tryParse(dateText), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/MuitoHentai.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/MuitoHentai.kt index d2e10e46..8ec4910d 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/MuitoHentai.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/MuitoHentai.kt @@ -99,7 +99,8 @@ class MuitoHentai(context: MangaLoaderContext) : PagedMangaParser(context, Manga MangaChapter( id = generateUid(href), name = a.text(), - number = i + 1, + number = i + 1f, + volume = 0, url = href, scanlator = null, uploadDate = 0, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/OnePieceEx.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/OnePieceEx.kt index d27c003c..57419ca4 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/OnePieceEx.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/OnePieceEx.kt @@ -73,7 +73,8 @@ class OnePieceEx(context: MangaLoaderContext) : PagedMangaParser(context, MangaS MangaChapter( id = generateUid(href), name = a.text(), - number = i + 1, + number = i + 1f, + volume = 0, url = href, scanlator = null, uploadDate = 0, @@ -92,7 +93,8 @@ class OnePieceEx(context: MangaLoaderContext) : PagedMangaParser(context, MangaS MangaChapter( id = generateUid(href), name = a.text(), - number = i + 1, + number = i + 1f, + volume = 0, url = href, scanlator = null, uploadDate = 0, 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 c41933a1..63238ba8 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 @@ -137,13 +137,13 @@ class MangaWtfParser( tags = jo.getJSONArray("labels").mapJSONToSet { it.toMangaTag() }, state = jo.getStringOrNull("status")?.toMangaState(), author = - jo.getJSONArray("relations").toJSONList().firstNotNullOfOrNull { - if (it.getStringOrNull("type") == "AUTHOR") { - it.getJSONObject("publisher").getStringOrNull("name") - } else { - null - } - }, + jo.getJSONArray("relations").toJSONList().firstNotNullOfOrNull { + if (it.getStringOrNull("type") == "AUTHOR") { + it.getJSONObject("publisher").getStringOrNull("name") + } else { + null + } + }, source = source, largeCoverUrl = null, description = jo.getString("description").nl2br(), @@ -211,10 +211,10 @@ class MangaWtfParser( MangaChapter( id = generateUid(jo.getString("id")), name = - jo.getStringOrNull("name") ?: buildString { - if (volume > 0) append("Том ").append(volume).append(' ') - if (number > 0) append("Глава ").append(number) else append("Без имени") - }, + jo.getStringOrNull("name") ?: buildString { + if (volume > 0) append("Том ").append(volume).append(' ') + if (number > 0) append("Глава ").append(number) else append("Без имени") + }, number = number, volume = volume, url = jo.getString("id"), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/RemangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/RemangaParser.kt index 0c8ed0bc..7f81b051 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/RemangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/RemangaParser.kt @@ -15,7 +15,6 @@ import org.koitharu.kotatsu.parsers.config.ConfigKey import org.koitharu.kotatsu.parsers.exception.ContentUnavailableException import org.koitharu.kotatsu.parsers.exception.ParseException import org.koitharu.kotatsu.parsers.model.* -import org.koitharu.kotatsu.parsers.network.UserAgents import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.* import java.text.DateFormat diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/multichan/ChanParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/multichan/ChanParser.kt index cc9a652d..9e38105e 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/multichan/ChanParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/multichan/ChanParser.kt @@ -83,7 +83,8 @@ internal abstract class ChanParser( MangaChapter( id = generateUid(href), name = tr.selectFirst("a")?.text().orEmpty(), - number = i + 1, + number = i + 1f, + volume = 0, url = href, scanlator = null, branch = null, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/multichan/YaoiChanParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/multichan/YaoiChanParser.kt index ff9672f5..1d389058 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/multichan/YaoiChanParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/multichan/YaoiChanParser.kt @@ -34,7 +34,8 @@ internal class YaoiChanParser(context: MangaLoaderContext) : ChanParser(context, MangaChapter( id = generateUid(href), name = a.text().trim(), - number = i + 1, + number = i + 1f, + volume = 0, url = href, uploadDate = 0L, source = source, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/scan/ScanParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/scan/ScanParser.kt index 6142f05a..828f8077 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/scan/ScanParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/scan/ScanParser.kt @@ -127,7 +127,8 @@ internal abstract class ScanParser( MangaChapter( id = generateUid(href), name = div.selectFirstOrThrow("h5").html().substringBefore(""), - number = i + 1, + number = i + 1f, + volume = 0, url = href, scanlator = null, uploadDate = dateFormat.tryParse(doc.selectFirstOrThrow("h5 div").text()), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/sinmh/SinmhParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/sinmh/SinmhParser.kt index ebbf48ed..aa4d116b 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/sinmh/SinmhParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/sinmh/SinmhParser.kt @@ -176,7 +176,8 @@ internal abstract class SinmhParser( MangaChapter( id = generateUid(href), name = name, - number = i + 1, + number = i + 1f, + volume = 0, url = href, uploadDate = 0, source = source, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/MangaAy.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/MangaAy.kt index bff10810..c835ce83 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/MangaAy.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/MangaAy.kt @@ -167,7 +167,8 @@ class MangaAy(context: MangaLoaderContext) : PagedMangaParser(context, MangaSour MangaChapter( id = generateUid(href), name = a.text(), - number = i + 1, + number = i + 1f, + volume = 0, url = href, scanlator = null, uploadDate = dateFormat.tryParse(tr.selectFirstOrThrow("time").attr("datetime")), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/SadScans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/SadScans.kt index 5c686374..837d0e65 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/SadScans.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/SadScans.kt @@ -77,7 +77,8 @@ internal class SadScans(context: MangaLoaderContext) : MangaParser(context, Mang MangaChapter( id = generateUid(url), name = a.text(), - number = i + 1, + number = i + 1f, + volume = 0, url = url, scanlator = null, uploadDate = dateFormat.tryParse(div.select(".detail span").last()?.text()), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/TrWebtoon.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/TrWebtoon.kt index f2477e69..9c5a9d62 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/TrWebtoon.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/TrWebtoon.kt @@ -183,7 +183,8 @@ class TrWebtoon(context: MangaLoaderContext) : MangaChapter( id = generateUid(url), name = tr.selectFirstOrThrow("a").text(), - number = i + 1, + number = i + 1f, + volume = 0, url = url, scanlator = null, uploadDate = parseChapterDate( diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/YaoiFlix.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/YaoiFlix.kt index 27b1493e..370a1492 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/YaoiFlix.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/YaoiFlix.kt @@ -116,7 +116,8 @@ class YaoiFlix(context: MangaLoaderContext) : PagedMangaParser(context, MangaSou MangaChapter( id = generateUid(href), name = div.selectFirstOrThrow(".name").text(), - number = i + 1, + number = i + 1f, + volume = 0, url = href, scanlator = null, uploadDate = dateFormat.tryParse(div.selectFirstOrThrow(".date").text()), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/Truyenqq.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/Truyenqq.kt index 256892d7..03acef75 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/Truyenqq.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/Truyenqq.kt @@ -138,7 +138,8 @@ internal class Truyenqq(context: MangaLoaderContext) : PagedMangaParser(context, MangaChapter( id = generateUid(href), name = name, - number = i + 1, + number = i + 1f, + volume = 0, url = href, scanlator = null, uploadDate = dateFormat.tryParse(dateText), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/YurinekoParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/YurinekoParser.kt index 336e7e88..807fcf51 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/YurinekoParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/YurinekoParser.kt @@ -93,7 +93,8 @@ class YurinekoParser(context: MangaLoaderContext) : PagedMangaParser(context, Ma MangaChapter( id = generateUid(chapterId.toLong()), name = jo.getString("name"), - number = i + 1, + number = i + 1f, + volume = 0, scanlator = null, url = "/read/$mangaId/$chapterId", uploadDate = df.tryParse(jo.getString("date")), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/WpComicsParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/WpComicsParser.kt index 4c0b7354..4105aed5 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/WpComicsParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/WpComicsParser.kt @@ -234,7 +234,8 @@ internal abstract class WpComicsParser( MangaChapter( id = generateUid(href), name = a.text(), - number = i + 1, + number = i + 1f, + volume = 0, url = href, uploadDate = parseChapterDate( dateFormat, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/en/XoxoComics.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/en/XoxoComics.kt index ff7751ac..e3bfafc0 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/en/XoxoComics.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/en/XoxoComics.kt @@ -176,7 +176,7 @@ internal class XoxoComics(context: MangaLoaderContext) : override suspend fun getPages(chapter: MangaChapter): List { val fullUrl = chapter.url.toAbsoluteUrl(domain) + "/all" val doc = webClient.httpGet(fullUrl).parseHtml() - return doc.select(selectPage).mapNotNull{ url -> + return doc.select(selectPage).mapNotNull { url -> val img = url.src()?.toRelativeUrl(domain) ?: return@mapNotNull null MangaPage( id = generateUid(img), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zeistmanga/ZeistMangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zeistmanga/ZeistMangaParser.kt index 73370a13..e3d7ef96 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zeistmanga/ZeistMangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zeistmanga/ZeistMangaParser.kt @@ -283,7 +283,8 @@ internal abstract class ZeistMangaParser( id = generateUid(href), url = href, name = name, - number = i + 1, + number = i + 1f, + volume = 0, branch = null, uploadDate = dateFormat.tryParse(dateText), scanlator = null, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zeistmanga/id/KomikGes.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zeistmanga/id/KomikGes.kt index 1d143e0e..9f01c030 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zeistmanga/id/KomikGes.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zeistmanga/id/KomikGes.kt @@ -41,7 +41,8 @@ internal class KomikGes(context: MangaLoaderContext) : id = generateUid(href), url = href, name = name, - number = i + 1, + number = i + 1f, + volume = 0, branch = null, uploadDate = dateFormat.tryParse(dateText), scanlator = null, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zeistmanga/id/MonzeeKomik.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zeistmanga/id/MonzeeKomik.kt index 36e2d10f..9b8072ce 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zeistmanga/id/MonzeeKomik.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zeistmanga/id/MonzeeKomik.kt @@ -63,7 +63,8 @@ internal class MonzeeKomik(context: MangaLoaderContext) : id = generateUid(href), url = href, name = name, - number = i + 1, + number = i + 1f, + volume = 0, branch = null, uploadDate = dateFormat.tryParse(dateText), scanlator = null, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zeistmanga/id/ToonCubus.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zeistmanga/id/ToonCubus.kt index 65060b5c..34b09b30 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zeistmanga/id/ToonCubus.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zeistmanga/id/ToonCubus.kt @@ -33,7 +33,8 @@ internal class ToonCubus(context: MangaLoaderContext) : id = generateUid(url), url = url, name = name, - number = i + 1, + number = i + 1f, + volume = 0, branch = null, uploadDate = 0, scanlator = null, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zeistmanga/pt/AnimeXNovel.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zeistmanga/pt/AnimeXNovel.kt index 18690f48..296e8267 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zeistmanga/pt/AnimeXNovel.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zeistmanga/pt/AnimeXNovel.kt @@ -37,7 +37,8 @@ internal class AnimeXNovel(context: MangaLoaderContext) : id = generateUid(url), url = url, name = name, - number = i + 1, + number = i + 1f, + volume = 0, branch = null, uploadDate = 0, scanlator = null, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zh/Baozimh.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zh/Baozimh.kt index 3164936e..9fd41420 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zh/Baozimh.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zh/Baozimh.kt @@ -159,7 +159,9 @@ internal class Baozimh(context: MangaLoaderContext) : val tags = selectTag.mapNotNullToSet { tagMap[it.text()] } var chaptersReversed = false val chapters = try { - doc.requireElementById("chapter-items").select("div.comics-chapters a") + doc.requireElementById("chapters_other_list").select("div.comics-chapters a") + doc.requireElementById("chapter-items") + .select("div.comics-chapters a") + doc.requireElementById("chapters_other_list") + .select("div.comics-chapters a") } catch (e: ParseException) { chaptersReversed = true // If the above fails it means the manga is new, so we select the chapters using the "comics-chapters__item" query @@ -174,18 +176,19 @@ internal class Baozimh(context: MangaLoaderContext) : }, tags = tags, chapters = chapters.mapChapters(chaptersReversed) { i, a -> - val url = a.attrAsRelativeUrl("href").toAbsoluteUrl(domain) - MangaChapter( - id = generateUid(url), - name = a.selectFirstOrThrow("span").text(), - number = i + 1, - url = url, - scanlator = null, - uploadDate = 0, - branch = null, - source = source, - ) - }, + val url = a.attrAsRelativeUrl("href").toAbsoluteUrl(domain) + MangaChapter( + id = generateUid(url), + name = a.selectFirstOrThrow("span").text(), + number = i + 1f, + volume = 0, + url = url, + scanlator = null, + uploadDate = 0, + branch = null, + source = source, + ) + }, ) } @@ -210,22 +213,23 @@ internal class Baozimh(context: MangaLoaderContext) : var chapterPart = chapterLink.substringAfterLast("/").substringBefore(".html") var nexChapterPart = nextChapterLink.substringAfterLast("/").substringBefore(".html") - while (nextChapterLink != "" && (nexChapterPart == chapterPart + "_" + part.toString())){ + while (nextChapterLink != "" && (nexChapterPart == chapterPart + "_" + part.toString())) { val doc2 = webClient.httpGet(nextChapterLink).parseHtml() val pages2 = doc2.requireElementById("__nuxt").select("button.pure-button").mapNotNull { btn -> val urlPage = btn.attr("on").substringAfter(": '").substringBefore("?t=") val id = generateUid(urlPage) - if(!idSet.add(id)){ - null - }else{ + if (!idSet.add(id)) { + null + } else { MangaPage( id = id, url = urlPage, preview = null, source = source, - )} + ) + } } - pages = pages+pages2 + pages = pages + pages2 part++ chapterLink = doc2.select("link[rel=canonical]").attr("href") nextChapterLink = doc2.select("a#next-chapter").attr("href") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zmanga/ZMangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zmanga/ZMangaParser.kt index aff9aa4f..50ea68a7 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zmanga/ZMangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zmanga/ZMangaParser.kt @@ -199,7 +199,8 @@ internal abstract class ZMangaParser( MangaChapter( id = generateUid(href), name = li.selectFirstOrThrow(".flexch-infoz span:not(.date)").text(), - number = i + 1, + number = i + 1f, + volume = 0, url = href, uploadDate = parseChapterDate( dateFormat, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zmanga/id/MaidId.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zmanga/id/MaidId.kt index 1f555b1b..e583cc67 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zmanga/id/MaidId.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zmanga/id/MaidId.kt @@ -28,7 +28,8 @@ internal class MaidId(context: MangaLoaderContext) : MangaChapter( id = generateUid(href), name = "Chapter $numChapter", - number = i + 1, + number = i + 1f, + volume = 0, url = href, uploadDate = parseChapterDate( dateFormat, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zmanga/id/ShiroDoujin.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zmanga/id/ShiroDoujin.kt index 9557e176..fc8f58b7 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zmanga/id/ShiroDoujin.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zmanga/id/ShiroDoujin.kt @@ -28,7 +28,8 @@ internal class ShiroDoujin(context: MangaLoaderContext) : MangaChapter( id = generateUid(href), name = "Chapter $numChapter", - number = i + 1, + number = i + 1f, + volume = 0, url = href, uploadDate = parseChapterDate( dateFormat, From b822574b7079aa71681de1e4244c66c64b59357a Mon Sep 17 00:00:00 2001 From: Naga <94557604+NagaYZ@users.noreply.github.com> Date: Sat, 6 Jul 2024 23:14:31 +0200 Subject: [PATCH 11/25] moved mangaworld in package --- .../kotatsu/parsers/site/it/{ => mangaworld}/MangaWorld.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/main/kotlin/org/koitharu/kotatsu/parsers/site/it/{ => mangaworld}/MangaWorld.kt (99%) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/it/MangaWorld.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/it/mangaworld/MangaWorld.kt similarity index 99% rename from src/main/kotlin/org/koitharu/kotatsu/parsers/site/it/MangaWorld.kt rename to src/main/kotlin/org/koitharu/kotatsu/parsers/site/it/mangaworld/MangaWorld.kt index 797e7450..fc767510 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/it/MangaWorld.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/it/mangaworld/MangaWorld.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.parsers.site.it +package org.koitharu.kotatsu.parsers.site.it.mangaworld import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.MangaLoaderContext From 1ace1ba3ec566758736d757328435fa7ef03659d Mon Sep 17 00:00:00 2001 From: Naga <94557604+NagaYZ@users.noreply.github.com> Date: Sat, 6 Jul 2024 23:16:17 +0200 Subject: [PATCH 12/25] added source mangaworldadult, refactor mangaworld --- .../parsers/site/it/mangaworld/MangaWorld.kt | 166 +---------------- .../site/it/mangaworld/MangaWorldAdult.kt | 10 + .../site/it/mangaworld/MangaWorldParser.kt | 173 ++++++++++++++++++ 3 files changed, 185 insertions(+), 164 deletions(-) create mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/it/mangaworld/MangaWorldAdult.kt create mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/it/mangaworld/MangaWorldParser.kt diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/it/mangaworld/MangaWorld.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/it/mangaworld/MangaWorld.kt index fc767510..e9d2632f 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/it/mangaworld/MangaWorld.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/it/mangaworld/MangaWorld.kt @@ -1,172 +1,10 @@ package org.koitharu.kotatsu.parsers.site.it.mangaworld -import org.jsoup.nodes.Document 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.* +import org.koitharu.kotatsu.parsers.model.MangaSource @MangaSourceParser("MANGAWORLD", "MangaWorld", "it") internal class MangaWorld( context: MangaLoaderContext, -) : PagedMangaParser(context, MangaSource.MANGAWORLD, pageSize = 16) { - override val availableSortOrders: Set = - EnumSet.of(SortOrder.POPULARITY, SortOrder.ALPHABETICAL, SortOrder.NEWEST, SortOrder.ALPHABETICAL_DESC, SortOrder.UPDATED) - - override val defaultSortOrder: SortOrder - get() = SortOrder.ALPHABETICAL - - override val configKeyDomain = ConfigKey.Domain("mangaworld.ac") - - override val availableStates: Set = EnumSet.of(MangaState.ONGOING, MangaState.FINISHED, MangaState.ABANDONED, MangaState.PAUSED) - - override val isMultipleTagsSupported = true - - override suspend fun getListPage( - page: Int, - filter: MangaListFilter?, - ): List { - val url = - buildString { - append("https://") - append(domain) - append("/archive?") - when (filter) { - is MangaListFilter.Search -> { - append("keyword=") - append(filter.query.urlEncoded()) - } - - is MangaListFilter.Advanced -> { - if(filter.tags.isEmpty() && filter.states.isEmpty() && filter.sortOrder == SortOrder.UPDATED) return parseMangaList(webClient.httpGet("https://$domain/?page=$page").parseHtml()) - - if (filter.tags.isNotEmpty()) { - filter.tags.joinTo(this, "&") { it.key.substringAfter("archive?") } - } - - when (filter.sortOrder) { - SortOrder.POPULARITY -> append("&sort=most_read") - SortOrder.ALPHABETICAL -> append("&sort=a-z") - SortOrder.NEWEST -> append("&sort=newest") - SortOrder.ALPHABETICAL_DESC -> append("&sort=z-a") - else -> append("&sort=a-z") - } - when (filter.states.oneOrThrowIfMany()) { - MangaState.ONGOING -> append("&status=ongoing") - MangaState.FINISHED -> append("&status=completed") - MangaState.ABANDONED -> append("&status=dropped") - MangaState.PAUSED -> append("&status=paused") - else -> Unit - } - } - - null -> Unit - } - append("&page=$page") - } - val doc = webClient.httpGet(url).parseHtml() - return parseMangaList(doc) - } - - private fun parseMangaList(doc: Document): List { - return doc.select(".comics-grid .entry").map { div -> - val href = div.selectFirstOrThrow("a.thumb").attrAsRelativeUrl("href") - val tags = div.select(".genres a[href*=/archive?genre=]") - .mapNotNullToSet { MangaTag(it.ownText().toTitleCase(sourceLocale), it.attr("href"), source) } - Manga( - id = generateUid(href), - url = href, - publicUrl = href.toAbsoluteUrl(domain), - coverUrl = div.selectFirst(".thumb img")?.attr("src").orEmpty(), - title = div.selectFirst(".name a.manga-title")?.text().orEmpty(), - altTitle = null, - rating = RATING_UNKNOWN, - tags = tags, - author = div.selectFirst(".author a")?.text(), - state = - when (div.selectFirst(".status a")?.text()) { - "In corso" -> MangaState.ONGOING - "Finito" -> MangaState.FINISHED - "Droppato" -> MangaState.ABANDONED - "In pausa" -> MangaState.PAUSED - else -> null - }, - source = source, - isNsfw = isNsfwSource, - ) - } - } - - - override suspend fun getAvailableTags(): Set { - val doc = webClient.httpGet("https://$domain/").parseHtml() - val genres = doc.select("div[aria-labelledby=genresDropdown] a").mapNotNullToSet { - MangaTag( - key = it.attr("href"), - title = it.text().toTitleCase(sourceLocale), - source = source, - ) - } - - val types = doc.select("div[aria-labelledby=typesDropdown] a").mapNotNullToSet { - MangaTag( - key = it.attr("href"), - title = it.text().toTitleCase(sourceLocale), - source = source, - ) - } - - return genres + types - } - - override suspend fun getDetails(manga: Manga): Manga { - val doc = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml() - return manga.copy( - altTitle = - doc.selectFirst(".meta-data .font-weight-bold:contains(Titoli alternativi:)") - ?.parent() - ?.ownText() - ?.substringAfter(": ") - ?.trim(), - description = doc.getElementById("noidungm")?.text().orEmpty(), - chapters = - doc.select(".chapters-wrapper .chapter a").mapChapters(reversed = true) { i, a -> - val url = a.attrAsRelativeUrl("href").toAbsoluteUrl(domain) - MangaChapter( - id = generateUid(url), - name = a.selectFirstOrThrow("span.d-inline-block").text(), - number = i + 1f, - volume = 0, - url = url, - scanlator = null, - uploadDate = - SimpleDateFormat("dd MMMM yyyy", Locale.ITALIAN).tryParse( - a.selectFirst(".chap-date")?.text(), - ), - branch = null, - source = source, - ) - }, - ) - } - - override suspend fun getPages(chapter: MangaChapter): List { - val doc = webClient.httpGet(chapter.url.toAbsoluteUrl(domain)).parseHtml() - val selectWebtoonPages = "img.page-image" - val selectMangaPages = "#page .img-fluid" - val imgSelector = if (doc.select(selectWebtoonPages).isNotEmpty()) selectWebtoonPages else selectMangaPages - return doc.select(imgSelector).map { img -> - val urlPage = img.src()?.toRelativeUrl(domain) ?: img.parseFailed("Image src not found") - MangaPage( - id = generateUid(urlPage), - url = urlPage, - preview = null, - source = source, - ) - } - } -} +) : MangaWorldParser(context, MangaSource.MANGAWORLD,"mangaworld.ac") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/it/mangaworld/MangaWorldAdult.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/it/mangaworld/MangaWorldAdult.kt new file mode 100644 index 00000000..fa2f2b48 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/it/mangaworld/MangaWorldAdult.kt @@ -0,0 +1,10 @@ +package org.koitharu.kotatsu.parsers.site.it.mangaworld + +import org.koitharu.kotatsu.parsers.MangaLoaderContext +import org.koitharu.kotatsu.parsers.MangaSourceParser +import org.koitharu.kotatsu.parsers.model.* + +@MangaSourceParser("MANGAWORLDADULT", "MangaWorldAdult", "it") +internal class MangaWorldAdult( + context: MangaLoaderContext, +) : MangaWorldParser(context, MangaSource.MANGAWORLD, "mangaworldadult.net") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/it/mangaworld/MangaWorldParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/it/mangaworld/MangaWorldParser.kt new file mode 100644 index 00000000..fd294fb0 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/it/mangaworld/MangaWorldParser.kt @@ -0,0 +1,173 @@ +package org.koitharu.kotatsu.parsers.site.it.mangaworld + +import org.jsoup.nodes.Document +import org.koitharu.kotatsu.parsers.MangaLoaderContext +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.* + +abstract class MangaWorldParser( + context: MangaLoaderContext, + source: MangaSource, + domain: String, + pageSize: Int = 16 +) : PagedMangaParser(context, source, pageSize) { + override val availableSortOrders: Set = + EnumSet.of(SortOrder.POPULARITY, SortOrder.ALPHABETICAL, SortOrder.NEWEST, SortOrder.ALPHABETICAL_DESC, SortOrder.UPDATED) + + override val defaultSortOrder: SortOrder + get() = SortOrder.ALPHABETICAL + + override val configKeyDomain = ConfigKey.Domain(domain) + + override val availableStates: Set = EnumSet.of(MangaState.ONGOING, MangaState.FINISHED, MangaState.ABANDONED, MangaState.PAUSED) + + override val isMultipleTagsSupported = true + + override suspend fun getListPage( + page: Int, + filter: MangaListFilter?, + ): List { + val url = + buildString { + append("https://") + append(domain) + append("/archive?") + when (filter) { + is MangaListFilter.Search -> { + append("keyword=") + append(filter.query.urlEncoded()) + } + + is MangaListFilter.Advanced -> { + if(filter.tags.isEmpty() && filter.states.isEmpty() && filter.sortOrder == SortOrder.UPDATED) return parseMangaList(webClient.httpGet("https://$domain/?page=$page").parseHtml()) + + if (filter.tags.isNotEmpty()) { + filter.tags.joinTo(this, "&") { it.key.substringAfter("archive?") } + } + + when (filter.sortOrder) { + SortOrder.POPULARITY -> append("&sort=most_read") + SortOrder.ALPHABETICAL -> append("&sort=a-z") + SortOrder.NEWEST -> append("&sort=newest") + SortOrder.ALPHABETICAL_DESC -> append("&sort=z-a") + else -> append("&sort=a-z") + } + when (filter.states.oneOrThrowIfMany()) { + MangaState.ONGOING -> append("&status=ongoing") + MangaState.FINISHED -> append("&status=completed") + MangaState.ABANDONED -> append("&status=dropped") + MangaState.PAUSED -> append("&status=paused") + else -> Unit + } + } + + null -> Unit + } + append("&page=$page") + } + val doc = webClient.httpGet(url).parseHtml() + return parseMangaList(doc) + } + + private fun parseMangaList(doc: Document): List { + return doc.select(".comics-grid .entry").map { div -> + val href = div.selectFirstOrThrow("a.thumb").attrAsRelativeUrl("href") + val tags = div.select(".genres a[href*=/archive?genre=]") + .mapNotNullToSet { MangaTag(it.ownText().toTitleCase(sourceLocale), it.attr("href"), source) } + Manga( + id = generateUid(href), + url = href, + publicUrl = href.toAbsoluteUrl(domain), + coverUrl = div.selectFirst(".thumb img")?.attr("src").orEmpty(), + title = div.selectFirst(".name a.manga-title")?.text().orEmpty(), + altTitle = null, + rating = RATING_UNKNOWN, + tags = tags, + author = div.selectFirst(".author a")?.text(), + state = + when (div.selectFirst(".status a")?.text()) { + "In corso" -> MangaState.ONGOING + "Finito" -> MangaState.FINISHED + "Droppato" -> MangaState.ABANDONED + "In pausa" -> MangaState.PAUSED + else -> null + }, + source = source, + isNsfw = isNsfwSource, + ) + } + } + + + override suspend fun getAvailableTags(): Set { + val doc = webClient.httpGet("https://$domain/").parseHtml() + val genres = doc.select("div[aria-labelledby=genresDropdown] a").mapNotNullToSet { + MangaTag( + key = it.attr("href"), + title = it.text().toTitleCase(sourceLocale), + source = source, + ) + } + + val types = doc.select("div[aria-labelledby=typesDropdown] a").mapNotNullToSet { + MangaTag( + key = it.attr("href"), + title = it.text().toTitleCase(sourceLocale), + source = source, + ) + } + + return genres + types + } + + override suspend fun getDetails(manga: Manga): Manga { + val doc = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml() + return manga.copy( + altTitle = + doc.selectFirst(".meta-data .font-weight-bold:contains(Titoli alternativi:)") + ?.parent() + ?.ownText() + ?.substringAfter(": ") + ?.trim(), + description = doc.getElementById("noidungm")?.text().orEmpty(), + chapters = + doc.select(".chapters-wrapper .chapter a").mapChapters(reversed = true) { i, a -> + val url = a.attrAsRelativeUrl("href").toAbsoluteUrl(domain) + MangaChapter( + id = generateUid(url), + name = a.selectFirstOrThrow("span.d-inline-block").text(), + number = i + 1f, + volume = 0, + url = url, + scanlator = null, + uploadDate = + SimpleDateFormat("dd MMMM yyyy", Locale.ITALIAN).tryParse( + a.selectFirst(".chap-date")?.text(), + ), + branch = null, + source = source, + ) + }, + ) + } + + override suspend fun getPages(chapter: MangaChapter): List { + val doc = webClient.httpGet(chapter.url.toAbsoluteUrl(domain)).parseHtml() + val selectWebtoonPages = "img.page-image" + val selectMangaPages = "#page .img-fluid" + val imgSelector = if (doc.select(selectWebtoonPages).isNotEmpty()) selectWebtoonPages else selectMangaPages + return doc.select(imgSelector).map { img -> + val urlPage = img.src()?.toRelativeUrl(domain) ?: img.parseFailed("Image src not found") + MangaPage( + id = generateUid(urlPage), + url = urlPage, + preview = null, + source = source, + ) + } + } +} From 74b8aaa94ee6b9edefae8f992014ce1a8f4cd11f Mon Sep 17 00:00:00 2001 From: Naga <94557604+NagaYZ@users.noreply.github.com> Date: Sat, 6 Jul 2024 23:16:41 +0200 Subject: [PATCH 13/25] fixed source mangaworldadult --- .../kotatsu/parsers/site/it/mangaworld/MangaWorldAdult.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/it/mangaworld/MangaWorldAdult.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/it/mangaworld/MangaWorldAdult.kt index fa2f2b48..5713c483 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/it/mangaworld/MangaWorldAdult.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/it/mangaworld/MangaWorldAdult.kt @@ -7,4 +7,4 @@ import org.koitharu.kotatsu.parsers.model.* @MangaSourceParser("MANGAWORLDADULT", "MangaWorldAdult", "it") internal class MangaWorldAdult( context: MangaLoaderContext, -) : MangaWorldParser(context, MangaSource.MANGAWORLD, "mangaworldadult.net") +) : MangaWorldParser(context, MangaSource.MANGAWORLDADULT, "mangaworldadult.net") From b345efe2d1585cec841ce0bb8ee2fa94ddc0c669 Mon Sep 17 00:00:00 2001 From: Naga <94557604+NagaYZ@users.noreply.github.com> Date: Sun, 7 Jul 2024 20:53:16 +0200 Subject: [PATCH 14/25] fixed source mangaworld pages --- .../kotatsu/parsers/site/it/mangaworld/MangaWorldParser.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/it/mangaworld/MangaWorldParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/it/mangaworld/MangaWorldParser.kt index fd294fb0..45be8dbd 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/it/mangaworld/MangaWorldParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/it/mangaworld/MangaWorldParser.kt @@ -142,7 +142,7 @@ abstract class MangaWorldParser( name = a.selectFirstOrThrow("span.d-inline-block").text(), number = i + 1f, volume = 0, - url = url, + url = "$url?style=list", scanlator = null, uploadDate = SimpleDateFormat("dd MMMM yyyy", Locale.ITALIAN).tryParse( @@ -158,7 +158,7 @@ abstract class MangaWorldParser( override suspend fun getPages(chapter: MangaChapter): List { val doc = webClient.httpGet(chapter.url.toAbsoluteUrl(domain)).parseHtml() val selectWebtoonPages = "img.page-image" - val selectMangaPages = "#page .img-fluid" + val selectMangaPages = "img.img-fluid" val imgSelector = if (doc.select(selectWebtoonPages).isNotEmpty()) selectWebtoonPages else selectMangaPages return doc.select(imgSelector).map { img -> val urlPage = img.src()?.toRelativeUrl(domain) ?: img.parseFailed("Image src not found") From 64666e42e8cb96223dd0e8c1c38c31368199078c Mon Sep 17 00:00:00 2001 From: Draken <131387159+dragonx943@users.noreply.github.com> Date: Tue, 9 Jul 2024 01:31:14 +0700 Subject: [PATCH 15/25] Update HentaiVNParser.kt not sure, i hope it will works... --- .../org/koitharu/kotatsu/parsers/site/vi/HentaiVNParser.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/HentaiVNParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/HentaiVNParser.kt index d5ea7409..240d007e 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/HentaiVNParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/HentaiVNParser.kt @@ -23,10 +23,10 @@ private const val SEARCH_PAGE_SIZE = 10 @MangaSourceParser("HENTAIVN", "HentaiVN", "vi", type = ContentType.HENTAI) class HentaiVNParser(context: MangaLoaderContext) : MangaParser(context, MangaSource.HENTAIVN) { - override val configKeyDomain: ConfigKey.Domain = ConfigKey.Domain("hentaivn.red", "hentaivn.autos", "hentaivn.tv") + override val configKeyDomain: ConfigKey.Domain = ConfigKey.Domain("zhentaivn.cc", "hentaivn.bio") // hentaivn has created 2 different interfaces for mobile and desktop, and Cloudflare detects whether it's mobile or not even with a desktop user agent. - override val headers: Headers = Headers.Builder().add("User-Agent", UserAgents.CHROME_MOBILE).build() + override val headers: Headers = Headers.Builder().add("User-Agent", UserAgents.CHROME_DESKTOP).build() override val availableSortOrders: Set = EnumSet.of( SortOrder.UPDATED, From cd468df9ad828c4bbb5444321c0f6b2c6521dffc Mon Sep 17 00:00:00 2001 From: devi Date: Wed, 10 Jul 2024 20:17:06 +0200 Subject: [PATCH 16/25] Add : MangaTx.to - AlterkaiScans - StoneScape Kalango - SolooScan - ErosScans - SolooScan RaysScan - TemakiMangas - ZinChanManga Urls Changes Add volume on some parser Fix ThunderScans close #818 NinjaScan close #753 Add Ngomik close #761 Remove dulicate source paragonscans Fix LuminousScans close #578 Fix YugenApp close #854 Fix KaiScans close #614 Add PeachBl Close #884 Fix GalinhaSamurai close #835 Fix RocksManga close #827 Fix CrystalComics close #792 --- .../parsers/site/es/TuMangaOnlineParser.kt | 6 ++- .../parsers/site/fr/BentomangaParser.kt | 3 +- .../site/galleryadults/GalleryAdultsParser.kt | 3 +- .../site/galleryadults/all/HentaiEra.kt | 3 +- .../parsers/site/gattsu/GattsuParser.kt | 3 +- .../kotatsu/parsers/site/guya/GuyaParser.kt | 3 +- .../parsers/site/id/DoujinDesuParser.kt | 3 +- .../parsers/site/it/mangaworld/MangaWorld.kt | 2 +- .../site/it/mangaworld/MangaWorldParser.kt | 23 +++++++--- .../parsers/site/likemanga/LikeMangaParser.kt | 3 +- .../parsers/site/madara/ar/RocksManga.kt | 41 ++++++++++++++++- .../en/{Paragonscans.kt => MangaTxTo.kt} | 8 ++-- .../parsers/site/madara/en/StoneScape.kt | 13 ++++++ .../parsers/site/madara/en/TcbScansManga.kt | 12 +++++ .../parsers/site/madara/en/ZinChanManga.kt | 11 +++++ .../parsers/site/madara/pt/CrystalScan.kt | 4 +- .../parsers/site/madara/pt/GalinhaSamurai.kt | 3 +- .../parsers/site/madara/pt/KakuseiProject.kt | 2 +- .../kotatsu/parsers/site/madara/pt/Kalango.kt | 14 ++++++ .../parsers/site/madara/pt/NinjaScan.kt | 4 +- .../parsers/site/madara/pt/SinensisScans.kt | 2 + .../parsers/site/mangareader/ar/PeachBl.kt | 14 ++++++ .../site/mangareader/ar/ThunderScans.kt | 1 + .../parsers/site/mangareader/en/ErosScans.kt | 10 +++++ .../site/mangareader/en/FlameComics.kt | 2 +- .../parsers/site/mangareader/en/KaiScans.kt | 1 - .../site/mangareader/en/LuminousScans.kt | 2 +- .../site/mangareader/id/AlterkaiScans.kt | 13 ++++++ .../parsers/site/mangareader/id/Ngomik.kt | 13 ++++++ .../otakusanctuary/OtakuSanctuaryParser.kt | 3 +- .../parsers/site/pt/LuratoonScansParser.kt | 6 ++- .../kotatsu/parsers/site/pt/YugenMangas.kt | 44 ++++++++----------- .../kotatsu/parsers/site/ru/AComics.kt | 3 +- .../parsers/site/ru/rulib/LibSocialParser.kt | 4 +- .../parsers/site/vi/BlogTruyenParser.kt | 3 +- .../kotatsu/parsers/site/vi/HentaiVNParser.kt | 3 +- .../kotatsu/parsers/site/vi/LxManga.kt | 3 +- .../parsers/site/vi/TruyentranhLHParser.kt | 3 +- .../kotatsu/parsers/site/vmp/VmpParser.kt | 3 +- .../parsers/site/zeistmanga/pt/RaysScan.kt | 17 +++++++ .../parsers/site/zeistmanga/pt/SolooScan.kt | 15 +++++++ .../site/zeistmanga/pt/TemakiMangas.kt | 17 +++++++ 42 files changed, 278 insertions(+), 68 deletions(-) rename src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/{Paragonscans.kt => MangaTxTo.kt} (53%) create mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/StoneScape.kt create mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/TcbScansManga.kt create mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/ZinChanManga.kt create mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/Kalango.kt create mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/ar/PeachBl.kt create mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/ErosScans.kt create mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/id/AlterkaiScans.kt create mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/id/Ngomik.kt create mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/zeistmanga/pt/RaysScan.kt create mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/zeistmanga/pt/SolooScan.kt create mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/zeistmanga/pt/TemakiMangas.kt diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/es/TuMangaOnlineParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/es/TuMangaOnlineParser.kt index 9a7cb14c..03bdb293 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/es/TuMangaOnlineParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/es/TuMangaOnlineParser.kt @@ -147,7 +147,8 @@ class TuMangaOnlineParser(context: MangaLoaderContext) : PagedMangaParser( return MangaChapter( id = generateUid(href), name = "One Shot", - number = 1, + number = 1f, + volume = 0, url = href, scanlator = element.select("div.col-md-6.text-truncate").text(), branch = null, @@ -163,7 +164,8 @@ class TuMangaOnlineParser(context: MangaLoaderContext) : PagedMangaParser( return MangaChapter( id = generateUid(href), name = chName, - number = number + 1, + number = number + 1f, + volume = 0, url = href, scanlator = element.select("div.col-md-6.text-truncate").text(), branch = null, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/BentomangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/BentomangaParser.kt index f747b227..0e239c4b 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/BentomangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/BentomangaParser.kt @@ -228,7 +228,8 @@ internal class BentomangaParser(context: MangaLoaderContext) : PagedMangaParser( MangaChapter( id = generateUid(href), name = if (name != null && name != title) "$title: $name" else title, - number = href.substringAfterLast('/').toIntOrNull() ?: 0, + number = href.substringAfterLast('/').toFloatOrNull() ?: 0f, + volume = 0, url = href, scanlator = div.selectFirst(".team_link-name")?.textOrNull(), uploadDate = div.selectFirst(".component-chapter-date") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/GalleryAdultsParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/GalleryAdultsParser.kt index e4b70d0b..f908e9d9 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/GalleryAdultsParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/GalleryAdultsParser.kt @@ -158,7 +158,8 @@ internal abstract class GalleryAdultsParser( MangaChapter( id = manga.id, name = manga.title, - number = 1, + number = 1f, + volume = 0, url = urlChapters, scanlator = null, uploadDate = 0, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/all/HentaiEra.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/all/HentaiEra.kt index dccc423c..8e9b0047 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/all/HentaiEra.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/all/HentaiEra.kt @@ -131,7 +131,8 @@ internal class HentaiEra(context: MangaLoaderContext) : MangaChapter( id = manga.id, name = manga.title, - number = 1, + number = 1f, + volume = 0, url = urlChapters, scanlator = null, uploadDate = 0, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/gattsu/GattsuParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/gattsu/GattsuParser.kt index 80bb6a6b..5cb7ab3d 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/gattsu/GattsuParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/gattsu/GattsuParser.kt @@ -115,7 +115,8 @@ internal abstract class GattsuParser( MangaChapter( id = manga.id, name = manga.title, - number = 1, + number = 1f, + volume = 0, url = urlChapter, scanlator = null, uploadDate = 0, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/guya/GuyaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/guya/GuyaParser.kt index 66f59eef..07b4f476 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/guya/GuyaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/guya/GuyaParser.kt @@ -91,7 +91,8 @@ internal abstract class GuyaParser( MangaChapter( id = generateUid(url), name = chapter.getString("title"), - number = i, + number = i.toFloat(), + volume = 0, url = url, scanlator = null, uploadDate = 0, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/id/DoujinDesuParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/id/DoujinDesuParser.kt index 4dfa52e1..19084598 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/id/DoujinDesuParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/id/DoujinDesuParser.kt @@ -126,7 +126,8 @@ class DoujinDesuParser(context: MangaLoaderContext) : PagedMangaParser(context, MangaChapter( id = generateUid(url), name = titleTag.text(), - number = index + 1, + number = index + 1f, + volume = 0, url = url, scanlator = null, uploadDate = chapterDateFormat.tryParse(element.select(".epsleft > .date").text()), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/it/mangaworld/MangaWorld.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/it/mangaworld/MangaWorld.kt index e9d2632f..7ffc5cf6 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/it/mangaworld/MangaWorld.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/it/mangaworld/MangaWorld.kt @@ -7,4 +7,4 @@ import org.koitharu.kotatsu.parsers.model.MangaSource @MangaSourceParser("MANGAWORLD", "MangaWorld", "it") internal class MangaWorld( context: MangaLoaderContext, -) : MangaWorldParser(context, MangaSource.MANGAWORLD,"mangaworld.ac") +) : MangaWorldParser(context, MangaSource.MANGAWORLD, "mangaworld.ac") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/it/mangaworld/MangaWorldParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/it/mangaworld/MangaWorldParser.kt index 45be8dbd..7b0bd5fd 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/it/mangaworld/MangaWorldParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/it/mangaworld/MangaWorldParser.kt @@ -10,20 +10,27 @@ import java.text.SimpleDateFormat import java.util.* abstract class MangaWorldParser( - context: MangaLoaderContext, - source: MangaSource, - domain: String, - pageSize: Int = 16 + context: MangaLoaderContext, + source: MangaSource, + domain: String, + pageSize: Int = 16, ) : PagedMangaParser(context, source, pageSize) { override val availableSortOrders: Set = - EnumSet.of(SortOrder.POPULARITY, SortOrder.ALPHABETICAL, SortOrder.NEWEST, SortOrder.ALPHABETICAL_DESC, SortOrder.UPDATED) + EnumSet.of( + SortOrder.POPULARITY, + SortOrder.ALPHABETICAL, + SortOrder.NEWEST, + SortOrder.ALPHABETICAL_DESC, + SortOrder.UPDATED, + ) override val defaultSortOrder: SortOrder get() = SortOrder.ALPHABETICAL override val configKeyDomain = ConfigKey.Domain(domain) - override val availableStates: Set = EnumSet.of(MangaState.ONGOING, MangaState.FINISHED, MangaState.ABANDONED, MangaState.PAUSED) + override val availableStates: Set = + EnumSet.of(MangaState.ONGOING, MangaState.FINISHED, MangaState.ABANDONED, MangaState.PAUSED) override val isMultipleTagsSupported = true @@ -43,7 +50,9 @@ abstract class MangaWorldParser( } is MangaListFilter.Advanced -> { - if(filter.tags.isEmpty() && filter.states.isEmpty() && filter.sortOrder == SortOrder.UPDATED) return parseMangaList(webClient.httpGet("https://$domain/?page=$page").parseHtml()) + if (filter.tags.isEmpty() && filter.states.isEmpty() && filter.sortOrder == SortOrder.UPDATED) return parseMangaList( + webClient.httpGet("https://$domain/?page=$page").parseHtml(), + ) if (filter.tags.isNotEmpty()) { filter.tags.joinTo(this, "&") { it.key.substringAfter("archive?") } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/likemanga/LikeMangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/likemanga/LikeMangaParser.kt index 1a8047b5..c955364a 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/likemanga/LikeMangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/likemanga/LikeMangaParser.kt @@ -219,7 +219,8 @@ internal abstract class LikeMangaParser( MangaChapter( id = generateUid(url), name = li.selectFirstOrThrow("a").text(), - number = chapNum.toInt(), + number = chapNum.toFloat(), + volume = 0, url = url, scanlator = null, uploadDate = parseChapterDate( diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/ar/RocksManga.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/ar/RocksManga.kt index c8636810..d372faed 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/ar/RocksManga.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/ar/RocksManga.kt @@ -1,10 +1,49 @@ package org.koitharu.kotatsu.parsers.site.madara.ar +import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser +import org.koitharu.kotatsu.parsers.model.MangaChapter import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.site.madara.MadaraParser +import org.koitharu.kotatsu.parsers.util.attrAsRelativeUrlOrNull +import org.koitharu.kotatsu.parsers.util.generateUid +import org.koitharu.kotatsu.parsers.util.mapChapters +import org.koitharu.kotatsu.parsers.util.parseFailed +import java.text.SimpleDateFormat @MangaSourceParser("ROCKSMANGA", "RocksManga", "ar") internal class RocksManga(context: MangaLoaderContext) : - MadaraParser(context, MangaSource.ROCKSMANGA, "rocks-manga.com") + MadaraParser(context, MangaSource.ROCKSMANGA, "rocks-manga.com") { + override val selectChapter = "ul#chapter-list li.chapter-item" + override val datePattern = "d MMMM yyyy" + override val selectDate = ".ch-post-time" + override val selectBodyPage = "div.reading-content" + override val selectPage = "img" + override val selectDesc = ".story" + + override suspend fun loadChapters(mangaUrl: String, document: Document): List { + val dateFormat = SimpleDateFormat(datePattern, sourceLocale) + return document.select(selectChapter).mapChapters(reversed = true) { i, li -> + val a = li.selectFirst("a") + val href = a?.attrAsRelativeUrlOrNull("href") ?: li.parseFailed("Link is missing") + val link = href + stylePage + val dateText = li.selectFirst("a.c-new-tag")?.attr("title") ?: li.selectFirst(selectDate)?.text() + val name = a.selectFirst(".ch-title")?.text() ?: a.ownText() + MangaChapter( + id = generateUid(href), + url = link, + name = name, + number = i + 1f, + volume = 0, + branch = null, + uploadDate = parseChapterDate( + dateFormat, + dateText, + ), + scanlator = null, + source = source, + ) + } + } +} diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/Paragonscans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/MangaTxTo.kt similarity index 53% rename from src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/Paragonscans.kt rename to src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/MangaTxTo.kt index 2abb29c9..7f3149fd 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/Paragonscans.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/MangaTxTo.kt @@ -5,8 +5,8 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.site.madara.MadaraParser -@MangaSourceParser("PARAGONSCANS", "ParagonScans", "en") -internal class Paragonscans(context: MangaLoaderContext) : - MadaraParser(context, MangaSource.PARAGONSCANS, "paragonscans.com", pageSize = 50) { - override val datePattern = "MM/dd/yyyy" +@MangaSourceParser("MANGATX_TO", "MangaTx.to", "en") +internal class MangaTxTo(context: MangaLoaderContext) : + MadaraParser(context, MangaSource.MANGATX_TO, "mangatx.to", 10) { + override val tagPrefix = "manhua-genre/" } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/StoneScape.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/StoneScape.kt new file mode 100644 index 00000000..cc0fd9cb --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/StoneScape.kt @@ -0,0 +1,13 @@ +package org.koitharu.kotatsu.parsers.site.madara.en + +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.madara.MadaraParser + +@MangaSourceParser("STONESCAPE", "StoneScape", "en") +internal class StoneScape(context: MangaLoaderContext) : + MadaraParser(context, MangaSource.STONESCAPE, "stonescape.xyz", 10) { + override val listUrl = "series/" + override val tagPrefix = "series-genre/" +} diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/TcbScansManga.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/TcbScansManga.kt new file mode 100644 index 00000000..0555715c --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/TcbScansManga.kt @@ -0,0 +1,12 @@ +package org.koitharu.kotatsu.parsers.site.madara.en + +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.madara.MadaraParser + +@MangaSourceParser("TCBSCANSMANGA", "TcbScansManga", "en") +internal class TcbScansManga(context: MangaLoaderContext) : + MadaraParser(context, MangaSource.TCBSCANSMANGA, "tcbscans-manga.com", 10) { + override val selectPage = "img" +} diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/ZinChanManga.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/ZinChanManga.kt new file mode 100644 index 00000000..5d56c48d --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/ZinChanManga.kt @@ -0,0 +1,11 @@ +package org.koitharu.kotatsu.parsers.site.madara.en + +import org.koitharu.kotatsu.parsers.MangaLoaderContext +import org.koitharu.kotatsu.parsers.MangaSourceParser +import org.koitharu.kotatsu.parsers.model.ContentType +import org.koitharu.kotatsu.parsers.model.MangaSource +import org.koitharu.kotatsu.parsers.site.madara.MadaraParser + +@MangaSourceParser("ZINCHANMANGA", "ZinChanManga", "en", ContentType.HENTAI) +internal class ZinChanManga(context: MangaLoaderContext) : + MadaraParser(context, MangaSource.ZINCHANMANGA, "zinchanmanga.com", 10) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/CrystalScan.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/CrystalScan.kt index 993701db..053e7dfc 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/CrystalScan.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/CrystalScan.kt @@ -5,6 +5,6 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.site.madara.MadaraParser -@MangaSourceParser("CRYSTALSCAN", "CrystalScan", "pt") +@MangaSourceParser("CRYSTALSCAN", "CrystalComics", "pt") internal class CrystalScan(context: MangaLoaderContext) : - MadaraParser(context, MangaSource.CRYSTALSCAN, "crystalscan.net") + MadaraParser(context, MangaSource.CRYSTALSCAN, "crystalcomics.com") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/GalinhaSamurai.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/GalinhaSamurai.kt index 063c8200..bde9ae36 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/GalinhaSamurai.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/GalinhaSamurai.kt @@ -5,8 +5,9 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.site.madara.MadaraParser -@MangaSourceParser("GALINHASAMURAI", "Galinha Samurai", "pt") +@MangaSourceParser("GALINHASAMURAI", "GalinhaSamurai", "pt") internal class GalinhaSamurai(context: MangaLoaderContext) : MadaraParser(context, MangaSource.GALINHASAMURAI, "galinhasamurai.com") { override val datePattern = "dd/MM/yyyy" + override val withoutAjax = true } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/KakuseiProject.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/KakuseiProject.kt index 20be0e9a..441c7e2f 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/KakuseiProject.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/KakuseiProject.kt @@ -5,6 +5,6 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.site.madara.MadaraParser -@MangaSourceParser("KAKUSEIPROJECT", "Kakusei Project", "pt") +@MangaSourceParser("KAKUSEIPROJECT", "KakuseiProject", "pt") internal class KakuseiProject(context: MangaLoaderContext) : MadaraParser(context, MangaSource.KAKUSEIPROJECT, "kakuseiproject.com", 10) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/Kalango.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/Kalango.kt new file mode 100644 index 00000000..8d944c9c --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/Kalango.kt @@ -0,0 +1,14 @@ +package org.koitharu.kotatsu.parsers.site.madara.pt + +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.madara.MadaraParser +import java.util.Locale + +@MangaSourceParser("KALANGO", "Kalango", "pt") +internal class Kalango(context: MangaLoaderContext) : + MadaraParser(context, MangaSource.KALANGO, "kalango.org") { + override val datePattern: String = "dd 'de' MMMM 'de' yyyy" + override val sourceLocale: Locale = Locale.ENGLISH +} diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/NinjaScan.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/NinjaScan.kt index f056d7aa..e75adcb5 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/NinjaScan.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/NinjaScan.kt @@ -5,8 +5,8 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.site.madara.MadaraParser -@MangaSourceParser("NINJASCAN", "NinjaScan", "pt") +@MangaSourceParser("NINJASCAN", "NinjaComics", "pt") internal class NinjaScan(context: MangaLoaderContext) : - MadaraParser(context, MangaSource.NINJASCAN, "ninjascan.site") { + MadaraParser(context, MangaSource.NINJASCAN, "ninjacomics.xyz") { override val datePattern: String = "dd 'de' MMMMM 'de' yyyy" } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/SinensisScans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/SinensisScans.kt index b37cf2ea..3b7845e2 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/SinensisScans.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/SinensisScans.kt @@ -1,10 +1,12 @@ package org.koitharu.kotatsu.parsers.site.madara.pt +import org.koitharu.kotatsu.parsers.Broken 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.madara.MadaraParser +@Broken // Not dead, changed template @MangaSourceParser("SINENSISSCANS", "SinensisScans", "pt") internal class SinensisScans(context: MangaLoaderContext) : MadaraParser(context, MangaSource.SINENSISSCANS, "sinensistoon.com") { diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/ar/PeachBl.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/ar/PeachBl.kt new file mode 100644 index 00000000..946096f2 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/ar/PeachBl.kt @@ -0,0 +1,14 @@ +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.ContentType +import org.koitharu.kotatsu.parsers.model.MangaSource +import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser +import java.util.Locale + +@MangaSourceParser("PEACHBL", "PeachBl", "ar", ContentType.HENTAI) +internal class PeachBl(context: MangaLoaderContext) : + MangaReaderParser(context, MangaSource.PEACHBL, "peach-bl.com", pageSize = 20, searchPageSize = 10) { + override val sourceLocale: Locale = Locale.ENGLISH +} diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/ar/ThunderScans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/ar/ThunderScans.kt index 400fa3f1..d8f8a72d 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/ar/ThunderScans.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/ar/ThunderScans.kt @@ -9,4 +9,5 @@ import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser internal class ThunderScans(context: MangaLoaderContext) : MangaReaderParser(context, MangaSource.THUNDERSCANS, "thunderscans.com", pageSize = 32, searchPageSize = 10) { override val isTagsExclusionSupported = false + override val selectChapter = ".eplister > ul > li" } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/ErosScans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/ErosScans.kt new file mode 100644 index 00000000..afaf77c5 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/ErosScans.kt @@ -0,0 +1,10 @@ +package org.koitharu.kotatsu.parsers.site.mangareader.en + +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("EROSSCANS", "ErosScans", "en") +internal class ErosScans(context: MangaLoaderContext) : + MangaReaderParser(context, MangaSource.EROSSCANS, "erosscans.xyz", pageSize = 20, searchPageSize = 10) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/FlameComics.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/FlameComics.kt index fcdc78d5..95938ed2 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/FlameComics.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/FlameComics.kt @@ -7,6 +7,6 @@ import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser @MangaSourceParser("FLAMECOMICS", "FlameComics", "en") internal class FlameComics(context: MangaLoaderContext) : - MangaReaderParser(context, MangaSource.FLAMECOMICS, "flamecomics.com", pageSize = 24, searchPageSize = 10) { + MangaReaderParser(context, MangaSource.FLAMECOMICS, "flamecomics.me", pageSize = 24, searchPageSize = 10) { override val listUrl = "/series" } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/KaiScans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/KaiScans.kt index 608eb9dd..af5ad5f1 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/KaiScans.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/KaiScans.kt @@ -8,6 +8,5 @@ import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser @MangaSourceParser("KAISCANS", "KaiScans", "en") internal class KaiScans(context: MangaLoaderContext) : MangaReaderParser(context, MangaSource.KAISCANS, "kaiscans.org", pageSize = 20, searchPageSize = 10) { - override val listUrl = "/series" override val isTagsExclusionSupported = false } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/LuminousScans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/LuminousScans.kt index c72749f8..fc2ac11c 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/LuminousScans.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/LuminousScans.kt @@ -7,7 +7,7 @@ import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser @MangaSourceParser("LUMINOUSSCANS", "LuminousScans", "en") internal class LuminousScans(context: MangaLoaderContext) : - MangaReaderParser(context, MangaSource.LUMINOUSSCANS, "lumitoon.com", pageSize = 20, searchPageSize = 10) { + MangaReaderParser(context, MangaSource.LUMINOUSSCANS, "luminous-scans.com", pageSize = 20, searchPageSize = 10) { override val listUrl = "/series" override val isTagsExclusionSupported = false } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/id/AlterkaiScans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/id/AlterkaiScans.kt new file mode 100644 index 00000000..6e64d5c1 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/id/AlterkaiScans.kt @@ -0,0 +1,13 @@ +package org.koitharu.kotatsu.parsers.site.mangareader.id + +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 +import java.util.Locale + +@MangaSourceParser("ALTERKAISCANS", "AlterkaiScans", "id") +internal class AlterkaiScans(context: MangaLoaderContext) : + MangaReaderParser(context, MangaSource.ALTERKAISCANS, "alterkaiscans.my.id", pageSize = 20, searchPageSize = 10) { + override val sourceLocale: Locale = Locale.ENGLISH +} diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/id/Ngomik.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/id/Ngomik.kt new file mode 100644 index 00000000..e87b6390 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/id/Ngomik.kt @@ -0,0 +1,13 @@ +package org.koitharu.kotatsu.parsers.site.mangareader.id + +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 +import java.util.Locale + +@MangaSourceParser("NGOMIK", "Ngomik", "id") +internal class Ngomik(context: MangaLoaderContext) : + MangaReaderParser(context, MangaSource.NGOMIK, "ngomik.mom", pageSize = 20, searchPageSize = 5) { + override val sourceLocale: Locale = Locale.ENGLISH +} diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/otakusanctuary/OtakuSanctuaryParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/otakusanctuary/OtakuSanctuaryParser.kt index 8d454c84..b1d032ca 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/otakusanctuary/OtakuSanctuaryParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/otakusanctuary/OtakuSanctuaryParser.kt @@ -186,7 +186,8 @@ internal abstract class OtakuSanctuaryParser( MangaChapter( id = generateUid(url), name = name, - number = i, + number = i.toFloat(), + volume = 0, url = url, scanlator = null, uploadDate = parseChapterDate( diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/LuratoonScansParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/LuratoonScansParser.kt index 422374e1..f34f29e8 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/LuratoonScansParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/LuratoonScansParser.kt @@ -6,6 +6,7 @@ import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.Response import okhttp3.ResponseBody.Companion.toResponseBody import org.json.JSONArray +import org.koitharu.kotatsu.parsers.Broken import org.koitharu.kotatsu.parsers.ErrorMessages import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaParser @@ -16,13 +17,14 @@ import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat import java.util.zip.ZipInputStream -@MangaSourceParser("RANDOMSCANS", "Luratoon Scan", "pt") +@Broken // Not dead but totally changed structure +@MangaSourceParser("RANDOMSCANS", "LuratoonScan", "pt") internal class LuratoonScansParser(context: MangaLoaderContext) : MangaParser(context, MangaSource.RANDOMSCANS), Interceptor { override val availableSortOrders = setOf(SortOrder.ALPHABETICAL) - override val configKeyDomain = ConfigKey.Domain("luratoon.com") + override val configKeyDomain = ConfigKey.Domain("luratoons.com") private val userAgentKey = ConfigKey.UserAgent(context.getDefaultUserAgent()) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/YugenMangas.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/YugenMangas.kt index 3dc110c3..6c240306 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/YugenMangas.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/YugenMangas.kt @@ -12,11 +12,11 @@ import java.text.DateFormat import java.text.SimpleDateFormat import java.util.* -@MangaSourceParser("YUGENMANGAS", "YugenMangas.net.br", "pt") +@MangaSourceParser("YUGENMANGAS", "YugenApp", "pt") class YugenMangas(context: MangaLoaderContext) : PagedMangaParser(context, MangaSource.YUGENMANGAS, 28) { - override val availableSortOrders: Set = EnumSet.of(SortOrder.ALPHABETICAL, SortOrder.UPDATED) - override val configKeyDomain = ConfigKey.Domain("yugenmangas.net.br") + override val availableSortOrders: Set = EnumSet.of(SortOrder.UPDATED) + override val configKeyDomain = ConfigKey.Domain("yugenapp.lat") override suspend fun getListPage(page: Int, filter: MangaListFilter?): List { @@ -32,7 +32,7 @@ class YugenMangas(context: MangaLoaderContext) : PagedMangaParser(context, Manga val url = buildString { append("https://api.") append(domain) - append("/api/series/list/?query=") + append("/api/series/?search=") append(filter.query.urlEncoded()) } webClient.httpGet(url).parseJsonArray() @@ -41,22 +41,12 @@ class YugenMangas(context: MangaLoaderContext) : PagedMangaParser(context, Manga is MangaListFilter.Advanced -> { - if (filter.sortOrder == SortOrder.UPDATED) { - val url = buildString { - append("https://api.") - append(domain) - append("/api/latest_updates/") - } - webClient.httpGet(url).parseJsonArray() - } else { - val url = buildString { - append("https://api.") - append(domain) - append("/api/all_series/") - } - webClient.httpGet(url).parseJson().getJSONArray("series") + val url = buildString { + append("https://api.") + append(domain) + append("/api/latest_updates/") } - + webClient.httpGet(url).parseJsonArray() } null -> { @@ -73,7 +63,7 @@ class YugenMangas(context: MangaLoaderContext) : PagedMangaParser(context, Manga val slug = j.getString("slug") val cover = if (!j.getString("cover").startsWith("https://")) { // Some covers don't have the "/" so we ensure that the URL will be spelled correctly. - "https://$domain/media/" + j.getString("cover").removePrefix("/") + "https://api.$domain/media/" + j.getString("cover").removePrefix("/") } else { j.getString("cover") } @@ -97,11 +87,12 @@ class YugenMangas(context: MangaLoaderContext) : PagedMangaParser(context, Manga override suspend fun getDetails(manga: Manga): Manga { val detailManga = - webClient.httpPost("https://api.$domain/api/serie_details/${manga.url}", emptyMap()).parseJson() + webClient.httpPost("https://api.$domain/api/serie/serie_details/${manga.url}", emptyMap()).parseJson() val body = JSONObject() body.put("serie_slug", manga.url) - val chapterManga = webClient.httpPost("https://api.$domain/api/get_chapters_by_serie/", body).parseJson() - .getJSONArray("chapters") + val chapterManga = + webClient.httpPost("https://api.$domain/api/chapters/get_chapters_by_serie/", body).parseJson() + .getJSONArray("chapters") val dateFormat = SimpleDateFormat("dd/MM/yyyy", sourceLocale) return manga.copy( description = detailManga.getString("synopsis"), @@ -117,11 +108,12 @@ class YugenMangas(context: MangaLoaderContext) : PagedMangaParser(context, Manga } }, chapters = chapterManga.mapJSON { j -> - val url = "https://api.$domain/api/serie/${manga.url}/chapter/${j.getString("slug")}/images/imgs/" + val url = "https://api.$domain/api/serie/${manga.url}/chapter/${j.getString("slug")}/images/imgs/get/" MangaChapter( id = generateUid(url), name = j.getString("name"), - number = j.getString("name").removePrefix("Capítulo ").toInt(), + number = j.getString("name").removePrefix("Capítulo ").toFloat(), + volume = 0, url = url, scanlator = null, uploadDate = parseChapterDate( @@ -158,7 +150,7 @@ class YugenMangas(context: MangaLoaderContext) : PagedMangaParser(context, Manga val jsonPages = webClient.httpPost(chapter.url, emptyMap()).parseJson().getJSONArray("chapter_images") val pages = ArrayList(jsonPages.length()) for (i in 0 until jsonPages.length()) { - val img = "https://$domain/${jsonPages.getString(i)}" + val img = "https://api.$domain/${jsonPages.getString(i)}" pages.add( MangaPage( id = generateUid(img), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/AComics.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/AComics.kt index 32102ffc..291e5762 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/AComics.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/AComics.kt @@ -142,7 +142,8 @@ internal class AComics(context: MangaLoaderContext) : MangaChapter( id = manga.id, name = manga.title, - number = 1, + number = 1f, + volume = 0, url = manga.url.replace("/about", "/"), scanlator = null, uploadDate = 0, 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 b81aa404..44d751b0 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 @@ -87,7 +87,7 @@ internal abstract class LibSocialParser( SortOrder.NEWEST -> "created_at" SortOrder.ALPHABETICAL, SortOrder.ALPHABETICAL_DESC, - -> "rus_name" + -> "rus_name" }, ) urlBuilder.addQueryParameter( @@ -98,7 +98,7 @@ internal abstract class LibSocialParser( SortOrder.RATING, SortOrder.NEWEST, SortOrder.ALPHABETICAL_DESC, - -> "desc" + -> "desc" SortOrder.ALPHABETICAL -> "asc" }, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/BlogTruyenParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/BlogTruyenParser.kt index f5bee237..b8827f12 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/BlogTruyenParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/BlogTruyenParser.kt @@ -197,7 +197,8 @@ class BlogTruyenParser(context: MangaLoaderContext) : MangaChapter( id = generateUid(id), name = name, - number = index + 1, + number = index + 1f, + volume = 0, url = relativeUrl, scanlator = null, uploadDate = uploadDate, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/HentaiVNParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/HentaiVNParser.kt index d5ea7409..87375c53 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/HentaiVNParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/HentaiVNParser.kt @@ -244,7 +244,8 @@ class HentaiVNParser(context: MangaLoaderContext) : MangaParser(context, MangaSo MangaChapter( id = generateUid(titleEl.attrAsRelativeUrl("href")), name = titleEl.text(), - number = index + 1, + number = index + 1f, + volume = 0, url = titleEl.attrAsRelativeUrl("href"), scanlator = null, uploadDate = chapterDateFormat.tryParse(dateStr), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/LxManga.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/LxManga.kt index 98669335..26de65fe 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/LxManga.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/LxManga.kt @@ -142,7 +142,8 @@ internal class LxManga(context: MangaLoaderContext) : PagedMangaParser(context, MangaChapter( id = generateUid(href), name = name, - number = i, + number = i.toFloat(), + volume = 0, url = href, scanlator = null, uploadDate = dateFormat.tryParse(date), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/TruyentranhLHParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/TruyentranhLHParser.kt index e8c1effe..cb69e77e 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/TruyentranhLHParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/TruyentranhLHParser.kt @@ -133,7 +133,8 @@ class TruyentranhLHParser(context: MangaLoaderContext) : MangaChapter( id = generateUid(element.attrAsRelativeUrl("href")), name = element.selectFirst(".chapter-name")?.text()?.trim().orEmpty(), - number = index + 1, + number = index + 1f, + volume = 0, url = element.attrAsRelativeUrl("href"), scanlator = null, uploadDate = chapterDateFormat.tryParse(element.selectFirst(".chapter-time")?.text()), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vmp/VmpParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vmp/VmpParser.kt index 69b9c256..3e0faebd 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vmp/VmpParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vmp/VmpParser.kt @@ -122,7 +122,8 @@ internal abstract class VmpParser( MangaChapter( id = manga.id, name = manga.title, - number = 1, + number = 1f, + volume = 0, url = manga.url, scanlator = null, uploadDate = 0, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zeistmanga/pt/RaysScan.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zeistmanga/pt/RaysScan.kt new file mode 100644 index 00000000..4071eea9 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zeistmanga/pt/RaysScan.kt @@ -0,0 +1,17 @@ +package org.koitharu.kotatsu.parsers.site.zeistmanga.pt + +import org.koitharu.kotatsu.parsers.MangaLoaderContext +import org.koitharu.kotatsu.parsers.MangaSourceParser +import org.koitharu.kotatsu.parsers.model.MangaSource +import org.koitharu.kotatsu.parsers.model.MangaState +import org.koitharu.kotatsu.parsers.model.MangaTag +import org.koitharu.kotatsu.parsers.site.zeistmanga.ZeistMangaParser + +@MangaSourceParser("RAYSSCAN", "RaysScan", "pt") +internal class RaysScan(context: MangaLoaderContext) : + ZeistMangaParser(context, MangaSource.RAYSSCAN, "raysscan.blogspot.com") { + override val availableStates: Set = emptySet() + override suspend fun getAvailableTags(): Set = emptySet() +} + + diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zeistmanga/pt/SolooScan.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zeistmanga/pt/SolooScan.kt new file mode 100644 index 00000000..3bd59fa6 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zeistmanga/pt/SolooScan.kt @@ -0,0 +1,15 @@ +package org.koitharu.kotatsu.parsers.site.zeistmanga.pt + +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("SOLOOSCAN", "SolooScan", "pt") +internal class SolooScan(context: MangaLoaderContext) : + ZeistMangaParser(context, MangaSource.SOLOOSCAN, "solooscan.blogspot.com") { + override val mangaCategory = "Recentes" + override val sateOngoing: String = "Lançando" + override val sateFinished: String = "Completo" + override val sateAbandoned: String = "Dropado" +} diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zeistmanga/pt/TemakiMangas.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zeistmanga/pt/TemakiMangas.kt new file mode 100644 index 00000000..ba728ea7 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zeistmanga/pt/TemakiMangas.kt @@ -0,0 +1,17 @@ +package org.koitharu.kotatsu.parsers.site.zeistmanga.pt + +import org.koitharu.kotatsu.parsers.MangaLoaderContext +import org.koitharu.kotatsu.parsers.MangaSourceParser +import org.koitharu.kotatsu.parsers.model.MangaSource +import org.koitharu.kotatsu.parsers.model.MangaState +import org.koitharu.kotatsu.parsers.model.MangaTag +import org.koitharu.kotatsu.parsers.site.zeistmanga.ZeistMangaParser + +@MangaSourceParser("TEMAKIMANGAS", "TemakiMangas", "pt") +internal class TemakiMangas(context: MangaLoaderContext) : + ZeistMangaParser(context, MangaSource.TEMAKIMANGAS, "www.temakimangas.xyz") { + override val availableStates: Set = emptySet() + override suspend fun getAvailableTags(): Set = emptySet() +} + + From cc8369e02a108e03da31f2393af4f3d0a57bd3d5 Mon Sep 17 00:00:00 2001 From: Draken <131387159+dragonx943@users.noreply.github.com> Date: Thu, 11 Jul 2024 23:49:45 +0700 Subject: [PATCH 17/25] Update HentaiVNParser.kt --- .../org/koitharu/kotatsu/parsers/site/vi/HentaiVNParser.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/HentaiVNParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/HentaiVNParser.kt index 240d007e..2d6960d9 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/HentaiVNParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/HentaiVNParser.kt @@ -26,7 +26,7 @@ class HentaiVNParser(context: MangaLoaderContext) : MangaParser(context, MangaSo override val configKeyDomain: ConfigKey.Domain = ConfigKey.Domain("zhentaivn.cc", "hentaivn.bio") // hentaivn has created 2 different interfaces for mobile and desktop, and Cloudflare detects whether it's mobile or not even with a desktop user agent. - override val headers: Headers = Headers.Builder().add("User-Agent", UserAgents.CHROME_DESKTOP).build() + override val headers: Headers = Headers.Builder().add("User-Agent", UserAgents.FIREFOX_DESKTOP).build() override val availableSortOrders: Set = EnumSet.of( SortOrder.UPDATED, From 11c1eafa0dd815e8e7df148db71639903e2fb542 Mon Sep 17 00:00:00 2001 From: devi Date: Thu, 11 Jul 2024 21:30:04 +0200 Subject: [PATCH 18/25] Fix ReaperComics close #816 close #699 Fix GuildaTierDraw close #786 Fix Truyenqq close #793 Fix JiangzaiToon close #783 Fix MangaPark close #734 Fix ScanIta close #670 Add MangaPeak close #888 Fix ArvenComics close #660 --- .../kotatsu/parsers/site/all/MangaPark.kt | 2 +- .../kotatsu/parsers/site/en/ReaperComics.kt | 8 +-- .../parsers/site/madara/ar/LekManga.kt | 2 +- .../parsers/site/madara/ar/LikeMangaNet.kt | 2 +- .../parsers/site/madara/ar/MangaPeak.kt | 10 ++++ .../site/madara/en/IsekaiScanEuParser.kt | 2 +- .../parsers/site/madara/pt/CeriseScans.kt | 2 + .../parsers/site/madara/th/Manhuabug.kt | 1 + .../parsers/site/madara/th/Manhuakey.kt | 1 + .../parsers/site/madara/tr/Jiangzaitoon.kt | 3 +- .../parsers/site/madara/tr/MerlinScans.kt | 11 ++++ .../parsers/site/mangareader/en/ArvenScans.kt | 4 +- .../parsers/site/mangareader/es/TenkaiScan.kt | 2 + .../parsers/site/mangareader/pt/MangasChan.kt | 2 + .../parsers/site/mangareader/tr/Mangaokutr.kt | 2 +- .../site/mangareader/tr/MerlinScans.kt | 12 ----- .../kotatsu/parsers/site/scan/ScanParser.kt | 2 +- .../kotatsu/parsers/site/scan/it/ScanIta.kt | 50 ++++++++++++++++++- .../kotatsu/parsers/site/vi/Truyenqq.kt | 2 +- .../site/zeistmanga/pt/GuildaTierDraw.kt | 2 +- 20 files changed, 94 insertions(+), 28 deletions(-) create mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/ar/MangaPeak.kt create mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/tr/MerlinScans.kt delete mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/tr/MerlinScans.kt 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 28cdfc86..4a1e1e5e 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 @@ -257,7 +257,7 @@ internal class MangaPark(context: MangaLoaderContext) : .findAll(script) .mapNotNullTo(ArrayList()) { val url = it.groupValues.getOrNull(1) ?: return@mapNotNullTo null - if (url.contains("/comic/") || url.contains("/manga/")) { + if (url.contains("/comic/") || url.contains("/manga/") || url.contains("/image/mpup/")) { MangaPage( id = generateUid(url), url = url, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/ReaperComics.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/ReaperComics.kt index a3fa9090..fe56ec37 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/ReaperComics.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/ReaperComics.kt @@ -35,9 +35,7 @@ internal class ReaperComics(context: MangaLoaderContext) : override val configKeyDomain = ConfigKey.Domain("reaperscans.com") - private val userAgentKey = ConfigKey.UserAgent( - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36", - ) + private val userAgentKey = ConfigKey.UserAgent(context.getDefaultUserAgent()) private val baseHeaders: Headers get() = Headers.Builder().add("User-Agent", config[userAgentKey]).build() @@ -171,7 +169,7 @@ internal class ReaperComics(context: MangaLoaderContext) : val doc = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml() val simpleDateFormat = SimpleDateFormat("dd/MM/yyyy", sourceLocale) - var totalChapters = (doc.selectFirst(selectTotalChapter)?.text()?.toIntOrNull() ?: 0) - 1 + var totalChapters = (doc.selectFirst(selectTotalChapter)?.text()?.toFloatOrNull() ?: 0f) - 1f val chapters = mutableSetOf() var hasNextPage = doc.selectFirst(chapterListNextPageSelector()) != null chapters.addAll( @@ -182,6 +180,7 @@ internal class ReaperComics(context: MangaLoaderContext) : id = generateUid(chapterUrl), name = li.selectFirst("div.truncate p.truncate")?.text().orEmpty(), number = totalChapters--, + volume = 0, url = chapterUrl, scanlator = null, uploadDate = parseChapterDate( @@ -256,6 +255,7 @@ internal class ReaperComics(context: MangaLoaderContext) : id = generateUid(chapterUrl), name = li.selectFirst("div.truncate p.truncate")?.text().orEmpty(), number = totalChapters--, + volume = 0, url = chapterUrl, scanlator = null, uploadDate = parseChapterDate( diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/ar/LekManga.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/ar/LekManga.kt index af0368f6..d038d9a3 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/ar/LekManga.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/ar/LekManga.kt @@ -6,5 +6,5 @@ import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.site.madara.MadaraParser @MangaSourceParser("MANGALEK", "LekManga", "ar") -internal class MangaLek(context: MangaLoaderContext) : +internal class LekManga(context: MangaLoaderContext) : MadaraParser(context, MangaSource.MANGALEK, "lekmanga.net", pageSize = 10) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/ar/LikeMangaNet.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/ar/LikeMangaNet.kt index 85d9c1e4..16b05ac4 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/ar/LikeMangaNet.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/ar/LikeMangaNet.kt @@ -6,5 +6,5 @@ import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.site.madara.MadaraParser @MangaSourceParser("LIKEMANGANET", "Like-Manga.net", "ar") -internal class MangaLikeNet(context: MangaLoaderContext) : +internal class LikeMangaNet(context: MangaLoaderContext) : MadaraParser(context, MangaSource.LIKEMANGANET, "like-manga.net", pageSize = 10) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/ar/MangaPeak.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/ar/MangaPeak.kt new file mode 100644 index 00000000..e5185aeb --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/ar/MangaPeak.kt @@ -0,0 +1,10 @@ +package org.koitharu.kotatsu.parsers.site.madara.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.madara.MadaraParser + +@MangaSourceParser("MANGAPEAK", "MangaPeak", "ar") +internal class MangaPeak(context: MangaLoaderContext) : + MadaraParser(context, MangaSource.MANGAPEAK, "mangapeak.org") 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 faa03117..f6e243ff 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 @@ -6,7 +6,7 @@ import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.site.madara.MadaraParser import org.koitharu.kotatsu.parsers.util.* -@MangaSourceParser("ISEKAISCAN_EU", "IsekaiScan.to", "en") +@MangaSourceParser("ISEKAISCAN_EU", "ParagonScans", "en") internal class IsekaiScanEuParser(context: MangaLoaderContext) : MadaraParser(context, MangaSource.ISEKAISCAN_EU, "paragonscans.com") { diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/CeriseScans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/CeriseScans.kt index 7cc0f886..fa0fe921 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/CeriseScans.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/CeriseScans.kt @@ -1,10 +1,12 @@ package org.koitharu.kotatsu.parsers.site.madara.pt +import org.koitharu.kotatsu.parsers.Broken 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.madara.MadaraParser +@Broken @MangaSourceParser("CERISE_SCANS", "CeriseScans", "pt") internal class CeriseScans(context: MangaLoaderContext) : MadaraParser(context, MangaSource.CERISE_SCANS, "cerisetoon.com") { diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/th/Manhuabug.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/th/Manhuabug.kt index 31d30593..9446ecbc 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/th/Manhuabug.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/th/Manhuabug.kt @@ -11,4 +11,5 @@ internal class Manhuabug(context: MangaLoaderContext) : MadaraParser(context, MangaSource.MANHUABUG, "www.manhuabug.com", 10) { override val datePattern: String = "d MMMM yyyy" override val sourceLocale: Locale = Locale.ENGLISH + override val selectPage = "img" } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/th/Manhuakey.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/th/Manhuakey.kt index 0540db00..0a50e9a9 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/th/Manhuakey.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/th/Manhuakey.kt @@ -11,4 +11,5 @@ internal class Manhuakey(context: MangaLoaderContext) : MadaraParser(context, MangaSource.MANHUAKEY, "www.manhuakey.com", 10) { override val datePattern: String = "d MMMM yyyy" override val sourceLocale: Locale = Locale.ENGLISH + override val selectPage = "img" } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/tr/Jiangzaitoon.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/tr/Jiangzaitoon.kt index 9b655a5b..ee5779e2 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/tr/Jiangzaitoon.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/tr/Jiangzaitoon.kt @@ -8,6 +8,7 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser @MangaSourceParser("JIANGZAITOON", "JiangzaiToon", "tr", ContentType.HENTAI) internal class Jiangzaitoon(context: MangaLoaderContext) : - MadaraParser(context, MangaSource.JIANGZAITOON, "jiangzaitoon.cc") { + MadaraParser(context, MangaSource.JIANGZAITOON, "jiangzaitoon.dev") { override val datePattern = "d MMMM yyyy" + override val postReq = true } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/tr/MerlinScans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/tr/MerlinScans.kt new file mode 100644 index 00000000..80d9f4ee --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/tr/MerlinScans.kt @@ -0,0 +1,11 @@ +package org.koitharu.kotatsu.parsers.site.madara.tr + +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.madara.MadaraParser + +//Images blocked by ReCAPTCHA +@MangaSourceParser("MERLINSCANS", "MerlinScans", "tr") +internal class MerlinScans(context: MangaLoaderContext) : + MadaraParser(context, MangaSource.MERLINSCANS, "merlinscans.com", 10) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/ArvenScans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/ArvenScans.kt index aef8f554..a5c8a164 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/ArvenScans.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/ArvenScans.kt @@ -5,8 +5,8 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser -@MangaSourceParser("ARVENSCANS", "ArvenScans", "en") +@MangaSourceParser("ARVENSCANS", "ArvenComics", "en") internal class ArvenScans(context: MangaLoaderContext) : - MangaReaderParser(context, MangaSource.ARVENSCANS, "arvenscans.org", pageSize = 20, searchPageSize = 10) { + MangaReaderParser(context, MangaSource.ARVENSCANS, "arvencomics.com", pageSize = 20, searchPageSize = 10) { override val listUrl = "/series" } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/es/TenkaiScan.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/es/TenkaiScan.kt index d680febc..16aa0e51 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/es/TenkaiScan.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/es/TenkaiScan.kt @@ -1,5 +1,6 @@ package org.koitharu.kotatsu.parsers.site.mangareader.es +import org.koitharu.kotatsu.parsers.Broken import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.model.ContentType @@ -7,6 +8,7 @@ import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser import java.util.Locale +@Broken // Not dead, changed template @MangaSourceParser("TENKAISCAN", "TenkaiScan", "es", ContentType.HENTAI) internal class TenkaiScan(context: MangaLoaderContext) : MangaReaderParser(context, MangaSource.TENKAISCAN, "tenkaiscan.net", 20, 10) { diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/pt/MangasChan.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/pt/MangasChan.kt index cf9d04b2..9831abc3 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/pt/MangasChan.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/pt/MangasChan.kt @@ -1,10 +1,12 @@ package org.koitharu.kotatsu.parsers.site.mangareader.pt +import org.koitharu.kotatsu.parsers.Broken 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 +@Broken @MangaSourceParser("MANGASCHAN", "MangasChan", "pt") internal class MangasChan(context: MangaLoaderContext) : MangaReaderParser(context, MangaSource.MANGASCHAN, "mangaschan.net", pageSize = 20, searchPageSize = 20) { diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/tr/Mangaokutr.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/tr/Mangaokutr.kt index 8bd5715a..6bc6fcdd 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/tr/Mangaokutr.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/tr/Mangaokutr.kt @@ -5,6 +5,6 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser -@MangaSourceParser("MANGAOKUTR", "MangaOku Tr", "tr") +@MangaSourceParser("MANGAOKUTR", "MangaOkuTr", "tr") internal class Mangaokutr(context: MangaLoaderContext) : MangaReaderParser(context, MangaSource.MANGAOKUTR, "mangaokutr.com", pageSize = 25, searchPageSize = 20) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/tr/MerlinScans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/tr/MerlinScans.kt deleted file mode 100644 index 2f17473a..00000000 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/tr/MerlinScans.kt +++ /dev/null @@ -1,12 +0,0 @@ -package org.koitharu.kotatsu.parsers.site.mangareader.tr - -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("MERLINSCANS", "MerlinScans", "tr") -internal class MerlinScans(context: MangaLoaderContext) : - MangaReaderParser(context, MangaSource.MERLINSCANS, "merlinscans.com", pageSize = 25, searchPageSize = 20) { - override val isTagsExclusionSupported = false -} diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/scan/ScanParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/scan/ScanParser.kt index 828f8077..f3b5a9d6 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/scan/ScanParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/scan/ScanParser.kt @@ -91,7 +91,7 @@ internal abstract class ScanParser( return getOrCreateTagMap().values.toSet() } - private suspend fun getOrCreateTagMap(): Map = mutex.withLock { + protected suspend fun getOrCreateTagMap(): Map = mutex.withLock { tagCache?.let { return@withLock it } val tagMap = ArrayMap() val tagElements = webClient.httpGet("https://$domain/manga").parseHtml() diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/scan/it/ScanIta.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/scan/it/ScanIta.kt index 27997be0..de5077ad 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/scan/it/ScanIta.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/scan/it/ScanIta.kt @@ -1,10 +1,58 @@ package org.koitharu.kotatsu.parsers.site.scan.it +import kotlinx.coroutines.async +import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser +import org.koitharu.kotatsu.parsers.model.Manga +import org.koitharu.kotatsu.parsers.model.MangaChapter import org.koitharu.kotatsu.parsers.model.MangaSource +import org.koitharu.kotatsu.parsers.model.RATING_UNKNOWN import org.koitharu.kotatsu.parsers.site.scan.ScanParser +import org.koitharu.kotatsu.parsers.util.* +import java.text.SimpleDateFormat +import kotlinx.coroutines.coroutineScope @MangaSourceParser("SCANITA", "ScanIta.org", "it") internal class ScanIta(context: MangaLoaderContext) : - ScanParser(context, MangaSource.SCANITA, "scanita.org") + ScanParser(context, MangaSource.SCANITA, "scanita.org") { + + override suspend fun getDetails(manga: Manga): Manga = coroutineScope { + val doc = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml() + val tagMap = getOrCreateTagMap() + val selectTag = doc.select(".card-series-detail .col-6:contains(Categorie) div") + val tags = selectTag.mapNotNullToSet { tagMap[it.text()] } + val chaptersDeferred = async { loadChapters(doc) } + manga.copy( + rating = doc.selectFirst(".card-series-detail .rate-value span")?.ownText()?.toFloatOrNull()?.div(5f) + ?: RATING_UNKNOWN, + tags = tags, + author = doc.selectFirst(".card-series-detail .col-6:contains(Autore) div")?.text(), + altTitle = doc.selectFirst(".card div.col-12.mb-4 h2")?.text().orEmpty(), + description = doc.selectFirst(".card div.col-12.mb-4 p")?.html().orEmpty(), + chapters = chaptersDeferred.await(), + ) + } + + private suspend fun loadChapters(document: Document): List { + val id = document.selectFirstOrThrow(".container-fluid button.w-100").attr("data-path") + .substringAfter("/manga/").substringBefore("/books") + val url = "https://$domain/manga/$id/books" + val doc = webClient.httpGet(url).parseHtml() + val dateFormat = SimpleDateFormat("MM-dd-yyyy", sourceLocale) + return doc.select(".chapters-list .col-chapter").mapChapters(reversed = true) { i, div -> + val href = div.selectFirstOrThrow("a").attrAsRelativeUrl("href") + MangaChapter( + id = generateUid(href), + name = div.selectFirstOrThrow("h5").html().substringBefore(""), + number = i + 1f, + volume = 0, + url = href, + scanlator = null, + uploadDate = dateFormat.tryParse(doc.selectFirstOrThrow("h5 div").text()), + branch = null, + source = source, + ) + } + } +} diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/Truyenqq.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/Truyenqq.kt index 03acef75..7a9655b4 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/Truyenqq.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/Truyenqq.kt @@ -17,7 +17,7 @@ internal class Truyenqq(context: MangaLoaderContext) : PagedMangaParser(context, override val availableStates: Set = EnumSet.of(MangaState.ONGOING, MangaState.FINISHED) - override val configKeyDomain = ConfigKey.Domain("truyenqqvn.com") + override val configKeyDomain = ConfigKey.Domain("truyenqqviet.com") override suspend fun getListPage(page: Int, filter: MangaListFilter?): List { diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zeistmanga/pt/GuildaTierDraw.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zeistmanga/pt/GuildaTierDraw.kt index cd849f49..2a12ff52 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zeistmanga/pt/GuildaTierDraw.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zeistmanga/pt/GuildaTierDraw.kt @@ -12,7 +12,7 @@ import org.koitharu.kotatsu.parsers.util.requireElementById @MangaSourceParser("GUILDATIERDRAW", "GuildaTierDraw", "pt") internal class GuildaTierDraw(context: MangaLoaderContext) : - ZeistMangaParser(context, MangaSource.GUILDATIERDRAW, "www.guildatierdraw.com") { + ZeistMangaParser(context, MangaSource.GUILDATIERDRAW, "www.guildatierdraw.top") { override suspend fun getAvailableTags(): Set { val doc = webClient.httpGet("https://$domain").parseHtml() From df562bedbba1a2238f1a7c9b565e508afea2cb15 Mon Sep 17 00:00:00 2001 From: Naga <94557604+NagaYZ@users.noreply.github.com> Date: Fri, 12 Jul 2024 00:38:19 +0200 Subject: [PATCH 19/25] Closes #886 --- .../org/koitharu/kotatsu/parsers/site/madara/en/Manhuaplus.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/Manhuaplus.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/Manhuaplus.kt index a4f3ed01..bd8a3eb4 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/Manhuaplus.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/Manhuaplus.kt @@ -11,7 +11,7 @@ import org.koitharu.kotatsu.parsers.util.* @MangaSourceParser("MANHUAPLUS", "ManhuaPlus", "en") internal class Manhuaplus(context: MangaLoaderContext) : - MadaraParser(context, MangaSource.MANHUAPLUS, "manhuaplus.org") { + MadaraParser(context, MangaSource.MANHUAPLUS, "manhuaplus.com") { override val withoutAjax = true From cf5abdf7d3be5569bf2e693e9b9e13b35a426ff8 Mon Sep 17 00:00:00 2001 From: Draken <131387159+dragonx943@users.noreply.github.com> Date: Fri, 12 Jul 2024 16:22:44 +0700 Subject: [PATCH 20/25] Update HentaiVNParser.kt --- .../org/koitharu/kotatsu/parsers/site/vi/HentaiVNParser.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/HentaiVNParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/HentaiVNParser.kt index 2d6960d9..21f0e501 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/HentaiVNParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/HentaiVNParser.kt @@ -23,7 +23,7 @@ private const val SEARCH_PAGE_SIZE = 10 @MangaSourceParser("HENTAIVN", "HentaiVN", "vi", type = ContentType.HENTAI) class HentaiVNParser(context: MangaLoaderContext) : MangaParser(context, MangaSource.HENTAIVN) { - override val configKeyDomain: ConfigKey.Domain = ConfigKey.Domain("zhentaivn.cc", "hentaivn.bio") + override val configKeyDomain: ConfigKey.Domain = ConfigKey.Domain("zhentaivnz.cc", "hentaivn.homes") // hentaivn has created 2 different interfaces for mobile and desktop, and Cloudflare detects whether it's mobile or not even with a desktop user agent. override val headers: Headers = Headers.Builder().add("User-Agent", UserAgents.FIREFOX_DESKTOP).build() From 1c85782690558471ac3501c2f55ed3d0cf10d939 Mon Sep 17 00:00:00 2001 From: devi Date: Sat, 13 Jul 2024 21:30:59 +0200 Subject: [PATCH 21/25] =?UTF-8?q?Fix=20CafecomYaoi=20close=20#715=20Fix=20?= =?UTF-8?q?Topmanhua=20close=20#710=20Add=20Some=20sources=20Add=20new=20P?= =?UTF-8?q?arser=20fix=20EpsilonScan=20close=20#602=20Add=20MangaHub.link?= =?UTF-8?q?=20close=20#892=20Fix=20SussyScan=20close=20#893=20Fix=20MaidSc?= =?UTF-8?q?an=20close=20#585=20fix=20HuntersScan=20close=20#584=20Fix=20Te?= =?UTF-8?q?amXNovel=20close=20#575=20close=20#574=20Fix=20MangaTown=20clos?= =?UTF-8?q?e=20#569=20Add=20LeitorDeManga=20close=20#864=20add=20Search=20?= =?UTF-8?q?on=20ScanParser=20Add=20mangabr=20close=20#862=20Add=20Manga=20?= =?UTF-8?q?Italia=20close=20#841=20Add=20Mang=C3=A1=20Terra=20close=20#856?= =?UTF-8?q?=20Fix=20MilaSub=20close=20#559=20Fix=20KomikTapParser=20close?= =?UTF-8?q?=20#554=20Fix=20YugenApp=20close=20#586=20Fix=20TuMangaOnline?= =?UTF-8?q?=20close=20#566=20Fix=20bato=20close=20#516=20Fix=20Mangakakalo?= =?UTF-8?q?t=20close=20#490?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kotatsu/parsers/site/all/BatoToParser.kt | 7 +- .../kotatsu/parsers/site/ar/TeamXNovel.kt | 4 +- .../kotatsu/parsers/site/en/MangaGeko.kt | 11 +- .../parsers/site/en/MangaTownParser.kt | 6 +- .../parsers/site/es/TuMangaOnlineParser.kt | 44 ++- .../parsers/site/heancms/es/YugenMangasEs.kt | 2 + .../parsers/site/keyoapp/KeyoappParser.kt | 307 ++++++++++++++++++ .../parsers/site/keyoapp/en/EzManga.kt | 10 + .../parsers/site/keyoapp/en/KewnScans.kt | 10 + .../parsers/site/keyoapp/en/LaidBackScans.kt | 10 + .../parsers/site/keyoapp/fr/AnteikuScan.kt | 10 + .../parsers/site/keyoapp/fr/Astrames.kt | 10 + .../parsers/site/keyoapp/fr/EdScanlation.kt | 10 + .../parsers/site/keyoapp/fr/StarboundScans.kt | 10 + .../parsers/site/madara/MadaraParser.kt | 13 +- .../parsers/site/madara/en/TopManhua.kt | 5 +- .../parsers/site/madara/fr/EpsilonSoft.kt | 12 + .../fr/EpsilonscanParser.kt | 7 +- .../parsers/site/madara/fr/HarmonyScan.kt | 10 + .../parsers/site/madara/pt/CafecomYaoi.kt | 4 +- .../parsers/site/madara/pt/DreamScan.kt | 10 + .../parsers/site/madara/pt/HuntersScan.kt | 1 - .../parsers/site/madara/pt/LeitorDeManga.kt | 13 + .../parsers/site/madara/pt/MaidScan.kt | 4 +- .../site/madara/pt/MugiwarasOficial.kt | 12 + .../parsers/site/madara/pt/SussyScan.kt | 4 +- .../kotatsu/parsers/site/madara/tr/MilaSub.kt | 12 + .../parsers/site/mangabox/en/Mangakakalot.kt | 4 +- .../site/mangareader/fr/MangasScans.kt | 10 + .../parsers/site/mangareader/fr/RimuScans.kt | 10 + .../site/mangareader/id/KomikTapParser.kt | 7 +- .../parsers/site/mangareader/id/Komikcast.kt | 2 +- .../parsers/site/mangareader/tr/MilaSub.kt | 12 - .../kotatsu/parsers/site/pt/YugenMangas.kt | 23 +- .../kotatsu/parsers/site/scan/ScanParser.kt | 121 ++++--- .../parsers/site/scan/it/MangaItalia.kt | 10 + .../kotatsu/parsers/site/scan/pt/MangaBr.kt | 10 + .../parsers/site/scan/pt/MangaTerra.kt | 10 + .../parsers/site/zeistmanga/ar/MangaHub.kt | 38 +++ 39 files changed, 717 insertions(+), 98 deletions(-) create mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/keyoapp/KeyoappParser.kt create mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/keyoapp/en/EzManga.kt create mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/keyoapp/en/KewnScans.kt create mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/keyoapp/en/LaidBackScans.kt create mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/keyoapp/fr/AnteikuScan.kt create mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/keyoapp/fr/Astrames.kt create mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/keyoapp/fr/EdScanlation.kt create mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/keyoapp/fr/StarboundScans.kt create mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/fr/EpsilonSoft.kt rename src/main/kotlin/org/koitharu/kotatsu/parsers/site/{mangareader => madara}/fr/EpsilonscanParser.kt (64%) create mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/fr/HarmonyScan.kt create mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/DreamScan.kt create mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/LeitorDeManga.kt create mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/MugiwarasOficial.kt create mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/tr/MilaSub.kt create mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/fr/MangasScans.kt create mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/fr/RimuScans.kt delete mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/tr/MilaSub.kt create mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/scan/it/MangaItalia.kt create mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/scan/pt/MangaBr.kt create mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/scan/pt/MangaTerra.kt create mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/zeistmanga/ar/MangaHub.kt 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 1d6d60d6..53169c8b 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 @@ -104,7 +104,12 @@ internal class BatoToParser(context: MangaLoaderContext) : PagedMangaParser( filter.locale?.let { append("&langs=") - append(it.language) + if (it.language == "in") { + append("id") + } else { + append(it.language) + } + } append("&genres=") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ar/TeamXNovel.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ar/TeamXNovel.kt index 0322983b..d7408639 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ar/TeamXNovel.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ar/TeamXNovel.kt @@ -31,7 +31,7 @@ internal class TeamXNovel(context: MangaLoaderContext) : PagedMangaParser(contex when (filter) { is MangaListFilter.Search -> { - append("/series?search=") + append("/?search=") append(filter.query.urlEncoded()) if (page > 1) { append("&page=") @@ -95,7 +95,7 @@ internal class TeamXNovel(context: MangaLoaderContext) : PagedMangaParser(contex publicUrl = href.toAbsoluteUrl(domain), rating = RATING_UNKNOWN, isNsfw = false, - coverUrl = div.selectFirstOrThrow("img").src().orEmpty(), + coverUrl = div.selectFirstOrThrow("img").src()?.replace("thumbnail_", "").orEmpty(), tags = emptySet(), state = when (div.selectFirst(".status")?.text()) { "مستمرة" -> MangaState.ONGOING diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MangaGeko.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MangaGeko.kt index a3212738..5b57905f 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MangaGeko.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MangaGeko.kt @@ -2,13 +2,11 @@ package org.koitharu.kotatsu.parsers.site.en import kotlinx.coroutines.async import kotlinx.coroutines.coroutineScope -import okhttp3.Headers 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.network.UserAgents import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat import java.util.* @@ -23,9 +21,12 @@ internal class MangaGeko(context: MangaLoaderContext) : PagedMangaParser(context override val isMultipleTagsSupported = false - override val headers: Headers = Headers.Builder() - .add("User-Agent", UserAgents.CHROME_DESKTOP) - .build() + private val userAgentKey = ConfigKey.UserAgent(context.getDefaultUserAgent()) + + override fun onCreateConfig(keys: MutableCollection>) { + super.onCreateConfig(keys) + keys.add(userAgentKey) + } override suspend fun getListPage(page: Int, filter: MangaListFilter?): List { diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MangaTownParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MangaTownParser.kt index 4353adca..a2e23791 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MangaTownParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MangaTownParser.kt @@ -174,10 +174,10 @@ internal class MangaTownParser(context: MangaLoaderContext) : PagedMangaParser(c override suspend fun getPages(chapter: MangaChapter): List { val fullUrl = chapter.url.toAbsoluteUrl(domain) val doc = webClient.httpGet(fullUrl).parseHtml() - val root = doc.body().selectFirstOrThrow("div.page_select") - val isManga = root.select("select") + val root = doc.body().selectFirst("div.page_select") + val isManga = root?.select("select") - if (isManga.isEmpty()) {//Webtoon + if (isManga.isNullOrEmpty()) {//Webtoon val imgElements = doc.select("div#viewer.read_img img.image") return imgElements.map { val href = it.attr("src") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/es/TuMangaOnlineParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/es/TuMangaOnlineParser.kt index 03bdb293..894782d5 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/es/TuMangaOnlineParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/es/TuMangaOnlineParser.kt @@ -207,6 +207,9 @@ class TuMangaOnlineParser(context: MangaLoaderContext) : PagedMangaParser( private suspend fun redirectToReadingPage(document: Document): Document { val script1 = document.selectFirst("script:containsData(uniqid)") val script2 = document.selectFirst("script:containsData(window.location.replace)") + val script3 = document.selectFirst("script:containsData(redirectUrl)") + val script4 = document.selectFirst("input#redir") + val script5 = document.selectFirst("script:containsData(window.opener):containsData(location.replace)") val redirectHeaders = Headers.Builder().set("Referer", document.baseUri()).build() @@ -228,15 +231,52 @@ class TuMangaOnlineParser(context: MangaLoaderContext) : PagedMangaParser( if (script2 != null) { val data = script2.data() - val regexRedirect = """window\.location\.replace\('(.+)'\)""".toRegex() - val url = regexRedirect.find(data)!!.groupValues[1] + val regexRedirect = """window\.location\.replace\(['"](.+)['"]\)""".toRegex() + val url = regexRedirect.find(data)?.groupValues?.get(1)?.unescapeUrl() + + if (url != null) { + return redirectToReadingPage(webClient.httpGet(url, redirectHeaders).parseHtml()) + } + } + + if (script3 != null) { + val data = script3.data() + val regexRedirect = """redirectUrl\s*=\s*'(.+)'""".toRegex() + val url = regexRedirect.find(data)?.groupValues?.get(1)?.unescapeUrl() + + if (url != null) { + return redirectToReadingPage(webClient.httpGet(url, redirectHeaders).parseHtml()) + } + } + + if (script4 != null) { + val url = script4.attr("value").unescapeUrl() return redirectToReadingPage(webClient.httpGet(url, redirectHeaders).parseHtml()) } + if (script5 != null) { + val data = script5.data() + val regexRedirect = """;[^.]location\.replace\(['"](.+)['"]\)""".toRegex() + val url = regexRedirect.find(data)?.groupValues?.get(1)?.unescapeUrl() + + if (url != null) { + return redirectToReadingPage(webClient.httpGet(url, redirectHeaders).parseHtml()) + } + } + return document } + private fun String.unescapeUrl(): String { + return if (this.startsWith("http:\\/\\/") || this.startsWith("https:\\/\\/")) { + this.replace("\\/", "/") + } else { + this + } + } + + override suspend fun getAvailableTags(): Set { val doc = webClient.httpGet("https://$domain/library", headers).parseHtml() val elements = doc.body().select("div#books-genders > div > div") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/es/YugenMangasEs.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/es/YugenMangasEs.kt index 8e37063d..844093cb 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/es/YugenMangasEs.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/es/YugenMangasEs.kt @@ -1,5 +1,6 @@ package org.koitharu.kotatsu.parsers.site.heancms.es +import org.koitharu.kotatsu.parsers.Broken import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.model.* @@ -7,6 +8,7 @@ import org.koitharu.kotatsu.parsers.site.heancms.HeanCms import org.koitharu.kotatsu.parsers.util.json.mapJSON import org.koitharu.kotatsu.parsers.util.* +@Broken // Not dead but changed template and url visualikigai.com @MangaSourceParser("YUGEN_MANGAS_ES", "YugenMangas.lat", "es", ContentType.HENTAI) internal class YugenMangasEs(context: MangaLoaderContext) : HeanCms(context, MangaSource.YUGEN_MANGAS_ES, "yugenmangas.lat") { diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/keyoapp/KeyoappParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/keyoapp/KeyoappParser.kt new file mode 100644 index 00000000..a807d132 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/keyoapp/KeyoappParser.kt @@ -0,0 +1,307 @@ +package org.koitharu.kotatsu.parsers.site.keyoapp + +import androidx.collection.scatterSetOf +import kotlinx.coroutines.coroutineScope +import org.jsoup.nodes.Document +import org.jsoup.nodes.Element +import org.koitharu.kotatsu.parsers.MangaLoaderContext +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.DateFormat +import java.text.SimpleDateFormat +import java.util.* + +internal abstract class KeyoappParser( + context: MangaLoaderContext, + source: MangaSource, + domain: String, + pageSize: Int = 24, +) : PagedMangaParser(context, source, pageSize) { + + override val configKeyDomain = ConfigKey.Domain(domain) + + private val userAgentKey = ConfigKey.UserAgent(context.getDefaultUserAgent()) + + override fun onCreateConfig(keys: MutableCollection>) { + super.onCreateConfig(keys) + keys.add(userAgentKey) + } + + override val isMultipleTagsSupported = false + + override val availableSortOrders: Set = EnumSet.of( + SortOrder.UPDATED, + SortOrder.NEWEST, + ) + + protected open val listUrl = "series/" + protected open val datePattern = "MMM d, yyyy" + + + @JvmField + protected val ongoing = scatterSetOf( + "ongoing", + ) + + @JvmField + protected val finished = scatterSetOf( + "completed", + ) + + @JvmField + protected val paused = scatterSetOf( + "paused", + ) + + @JvmField + protected val upcoming = scatterSetOf( + "dropped", + ) + + init { + paginator.firstPage = 1 + searchPaginator.firstPage = 1 + } + + override suspend fun getListPage(page: Int, filter: MangaListFilter?): List { + + var query = "" + var tag = "" + + if (page > 1) { + return emptyList() + } + + val url = urlBuilder().apply { + + when (filter) { + is MangaListFilter.Search -> { + addPathSegment("series") + query = filter.query + } + + is MangaListFilter.Advanced -> { + + if (filter.tags.isNotEmpty()) { + filter.tags.oneOrThrowIfMany()?.let { + tag = it.title + } + } + + when (filter.sortOrder) { + SortOrder.UPDATED -> addPathSegment("latest") + SortOrder.NEWEST -> addPathSegment("series") + else -> addPathSegment("latest") + } + + } + + null -> addPathSegment("latest") + } + }.build() + + return parseMangaList(webClient.httpGet(url).parseHtml(), tag, query) + } + + + protected open fun parseMangaList(doc: Document, tag: String, query: String): List { + + val manga = ArrayList() + + doc.select("#searched_series_page button").ifEmpty { + doc.select("div.grid > div.group") + }.map { div -> + + val title = div.selectFirstOrThrow("h3").text().orEmpty() + if (query.isNotEmpty() && title.contains(query, ignoreCase = true)) { + manga.add(addManga(div)) + } + + // Not all tags are present in UPDATED + val tags = div.attr("tags") ?: div.select("div.gap-1 a").joinToString() + if (tag.isNotEmpty() && tags.contains(tag, ignoreCase = true)) { + manga.add(addManga(div)) + } + + if (query.isEmpty() && tag.isEmpty()) { + manga.add(addManga(div)) + } + + } + + return manga + } + + + private fun addManga(div: Element): Manga { + val href = div.selectFirstOrThrow("a").attrAsRelativeUrl("href") + val cover = div.selectFirst("div.h-full") ?: div.selectFirst("a") + return Manga( + id = generateUid(href), + url = href, + publicUrl = href.toAbsoluteUrl(div.host ?: domain), + coverUrl = cover?.styleValueOrNull("background-image")?.cssUrl().orEmpty(), + title = div.selectFirstOrThrow("h3").text().orEmpty(), + altTitle = null, + rating = RATING_UNKNOWN, + tags = div.select("div.gap-1 a").mapNotNullToSet { a -> + MangaTag( + key = a.attr("href").substringAfterLast('='), + title = a.text().toTitleCase(), + source = source, + ) + }, + author = null, + state = null, + source = source, + isNsfw = isNsfwSource, + ) + } + + private fun String.cssUrl(): String? { + val fromIndex = indexOf("url(") + if (fromIndex == -1) { + return null + } + val toIndex = indexOf(')', startIndex = fromIndex) + return if (toIndex == -1) { + null + } else { + substring(fromIndex + 4, toIndex).trim() + } + } + + + override suspend fun getAvailableTags(): Set { + val doc = webClient.httpGet("https://$domain/$listUrl").parseHtml() + return doc.requireElementById("series_tags_page").select("button").mapNotNullToSet { button -> + val key = button.attr("tag") ?: return@mapNotNullToSet null + val name = button.text().toTitleCase(sourceLocale) + MangaTag( + key = key, + title = name, + source = source, + ) + } + } + + protected open val selectDesc = "div.grid > div.overflow-hidden > p" + protected open val selectState = "div[alt=Status]" + protected open val selectTag = "div.grid:has(>h1) > div > a" + protected open val selectAuthor = "div[alt=Author]" + protected open val selectChapter = "#chapters > a:not(:has(.text-sm span:matches(Upcoming)))" + + override suspend fun getDetails(manga: Manga): Manga = coroutineScope { + val fullUrl = manga.url.toAbsoluteUrl(domain) + val doc = webClient.httpGet(fullUrl).parseHtml() + val dateFormat = SimpleDateFormat(datePattern, sourceLocale) + manga.copy( + tags = doc.body().select(selectTag).mapNotNullToSet { a -> + MangaTag( + key = a.attr("href").substringAfterLast('='), + title = a.text().toTitleCase(), + source = source, + ) + }, + description = doc.selectFirstOrThrow(selectDesc).html(), + state = when ( + doc.selectFirstOrThrow(selectState).text().lowercase() + ) { + in ongoing -> MangaState.ONGOING + in finished -> MangaState.FINISHED + in paused -> MangaState.PAUSED + in upcoming -> MangaState.UPCOMING + else -> null + }, + chapters = doc.select(selectChapter) + .mapChapters(reversed = true) { i, a -> + val href = a.attrAsRelativeUrl("href") + val name = a.selectFirstOrThrow("span.truncate").text() + val dateText = a.selectLast("div.text-xs.w-fit")?.text() ?: "0" + MangaChapter( + id = generateUid(href), + name = name, + number = i + 1f, + volume = 0, + url = href, + scanlator = null, + uploadDate = parseChapterDate( + dateFormat, + dateText, + ), + branch = null, + source = source, + ) + }, + ) + } + + protected open val selectPage = "#pages > img" + + override suspend fun getPages(chapter: MangaChapter): List { + val fullUrl = chapter.url.toAbsoluteUrl(domain) + val doc = webClient.httpGet(fullUrl).parseHtml() + return doc.select(selectPage).map { img -> + val url = img.src()?.toRelativeUrl(domain) ?: img.parseFailed("Image src not found") + MangaPage( + id = generateUid(url), + url = url, + preview = null, + source = source, + ) + } + } + + protected fun parseChapterDate(dateFormat: DateFormat, date: String?): Long { + val d = date?.lowercase() ?: return 0 + return when { + d.endsWith(" ago") -> parseRelativeDate(date) + + d.startsWith("year") -> Calendar.getInstance().apply { + add(Calendar.DAY_OF_MONTH, -1) + set(Calendar.HOUR_OF_DAY, 0) + set(Calendar.MINUTE, 0) + set(Calendar.SECOND, 0) + set(Calendar.MILLISECOND, 0) + }.timeInMillis + + d.startsWith("today") -> Calendar.getInstance().apply { + set(Calendar.HOUR_OF_DAY, 0) + set(Calendar.MINUTE, 0) + set(Calendar.SECOND, 0) + set(Calendar.MILLISECOND, 0) + }.timeInMillis + + date.contains(Regex("""\d(st|nd|rd|th)""")) -> date.split(" ").map { + if (it.contains(Regex("""\d\D\D"""))) { + it.replace(Regex("""\D"""), "") + } else { + it + } + }.let { dateFormat.tryParse(it.joinToString(" ")) } + + else -> dateFormat.tryParse(date) + } + } + + private fun parseRelativeDate(date: String): Long { + val number = Regex("""(\d+)""").find(date)?.value?.toIntOrNull() ?: return 0 + val cal = Calendar.getInstance() + return when { + WordSet("second").anyWordIn(date) -> cal.apply { add(Calendar.SECOND, -number) }.timeInMillis + + WordSet("minute", "minutes").anyWordIn(date) -> cal.apply { add(Calendar.MINUTE, -number) }.timeInMillis + + WordSet("hour", "hours").anyWordIn(date) -> cal.apply { add(Calendar.HOUR, -number) }.timeInMillis + + WordSet("day", "days").anyWordIn(date) -> cal.apply { add(Calendar.DAY_OF_MONTH, -number) }.timeInMillis + + WordSet("month", "months").anyWordIn(date) -> cal.apply { add(Calendar.MONTH, -number) }.timeInMillis + + WordSet("year").anyWordIn(date) -> cal.apply { add(Calendar.YEAR, -number) }.timeInMillis + else -> 0 + } + } +} diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/keyoapp/en/EzManga.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/keyoapp/en/EzManga.kt new file mode 100644 index 00000000..20d8507e --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/keyoapp/en/EzManga.kt @@ -0,0 +1,10 @@ +package org.koitharu.kotatsu.parsers.site.keyoapp.en + +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.keyoapp.KeyoappParser + +@MangaSourceParser("EZMANGA", "EzManga", "en") +internal class EzManga(context: MangaLoaderContext) : + KeyoappParser(context, MangaSource.EZMANGA, "ezmanga.org") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/keyoapp/en/KewnScans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/keyoapp/en/KewnScans.kt new file mode 100644 index 00000000..2e6cc01e --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/keyoapp/en/KewnScans.kt @@ -0,0 +1,10 @@ +package org.koitharu.kotatsu.parsers.site.keyoapp.en + +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.keyoapp.KeyoappParser + +@MangaSourceParser("KEWNSCANS", "KewnScans", "en") +internal class KewnScans(context: MangaLoaderContext) : + KeyoappParser(context, MangaSource.KEWNSCANS, "kewnscans.org") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/keyoapp/en/LaidBackScans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/keyoapp/en/LaidBackScans.kt new file mode 100644 index 00000000..24d90fd2 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/keyoapp/en/LaidBackScans.kt @@ -0,0 +1,10 @@ +package org.koitharu.kotatsu.parsers.site.keyoapp.en + +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.keyoapp.KeyoappParser + +@MangaSourceParser("LAIDBACKSCANS", "LaidBackScans", "en") +internal class LaidBackScans(context: MangaLoaderContext) : + KeyoappParser(context, MangaSource.LAIDBACKSCANS, "laidbackscans.org") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/keyoapp/fr/AnteikuScan.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/keyoapp/fr/AnteikuScan.kt new file mode 100644 index 00000000..2f9b891a --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/keyoapp/fr/AnteikuScan.kt @@ -0,0 +1,10 @@ +package org.koitharu.kotatsu.parsers.site.keyoapp.fr + +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.keyoapp.KeyoappParser + +@MangaSourceParser("ANTEIKUSCAN", "AnteikuScan", "fr") +internal class AnteikuScan(context: MangaLoaderContext) : + KeyoappParser(context, MangaSource.ANTEIKUSCAN, "anteikuscan.fr") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/keyoapp/fr/Astrames.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/keyoapp/fr/Astrames.kt new file mode 100644 index 00000000..2f0dfeaf --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/keyoapp/fr/Astrames.kt @@ -0,0 +1,10 @@ +package org.koitharu.kotatsu.parsers.site.keyoapp.fr + +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.keyoapp.KeyoappParser + +@MangaSourceParser("ASTRAMES", "Astrames", "fr") +internal class Astrames(context: MangaLoaderContext) : + KeyoappParser(context, MangaSource.ASTRAMES, "astrames.fr") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/keyoapp/fr/EdScanlation.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/keyoapp/fr/EdScanlation.kt new file mode 100644 index 00000000..d89564af --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/keyoapp/fr/EdScanlation.kt @@ -0,0 +1,10 @@ +package org.koitharu.kotatsu.parsers.site.keyoapp.fr + +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.keyoapp.KeyoappParser + +@MangaSourceParser("EDSCANLATION", "EdScanlation", "fr") +internal class EdScanlation(context: MangaLoaderContext) : + KeyoappParser(context, MangaSource.EDSCANLATION, "edscanlation.fr") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/keyoapp/fr/StarboundScans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/keyoapp/fr/StarboundScans.kt new file mode 100644 index 00000000..27abcf94 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/keyoapp/fr/StarboundScans.kt @@ -0,0 +1,10 @@ +package org.koitharu.kotatsu.parsers.site.keyoapp.fr + +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.keyoapp.KeyoappParser + +@MangaSourceParser("STARBOUNDSCANS", "StarboundScans", "fr") +internal class StarboundScans(context: MangaLoaderContext) : + KeyoappParser(context, MangaSource.STARBOUNDSCANS, "starboundscans.org") 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 f811530f..5f43a3fc 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 @@ -23,8 +23,14 @@ internal abstract class MadaraParser( ) : PagedMangaParser(context, source, pageSize) { override val configKeyDomain = ConfigKey.Domain(domain) + private val userAgentKey = ConfigKey.UserAgent(context.getDefaultUserAgent()) + override fun onCreateConfig(keys: MutableCollection>) { + super.onCreateConfig(keys) + keys.add(userAgentKey) + } + override val isMultipleTagsSupported = false override val availableSortOrders: Set = EnumSet.of( @@ -333,7 +339,7 @@ internal abstract class MadaraParser( publicUrl = href.toAbsoluteUrl(div.host ?: domain), coverUrl = div.selectFirst("img")?.src().orEmpty(), title = (summary?.selectFirst("h3") ?: summary?.selectFirst("h4") - ?: div.selectFirst(".manga-name"))?.text().orEmpty(), + ?: div.selectFirst(".manga-name") ?: div.selectFirst(".post-title"))?.text().orEmpty(), altTitle = null, rating = div.selectFirst("span.total_votes")?.ownText()?.toFloatOrNull()?.div(5f) ?: -1f, tags = summary?.selectFirst(".mg_genres")?.select("a")?.mapNotNullToSet { a -> @@ -651,11 +657,6 @@ internal abstract class MadaraParser( } } - override fun onCreateConfig(keys: MutableCollection>) { - super.onCreateConfig(keys) - keys.add(userAgentKey) - } - // Parses dates in this form: // 21 hours ago private fun parseRelativeDate(date: String): Long { diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/TopManhua.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/TopManhua.kt index 0965e9d0..eb6712a2 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/TopManhua.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/TopManhua.kt @@ -5,9 +5,10 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.site.madara.MadaraParser -@MangaSourceParser("TOPMANHUA", "TopManhua", "en") +@MangaSourceParser("TOPMANHUA", "ManhuaTop", "en") internal class TopManhua(context: MangaLoaderContext) : - MadaraParser(context, MangaSource.TOPMANHUA, "topmanhua.com") { + MadaraParser(context, MangaSource.TOPMANHUA, "manhuatop.org") { override val tagPrefix = "manhua-genre/" + override val listUrl = "manhua/" override val datePattern = "MM/dd/yyyy" } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/fr/EpsilonSoft.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/fr/EpsilonSoft.kt new file mode 100644 index 00000000..ccd5c956 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/fr/EpsilonSoft.kt @@ -0,0 +1,12 @@ +package org.koitharu.kotatsu.parsers.site.madara.fr + +import org.koitharu.kotatsu.parsers.MangaLoaderContext +import org.koitharu.kotatsu.parsers.MangaSourceParser +import org.koitharu.kotatsu.parsers.model.* +import org.koitharu.kotatsu.parsers.site.madara.MadaraParser + +@MangaSourceParser("EPSILONSOFT", "EpsilonSoft", "fr") +internal class EpsilonSoft(context: MangaLoaderContext) : + MadaraParser(context, MangaSource.EPSILONSOFT, "epsilonsoft.to") { + override val datePattern = "dd/MM/yy" +} diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/fr/EpsilonscanParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/fr/EpsilonscanParser.kt similarity index 64% rename from src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/fr/EpsilonscanParser.kt rename to src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/fr/EpsilonscanParser.kt index 563d3a05..ddea9da8 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/fr/EpsilonscanParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/fr/EpsilonscanParser.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.parsers.site.mangareader.fr +package org.koitharu.kotatsu.parsers.site.madara.fr import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser @@ -7,7 +7,6 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser @MangaSourceParser("EPSILONSCAN", "EpsilonScan", "fr", ContentType.HENTAI) internal class EpsilonscanParser(context: MangaLoaderContext) : - MadaraParser(context, MangaSource.EPSILONSCAN, "epsilonscan.fr") { - override val withoutAjax = true - override val isTagsExclusionSupported = false + MadaraParser(context, MangaSource.EPSILONSCAN, "epsilonscan.to") { + override val datePattern = "dd/MM/yy" } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/fr/HarmonyScan.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/fr/HarmonyScan.kt new file mode 100644 index 00000000..569b4e70 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/fr/HarmonyScan.kt @@ -0,0 +1,10 @@ +package org.koitharu.kotatsu.parsers.site.madara.fr + +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.madara.MadaraParser + +@MangaSourceParser("HARMONYSCAN", "HarmonyScan", "fr") +internal class HarmonyScan(context: MangaLoaderContext) : + MadaraParser(context, MangaSource.HARMONYSCAN, "harmony-scan.fr") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/CafecomYaoi.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/CafecomYaoi.kt index c35a1291..c25237bb 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/CafecomYaoi.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/CafecomYaoi.kt @@ -2,12 +2,12 @@ package org.koitharu.kotatsu.parsers.site.madara.pt import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser +import org.koitharu.kotatsu.parsers.model.ContentType import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.site.madara.MadaraParser -@MangaSourceParser("CAFECOMYAOI", "CafecomYaoi", "pt") +@MangaSourceParser("CAFECOMYAOI", "CafecomYaoi", "pt", ContentType.HENTAI) internal class CafecomYaoi(context: MangaLoaderContext) : MadaraParser(context, MangaSource.CAFECOMYAOI, "cafecomyaoi.com.br") { override val datePattern = "dd/MM/yyyy" - override val postReq = true } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/DreamScan.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/DreamScan.kt new file mode 100644 index 00000000..16871d71 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/DreamScan.kt @@ -0,0 +1,10 @@ +package org.koitharu.kotatsu.parsers.site.madara.pt + +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.madara.MadaraParser + +@MangaSourceParser("DREAMSCAN", "DreamScan", "pt") +internal class DreamScan(context: MangaLoaderContext) : + MadaraParser(context, MangaSource.DREAMSCAN, "dreamscan.com.br") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/HuntersScan.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/HuntersScan.kt index cb48a452..2cf9455a 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/HuntersScan.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/HuntersScan.kt @@ -11,5 +11,4 @@ internal class HuntersScan(context: MangaLoaderContext) : override val withoutAjax = true override val datePattern = "MM/dd/yyyy" override val tagPrefix = "series-genre/" - override val listUrl = "manga/" } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/LeitorDeManga.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/LeitorDeManga.kt new file mode 100644 index 00000000..4d51b988 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/LeitorDeManga.kt @@ -0,0 +1,13 @@ +package org.koitharu.kotatsu.parsers.site.madara.pt + +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.madara.MadaraParser + +@MangaSourceParser("LEITORDEMANGA", "LeitorDeManga", "pt") +internal class LeitorDeManga(context: MangaLoaderContext) : + MadaraParser(context, MangaSource.LEITORDEMANGA, "leitordemanga.com", 10) { + override val datePattern = "dd/MM/yyyy" + override val listUrl = "ler-manga/" +} diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/MaidScan.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/MaidScan.kt index d0877738..44749036 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/MaidScan.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/MaidScan.kt @@ -8,6 +8,6 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser @MangaSourceParser("MAIDSCAN", "MaidScan", "pt", ContentType.HENTAI) internal class MaidScan(context: MangaLoaderContext) : - MadaraParser(context, MangaSource.MAIDSCAN, "maidscan.com.br", 10) { - override val datePattern: String = "dd 'de' MMMMM 'de' yyyy" + MadaraParser(context, MangaSource.MAIDSCAN, "maidscans.com", 10) { + override val datePattern: String = "dd/MM/yyyy" } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/MugiwarasOficial.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/MugiwarasOficial.kt new file mode 100644 index 00000000..8d024f3a --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/MugiwarasOficial.kt @@ -0,0 +1,12 @@ +package org.koitharu.kotatsu.parsers.site.madara.pt + +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.madara.MadaraParser + +@MangaSourceParser("MUGIWARASOFICIAL", "MugiwarasOficial", "pt") +internal class MugiwarasOficial(context: MangaLoaderContext) : + MadaraParser(context, MangaSource.MUGIWARASOFICIAL, "mugiwarasoficial.com") { + override val datePattern: String = "dd/MM/yyyy" +} diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/SussyScan.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/SussyScan.kt index 671b5ed1..5e364f8c 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/SussyScan.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/SussyScan.kt @@ -7,6 +7,4 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser @MangaSourceParser("SUSSYSCAN", "SussyScan", "pt") internal class SussyScan(context: MangaLoaderContext) : - MadaraParser(context, MangaSource.SUSSYSCAN, "sussyscan.com") { - override val datePattern: String = "dd/MM/yyyy" -} + MadaraParser(context, MangaSource.SUSSYSCAN, "oldi.sussytoons.com") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/tr/MilaSub.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/tr/MilaSub.kt new file mode 100644 index 00000000..19dde699 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/tr/MilaSub.kt @@ -0,0 +1,12 @@ +package org.koitharu.kotatsu.parsers.site.madara.tr + +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.madara.MadaraParser + +@MangaSourceParser("MILASUB", "MilaSub", "tr") +internal class MilaSub(context: MangaLoaderContext) : + MadaraParser(context, MangaSource.MILASUB, "www.milasub.co", 20) { + override val datePattern = "d MMMM yyyy" +} diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangabox/en/Mangakakalot.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangabox/en/Mangakakalot.kt index 09d7f52c..b29db16f 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangabox/en/Mangakakalot.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangabox/en/Mangakakalot.kt @@ -32,7 +32,9 @@ internal class Mangakakalot(context: MangaLoaderContext) : is MangaListFilter.Search -> { append(searchUrl) - append(filter.query.urlEncoded()) + val regex = Regex("[^A-Za-z0-9 ]") + val q = regex.replace(filter.query, "") + append(q.replace(" ", "_")) append("?page=") } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/fr/MangasScans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/fr/MangasScans.kt new file mode 100644 index 00000000..1badafa7 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/fr/MangasScans.kt @@ -0,0 +1,10 @@ +package org.koitharu.kotatsu.parsers.site.mangareader.fr + +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("MANGASSCANS", "MangasScans", "fr") +internal class MangasScans(context: MangaLoaderContext) : + MangaReaderParser(context, MangaSource.MANGASSCANS, "mangas-scans.com", pageSize = 30, searchPageSize = 10) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/fr/RimuScans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/fr/RimuScans.kt new file mode 100644 index 00000000..7baf51a5 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/fr/RimuScans.kt @@ -0,0 +1,10 @@ +package org.koitharu.kotatsu.parsers.site.mangareader.fr + +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("RIMUSCANS", "RimuScans", "fr") +internal class RimuScans(context: MangaLoaderContext) : + MangaReaderParser(context, MangaSource.RIMUSCANS, "rimuscans.fr", pageSize = 30, searchPageSize = 10) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/id/KomikTapParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/id/KomikTapParser.kt index 6a5eef33..52ff8d29 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/id/KomikTapParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/id/KomikTapParser.kt @@ -2,13 +2,12 @@ package org.koitharu.kotatsu.parsers.site.mangareader.id import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser +import org.koitharu.kotatsu.parsers.model.ContentType import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser -import java.util.Locale -@MangaSourceParser("KOMIKTAP", "KomikTap", "id") +@MangaSourceParser("KOMIKTAP", "KomikTap", "id", ContentType.HENTAI) internal class KomikTapParser(context: MangaLoaderContext) : - MangaReaderParser(context, MangaSource.KOMIKTAP, "komiktap.me", pageSize = 25, searchPageSize = 10) { - override val sourceLocale: Locale = Locale.ENGLISH + MangaReaderParser(context, MangaSource.KOMIKTAP, "komiktap.info", pageSize = 25, searchPageSize = 10) { override val isTagsExclusionSupported = false } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/id/Komikcast.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/id/Komikcast.kt index eec44203..7f50fb00 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/id/Komikcast.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/id/Komikcast.kt @@ -13,7 +13,7 @@ import java.util.* @MangaSourceParser("KOMIKCAST", "KomikCast", "id") internal class Komikcast(context: MangaLoaderContext) : - MangaReaderParser(context, MangaSource.KOMIKCAST, "komikcast.lol", pageSize = 60, searchPageSize = 28) { + MangaReaderParser(context, MangaSource.KOMIKCAST, "komikcast.cz", pageSize = 60, searchPageSize = 28) { override val listUrl = "/daftar-komik" override val datePattern = "MMM d, yyyy" diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/tr/MilaSub.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/tr/MilaSub.kt deleted file mode 100644 index 9c5217a9..00000000 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/tr/MilaSub.kt +++ /dev/null @@ -1,12 +0,0 @@ -package org.koitharu.kotatsu.parsers.site.mangareader.tr - -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("MILASUB", "MilaSub", "tr") -internal class MilaSub(context: MangaLoaderContext) : - MangaReaderParser(context, MangaSource.MILASUB, "www.milasub.com", pageSize = 20, searchPageSize = 10) { - override val isTagsExclusionSupported = false -} diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/YugenMangas.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/YugenMangas.kt index 6c240306..31b0f4a9 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/YugenMangas.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/YugenMangas.kt @@ -15,7 +15,7 @@ import java.util.* @MangaSourceParser("YUGENMANGAS", "YugenApp", "pt") class YugenMangas(context: MangaLoaderContext) : PagedMangaParser(context, MangaSource.YUGENMANGAS, 28) { - override val availableSortOrders: Set = EnumSet.of(SortOrder.UPDATED) + override val availableSortOrders: Set = EnumSet.of(SortOrder.UPDATED, SortOrder.ALPHABETICAL) override val configKeyDomain = ConfigKey.Domain("yugenapp.lat") override suspend fun getListPage(page: Int, filter: MangaListFilter?): List { @@ -40,13 +40,22 @@ class YugenMangas(context: MangaLoaderContext) : PagedMangaParser(context, Manga is MangaListFilter.Advanced -> { - - val url = buildString { - append("https://api.") - append(domain) - append("/api/latest_updates/") + if (filter.sortOrder == SortOrder.UPDATED) { + val url = buildString { + append("https://api.") + append(domain) + append("/api/latest_updates/") + } + webClient.httpGet(url).parseJsonArray() + } else { + val url = buildString { + append("https://api.") + append(domain) + append("/api/series_novels/all_series/") + } + webClient.httpGet(url).parseJson().getJSONArray("series") } - webClient.httpGet(url).parseJsonArray() + } null -> { diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/scan/ScanParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/scan/ScanParser.kt index f3b5a9d6..cbd39d9f 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/scan/ScanParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/scan/ScanParser.kt @@ -3,7 +3,6 @@ package org.koitharu.kotatsu.parsers.site.scan import androidx.collection.ArrayMap import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock -import org.koitharu.kotatsu.parsers.ErrorMessages import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.PagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey @@ -21,17 +20,20 @@ internal abstract class ScanParser( override val availableSortOrders: Set = EnumSet.of(SortOrder.ALPHABETICAL, SortOrder.UPDATED, SortOrder.POPULARITY, SortOrder.RATING) - override val isSearchSupported = false override val configKeyDomain = ConfigKey.Domain(domain) override suspend fun getListPage(page: Int, filter: MangaListFilter?): List { + var query = false + val url = buildString { append("https://") append(domain) when (filter) { is MangaListFilter.Search -> { - throw IllegalArgumentException(ErrorMessages.SEARCH_NOT_SUPPORTED) // TODO + append("/search?q=") + append(filter.query.urlEncoded()) + query = true } is MangaListFilter.Advanced -> { @@ -64,24 +66,58 @@ internal abstract class ScanParser( } } - val doc = webClient.httpGet(url).parseHtml() - return doc.select(".series-paginated .series").map { div -> - val href = div.selectFirstOrThrow("a").attrAsRelativeUrl("href") - Manga( - id = generateUid(href), - url = href, - publicUrl = href.toAbsoluteUrl(div.host ?: domain), - coverUrl = div.selectFirst("img")?.attr("data-src")?.replace("\t", "").orEmpty(), - title = div.selectFirstOrThrow(".link-series h3").text().orEmpty(), - altTitle = null, - rating = RATING_UNKNOWN, - tags = emptySet(), - author = null, - state = null, - source = source, - isNsfw = isNsfwSource, - ) + if (query) { + val doc = webClient.httpGet(url).parseRaw() + + val list = if (doc.contains("grid-item-series")) { + doc.split("grid-item-series").drop(1) + } else { + doc.split("class=\\u0022series\\u0022\\").drop(1) + } + + return list.map { l -> + val href = l.substringAfter("href=\\u0022\\").substringBefore("\\u0022").replace("\\", "") + val cover = l.substringAfter("data-src=\\u0022").substringBefore("\\u0022\\u003E").replace("\\", "") + val title = l.substringAfter("item-title\\u0022\\u003E").substringBefore("\\u003C\\/p\\u003E").ifEmpty { + l.substringAfter("\\u003Ch3\\u003E").substringBefore("\\u003C\\/h3\\u003E") + } + Manga( + id = generateUid(href), + url = href, + publicUrl = href.toAbsoluteUrl(domain), + coverUrl = cover, + title = title, + altTitle = null, + rating = RATING_UNKNOWN, + tags = emptySet(), + author = null, + state = null, + source = source, + isNsfw = isNsfwSource, + ) + } + + } else { + val doc = webClient.httpGet(url).parseHtml() + return doc.select(".series-paginated .series, .series-paginated .grid-item-series").map { div -> + val href = div.selectFirstOrThrow("a").attrAsRelativeUrl("href") + Manga( + id = generateUid(href), + url = href, + publicUrl = href.toAbsoluteUrl(div.host ?: domain), + coverUrl = div.selectFirst("img")?.attr("data-src")?.replace("\t", "").orEmpty(), + title = div.selectFirstOrThrow(".link-series h3, .item-title").text().orEmpty(), + altTitle = null, + rating = RATING_UNKNOWN, + tags = emptySet(), + author = null, + state = null, + source = source, + isNsfw = isNsfwSource, + ) + } } + } private var tagCache: ArrayMap? = null @@ -95,7 +131,8 @@ internal abstract class ScanParser( tagCache?.let { return@withLock it } val tagMap = ArrayMap() val tagElements = webClient.httpGet("https://$domain/manga").parseHtml() - .requireElementById("filter-wrapper").select(".form-filters div.form-check") + .requireElementById("filter-wrapper") + .select(".form-filters div.form-check, .form-filters div.custom-control") for (el in tagElements) { val name = el.selectFirstOrThrow("label").text() if (name.isEmpty()) continue @@ -113,29 +150,33 @@ internal abstract class ScanParser( val doc = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml() val dateFormat = SimpleDateFormat("MM-dd-yyyy", sourceLocale) val tagMap = getOrCreateTagMap() - val selectTag = doc.select(".card-series-detail .col-6:contains(Categorie) div") + val selectTag = + doc.select(".card-series-detail .col-6:contains(Categorie) div, .card-series-about .mb-3:contains(Categorie) a, .card-series-about .mb-3:contains(Categorias) a") val tags = selectTag.mapNotNullToSet { tagMap[it.text()] } return manga.copy( - rating = doc.selectFirst(".card-series-detail .rate-value span")?.ownText()?.toFloatOrNull()?.div(5f) + rating = doc.selectFirst(".card-series-detail .rate-value span, .card-series-about .rate-value span") + ?.ownText()?.toFloatOrNull()?.div(5f) ?: RATING_UNKNOWN, tags = tags, - author = doc.selectFirst(".card-series-detail .col-6:contains(Autore) div")?.text(), - altTitle = doc.selectFirst(".card div.col-12.mb-4 h2")?.text().orEmpty(), - description = doc.selectFirst(".card div.col-12.mb-4 p")?.html().orEmpty(), - chapters = doc.select(".chapters-list .col-chapter").mapChapters(reversed = true) { i, div -> - val href = div.selectFirstOrThrow("a").attrAsRelativeUrl("href") - MangaChapter( - id = generateUid(href), - name = div.selectFirstOrThrow("h5").html().substringBefore(""), - number = i + 1f, - volume = 0, - url = href, - scanlator = null, - uploadDate = dateFormat.tryParse(doc.selectFirstOrThrow("h5 div").text()), - branch = null, - source = source, - ) - }, + author = doc.selectFirst(".card-series-detail .col-6:contains(Autore) div, .card-series-about .mb-3:contains(Autore) a") + ?.text(), + altTitle = doc.selectFirst(".card div.col-12.mb-4 h2, .card-series-about .h6")?.text().orEmpty(), + description = doc.selectFirst(".card div.col-12.mb-4 p, .card-series-desc .mb-4 p")?.html().orEmpty(), + chapters = doc.select(".chapters-list .col-chapter, .card-list-chapter .col-chapter") + .mapChapters(reversed = true) { i, div -> + val href = div.selectFirstOrThrow("a").attrAsRelativeUrl("href") + MangaChapter( + id = generateUid(href), + name = div.selectFirstOrThrow("h5").html().substringBefore(""), + number = i + 1f, + volume = 0, + url = href, + scanlator = null, + uploadDate = dateFormat.tryParse(doc.selectFirstOrThrow("h5 div").text()), + branch = null, + source = source, + ) + }, ) } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/scan/it/MangaItalia.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/scan/it/MangaItalia.kt new file mode 100644 index 00000000..0ee53dae --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/scan/it/MangaItalia.kt @@ -0,0 +1,10 @@ +package org.koitharu.kotatsu.parsers.site.scan.it + +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.scan.ScanParser + +@MangaSourceParser("MANGAITALIA", "MangaItalia", "pt") +internal class MangaItalia(context: MangaLoaderContext) : + ScanParser(context, MangaSource.MANGAITALIA, "manga-italia.com") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/scan/pt/MangaBr.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/scan/pt/MangaBr.kt new file mode 100644 index 00000000..f33ef885 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/scan/pt/MangaBr.kt @@ -0,0 +1,10 @@ +package org.koitharu.kotatsu.parsers.site.scan.pt + +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.scan.ScanParser + +@MangaSourceParser("MANGABR", "MangaBr", "pt") +internal class MangaBr(context: MangaLoaderContext) : + ScanParser(context, MangaSource.MANGABR, "mangabr.net") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/scan/pt/MangaTerra.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/scan/pt/MangaTerra.kt new file mode 100644 index 00000000..d3318917 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/scan/pt/MangaTerra.kt @@ -0,0 +1,10 @@ +package org.koitharu.kotatsu.parsers.site.scan.pt + +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.scan.ScanParser + +@MangaSourceParser("MANGATERRA", "MangaTerra", "pt") +internal class MangaTerra(context: MangaLoaderContext) : + ScanParser(context, MangaSource.MANGATERRA, "manga-terra.com") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zeistmanga/ar/MangaHub.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zeistmanga/ar/MangaHub.kt new file mode 100644 index 00000000..99b89be2 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zeistmanga/ar/MangaHub.kt @@ -0,0 +1,38 @@ +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.ContentType +import org.koitharu.kotatsu.parsers.model.MangaSource +import org.koitharu.kotatsu.parsers.model.MangaState +import org.koitharu.kotatsu.parsers.model.MangaTag +import org.koitharu.kotatsu.parsers.site.zeistmanga.ZeistMangaParser +import org.koitharu.kotatsu.parsers.util.domain +import org.koitharu.kotatsu.parsers.util.mapNotNullToSet +import org.koitharu.kotatsu.parsers.util.parseHtml +import org.koitharu.kotatsu.parsers.util.requireElementById +import org.koitharu.kotatsu.parsers.util.selectFirstOrThrow +import org.koitharu.kotatsu.parsers.util.toTitleCase +import java.util.EnumSet + +@MangaSourceParser("MANGAHUB_LINK", "MangaHub.link", "ar", ContentType.HENTAI) +internal class MangaHub(context: MangaLoaderContext) : + ZeistMangaParser(context, MangaSource.MANGAHUB_LINK, "www.mangahub.link") { + + override val availableStates: Set = + EnumSet.of(MangaState.ONGOING, MangaState.FINISHED) + + override val sateOngoing: String = "مستمر" + override val sateFinished: String = "مكتمل" + + override suspend fun getAvailableTags(): Set { + val doc = webClient.httpGet("https://$domain").parseHtml() + return doc.requireElementById("Genre").select("div.items-center").mapNotNullToSet { + MangaTag( + key = it.selectFirstOrThrow("input").attr("value"), + title = it.selectFirstOrThrow("label").text().substringBefore(')').toTitleCase(sourceLocale), + source = source, + ) + } + } +} From f49ddf743765ac941c411feb04bb57ebb7d8877e Mon Sep 17 00:00:00 2001 From: devi Date: Sat, 13 Jul 2024 21:49:05 +0200 Subject: [PATCH 22/25] Fix HentaiVN Remove some warning --- .../koitharu/kotatsu/parsers/site/fr/ScansMangasMe.kt | 2 +- .../kotatsu/parsers/site/heancms/en/OmegaScans.kt | 3 ++- .../koitharu/kotatsu/parsers/site/heancms/fr/PerfScan.kt | 3 ++- .../kotatsu/parsers/site/heancms/pt/ModeScanlator.kt | 3 ++- .../kotatsu/parsers/site/madara/en/ResetScans.kt | 2 +- .../koitharu/kotatsu/parsers/site/nepnep/NepnepParser.kt | 2 +- .../koitharu/kotatsu/parsers/site/vi/HentaiVNParser.kt | 9 +++++++-- 7 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/ScansMangasMe.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/ScansMangasMe.kt index f2bd90d0..c1f43072 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/ScansMangasMe.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/ScansMangasMe.kt @@ -132,7 +132,7 @@ internal class ScansMangasMe(context: MangaLoaderContext) : } private fun getChapters(doc: Document): List { - return doc.body().requireElementById("chapter_list").select("li").mapChapters(reversed = true) { i, li -> + return doc.body().requireElementById("chapter_list").select("li").mapChapters(reversed = true) { _, li -> val a = li.selectFirstOrThrow("a") val href = a.attrAsRelativeUrl("href") MangaChapter( diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/en/OmegaScans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/en/OmegaScans.kt index 14ab5753..ea4162b3 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/en/OmegaScans.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/en/OmegaScans.kt @@ -106,7 +106,7 @@ internal class OmegaScans(context: MangaLoaderContext) : HeanCms(context, MangaS val dateFormat = SimpleDateFormat(datePattern, Locale.ENGLISH) val chaptersJsonArray = json.getJSONArray("data") - var totalChapters = json.getJSONObject("meta").getInt("total") + var totalChapters = json.getJSONObject("meta").getInt("total").toFloat() val chapters = chaptersJsonArray.mapJSON { j -> val slug = j.getJSONObject("series").getString("series_slug") val chapterUrl = "https://$domain/$pathManga/$slug/${j.getString("chapter_slug")}" @@ -116,6 +116,7 @@ internal class OmegaScans(context: MangaLoaderContext) : HeanCms(context, MangaS url = chapterUrl, name = j.getString("chapter_name"), number = totalChapters--, + volume = 0, branch = null, uploadDate = dateFormat.tryParse(date), scanlator = null, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/fr/PerfScan.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/fr/PerfScan.kt index 6688d165..d683d619 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/fr/PerfScan.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/fr/PerfScan.kt @@ -125,7 +125,7 @@ internal class PerfScan(context: MangaLoaderContext) : val dateFormat = SimpleDateFormat(datePattern, Locale.ENGLISH) val chaptersJsonArray = json.getJSONArray("data") - var totalChapters = json.getJSONObject("meta").getInt("total") + var totalChapters = json.getJSONObject("meta").getInt("total").toFloat() val chapters = chaptersJsonArray.mapJSON { j -> val slug = j.getJSONObject("series").getString("series_slug") val chapterUrl = "https://$domain/$pathManga/$slug/${j.getString("chapter_slug")}" @@ -135,6 +135,7 @@ internal class PerfScan(context: MangaLoaderContext) : url = chapterUrl, name = j.getString("chapter_name"), number = totalChapters--, + volume = 0, branch = null, uploadDate = dateFormat.tryParse(date), scanlator = null, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/pt/ModeScanlator.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/pt/ModeScanlator.kt index d1a1b764..b3530567 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/pt/ModeScanlator.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/pt/ModeScanlator.kt @@ -108,7 +108,7 @@ internal class ModeScanlator( val dateFormat = SimpleDateFormat(datePattern, Locale.ENGLISH) val chaptersJsonArray = json.getJSONArray("data") - var totalChapters = json.getJSONObject("meta").getInt("total") + var totalChapters = json.getJSONObject("meta").getInt("total").toFloat() val chapters = chaptersJsonArray.mapJSON { j -> val slug = j.getJSONObject("series").getString("series_slug") val chapterUrl = "https://$domain/$pathManga/$slug/${j.getString("chapter_slug")}" @@ -118,6 +118,7 @@ internal class ModeScanlator( url = chapterUrl, name = j.getString("chapter_name"), number = totalChapters--, + volume = 0, branch = null, uploadDate = dateFormat.tryParse(date), scanlator = null, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/ResetScans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/ResetScans.kt index f9f71bbf..fb37d631 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/ResetScans.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/ResetScans.kt @@ -27,7 +27,7 @@ internal class ResetScans(context: MangaLoaderContext) : webClient.httpPost(url, emptyMap()).parseHtml() } val dateFormat = SimpleDateFormat(datePattern, sourceLocale) - return doc.select(selectChapter).mapChapters(reversed = true) { i, li -> + return doc.select(selectChapter).mapChapters(reversed = true) { _, li -> val a = li.getElementsByTag("a").findWithText() val href = a?.attrAsRelativeUrlOrNull("href") ?: li.parseFailed("Link is missing") val link = href + stylePage 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 079c1d3f..f29068ca 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 @@ -61,7 +61,7 @@ internal abstract class NepnepParser( val imgUrl = "https://temp.compsci88.com/cover/" + m.getString("i") + ".jpg" val lastUpdate = m.getLong("lt") val views = m.getString("v") - val viewMonth = m.getString("vm") + //val viewMonth = m.getString("vm") when (filter) { diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/HentaiVNParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/HentaiVNParser.kt index 654f435c..6db8f180 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/HentaiVNParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/HentaiVNParser.kt @@ -23,10 +23,15 @@ private const val SEARCH_PAGE_SIZE = 10 @MangaSourceParser("HENTAIVN", "HentaiVN", "vi", type = ContentType.HENTAI) class HentaiVNParser(context: MangaLoaderContext) : MangaParser(context, MangaSource.HENTAIVN) { - override val configKeyDomain: ConfigKey.Domain = ConfigKey.Domain("zhentaivnz.cc", "hentaivn.homes") + override val configKeyDomain: ConfigKey.Domain = ConfigKey.Domain("zhentaivnz.cc") // hentaivn has created 2 different interfaces for mobile and desktop, and Cloudflare detects whether it's mobile or not even with a desktop user agent. - override val headers: Headers = Headers.Builder().add("User-Agent", UserAgents.FIREFOX_DESKTOP).build() + private val userAgentKey = ConfigKey.UserAgent(context.getDefaultUserAgent()) + + override fun onCreateConfig(keys: MutableCollection>) { + super.onCreateConfig(keys) + keys.add(userAgentKey) + } override val availableSortOrders: Set = EnumSet.of( SortOrder.UPDATED, From dceedf019a5df8db3e00a10c342a0e1792f06d07 Mon Sep 17 00:00:00 2001 From: devi Date: Sat, 13 Jul 2024 21:49:31 +0200 Subject: [PATCH 23/25] Fix HentaiVN Remove some warning --- .../org/koitharu/kotatsu/parsers/site/vi/HentaiVNParser.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/HentaiVNParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/HentaiVNParser.kt index 6db8f180..a1c18eff 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/HentaiVNParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/HentaiVNParser.kt @@ -5,14 +5,12 @@ import kotlinx.coroutines.async import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock -import okhttp3.Headers import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaParser import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey import org.koitharu.kotatsu.parsers.model.* -import org.koitharu.kotatsu.parsers.network.UserAgents import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat import java.util.* From fadf8861e7f2cdfbc620d55e2265e7ca594bbbed Mon Sep 17 00:00:00 2001 From: devi Date: Sun, 14 Jul 2024 14:17:17 +0200 Subject: [PATCH 24/25] Rm BrMangas close #454 rm PowerManga close #462 Add MangaNinja close #897 Add Grimelek close #375 Add OpiaToon close#374 Add login on madara Fix ManhwaFreak --- .../parsers/site/foolslide/it/PowerManga.kt | 2 + .../parsers/site/madara/MadaraParser.kt | 30 ++- .../parsers/site/madara/pt/MangaNinja.kt | 12 + .../parsers/site/madara/tr/GloryManga.kt | 1 + .../parsers/site/madara/tr/Grimelek.kt | 14 ++ .../parsers/site/madara/tr/OpiaToon.kt | 13 ++ .../parsers/site/mangareader/en/FreakScans.kt | 2 + .../site/mangareader/en/ManhwaFreak.kt | 210 +----------------- .../parsers/site/mmrcms/es/MangaDoor.kt | 2 + .../kotatsu/parsers/site/pt/BrMangas.kt | 2 + 10 files changed, 78 insertions(+), 210 deletions(-) create mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/MangaNinja.kt create mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/tr/Grimelek.kt create mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/tr/OpiaToon.kt diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/foolslide/it/PowerManga.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/foolslide/it/PowerManga.kt index 39f6844d..053179a8 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/foolslide/it/PowerManga.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/foolslide/it/PowerManga.kt @@ -1,10 +1,12 @@ package org.koitharu.kotatsu.parsers.site.foolslide.it +import org.koitharu.kotatsu.parsers.Broken 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.foolslide.FoolSlideParser +@Broken @MangaSourceParser("POWERMANGA", "PowerManga", "it") internal class PowerManga(context: MangaLoaderContext) : FoolSlideParser(context, MangaSource.POWERMANGA, "reader.powermanga.org") { 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 5f43a3fc..ff5120fa 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 @@ -7,8 +7,11 @@ import org.json.JSONObject import org.jsoup.nodes.Document import org.jsoup.nodes.Element import org.koitharu.kotatsu.parsers.MangaLoaderContext +import org.koitharu.kotatsu.parsers.MangaParserAuthProvider import org.koitharu.kotatsu.parsers.PagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.exception.AuthRequiredException +import org.koitharu.kotatsu.parsers.exception.ParseException import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.DateFormat @@ -20,7 +23,7 @@ internal abstract class MadaraParser( source: MangaSource, domain: String, pageSize: Int = 12, -) : PagedMangaParser(context, source, pageSize) { +) : PagedMangaParser(context, source, pageSize), MangaParserAuthProvider { override val configKeyDomain = ConfigKey.Domain(domain) @@ -31,6 +34,28 @@ internal abstract class MadaraParser( keys.add(userAgentKey) } + override val authUrl: String + get() = "https://${domain}" + + override val isAuthorized: Boolean + get() { + return context.cookieJar.getCookies(domain).any { + it.name.contains("wordpress_logged_in") + } + } + + override suspend fun getUsername(): String { + val body = webClient.httpGet("https://${domain}/").parseHtml().body() + return body.selectFirst(".c-user_name")?.text() + ?: run { + throw if (body.selectFirst("#loginform") != null) { + AuthRequiredException(source) + } else { + body.parseFailed("Cannot find username") + } + } + } + override val isMultipleTagsSupported = false override val availableSortOrders: Set = EnumSet.of( @@ -557,7 +582,8 @@ internal abstract class MadaraParser( val doc = webClient.httpGet(fullUrl).parseHtml() val chapterProtector = doc.getElementById("chapter-protector-data") if (chapterProtector == null) { - val root = doc.body().selectFirstOrThrow(selectBodyPage) + val root = doc.body().selectFirst(selectBodyPage) + ?: throw ParseException("No image found, try to log in", fullUrl) return root.select(selectPage).map { div -> val img = div.selectFirstOrThrow("img") val url = img.src()?.toRelativeUrl(domain) ?: div.parseFailed("Image src not found") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/MangaNinja.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/MangaNinja.kt new file mode 100644 index 00000000..9cacca2e --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/pt/MangaNinja.kt @@ -0,0 +1,12 @@ +package org.koitharu.kotatsu.parsers.site.madara.pt + +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.madara.MadaraParser + +@MangaSourceParser("MANGANINJA", "MangaNinja", "pt") +internal class MangaNinja(context: MangaLoaderContext) : + MadaraParser(context, MangaSource.MANGANINJA, "manganinja.com", 10) { + override val datePattern: String = "dd/MM/yyyy" +} diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/tr/GloryManga.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/tr/GloryManga.kt index f640d06e..0146d295 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/tr/GloryManga.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/tr/GloryManga.kt @@ -5,6 +5,7 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.site.madara.MadaraParser +//This source requires an account. @MangaSourceParser("GLORYMANGA", "GloryManga", "tr") internal class GloryManga(context: MangaLoaderContext) : MadaraParser(context, MangaSource.GLORYMANGA, "glorymanga.com", 18) { diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/tr/Grimelek.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/tr/Grimelek.kt new file mode 100644 index 00000000..bd7a9fbb --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/tr/Grimelek.kt @@ -0,0 +1,14 @@ +package org.koitharu.kotatsu.parsers.site.madara.tr + +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.madara.MadaraParser + +//This source requires an account. +@MangaSourceParser("GRIMELEK", "Grimelek", "tr") +internal class Grimelek(context: MangaLoaderContext) : + MadaraParser(context, MangaSource.GRIMELEK, "glorymanga.com", 20) { + override val datePattern = "d MMMM yyyy" + override val listUrl = "seri/" +} diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/tr/OpiaToon.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/tr/OpiaToon.kt new file mode 100644 index 00000000..d6da03e9 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/tr/OpiaToon.kt @@ -0,0 +1,13 @@ +package org.koitharu.kotatsu.parsers.site.madara.tr + +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.madara.MadaraParser + +//This source requires an account. +@MangaSourceParser("OPIATOON", "OpiaToon", "tr") +internal class OpiaToon(context: MangaLoaderContext) : + MadaraParser(context, MangaSource.OPIATOON, "opiatoon.biz", 20) { + override val datePattern = "d MMMM" +} diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/FreakScans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/FreakScans.kt index f02dffa3..9fe61058 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/FreakScans.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/FreakScans.kt @@ -1,10 +1,12 @@ package org.koitharu.kotatsu.parsers.site.mangareader.en +import org.koitharu.kotatsu.parsers.Broken 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 +@Broken @MangaSourceParser("FREAKSCANS", "FreakScans", "en") internal class FreakScans(context: MangaLoaderContext) : MangaReaderParser(context, MangaSource.FREAKSCANS, "freakscans.com", pageSize = 20, searchPageSize = 20) { diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/ManhwaFreak.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/ManhwaFreak.kt index aa37348e..cd00fa41 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/ManhwaFreak.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/ManhwaFreak.kt @@ -1,216 +1,10 @@ package org.koitharu.kotatsu.parsers.site.mangareader.en -import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser -import org.koitharu.kotatsu.parsers.util.* -import java.text.DateFormat -import java.text.SimpleDateFormat -import java.util.Calendar - -@MangaSourceParser("MANHWA_FREAK", "Manhwa-Freak.com", "en") +@MangaSourceParser("MANHWA_FREAK", "ManhwaFreak", "en") internal class ManhwaFreak(context: MangaLoaderContext) : - MangaReaderParser(context, MangaSource.MANHWA_FREAK, "manhwa-freak.com", pageSize = 0, searchPageSize = 10) { - - override val selectMangaList = ".listupd .lastest-serie" - override val selectMangaListImg = "img" - override val availableStates: Set = emptySet() - override val isMultipleTagsSupported = false - override val isTagsExclusionSupported = false - - override suspend fun getListPage(page: Int, filter: MangaListFilter?): List { - val url = buildString { - append("https://") - append(domain) - - when (filter) { - - is MangaListFilter.Search -> { - append("/page/") - append(page.toString()) - append("/?s=") - append(filter.query.urlEncoded()) - } - - is MangaListFilter.Advanced -> { - if (page > 1) { - return emptyList() - } - - if (filter.tags.isNotEmpty()) { - filter.tags.oneOrThrowIfMany()?.let { - append("/genres/?genre=") - append(it.key) - } - } else { - append(listUrl) - append("/?order=") - append( - when (filter.sortOrder) { - SortOrder.ALPHABETICAL -> "az" - SortOrder.NEWEST -> "new" - SortOrder.POPULARITY -> "views" - SortOrder.UPDATED -> "" - else -> "" - }, - ) - } - } - - null -> { - append(listUrl) - } - } - } - return parseMangaList(webClient.httpGet(url).parseHtml()) - } - - override suspend fun getAvailableTags(): Set { - val doc = webClient.httpGet("https://$domain/genres/").parseHtml() - return doc.select("ul.genre-list li a").mapNotNullToSet { a -> - val href = a.attr("href").substringAfterLast("=") - MangaTag( - key = href, - title = a.text(), - source = source, - ) - } - } - - override suspend fun getDetails(manga: Manga): Manga { - val docs = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml() - val dateFormat = SimpleDateFormat(datePattern, sourceLocale) - val chapters = docs.select("div.chapter-li a").mapChapters(reversed = true) { index, a -> - val url = a.attrAsRelativeUrl("href") - val dateText = a.selectFirst(".chapter-info p.new")?.text() ?: a.select(".chapter-info p")[1].text() - MangaChapter( - id = generateUid(url), - name = a.selectFirst(".chapter-info p:contains(Chapter)")?.text() ?: "Chapter ${index + 1}", - url = url, - number = index + 1f, - volume = 0, - scanlator = null, - uploadDate = if (dateText == "NEW") { - parseChapterDate( - dateFormat, - "today", - ) - } else { - parseChapterDate( - dateFormat, - dateText, - ) - }, - branch = null, - source = source, - ) - } - return parseInfo(docs, manga, chapters) - } - - override suspend fun parseInfo(docs: Document, manga: Manga, chapters: List): Manga { - val tagMap = getOrCreateTagMap() - val selectTag = docs.requireElementById("info").select("div:contains(Genre) > p:last-child").text().split(",") - val tags = selectTag.mapNotNullToSet { tagMap[it] } - val mangaState = docs.requireElementById("info").select("div:contains(Status) > p:last-child").text().let { - when (it) { - "Ongoing" -> MangaState.ONGOING - "Completed" -> MangaState.FINISHED - else -> null - } - } - val author = docs.requireElementById("info").select("div:contains(Author(s)) > p:last-child").text() - return manga.copy( - altTitle = docs.requireElementById("info").select("div:contains(Alternative) > p:last-child").text(), - description = docs.requireElementById("summary").html(), - state = mangaState, - author = author, - isNsfw = manga.isNsfw, - tags = tags, - chapters = chapters, - ) - } - - private fun parseChapterDate(dateFormat: DateFormat, date: String?): Long { - // Clean date (e.g. 5th December 2019 to 5 December 2019) before parsing it - val d = date?.lowercase() ?: return 0 - return when { - d.endsWith(" ago") -> parseRelativeDate(date) - // Handle 'yesterday' and 'today', using midnight - d.startsWith("year") -> Calendar.getInstance().apply { - add(Calendar.DAY_OF_MONTH, -1) // yesterday - set(Calendar.HOUR_OF_DAY, 0) - set(Calendar.MINUTE, 0) - set(Calendar.SECOND, 0) - set(Calendar.MILLISECOND, 0) - }.timeInMillis - - d.startsWith("today") -> Calendar.getInstance().apply { - set(Calendar.HOUR_OF_DAY, 0) - set(Calendar.MINUTE, 0) - set(Calendar.SECOND, 0) - set(Calendar.MILLISECOND, 0) - }.timeInMillis - - date.contains(Regex("""\d(st|nd|rd|th)""")) -> date.split(" ").map { - if (it.contains(Regex("""\d\D\D"""))) { - it.replace(Regex("""\D"""), "") - } else { - it - } - }.let { dateFormat.tryParse(it.joinToString(" ")) } - - else -> dateFormat.tryParse(date) - } - } - - // Parses dates in this form: - // 21 hours ago - private fun parseRelativeDate(date: String): Long { - val number = Regex("""(\d+)""").find(date)?.value?.toIntOrNull() ?: return 0 - val cal = Calendar.getInstance() - return when { - WordSet( - "day", - "days", - "d", - ).anyWordIn(date) -> cal.apply { add(Calendar.DAY_OF_MONTH, -number) }.timeInMillis - - WordSet( - "hour", - "hours", - "h", - ).anyWordIn(date) -> cal.apply { - add( - Calendar.HOUR, - -number, - ) - }.timeInMillis - - WordSet( - "minute", - "minutes", - "mins", - ).anyWordIn(date) -> cal.apply { - add( - Calendar.MINUTE, - -number, - ) - }.timeInMillis - - WordSet("second").anyWordIn(date) -> cal.apply { - add( - Calendar.SECOND, - -number, - ) - }.timeInMillis - - WordSet("month", "months").anyWordIn(date) -> cal.apply { add(Calendar.MONTH, -number) }.timeInMillis - WordSet("year").anyWordIn(date) -> cal.apply { add(Calendar.YEAR, -number) }.timeInMillis - else -> 0 - } - } -} + MangaReaderParser(context, MangaSource.MANHWA_FREAK, "manhwafreak.site", pageSize = 20, searchPageSize = 10) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/es/MangaDoor.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/es/MangaDoor.kt index 727f748a..6139b0ba 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/es/MangaDoor.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/es/MangaDoor.kt @@ -1,11 +1,13 @@ package org.koitharu.kotatsu.parsers.site.mmrcms.es +import org.koitharu.kotatsu.parsers.Broken 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.mmrcms.MmrcmsParser import java.util.Locale +@Broken @MangaSourceParser("MANGADOOR", "MangaDoor", "es") internal class MangaDoor(context: MangaLoaderContext) : MmrcmsParser(context, MangaSource.MANGADOOR, "mangadoor.com") { diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/BrMangas.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/BrMangas.kt index abf5bcfb..41cbc078 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/BrMangas.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/BrMangas.kt @@ -1,6 +1,7 @@ package org.koitharu.kotatsu.parsers.site.pt import okhttp3.Headers +import org.koitharu.kotatsu.parsers.Broken import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.PagedMangaParser @@ -10,6 +11,7 @@ import org.koitharu.kotatsu.parsers.network.UserAgents import org.koitharu.kotatsu.parsers.util.* import java.util.* +@Broken @MangaSourceParser("BRMANGAS", "BrMangas", "pt") internal class BrMangas(context: MangaLoaderContext) : PagedMangaParser(context, MangaSource.BRMANGAS, 25) { From 426c7ad7089f88d679190a8fcfaa3ba439c656e6 Mon Sep 17 00:00:00 2001 From: SBS123 <161339329+OtakuArab@users.noreply.github.com> Date: Fri, 12 Jul 2024 12:32:03 +0300 Subject: [PATCH 25/25] Update Normoyun.kt --- .../koitharu/kotatsu/parsers/site/mangareader/ar/Normoyun.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/ar/Normoyun.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/ar/Normoyun.kt index 542c1d76..f0b51ea5 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/ar/Normoyun.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/ar/Normoyun.kt @@ -10,7 +10,7 @@ import java.text.SimpleDateFormat @MangaSourceParser("NORMOYUN", "Normoyun", "ar") internal class Normoyun(context: MangaLoaderContext) : - MangaReaderParser(context, MangaSource.NORMOYUN, "normoyun.com", pageSize = 42, searchPageSize = 39) { + MangaReaderParser(context, MangaSource.NORMOYUN, "t1manga.com", pageSize = 42, searchPageSize = 39) { override val datePattern = "MMMM dd, yyyy" override val selectMangaList = ".listupd .bs .bsx"