From edc07b5dbd64526edd6cac194cbc23e3a85243dc Mon Sep 17 00:00:00 2001 From: devi Date: Sun, 24 Dec 2023 12:00:06 +0100 Subject: [PATCH] New Template GuyaParser Add DankeFursLesen, GuyaCubari, Hachirumi, MahouShoujobu, Olaoe Add local on sources GattsuParser --- .../parsers/site/gattsu/pt/HentaiSeason.kt | 2 +- .../parsers/site/gattsu/pt/HentaiTokyo.kt | 2 +- .../site/gattsu/pt/MundoHentaiOficial.kt | 2 +- .../parsers/site/gattsu/pt/UniversoHentai.kt | 2 +- .../kotatsu/parsers/site/guya/GuyaParser.kt | 131 ++++++++++++++++++ .../parsers/site/guya/all/MahouShoujobu.kt | 10 ++ .../kotatsu/parsers/site/guya/en/Danke.kt | 10 ++ .../parsers/site/guya/en/GuyaCubari.kt | 10 ++ .../kotatsu/parsers/site/guya/en/Hachirumi.kt | 11 ++ .../kotatsu/parsers/site/madara/ar/Olaoe.kt | 14 ++ 10 files changed, 190 insertions(+), 4 deletions(-) create mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/guya/GuyaParser.kt create mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/guya/all/MahouShoujobu.kt create mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/guya/en/Danke.kt create mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/guya/en/GuyaCubari.kt create mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/guya/en/Hachirumi.kt create mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/ar/Olaoe.kt diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/gattsu/pt/HentaiSeason.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/gattsu/pt/HentaiSeason.kt index c58f23e5..5589ea89 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/gattsu/pt/HentaiSeason.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/gattsu/pt/HentaiSeason.kt @@ -6,6 +6,6 @@ import org.koitharu.kotatsu.parsers.model.ContentType import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.site.gattsu.GattsuParser -@MangaSourceParser("HENTAISEASON", "HentaiSeason", type = ContentType.HENTAI) +@MangaSourceParser("HENTAISEASON", "HentaiSeason", "pt", ContentType.HENTAI) internal class HentaiSeason(context: MangaLoaderContext) : GattsuParser(context, MangaSource.HENTAISEASON, "hentaiseason.com") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/gattsu/pt/HentaiTokyo.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/gattsu/pt/HentaiTokyo.kt index 614f272e..febe8c2f 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/gattsu/pt/HentaiTokyo.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/gattsu/pt/HentaiTokyo.kt @@ -6,7 +6,7 @@ import org.koitharu.kotatsu.parsers.model.ContentType import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.site.gattsu.GattsuParser -@MangaSourceParser("HENTAITOKYO", "HentaiTokyo", type = ContentType.HENTAI) +@MangaSourceParser("HENTAITOKYO", "HentaiTokyo", "pt", ContentType.HENTAI) internal class HentaiTokyo(context: MangaLoaderContext) : GattsuParser(context, MangaSource.HENTAITOKYO, "hentaitokyo.net") { override val tagUrl = "tags" diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/gattsu/pt/MundoHentaiOficial.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/gattsu/pt/MundoHentaiOficial.kt index bdb95dce..e187ec7a 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/gattsu/pt/MundoHentaiOficial.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/gattsu/pt/MundoHentaiOficial.kt @@ -14,7 +14,7 @@ import org.koitharu.kotatsu.parsers.util.generateUid import org.koitharu.kotatsu.parsers.util.selectLastOrThrow import org.koitharu.kotatsu.parsers.util.src -@MangaSourceParser("MUNDOHENTAIOFICIAL", "MundoHentaiOficial", type = ContentType.HENTAI) +@MangaSourceParser("MUNDOHENTAIOFICIAL", "MundoHentaiOficial", "pt", ContentType.HENTAI) internal class MundoHentaiOficial(context: MangaLoaderContext) : GattsuParser(context, MangaSource.MUNDOHENTAIOFICIAL, "mundohentaioficial.com") { diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/gattsu/pt/UniversoHentai.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/gattsu/pt/UniversoHentai.kt index 1133b0d8..f728442d 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/gattsu/pt/UniversoHentai.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/gattsu/pt/UniversoHentai.kt @@ -11,7 +11,7 @@ import org.koitharu.kotatsu.parsers.model.MangaTag import org.koitharu.kotatsu.parsers.site.gattsu.GattsuParser import org.koitharu.kotatsu.parsers.util.* -@MangaSourceParser("UNIVERSOHENTAI", "UniversoHentai", type = ContentType.HENTAI) +@MangaSourceParser("UNIVERSOHENTAI", "UniversoHentai", "pt", ContentType.HENTAI) internal class UniversoHentai(context: MangaLoaderContext) : GattsuParser(context, MangaSource.UNIVERSOHENTAI, "universohentai.com") { 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 new file mode 100644 index 00000000..66f59eef --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/guya/GuyaParser.kt @@ -0,0 +1,131 @@ +package org.koitharu.kotatsu.parsers.site.guya + +import org.json.JSONObject +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.util.* + +internal abstract class GuyaParser( + context: MangaLoaderContext, + source: MangaSource, + domain: String, + pageSize: Int = 0, +) : PagedMangaParser(context, source, pageSize) { + + override val availableSortOrders: Set = EnumSet.of(SortOrder.ALPHABETICAL) + + override val configKeyDomain = ConfigKey.Domain(domain) + + override suspend fun getListPage(page: Int, filter: MangaListFilter?): List { + if (page > 1) return emptyList() + val url = buildString { + append("https://") + append(domain) + append("/api/get_all_series/") + } + when (filter) { + + is MangaListFilter.Search -> { + return parseMangaList(webClient.httpGet(url).parseJson(), filter.query) + } + + is MangaListFilter.Advanced -> {} + + null -> {} + } + + return parseMangaList(webClient.httpGet(url).parseJson(), "") + } + + protected open fun parseMangaList(json: JSONObject, query: String): List { + val manga = ArrayList(json.length()) + val keys: Iterator = json.keys() + while (keys.hasNext()) { + val key = keys.next() + if (json.get(key) is JSONObject) { + if (query.isNotEmpty()) { + if (key.lowercase().contains(query.lowercase())) manga.add(addManga(json.getJSONObject(key), key)) + } else manga.add(addManga(json.getJSONObject(key), key)) + } + } + return manga + } + + private fun addManga(j: JSONObject, name: String): Manga { + val url = "https://$domain/read/manga/" + j.getString("slug") + val apiUrl = "https://$domain/api/series/" + j.getString("slug") + return Manga( + id = generateUid(apiUrl), + url = apiUrl, + publicUrl = url, + title = name, + coverUrl = j.getString("cover").toAbsoluteUrl(domain), + altTitle = null, + rating = RATING_UNKNOWN, + tags = emptySet(), + description = j.getString("description"), + state = null, + author = j.getString("author"), + isNsfw = isNsfwSource, + source = source, + ) + } + + override suspend fun getAvailableTags(): Set = emptySet() + + override suspend fun getDetails(manga: Manga): Manga { + val json = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseJson().getJSONObject("chapters") + val slug = manga.url.removeSuffix('/').substringAfterLast('/') + val keys: Iterator = json.keys() + val chapters = ArrayList() + var i = 0 + while (keys.hasNext()) { + val key = keys.next() + ++i + val chapter = json.getJSONObject(key) + val url = "https://$domain/api/series/$slug/$key" + chapters.add( + MangaChapter( + id = generateUid(url), + name = chapter.getString("title"), + number = i, + url = url, + scanlator = null, + uploadDate = 0, + branch = null, + source = source, + ), + ) + } + return manga.copy(chapters = chapters) + } + + override suspend fun getPages(chapter: MangaChapter): List { + val key = chapter.url.substringAfterLast('/') + val url = chapter.url.substringBeforeLast('/') + val slug = url.substringAfterLast('/') + val chapterPages = webClient.httpGet(url.toAbsoluteUrl(domain)).parseJson() + .getJSONObject("chapters").getJSONObject(key) + val images = chapterPages.getJSONObject("groups") + val folder = chapterPages.getString("folder") + val keysPages: Iterator = images.keys() + val firstKey = keysPages.next() + val jsonPages = images.getJSONArray(firstKey) + val pages = ArrayList(jsonPages.length()) + for (i in 0 until jsonPages.length()) { + val urlPage = "https://$domain/media/manga/$slug/chapters/$folder/$firstKey/" + jsonPages.getString(i) + pages.add( + MangaPage( + id = generateUid(urlPage), + url = urlPage, + preview = null, + source = source, + ), + ) + } + return pages + } +} diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/guya/all/MahouShoujobu.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/guya/all/MahouShoujobu.kt new file mode 100644 index 00000000..bfbdf762 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/guya/all/MahouShoujobu.kt @@ -0,0 +1,10 @@ +package org.koitharu.kotatsu.parsers.site.guya.all + +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.guya.GuyaParser + +@MangaSourceParser("MAHOUSHOUJOBU", "MahouShoujobu") +internal class MahouShoujobu(context: MangaLoaderContext) : + GuyaParser(context, MangaSource.MAHOUSHOUJOBU, "mahoushoujobu.com") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/guya/en/Danke.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/guya/en/Danke.kt new file mode 100644 index 00000000..80fe6fda --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/guya/en/Danke.kt @@ -0,0 +1,10 @@ +package org.koitharu.kotatsu.parsers.site.guya.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.guya.GuyaParser + +@MangaSourceParser("DANKE", "DankeFursLesen", "en") +internal class Danke(context: MangaLoaderContext) : + GuyaParser(context, MangaSource.DANKE, "danke.moe") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/guya/en/GuyaCubari.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/guya/en/GuyaCubari.kt new file mode 100644 index 00000000..6dff7ee6 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/guya/en/GuyaCubari.kt @@ -0,0 +1,10 @@ +package org.koitharu.kotatsu.parsers.site.guya.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.guya.GuyaParser + +@MangaSourceParser("GUYACUBARI", "GuyaCubari", "en") +internal class GuyaCubari(context: MangaLoaderContext) : + GuyaParser(context, MangaSource.GUYACUBARI, "guya.cubari.moe") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/guya/en/Hachirumi.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/guya/en/Hachirumi.kt new file mode 100644 index 00000000..42625374 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/guya/en/Hachirumi.kt @@ -0,0 +1,11 @@ +package org.koitharu.kotatsu.parsers.site.guya.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.guya.GuyaParser + +@MangaSourceParser("HACHIRUMI", "Hachirumi", "en", ContentType.HENTAI) +internal class Hachirumi(context: MangaLoaderContext) : + GuyaParser(context, MangaSource.HACHIRUMI, "hachirumi.com") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/ar/Olaoe.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/ar/Olaoe.kt new file mode 100644 index 00000000..f8ddc69e --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/ar/Olaoe.kt @@ -0,0 +1,14 @@ +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("OLAOE", "Olaoe", "ar") +internal class Olaoe(context: MangaLoaderContext) : + MadaraParser(context, MangaSource.OLAOE, "olaoe.cyou") { + override val datePattern = "dd-MM-yyyy" + override val tagPrefix = "/شوجو" + override val listUrl = "works/" +}