Update ZeistManga and add some sources (#15426)
* Update ZeistManga and add some sources * Remove status from Tooncubus * Linting * Linting * More Linting * Miskey in import * I hope it's the last
|
@ -0,0 +1,7 @@
|
||||||
|
package eu.kanade.tachiyomi.extension.id.asupankomik
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistManga
|
||||||
|
|
||||||
|
class AsupanKomik : ZeistManga("Asupan Komik", "https://www.asupankomik.my.id", "id") {
|
||||||
|
override val hasFilters = true
|
||||||
|
}
|
After Width: | Height: | Size: 5.0 KiB |
After Width: | Height: | Size: 2.8 KiB |
After Width: | Height: | Size: 6.7 KiB |
After Width: | Height: | Size: 12 KiB |
After Width: | Height: | Size: 18 KiB |
After Width: | Height: | Size: 90 KiB |
|
@ -1,14 +1,17 @@
|
||||||
package eu.kanade.tachiyomi.extension.es.datgarscanlation
|
package eu.kanade.tachiyomi.extension.es.datgarscanlation
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.multisrc.zeistmanga.Language
|
||||||
import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistManga
|
import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistManga
|
||||||
import org.jsoup.nodes.Document
|
import org.jsoup.nodes.Document
|
||||||
|
|
||||||
class DatGarScanlation : ZeistManga("DatGarScanlation", "https://datgarscanlation.blogspot.com", "es") {
|
class DatGarScanlation : ZeistManga("DatGarScanlation", "https://datgarscanlation.blogspot.com", "es") {
|
||||||
|
|
||||||
|
override val hasFilters = true
|
||||||
|
|
||||||
private val altChapterFeedRegex = """label\s*=\s*'([^']+)'""".toRegex()
|
private val altChapterFeedRegex = """label\s*=\s*'([^']+)'""".toRegex()
|
||||||
private val altScriptSelector = "#latest > script"
|
private val altScriptSelector = "#latest > script"
|
||||||
|
|
||||||
override fun getChaptersUrl(doc: Document): String {
|
override fun getApiUrl(doc: Document): String {
|
||||||
var chapterRegex = chapterFeedRegex
|
var chapterRegex = chapterFeedRegex
|
||||||
var script = doc.selectFirst(scriptSelector)
|
var script = doc.selectFirst(scriptSelector)
|
||||||
|
|
||||||
|
@ -29,4 +32,8 @@ class DatGarScanlation : ZeistManga("DatGarScanlation", "https://datgarscanlatio
|
||||||
|
|
||||||
return url.toString()
|
return url.toString()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun getLanguageList(): List<Language> = listOf(
|
||||||
|
Language(intl.all, ""),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
After Width: | Height: | Size: 7.4 KiB |
After Width: | Height: | Size: 3.9 KiB |
After Width: | Height: | Size: 11 KiB |
After Width: | Height: | Size: 22 KiB |
After Width: | Height: | Size: 36 KiB |
After Width: | Height: | Size: 246 KiB |
|
@ -0,0 +1,53 @@
|
||||||
|
package eu.kanade.tachiyomi.extension.ar.hijala
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.multisrc.zeistmanga.Genre
|
||||||
|
import eu.kanade.tachiyomi.multisrc.zeistmanga.Language
|
||||||
|
import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistManga
|
||||||
|
|
||||||
|
class Hijala : ZeistManga("Hijala", "https://hijala.blogspot.com", "ar") {
|
||||||
|
|
||||||
|
override val hasFilters = true
|
||||||
|
|
||||||
|
override fun getLanguageList(): List<Language> = listOf(
|
||||||
|
Language(intl.all, ""),
|
||||||
|
)
|
||||||
|
|
||||||
|
override fun getGenreList(): List<Genre> = listOf(
|
||||||
|
Genre("أكشن", "Action"),
|
||||||
|
Genre("أثارة", "Thriller"),
|
||||||
|
Genre("أتشي", "Ecchi"),
|
||||||
|
Genre("حياة مدرسية", "School Life"),
|
||||||
|
Genre("تاريخي", "Historical"),
|
||||||
|
Genre("ألعاب", "Game"),
|
||||||
|
Genre("خيال علمي", "Sci-Fi"),
|
||||||
|
Genre("خيال", "Fantasy"),
|
||||||
|
Genre("خارق للطبيعة", "Supernatural"),
|
||||||
|
Genre("رومانسي", "Romance"),
|
||||||
|
Genre("رعب", "Horror"),
|
||||||
|
Genre("دراما", "Drama"),
|
||||||
|
Genre("سينين", "Seinen"),
|
||||||
|
Genre("سحري", "Magic"),
|
||||||
|
Genre("رياضي", "Sports"),
|
||||||
|
Genre("شونين", "Shounen"),
|
||||||
|
Genre("شوجو", "Shoujo"),
|
||||||
|
Genre("شريحة من الحياة", "Slice of Life"),
|
||||||
|
Genre("علاجي", "Medical"),
|
||||||
|
Genre("عسكري", "Military"),
|
||||||
|
Genre("طبخ", "Cooking"),
|
||||||
|
Genre("فنون قتال", "Martial Arts"),
|
||||||
|
Genre("غموض", "Mystery"),
|
||||||
|
Genre("عوالم متعددة", "Isekai"),
|
||||||
|
Genre("مانها", "مانها"),
|
||||||
|
Genre("مأساوي", "Tragedy"),
|
||||||
|
Genre("كوميديا", "Comedy"),
|
||||||
|
Genre("مغامرات", "Adventure"),
|
||||||
|
Genre("مصاص دماء", "مصاص دماء"),
|
||||||
|
Genre("مانهوا", "مانهوا"),
|
||||||
|
Genre("موسيقي", "موسيقي"),
|
||||||
|
Genre("موسيقى", "Music"),
|
||||||
|
Genre("مغامرات", "مغامرات"),
|
||||||
|
Genre("نفسي", "نفسي"),
|
||||||
|
Genre("نفسي", "Psychological"),
|
||||||
|
Genre("ميكا", "ميكا"),
|
||||||
|
)
|
||||||
|
}
|
After Width: | Height: | Size: 4.7 KiB |
After Width: | Height: | Size: 2.6 KiB |
After Width: | Height: | Size: 6.8 KiB |
After Width: | Height: | Size: 13 KiB |
After Width: | Height: | Size: 20 KiB |
After Width: | Height: | Size: 121 KiB |
|
@ -0,0 +1,16 @@
|
||||||
|
package eu.kanade.tachiyomi.extension.id.klmanhua
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.multisrc.zeistmanga.Language
|
||||||
|
import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistManga
|
||||||
|
|
||||||
|
class KLManhua : ZeistManga("KLManhua", "https://klmanhua.blogspot.com", "id") {
|
||||||
|
|
||||||
|
override val hasFilters = true
|
||||||
|
|
||||||
|
override fun getLanguageList(): List<Language> = listOf(
|
||||||
|
Language(intl.all, ""),
|
||||||
|
)
|
||||||
|
|
||||||
|
override val imgSelector = "a[href]"
|
||||||
|
override val imgSelectorAttr = "href"
|
||||||
|
}
|
|
@ -1,22 +1,38 @@
|
||||||
package eu.kanade.tachiyomi.extension.ar.mangaailand
|
package eu.kanade.tachiyomi.extension.ar.mangaailand
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.multisrc.zeistmanga.Genre
|
||||||
|
import eu.kanade.tachiyomi.multisrc.zeistmanga.Language
|
||||||
import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistManga
|
import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistManga
|
||||||
import org.jsoup.nodes.Document
|
|
||||||
|
|
||||||
class MangaAiLand : ZeistManga("Manga Ai Land", "https://manga-ai-land.blogspot.com", "ar") {
|
class MangaAiLand : ZeistManga("Manga Ai Land", "https://manga-ai-land.blogspot.com", "ar") {
|
||||||
|
|
||||||
override val chapterFeedRegex = """([^']+)\?""".toRegex()
|
override val hasFilters = true
|
||||||
override val scriptSelector = "#myUL > script"
|
|
||||||
override val imgSelector = "a[href]"
|
override val imgSelector = "a[href]"
|
||||||
override val imgSelectorAttr = "href"
|
override val imgSelectorAttr = "href"
|
||||||
|
|
||||||
override fun getChaptersUrl(doc: Document): String {
|
override fun getLanguageList(): List<Language> = listOf(
|
||||||
val script = doc.selectFirst(scriptSelector)!!.attr("src")
|
Language(intl.all, ""),
|
||||||
val feed = chapterFeedRegex
|
)
|
||||||
.find(script)
|
|
||||||
?.groupValues?.get(1)
|
|
||||||
?: throw Exception("Failed to find chapter feed")
|
|
||||||
|
|
||||||
return "$baseUrl" + feed + "?alt=json&start-index=2&max-results=999999"
|
override fun getGenreList(): List<Genre> = listOf(
|
||||||
}
|
Genre("تراجيدي", "تراجيدي"),
|
||||||
|
Genre("تاريخي", "تاريخي"),
|
||||||
|
Genre("أكشن", "أكشن"),
|
||||||
|
Genre("خيالي", "خيالي"),
|
||||||
|
Genre("جيشي", "جيشي"),
|
||||||
|
Genre("تشويق", "تشويق"),
|
||||||
|
Genre("سينين", "سينين"),
|
||||||
|
Genre("سحري", "سحري"),
|
||||||
|
Genre("دراما", "دراما"),
|
||||||
|
Genre("عصابات", "عصابات"),
|
||||||
|
Genre("عسكري", "عسكري"),
|
||||||
|
Genre("شونين", "شونين"),
|
||||||
|
Genre("مغامرة", "مغامرة"),
|
||||||
|
Genre("فنون قتالية", "فنون قتالية"),
|
||||||
|
Genre("غموض", "غموض"),
|
||||||
|
Genre("وحوش", "وحوش"),
|
||||||
|
Genre("نجاة", "نجاة"),
|
||||||
|
Genre("نفسي", "نفسي"),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
After Width: | Height: | Size: 6.7 KiB |
After Width: | Height: | Size: 3.5 KiB |
After Width: | Height: | Size: 11 KiB |
After Width: | Height: | Size: 21 KiB |
After Width: | Height: | Size: 33 KiB |
After Width: | Height: | Size: 241 KiB |
|
@ -0,0 +1,13 @@
|
||||||
|
package eu.kanade.tachiyomi.extension.es.muslosnosekai
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.multisrc.zeistmanga.Language
|
||||||
|
import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistManga
|
||||||
|
|
||||||
|
class MuslosNoSekai : ZeistManga("Muslos No Sekai", "https://muslosnosekai.blogspot.com", "es") {
|
||||||
|
|
||||||
|
override val hasFilters = true
|
||||||
|
|
||||||
|
override fun getLanguageList(): List<Language> = listOf(
|
||||||
|
Language(intl.all, ""),
|
||||||
|
)
|
||||||
|
}
|
After Width: | Height: | Size: 4.9 KiB |
After Width: | Height: | Size: 2.7 KiB |
After Width: | Height: | Size: 6.8 KiB |
After Width: | Height: | Size: 12 KiB |
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 97 KiB |
|
@ -0,0 +1,11 @@
|
||||||
|
package eu.kanade.tachiyomi.extension.id.noromax
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistManga
|
||||||
|
|
||||||
|
class Noromax : ZeistManga("Noromax", "https://www.noromax.xyz", "id") {
|
||||||
|
|
||||||
|
override val hasFilters = true
|
||||||
|
|
||||||
|
override val imgSelector = "a[href]"
|
||||||
|
override val imgSelectorAttr = "href"
|
||||||
|
}
|
After Width: | Height: | Size: 5.7 KiB |
After Width: | Height: | Size: 3.0 KiB |
After Width: | Height: | Size: 8.8 KiB |
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 27 KiB |
After Width: | Height: | Size: 172 KiB |
|
@ -0,0 +1,16 @@
|
||||||
|
package eu.kanade.tachiyomi.extension.id.shiyurasub
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.multisrc.zeistmanga.Language
|
||||||
|
import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistManga
|
||||||
|
|
||||||
|
class ShiyuraSub : ZeistManga("ShiyuraSub", "https://shiyurasub.blogspot.com", "id") {
|
||||||
|
|
||||||
|
override val hasFilters = true
|
||||||
|
|
||||||
|
override val imgSelector = "a[href]"
|
||||||
|
override val imgSelectorAttr = "href"
|
||||||
|
|
||||||
|
override fun getLanguageList(): List<Language> = listOf(
|
||||||
|
Language(intl.all, ""),
|
||||||
|
)
|
||||||
|
}
|
After Width: | Height: | Size: 8.8 KiB |
After Width: | Height: | Size: 4.5 KiB |
After Width: | Height: | Size: 14 KiB |
After Width: | Height: | Size: 26 KiB |
After Width: | Height: | Size: 42 KiB |
After Width: | Height: | Size: 279 KiB |
|
@ -0,0 +1,34 @@
|
||||||
|
package eu.kanade.tachiyomi.extension.id.tooncubus
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistManga
|
||||||
|
import eu.kanade.tachiyomi.network.GET
|
||||||
|
import eu.kanade.tachiyomi.source.model.SChapter
|
||||||
|
import eu.kanade.tachiyomi.source.model.SManga
|
||||||
|
import eu.kanade.tachiyomi.util.asJsoup
|
||||||
|
import okhttp3.Response
|
||||||
|
import org.jsoup.nodes.Document
|
||||||
|
|
||||||
|
class Tooncubus : ZeistManga("Tooncubus", "https://www.tooncubus.site", "id") {
|
||||||
|
|
||||||
|
override fun chapterListParse(response: Response): List<SChapter> {
|
||||||
|
return response.asJsoup().selectFirst("ul.series-chapterlist")!!.select("div.flexch-infoz").map { element ->
|
||||||
|
SChapter.create().apply {
|
||||||
|
name = element.select("span")!!.text()
|
||||||
|
url = element.select("a").attr("href") // The website uses another domain for reading
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun pageListRequest(chapter: SChapter) = GET(chapter.url, headers)
|
||||||
|
|
||||||
|
override fun getChapterUrl(chapter: SChapter) = chapter.url
|
||||||
|
|
||||||
|
override fun mangaDetailsParse(document: Document): SManga {
|
||||||
|
val profileManga = document.selectFirst(".grid.gtc-235fr")!!
|
||||||
|
return SManga.create().apply {
|
||||||
|
thumbnail_url = profileManga.selectFirst("img")!!.attr("src")
|
||||||
|
genre = profileManga.select("div.mt-15 > a[rel=tag]")
|
||||||
|
.joinToString { it.text() }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -29,13 +29,29 @@ abstract class ZeistManga(
|
||||||
open val hasFilters = false
|
open val hasFilters = false
|
||||||
protected val json: Json by injectLazy()
|
protected val json: Json by injectLazy()
|
||||||
protected val intl by lazy { ZeistMangaIntl(lang) }
|
protected val intl by lazy { ZeistMangaIntl(lang) }
|
||||||
|
|
||||||
open val chapterFeedRegex = """clwd\.run\('([^']+)'""".toRegex()
|
open val chapterFeedRegex = """clwd\.run\('([^']+)'""".toRegex()
|
||||||
open val scriptSelector = "#clwd > script"
|
open val scriptSelector = "#clwd > script"
|
||||||
|
|
||||||
|
open val oldChapterFeedRegex = """([^']+)\?""".toRegex()
|
||||||
|
open val oldScriptSelector = "#myUL > script"
|
||||||
|
|
||||||
open val imgSelector = "img[src]"
|
open val imgSelector = "img[src]"
|
||||||
open val imgSelectorAttr = "src"
|
open val imgSelectorAttr = "src"
|
||||||
|
|
||||||
open fun getChaptersUrl(doc: Document): String {
|
open fun getApiUrl(doc: Document): String {
|
||||||
val script = doc.selectFirst(scriptSelector)!!
|
val script = doc.selectFirst(scriptSelector)
|
||||||
|
|
||||||
|
if (script == null) {
|
||||||
|
val altScript = doc.selectFirst(oldScriptSelector)!!.attr("src")
|
||||||
|
val feed = oldChapterFeedRegex
|
||||||
|
.find(altScript)
|
||||||
|
?.groupValues?.get(1)
|
||||||
|
?: throw Exception("Failed to find chapter feed")
|
||||||
|
|
||||||
|
return "$baseUrl$feed?alt=json&start-index=2&max-results=999999"
|
||||||
|
}
|
||||||
|
|
||||||
val feed = chapterFeedRegex
|
val feed = chapterFeedRegex
|
||||||
.find(script.html())
|
.find(script.html())
|
||||||
?.groupValues?.get(1)
|
?.groupValues?.get(1)
|
||||||
|
@ -50,7 +66,7 @@ abstract class ZeistManga(
|
||||||
override fun chapterListParse(response: Response): List<SChapter> {
|
override fun chapterListParse(response: Response): List<SChapter> {
|
||||||
val document = response.asJsoup()
|
val document = response.asJsoup()
|
||||||
|
|
||||||
val url = getChaptersUrl(document)
|
val url = getApiUrl(document)
|
||||||
|
|
||||||
val req = GET(url, headers)
|
val req = GET(url, headers)
|
||||||
val res = client.newCall(req).execute()
|
val res = client.newCall(req).execute()
|
||||||
|
@ -121,10 +137,8 @@ abstract class ZeistManga(
|
||||||
override fun mangaDetailsParse(document: Document): SManga {
|
override fun mangaDetailsParse(document: Document): SManga {
|
||||||
val profileManga = document.selectFirst(".grid.gtc-235fr")!!
|
val profileManga = document.selectFirst(".grid.gtc-235fr")!!
|
||||||
return SManga.create().apply {
|
return SManga.create().apply {
|
||||||
title = profileManga.selectFirst("h1.mt-0.mb-6.fs-20")!!.text()
|
|
||||||
thumbnail_url = profileManga.selectFirst("img")!!.attr("src")
|
thumbnail_url = profileManga.selectFirst("img")!!.attr("src")
|
||||||
description = profileManga.select("#synopsis").text()
|
description = profileManga.select("#synopsis").text()
|
||||||
status = SManga.UNKNOWN
|
|
||||||
genre = profileManga.select("div.mt-15 > a[rel=tag]")
|
genre = profileManga.select("div.mt-15 > a[rel=tag]")
|
||||||
.joinToString { it.text() }
|
.joinToString { it.text() }
|
||||||
}
|
}
|
||||||
|
@ -150,6 +164,7 @@ abstract class ZeistManga(
|
||||||
mangalist.removeLast()
|
mangalist.removeLast()
|
||||||
return MangasPage(mangalist, true)
|
return MangasPage(mangalist, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
return MangasPage(mangalist, false)
|
return MangasPage(mangalist, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -230,20 +245,26 @@ abstract class ZeistManga(
|
||||||
|
|
||||||
// Theme Default Status
|
// Theme Default Status
|
||||||
protected open fun getStatusList(): List<Status> = listOf(
|
protected open fun getStatusList(): List<Status> = listOf(
|
||||||
Status(intl.statusAll, ""),
|
Status(intl.all, ""),
|
||||||
Status(intl.statusOngoing, "Ongoing"),
|
Status(intl.statusOngoing, "Ongoing"),
|
||||||
Status(intl.statusCompleted, "Completed"),
|
Status(intl.statusCompleted, "Completed"),
|
||||||
Status(intl.statusDropped, "Dropped"),
|
Status(intl.statusDropped, "Dropped"),
|
||||||
Status(intl.statusUpcoming, "Upcoming"),
|
Status(intl.statusUpcoming, "Upcoming"),
|
||||||
|
Status(intl.statusHiatus, "Hiatus"),
|
||||||
|
Status(intl.statusCancelled, "Cancelled"),
|
||||||
)
|
)
|
||||||
|
|
||||||
// Theme Default Types
|
// Theme Default Types
|
||||||
protected open fun getTypeList(): List<Type> = listOf(
|
protected open fun getTypeList(): List<Type> = listOf(
|
||||||
Type(intl.typeAll, ""),
|
Type(intl.all, ""),
|
||||||
Type(intl.typeManga, "Manga"),
|
Type(intl.typeManga, "Manga"),
|
||||||
Type(intl.typeManhua, "Manhua"),
|
Type(intl.typeManhua, "Manhua"),
|
||||||
Type(intl.typeManhwa, "Manhwa"),
|
Type(intl.typeManhwa, "Manhwa"),
|
||||||
Type(intl.typeNovel, "Novel"),
|
Type(intl.typeNovel, "Novel"),
|
||||||
|
Type(intl.typeWebNovelJP, "Web Novel (JP)"),
|
||||||
|
Type(intl.typeWebNovelKR, "Web Novel (KR)"),
|
||||||
|
Type(intl.typeWebNovelCN, "Web Novel (CN)"),
|
||||||
|
Type(intl.typeDoujinshi, "Doujinshi"),
|
||||||
)
|
)
|
||||||
|
|
||||||
// Theme Default Genres
|
// Theme Default Genres
|
||||||
|
@ -290,7 +311,7 @@ abstract class ZeistManga(
|
||||||
|
|
||||||
// Theme Default Languages
|
// Theme Default Languages
|
||||||
protected open fun getLanguageList(): List<Language> = listOf(
|
protected open fun getLanguageList(): List<Language> = listOf(
|
||||||
Language(intl.languageAll, ""),
|
Language(intl.all, ""),
|
||||||
Language("Indonesian", "Indonesian"),
|
Language("Indonesian", "Indonesian"),
|
||||||
Language("English", "English"),
|
Language("English", "English"),
|
||||||
)
|
)
|
||||||
|
|
|
@ -34,11 +34,16 @@ data class ZeistMangaEntryDto(
|
||||||
val category: List<ZeistMangaEntryCategory>? = emptyList(),
|
val category: List<ZeistMangaEntryCategory>? = emptyList(),
|
||||||
@SerialName("link") val url: List<ZeistMangaEntryLink>? = emptyList(),
|
@SerialName("link") val url: List<ZeistMangaEntryLink>? = emptyList(),
|
||||||
val content: ZeistMangaEntryContentDto? = null,
|
val content: ZeistMangaEntryContentDto? = null,
|
||||||
|
@SerialName("media\$thumbnail") val thumbnail: ZeistMangaEntryThumbnail? = null,
|
||||||
) {
|
) {
|
||||||
fun toSManga(baseurl: String): SManga = SManga.create().apply {
|
fun toSManga(baseurl: String): SManga = SManga.create().apply {
|
||||||
title = this@ZeistMangaEntryDto.title!!.t
|
title = this@ZeistMangaEntryDto.title!!.t
|
||||||
url = getChapterLink(this@ZeistMangaEntryDto.url!!).substringAfter(baseurl)
|
url = getChapterLink(this@ZeistMangaEntryDto.url!!).substringAfter(baseurl)
|
||||||
thumbnail_url = getThumbnail(this@ZeistMangaEntryDto.content!!)
|
thumbnail_url = if (this@ZeistMangaEntryDto.thumbnail == null) {
|
||||||
|
getThumbnailFromContent(this@ZeistMangaEntryDto.content!!)
|
||||||
|
} else {
|
||||||
|
getThumbnail(this@ZeistMangaEntryDto.thumbnail)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun toSChapter(baseurl: String): SChapter = SChapter.create().apply {
|
fun toSChapter(baseurl: String): SChapter = SChapter.create().apply {
|
||||||
|
@ -52,7 +57,12 @@ data class ZeistMangaEntryDto(
|
||||||
return list.first { it.rel == "alternate" }.href
|
return list.first { it.rel == "alternate" }.href
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getThumbnail(html: ZeistMangaEntryContentDto): String {
|
private fun getThumbnail(thumbnail: ZeistMangaEntryThumbnail): String {
|
||||||
|
return thumbnail.url.replace("""\/s.+?-c\/""".toRegex(), "/w600/")
|
||||||
|
.replace("""=s(?!.*=s).+?-c$""".toRegex(), "=w600")
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getThumbnailFromContent(html: ZeistMangaEntryContentDto): String {
|
||||||
val document = Jsoup.parse(html.t)
|
val document = Jsoup.parse(html.t)
|
||||||
return document.selectFirst("img")!!.attr("src")
|
return document.selectFirst("img")!!.attr("src")
|
||||||
}
|
}
|
||||||
|
@ -83,3 +93,8 @@ data class ZeistMangaEntryLink(
|
||||||
data class ZeistMangaEntryCategory(
|
data class ZeistMangaEntryCategory(
|
||||||
val term: String,
|
val term: String,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
data class ZeistMangaEntryThumbnail(
|
||||||
|
val url: String,
|
||||||
|
)
|
||||||
|
|
|
@ -9,11 +9,18 @@ class ZeistMangaGenerator : ThemeSourceGenerator {
|
||||||
|
|
||||||
override val themeClass = "ZeistManga"
|
override val themeClass = "ZeistManga"
|
||||||
|
|
||||||
override val baseVersionCode: Int = 4
|
override val baseVersionCode: Int = 5
|
||||||
|
|
||||||
override val sources = listOf(
|
override val sources = listOf(
|
||||||
|
SingleLang("Asupan Komik", "https://www.asupankomik.my.id", "id"),
|
||||||
SingleLang("DatGarScanlation", "https://datgarscanlation.blogspot.com", "es"),
|
SingleLang("DatGarScanlation", "https://datgarscanlation.blogspot.com", "es"),
|
||||||
|
SingleLang("Hijala", "https://hijala.blogspot.com", "ar"),
|
||||||
|
SingleLang("KLManhua", "https://klmanhua.blogspot.com", "id", isNsfw = true),
|
||||||
SingleLang("Manga Ai Land", "https://manga-ai-land.blogspot.com", "ar"),
|
SingleLang("Manga Ai Land", "https://manga-ai-land.blogspot.com", "ar"),
|
||||||
|
SingleLang("Muslos No Sekai", "https://muslosnosekai.blogspot.com", "es"),
|
||||||
|
SingleLang("Noromax", "https://www.noromax.xyz", "id"),
|
||||||
|
SingleLang("ShiyuraSub", "https://shiyurasub.blogspot.com", "id"),
|
||||||
|
SingleLang("Tooncubus", "https://www.tooncubus.site", "id", isNsfw = true),
|
||||||
)
|
)
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|
|
@ -8,46 +8,62 @@ class ZeistMangaIntl(lang: String) {
|
||||||
|
|
||||||
val statusFilterTitle: String = when (availableLang) {
|
val statusFilterTitle: String = when (availableLang) {
|
||||||
SPANISH -> "Estado"
|
SPANISH -> "Estado"
|
||||||
|
ARAB -> "حالة"
|
||||||
|
INDONESIAN -> "Status"
|
||||||
else -> "Status"
|
else -> "Status"
|
||||||
}
|
}
|
||||||
|
|
||||||
val statusAll: String = when (availableLang) {
|
|
||||||
SPANISH -> "Todos"
|
|
||||||
else -> "All"
|
|
||||||
}
|
|
||||||
|
|
||||||
val statusOngoing: String = when (availableLang) {
|
val statusOngoing: String = when (availableLang) {
|
||||||
SPANISH -> "En curso"
|
SPANISH -> "En curso"
|
||||||
|
ARAB -> "جاري التنفيذ"
|
||||||
|
INDONESIAN -> "Sedang berlangsung"
|
||||||
else -> "Ongoing"
|
else -> "Ongoing"
|
||||||
}
|
}
|
||||||
|
|
||||||
val statusCompleted: String = when (availableLang) {
|
val statusCompleted: String = when (availableLang) {
|
||||||
SPANISH -> "Completado"
|
SPANISH -> "Completado"
|
||||||
|
ARAB -> "مكتمل"
|
||||||
|
INDONESIAN -> "Lengkap"
|
||||||
else -> "Completed"
|
else -> "Completed"
|
||||||
}
|
}
|
||||||
|
|
||||||
val statusDropped: String = when (availableLang) {
|
val statusDropped: String = when (availableLang) {
|
||||||
SPANISH -> "Abandonada"
|
SPANISH -> "Abandonado"
|
||||||
|
ARAB -> "إسقاط"
|
||||||
|
INDONESIAN -> "Menjatuhkan"
|
||||||
else -> "Dropped"
|
else -> "Dropped"
|
||||||
}
|
}
|
||||||
|
|
||||||
val statusUpcoming: String = when (availableLang) {
|
val statusUpcoming: String = when (availableLang) {
|
||||||
SPANISH -> "Próximos"
|
SPANISH -> "Próximos"
|
||||||
|
ARAB -> "القادمة"
|
||||||
|
INDONESIAN -> "Mendatang"
|
||||||
else -> "Upcoming"
|
else -> "Upcoming"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val statusHiatus: String = when (availableLang) {
|
||||||
|
SPANISH -> "En hiatus"
|
||||||
|
ARAB -> "فجوة"
|
||||||
|
INDONESIAN -> "Hiatus"
|
||||||
|
else -> "Hiatus"
|
||||||
|
}
|
||||||
|
|
||||||
|
val statusCancelled: String = when (availableLang) {
|
||||||
|
SPANISH -> "Cancelado"
|
||||||
|
ARAB -> "ألغيت"
|
||||||
|
INDONESIAN -> "Dibatalkan"
|
||||||
|
else -> "Cancelled"
|
||||||
|
}
|
||||||
|
|
||||||
// Type Filter
|
// Type Filter
|
||||||
|
|
||||||
val typeFilterTitle: String = when (availableLang) {
|
val typeFilterTitle: String = when (availableLang) {
|
||||||
SPANISH -> "Tipo"
|
SPANISH -> "Tipo"
|
||||||
|
ARAB -> "يكتب"
|
||||||
|
INDONESIAN -> "Jenis"
|
||||||
else -> "Type"
|
else -> "Type"
|
||||||
}
|
}
|
||||||
|
|
||||||
val typeAll: String = when (availableLang) {
|
|
||||||
SPANISH -> "Todos"
|
|
||||||
else -> "All"
|
|
||||||
}
|
|
||||||
|
|
||||||
val typeManga: String = when (availableLang) {
|
val typeManga: String = when (availableLang) {
|
||||||
SPANISH -> "Manga"
|
SPANISH -> "Manga"
|
||||||
else -> "Manga"
|
else -> "Manga"
|
||||||
|
@ -68,35 +84,65 @@ class ZeistMangaIntl(lang: String) {
|
||||||
else -> "Novel"
|
else -> "Novel"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val typeWebNovelJP: String = when (availableLang) {
|
||||||
|
SPANISH -> "Web Novel (JP)"
|
||||||
|
else -> "Web Novel (JP)"
|
||||||
|
}
|
||||||
|
|
||||||
|
val typeWebNovelKR: String = when (availableLang) {
|
||||||
|
SPANISH -> "Web Novel (KR)"
|
||||||
|
else -> "Web Novel (KR)"
|
||||||
|
}
|
||||||
|
|
||||||
|
val typeWebNovelCN: String = when (availableLang) {
|
||||||
|
SPANISH -> "Web Novel (CN)"
|
||||||
|
else -> "Web Novel (CN)"
|
||||||
|
}
|
||||||
|
|
||||||
|
val typeDoujinshi: String = when (availableLang) {
|
||||||
|
SPANISH -> "Doujinshi"
|
||||||
|
else -> "Doujinshi"
|
||||||
|
}
|
||||||
|
|
||||||
// Language Filter
|
// Language Filter
|
||||||
|
|
||||||
val languageFilterTitle: String = when (availableLang) {
|
val languageFilterTitle: String = when (availableLang) {
|
||||||
SPANISH -> "Idioma"
|
SPANISH -> "Idioma"
|
||||||
|
ARAB -> "لغة"
|
||||||
|
INDONESIAN -> "Bahasa"
|
||||||
else -> "Language"
|
else -> "Language"
|
||||||
}
|
}
|
||||||
|
|
||||||
val languageAll: String = when (availableLang) {
|
|
||||||
SPANISH -> "Todos"
|
|
||||||
else -> "All"
|
|
||||||
}
|
|
||||||
|
|
||||||
// Genre Filter
|
// Genre Filter
|
||||||
|
|
||||||
val genreFilterTitle: String = when (availableLang) {
|
val genreFilterTitle: String = when (availableLang) {
|
||||||
SPANISH -> "Género"
|
SPANISH -> "Género"
|
||||||
|
ARAB -> "جينيرو"
|
||||||
|
INDONESIAN -> "Genre"
|
||||||
else -> "Genre"
|
else -> "Genre"
|
||||||
}
|
}
|
||||||
|
|
||||||
// Extra
|
// Extra
|
||||||
val filterWarning: String = when (availableLang) {
|
val filterWarning: String = when (availableLang) {
|
||||||
SPANISH -> "Los filtros serán ignorados si la búsqueda no está vacía."
|
SPANISH -> "Los filtros serán ignorados si la búsqueda no está vacía."
|
||||||
|
ARAB -> "سيتم تجاهل عوامل التصفية إذا لم يكن البحث فارغًا"
|
||||||
|
INDONESIAN -> "Filter akan diabaikan jika pencarian tidak kosong."
|
||||||
else -> "Filters will be ignored if the search is not empty."
|
else -> "Filters will be ignored if the search is not empty."
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val all: String = when (availableLang) {
|
||||||
|
SPANISH -> "Todos"
|
||||||
|
ARAB -> "الجميع"
|
||||||
|
INDONESIAN -> "Semua"
|
||||||
|
else -> "All"
|
||||||
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
const val ENGLISH = "en"
|
const val ENGLISH = "en"
|
||||||
const val SPANISH = "es"
|
const val SPANISH = "es"
|
||||||
|
const val ARAB = "ar"
|
||||||
|
const val INDONESIAN = "id"
|
||||||
|
|
||||||
val AVAILABLE_LANGS = arrayOf(ENGLISH, SPANISH)
|
val AVAILABLE_LANGS = arrayOf(ENGLISH, SPANISH, ARAB, INDONESIAN)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|