New Template GuyaParser
Add DankeFursLesen, GuyaCubari, Hachirumi, MahouShoujobu, Olaoe Add local on sources GattsuParserpull/428/head
parent
a5219ceb6c
commit
edc07b5dbd
@ -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…
Reference in New Issue