New Template GuyaParser

Add DankeFursLesen, GuyaCubari, Hachirumi, MahouShoujobu, Olaoe
Add local on sources GattsuParser
pull/428/head
devi 2 years ago
parent a5219ceb6c
commit edc07b5dbd

@ -6,6 +6,6 @@ import org.koitharu.kotatsu.parsers.model.ContentType
import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.gattsu.GattsuParser 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) : internal class HentaiSeason(context: MangaLoaderContext) :
GattsuParser(context, MangaSource.HENTAISEASON, "hentaiseason.com") GattsuParser(context, MangaSource.HENTAISEASON, "hentaiseason.com")

@ -6,7 +6,7 @@ import org.koitharu.kotatsu.parsers.model.ContentType
import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.gattsu.GattsuParser 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) : internal class HentaiTokyo(context: MangaLoaderContext) :
GattsuParser(context, MangaSource.HENTAITOKYO, "hentaitokyo.net") { GattsuParser(context, MangaSource.HENTAITOKYO, "hentaitokyo.net") {
override val tagUrl = "tags" override val tagUrl = "tags"

@ -14,7 +14,7 @@ import org.koitharu.kotatsu.parsers.util.generateUid
import org.koitharu.kotatsu.parsers.util.selectLastOrThrow import org.koitharu.kotatsu.parsers.util.selectLastOrThrow
import org.koitharu.kotatsu.parsers.util.src import org.koitharu.kotatsu.parsers.util.src
@MangaSourceParser("MUNDOHENTAIOFICIAL", "MundoHentaiOficial", type = ContentType.HENTAI) @MangaSourceParser("MUNDOHENTAIOFICIAL", "MundoHentaiOficial", "pt", ContentType.HENTAI)
internal class MundoHentaiOficial(context: MangaLoaderContext) : internal class MundoHentaiOficial(context: MangaLoaderContext) :
GattsuParser(context, MangaSource.MUNDOHENTAIOFICIAL, "mundohentaioficial.com") { GattsuParser(context, MangaSource.MUNDOHENTAIOFICIAL, "mundohentaioficial.com") {

@ -11,7 +11,7 @@ import org.koitharu.kotatsu.parsers.model.MangaTag
import org.koitharu.kotatsu.parsers.site.gattsu.GattsuParser import org.koitharu.kotatsu.parsers.site.gattsu.GattsuParser
import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.*
@MangaSourceParser("UNIVERSOHENTAI", "UniversoHentai", type = ContentType.HENTAI) @MangaSourceParser("UNIVERSOHENTAI", "UniversoHentai", "pt", ContentType.HENTAI)
internal class UniversoHentai(context: MangaLoaderContext) : internal class UniversoHentai(context: MangaLoaderContext) :
GattsuParser(context, MangaSource.UNIVERSOHENTAI, "universohentai.com") { GattsuParser(context, MangaSource.UNIVERSOHENTAI, "universohentai.com") {

@ -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<SortOrder> = EnumSet.of(SortOrder.ALPHABETICAL)
override val configKeyDomain = ConfigKey.Domain(domain)
override suspend fun getListPage(page: Int, filter: MangaListFilter?): List<Manga> {
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<Manga> {
val manga = ArrayList<Manga>(json.length())
val keys: Iterator<String> = 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<MangaTag> = 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<String> = json.keys()
val chapters = ArrayList<MangaChapter>()
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<MangaPage> {
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<String> = images.keys()
val firstKey = keysPages.next()
val jsonPages = images.getJSONArray(firstKey)
val pages = ArrayList<MangaPage>(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
}
}

@ -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")

@ -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")

@ -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")

@ -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")

@ -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/"
}
Loading…
Cancel
Save