Initial commit

This commit is contained in:
FourTOne5
2024-01-09 04:12:39 +06:00
commit 600c345dfe
8593 changed files with 150590 additions and 0 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

View File

@@ -0,0 +1,41 @@
package eu.kanade.tachiyomi.extension.pt.animexnovel
import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistManga
import eu.kanade.tachiyomi.source.model.MangasPage
import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.Response
class AnimeXNovel : ZeistManga("AnimeXNovel", "https://www.animexnovel.com", "pt-BR") {
override val mangaCategory: String = "Manga"
override fun popularMangaParse(response: Response): MangasPage {
val document = response.asJsoup()
val mangas = document.select("div.PopularPosts div.grid > figure").map { element ->
SManga.create().apply {
thumbnail_url = element.selectFirst("img")!!.attr("abs:src")
title = element.selectFirst("figcaption > a")!!.text()
setUrlWithoutDomain(element.selectFirst("figcaption > a")!!.attr("href"))
}
}.filter { it.title.contains("[Mangá]") }
return MangasPage(mangas, false)
}
override val mangaDetailsSelectorDescription = "div.bc-fff.s1 > h3:contains(Sinopse) ~ div[style=text-align: justify;]"
private val chapterListSelector = "div:has(> .list-judul:contains(Lista de Capítulos)) div#latest ul > li, div.tab:has(> label:contains(Lista de Capítulos)) div.tab-content ul > li"
override fun chapterListParse(response: Response): List<SChapter> {
val document = response.asJsoup()
val chapters = document.select(chapterListSelector)
return chapters.map {
SChapter.create().apply {
name = it.select("a").text()
setUrlWithoutDomain(it.select("a").attr("href"))
}
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

View File

@@ -0,0 +1,8 @@
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
override val pageListSelector = "div.check-box"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

View File

@@ -0,0 +1,7 @@
package eu.kanade.tachiyomi.extension.pt.guildatierdraw
import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistManga
class GuildaTierDraw : ZeistManga("Guilda Tier Draw", "https://www.guildatierdraw.com", "pt-BR") {
override val mangaDetailsSelectorDescription = "#Sinopse"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 246 KiB

View File

@@ -0,0 +1,57 @@
package eu.kanade.tachiyomi.extension.ar.hijala
import eu.kanade.tachiyomi.multisrc.zeistmanga.Genre
import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistManga
import eu.kanade.tachiyomi.source.model.MangasPage
import okhttp3.Request
import okhttp3.Response
class Hijala : ZeistManga("Hijala", "https://hijala.blogspot.com", "ar") {
override val hasFilters = true
override val hasLanguageFilter = false
override val supportsLatest = false
override fun popularMangaRequest(page: Int): Request = latestUpdatesRequest(page)
override fun popularMangaParse(response: Response): MangasPage = latestUpdatesParse(response)
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("ميكا", "ميكا"),
)
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

View File

@@ -0,0 +1,9 @@
package eu.kanade.tachiyomi.extension.id.klmanhua
import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistManga
class KLManhua : ZeistManga("KLManhua", "https://klmanhua.blogspot.com", "id") {
override val hasFilters = true
override val hasLanguageFilter = false
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

View File

@@ -0,0 +1,146 @@
package eu.kanade.tachiyomi.extension.id.komikrealm
import eu.kanade.tachiyomi.multisrc.zeistmanga.Genre
import eu.kanade.tachiyomi.multisrc.zeistmanga.Status
import eu.kanade.tachiyomi.multisrc.zeistmanga.Type
import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistManga
import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistMangaDto
import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistMangaIntl
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.source.model.MangasPage
import eu.kanade.tachiyomi.source.model.Page
import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.util.asJsoup
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.json.Json
import okhttp3.Request
import okhttp3.Response
import org.jsoup.nodes.Document
import uy.kohesive.injekt.injectLazy
class KomikRealm : ZeistManga(
"KomikRealm",
"https://www.komikrealm.my.id",
"id",
) {
private val json: Json by injectLazy()
override val hasFilters = true
override val hasLanguageFilter = false
override val chapterCategory = ""
override fun popularMangaRequest(page: Int): Request {
val url = apiUrl("Project")
.addQueryParameter("orderby", "updated")
.addQueryParameter("max-results", "12")
.build()
return GET(url, headers)
}
override fun popularMangaParse(response: Response): MangasPage {
val jsonString = response.body.string()
val result = json.decodeFromString<ZeistMangaDto>(jsonString)
val mangas = result.feed?.entry.orEmpty()
.filter { it.category.orEmpty().any { category -> category.term == "Series" } }
.filter { !it.category.orEmpty().any { category -> category.term == "Anime" } }
.map { it.toSManga(baseUrl) }
return MangasPage(mangas, false)
}
override fun mangaDetailsParse(response: Response): SManga {
val document = response.asJsoup()
val profileManga = document.select(".bigcontent")
val infoManga = profileManga.select("ul.infonime li")
return SManga.create().apply {
thumbnail_url = profileManga.select("img").first()!!.attr("data-src")
description = profileManga.select(".sinoposis").text()
genre = profileManga.select("div.info-genre > a[rel=tag]")
.joinToString { it.text() }
infoManga.forEach {
val title = it.select("b").text()
val desc = it.select("span").text()
when (title) {
"Status" -> status = parseStatus(desc)
"Author" -> author = desc
"Artist" -> artist = desc
}
}
}
}
override fun chapterListParse(response: Response): List<SChapter> {
val document = response.asJsoup()
val url = getChapterFeedUrl(document)
val req = GET(url, headers)
val res = client.newCall(req).execute()
val jsonString = res.body.string()
val result = json.decodeFromString<ZeistMangaDto>(jsonString)
return result.feed?.entry
?.filter {
!it.category.orEmpty().any { category ->
category.term == "Series"
}
}
?.map { it.toSChapter(baseUrl) }
?: throw Exception("Failed to parse from chapter API")
}
private val imagePageRegex = """(http|https)://[^"]+""".toRegex()
override fun pageListParse(response: Response): List<Page> {
val document = response.asJsoup()
val script = document.select(".post-body > script").html()
val matches = imagePageRegex.findAll(script)
return matches.mapIndexed { i, match ->
Page(i, "", match.value)
}.toList()
}
private val labelChapterRegex = """var label_chapter = "([^"]+)";""".toRegex()
override fun getChapterFeedUrl(doc: Document): String {
val script = doc.select(".post-body > script")
val feed = labelChapterRegex.find(script.html())
?.groupValues?.get(1)
?: throw Exception("Failed to find chapter feed")
return apiUrl(chapterCategory)
.addPathSegments(feed)
.addQueryParameter("max-results", "999999")
.build().toString()
}
private val intl by lazy { ZeistMangaIntl(lang) }
override fun getStatusList(): List<Status> = listOf(
Status(intl.all, ""),
Status(intl.statusOngoing, "Ongoing"),
Status(intl.statusCompleted, "Completed"),
)
override fun getTypeList(): List<Type> = listOf(
Type(intl.all, ""),
Type(intl.typeManga, "Manga"),
Type(intl.typeManhua, "Manhua"),
Type(intl.typeManhwa, "Manhwa"),
)
override fun getGenreList(): List<Genre> = listOf(
Genre("Drama", "Drama"),
Genre("Mature", "Mature"),
Genre("Supernatural", "Supernatural"),
)
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View File

@@ -0,0 +1,11 @@
package eu.kanade.tachiyomi.extension.pt.ler999
import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistManga
import eu.kanade.tachiyomi.network.interceptor.rateLimit
import java.util.concurrent.TimeUnit
class Ler999 : ZeistManga("Ler 999", "https://ler999.blogspot.com", "pt-BR") {
override val client = super.client.newBuilder()
.rateLimit(1, 2, TimeUnit.SECONDS)
.build()
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

View File

@@ -0,0 +1,33 @@
package eu.kanade.tachiyomi.extension.ar.mangaailand
import eu.kanade.tachiyomi.multisrc.zeistmanga.Genre
import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistManga
class MangaAiLand : ZeistManga("Manga Ai Land", "https://manga-ai-land.blogspot.com", "ar") {
override val hasFilters = true
override val hasLanguageFilter = false
override val chapterCategory = "فصل"
override fun getGenreList(): List<Genre> = listOf(
Genre("تراجيدي", "تراجيدي"),
Genre("تاريخي", "تاريخي"),
Genre("أكشن", "أكشن"),
Genre("خيالي", "خيالي"),
Genre("جيشي", "جيشي"),
Genre("تشويق", "تشويق"),
Genre("سينين", "سينين"),
Genre("سحري", "سحري"),
Genre("دراما", "دراما"),
Genre("عصابات", "عصابات"),
Genre("عسكري", "عسكري"),
Genre("شونين", "شونين"),
Genre("مغامرة", "مغامرة"),
Genre("فنون قتالية", "فنون قتالية"),
Genre("غموض", "غموض"),
Genre("وحوش", "وحوش"),
Genre("نجاة", "نجاة"),
Genre("نفسي", "نفسي"),
)
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

View File

@@ -0,0 +1,7 @@
package eu.kanade.tachiyomi.extension.ar.mangasoul
import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistManga
class MangaSoul : ZeistManga("Manga Soul", "https://www.manga-soul.com", "ar") {
override val mangaDetailsSelectorInfo = ".y6x11p, .y6x11p > b > span"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

View File

@@ -0,0 +1,86 @@
package eu.kanade.tachiyomi.extension.id.mikoroku
import eu.kanade.tachiyomi.multisrc.zeistmanga.Genre
import eu.kanade.tachiyomi.multisrc.zeistmanga.Status
import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistManga
import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.Response
import org.jsoup.nodes.Element
class MikoRoku : ZeistManga("MikoRoku", "https://www.mikoroku.web.id", "id") {
// ============================== Popular ===============================
override val popularMangaSelector = "div.PopularPosts article"
override val popularMangaSelectorTitle = ".post-title a"
override val popularMangaSelectorUrl = ".post-title a"
// ============================== Filters ===============================
override val hasFilters = true
// The source actually has both, but they return no result, so its useless.
override val hasLanguageFilter = false
override val hasTypeFilter = false
override fun getStatusList() = listOf(
Status("Semua", ""),
Status("Ongoing", "Ongoing"),
Status("Completed", "Completed"),
)
override fun getGenreList() = listOf(
Genre("Action", "Action"),
Genre("Adventure", "Adventure"),
Genre("Comedy", "Comedy"),
Genre("Dark Fantasy", "Dark Fantasy"),
Genre("Drama", "Drama"),
Genre("Fantasy", "Fantasy"),
Genre("Harem", "H4rem"),
Genre("Historical", "Historical"),
Genre("Horror", "Horror"),
Genre("Isekai", "Isekai"),
Genre("Magic", "Magic"),
Genre("Mecha", "Mecha"),
Genre("Military", "Military"),
Genre("Monsters", "Monsters"),
Genre("Mystery", "Mystery"),
Genre("Psychological", "Psychological"),
Genre("Romance", "Romance"),
Genre("School Life", "School Life"),
Genre("Sci-Fi", "Sci-Fi"),
Genre("Seinen", "Seinen"),
Genre("Shounen", "Shounen"),
Genre("Slice of Life", "Slice of Life"),
Genre("Supernatural", "Supernatural"),
Genre("Survival", "Survival"),
Genre("Tragedy", "Tragedy"),
)
// =========================== Manga Details ============================
override val mangaDetailsSelector = "div.section#main div.widget:has(main)"
override val mangaDetailsSelectorGenres = "dl > dd > a[rel=tag]"
override fun mangaDetailsParse(response: Response): SManga {
val document = response.use { it.asJsoup() }
val profileManga = document.selectFirst(mangaDetailsSelector)!!
return SManga.create().apply {
with(profileManga) {
thumbnail_url = selectFirst("img")?.absUrl("src")
description = document.select(mangaDetailsSelectorDescription).text()
genre = select(mangaDetailsSelectorGenres).eachText().joinToString()
status = parseStatus(selectFirst("span[data-status]")?.text().orEmpty())
author = getInfo("Author")
artist = getInfo("Artist")
}
}
}
private fun Element.getInfo(text: String): String? =
selectFirst("$mangaDetailsSelectorInfo:containsOwn($text) > $mangaDetailsSelectorInfoDescription")
?.text()
?.trim()
// =============================== Pages ================================
// Specific/faster selection first, generic/slower last
override val pageListSelector = "article#reader div.separator a, article#reader"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 216 KiB

View File

@@ -0,0 +1,22 @@
package eu.kanade.tachiyomi.extension.tr.mikrokosmosfansub
import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistManga
import eu.kanade.tachiyomi.source.model.Page
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.Response
import org.jsoup.Jsoup
class MikrokosmosFansub : ZeistManga("Mikrokosmos Fansub", "https://mikrokosmosfb.blogspot.com", "tr") {
override val pageListSelector = "div.check-box > script"
override fun pageListParse(response: Response): List<Page> {
val document = response.asJsoup()
val script = document.select(pageListSelector)
val content = script.html().substringAfter("const content = `").substringBefore("`;")
val images = Jsoup.parse(content).select("a")
return images.select("img[src]").mapIndexed { i, img ->
Page(i, "", img.attr("abs:src"))
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View File

@@ -0,0 +1,28 @@
package eu.kanade.tachiyomi.extension.tr.shadowceviri
import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistManga
import eu.kanade.tachiyomi.source.model.MangasPage
import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.Response
class ShadowCeviri : ZeistManga("Shadow Çeviri", "https://shadowceviri.blogspot.com", "tr") {
// ============================== Popular ===============================
override fun popularMangaParse(response: Response): MangasPage {
val document = response.use { it.asJsoup() }
val mangas = document.select("ul.gallery > li.bg").map { element ->
SManga.create().apply {
thumbnail_url = element.attr("style").substringAfter('(').substringBefore(')')
title = element.selectFirst("h3")?.text() ?: "Manga"
// NPE my beloved
setUrlWithoutDomain(element.selectFirst("a")!!.attr("href"))
}
}
return MangasPage(mangas, false)
}
// ============================== Chapters ==============================
override val useOldChapterFeed = true
override val chapterCategory = "Bölüm"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 172 KiB

Some files were not shown because too many files have changed in this diff Show More