Add three new sources to Madara (#6951)

* Add two new sources to Madara.

* Add one more source to Madara.
This commit is contained in:
Alessandro Jean 2021-05-10 17:24:52 -03:00 committed by GitHub
parent f15120b5bd
commit 02d712be26
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 249 additions and 2 deletions

View File

@ -0,0 +1,86 @@
package eu.kanade.tachiyomi.extension.pt.bananamecanica
import eu.kanade.tachiyomi.annotations.Nsfw
import eu.kanade.tachiyomi.lib.ratelimit.RateLimitInterceptor
import eu.kanade.tachiyomi.multisrc.madara.Madara
import okhttp3.OkHttpClient
import java.text.SimpleDateFormat
import java.util.Locale
import java.util.concurrent.TimeUnit
@Nsfw
class BananaMecanica : Madara(
"Banana Mecânica",
"https://leitorbm.com",
"pt-BR",
SimpleDateFormat("dd 'de' MMMMM 'de' yyyy", Locale("pt", "BR"))
) {
override val client: OkHttpClient = super.client.newBuilder()
.addInterceptor(RateLimitInterceptor(1, 1, TimeUnit.SECONDS))
.build()
// [...document.querySelectorAll('input[name="genre[]"]')]
// .map(x => `Genre("${document.querySelector('label[for=' + x.id + ']').innerHTML.trim()}", "${x.value}")`)
// .join(',\n')
override fun getGenreList(): List<Genre> = listOf(
Genre("Ação", "acao"),
Genre("Action", "action"),
Genre("Adult", "adult"),
Genre("Adventure", "adventure"),
Genre("Anime", "anime"),
Genre("Cartoon", "cartoon"),
Genre("Comédia", "comedia"),
Genre("Comedy", "comedy"),
Genre("Comic", "comic"),
Genre("Cooking", "cooking"),
Genre("Cotidiano", "cotidiano"),
Genre("Detective", "detective"),
Genre("Doujinshi", "doujinshi"),
Genre("Drama", "drama"),
Genre("Ecchi", "ecchi"),
Genre("Fantasia", "fantasia"),
Genre("Fantasy", "fantasy"),
Genre("Gender Bender", "gender-bender"),
Genre("Harem", "harem"),
Genre("Historical", "historical"),
Genre("Horror", "horror"),
Genre("Josei", "josei"),
Genre("Live action", "live-action"),
Genre("M-preg/Omegaverse", "m-preg-omegaverse"),
Genre("Manga", "manga"),
Genre("Manhua", "manhua"),
Genre("Manhwa", "manhwa"),
Genre("Martial Arts", "martial-arts"),
Genre("Mature", "mature"),
Genre("Mecha", "mecha"),
Genre("Mistério", "misterio"),
Genre("Mystery", "mystery"),
Genre("Omegaverse", "omegaverse"),
Genre("One shot", "one-shot"),
Genre("Psicológico", "psicologico"),
Genre("Psychological", "psychological"),
Genre("Romance", "romance"),
Genre("School Life", "school-life"),
Genre("Sci-fi", "sci-fi"),
Genre("Seinen", "seinen"),
Genre("Shotacon", "shotacon"),
Genre("Shoujo", "shoujo"),
Genre("Shoujo Ai", "shoujo-ai"),
Genre("Shounen", "shounen"),
Genre("Shounen Ai", "shounen-ai"),
Genre("Slice of Life", "slice-of-life"),
Genre("Smut", "smut"),
Genre("Sobrenatural", "sobrenatural"),
Genre("Soft Yaoi", "soft-yaoi"),
Genre("Soft Yuri", "soft-yuri"),
Genre("Sports", "sports"),
Genre("Supernatural", "supernatural"),
Genre("Tragedy", "tragedy"),
Genre("Vida Ecolar", "vida-ecolar"),
Genre("Vida Escolar", "vida-escolar"),
Genre("Webtoon", "webtoon"),
Genre("Yaoi", "yaoi"),
Genre("Yuri", "yuri")
)
}

View File

@ -0,0 +1,88 @@
package eu.kanade.tachiyomi.extension.pt.fenixscanlator
import eu.kanade.tachiyomi.lib.ratelimit.RateLimitInterceptor
import eu.kanade.tachiyomi.multisrc.madara.Madara
import okhttp3.OkHttpClient
import java.text.SimpleDateFormat
import java.util.Locale
import java.util.concurrent.TimeUnit
class FenixScanlator : Madara(
"Fênix Scanlator",
"https://fenixscanlator.xyz",
"pt-BR",
SimpleDateFormat("dd 'de' MMMMM 'de' yyyy", Locale("pt", "BR"))
) {
override val client: OkHttpClient = super.client.newBuilder()
.addInterceptor(RateLimitInterceptor(1, 1, TimeUnit.SECONDS))
.build()
// [...document.querySelectorAll('input[name="genre[]"]')]
// .map(x => `Genre("${document.querySelector('label[for=' + x.id + ']').innerHTML.trim()}", "${x.value}")`)
// .join(',\n')
override fun getGenreList(): List<Genre> = listOf(
Genre("Action", "action"),
Genre("Adult", "adult"),
Genre("Adventure", "adventure"),
Genre("Anime", "anime"),
Genre("Cartoon", "cartoon"),
Genre("Comedy", "comedy"),
Genre("Comic", "comic"),
Genre("Cooking", "cooking"),
Genre("Delinquentes", "delinquentes"),
Genre("Detective", "detective"),
Genre("Doujinshi", "doujinshi"),
Genre("Drama", "drama"),
Genre("Ecchi", "ecchi"),
Genre("Fantasmas", "fantasmas"),
Genre("Fantasy", "fantasy"),
Genre("Gastronomia", "gastronomia"),
Genre("Gender Bender", "gender-bender"),
Genre("Harem", "harem"),
Genre("Historical", "historical"),
Genre("Horror", "horror"),
Genre("Isekai", "isekai"),
Genre("Josei", "josei"),
Genre("Live action", "live-action"),
Genre("Long Strip", "long-strip"),
Genre("Magia", "magia"),
Genre("Manga", "manga"),
Genre("Manhua", "manhua"),
Genre("Manhwa", "manhwa"),
Genre("Martial Arts", "martial-arts"),
Genre("Mature", "mature"),
Genre("Mecha", "mecha"),
Genre("Medicina", "medicina"),
Genre("Monstros", "monstros"),
Genre("Mystery", "mystery"),
Genre("One shot", "one-shot"),
Genre("Pós-Apocalíptico", "pos-apocaliptico"),
Genre("Psychological", "psychological"),
Genre("Realidade Virtual", "realidade-virtual"),
Genre("Reencarnação", "reencarnacao"),
Genre("Romance", "romance"),
Genre("School Life", "school-life"),
Genre("Sci-fi", "sci-fi"),
Genre("Seinen", "seinen"),
Genre("Shoujo", "shoujo"),
Genre("Shoujo Ai", "shoujo-ai"),
Genre("Shounen", "shounen"),
Genre("Shounen Ai", "shounen-ai"),
Genre("Slice of Life", "slice-of-life"),
Genre("Smut", "smut"),
Genre("Sobrevivência", "sobrevivencia"),
Genre("Soft Yaoi", "soft-yaoi"),
Genre("Soft Yuri", "soft-yuri"),
Genre("Sports", "sports"),
Genre("Super Herói", "super-heroi"),
Genre("Supernatural", "supernatural"),
Genre("Thriller", "thriller"),
Genre("Tragedy", "tragedy"),
Genre("Vídeo Games", "video-games"),
Genre("Web Comic", "web-comic"),
Genre("Webtoon", "webtoon"),
Genre("Yaoi", "yaoi"),
Genre("Yuri", "yuri")
)
}

View File

@ -0,0 +1,70 @@
package eu.kanade.tachiyomi.extension.pt.sweettimescan
import eu.kanade.tachiyomi.lib.ratelimit.RateLimitInterceptor
import eu.kanade.tachiyomi.multisrc.madara.Madara
import eu.kanade.tachiyomi.source.model.MangasPage
import okhttp3.OkHttpClient
import okhttp3.Response
import org.jsoup.nodes.Element
import java.text.SimpleDateFormat
import java.util.Locale
import java.util.concurrent.TimeUnit
class SweetTimeScan : Madara(
"Sweet Time Scan",
"https://sweetscan.net",
"pt-BR",
SimpleDateFormat("MMMMM dd, yyyy", Locale("pt", "BR"))
) {
override val client: OkHttpClient = super.client.newBuilder()
.addInterceptor(RateLimitInterceptor(1, 1, TimeUnit.SECONDS))
.build()
override fun popularMangaSelector() = "div.page-item-detail.manga"
// The source has novels in text format, so we need to filter them.
override fun searchMangaParse(response: Response): MangasPage {
val mangaPage = super.searchMangaParse(response)
val filteredResult = mangaPage.mangas.filter { it.title.contains(NOVEL_REGEX).not() }
return MangasPage(filteredResult, mangaPage.hasNextPage)
}
// The site uses some image cache plugin that made the thumbnails don't load.
// This removes the plugin site base URL and returns the direct image URL.
override fun imageFromElement(element: Element): String {
return baseUrl + super.imageFromElement(element)?.substringAfter(baseUrl)
}
// [...document.querySelectorAll('input[name="genre[]"]')]
// .map(x => `Genre("${document.querySelector('label[for=' + x.id + ']').innerHTML.trim()}", "${x.value}")`)
// .join(',\n')
override fun getGenreList(): List<Genre> = listOf(
Genre("Ação", "acao"),
Genre("Artes Marciais", "artes-marciais"),
Genre("Aventura", "aventura"),
Genre("Comédia", "comedia"),
Genre("Drama", "drama"),
Genre("Ecchi", "ecchi"),
Genre("Escolar", "escolar"),
Genre("Fantasia", "fantasia"),
Genre("Histórico", "historico"),
Genre("Isekai", "isekai"),
Genre("Josei", "josei"),
Genre("Magia", "magia"),
Genre("Médico", "medico"),
Genre("Mistério", "misterio"),
Genre("Psicológico", "psicologico"),
Genre("Reencarnação", "reencarnacao"),
Genre("Romance", "romance"),
Genre("Sci Fi", "sci-fi"),
Genre("Shoujo", "shoujo"),
Genre("Slice of Life", "slice-of-life"),
Genre("Sobrenatural", "sobrenatural")
)
companion object {
private val NOVEL_REGEX = "novel|livro".toRegex(RegexOption.IGNORE_CASE)
}
}

View File

@ -351,7 +351,7 @@ abstract class Madara(
// I don't know what's the corresponding for COMPLETED and LICENSED // I don't know what's the corresponding for COMPLETED and LICENSED
// There's no support for "Canceled" or "On Hold" // There's no support for "Canceled" or "On Hold"
"Completed", "Completo", "Concluído", "Concluido", "Terminé" -> SManga.COMPLETED "Completed", "Completo", "Concluído", "Concluido", "Terminé" -> SManga.COMPLETED
"OnGoing", "Продолжается", "Updating", "Em Lançamento", "Em andamento", "Em Andamento", "En cours", "Ativo" -> SManga.ONGOING "OnGoing", "Продолжается", "Updating", "Em Lançamento", "Em andamento", "Em Andamento", "En cours", "Ativo", "Lançando" -> SManga.ONGOING
else -> SManga.UNKNOWN else -> SManga.UNKNOWN
} }
} }
@ -397,7 +397,7 @@ abstract class Madara(
return this.contains("Updating", true).not() return this.contains("Updating", true).not()
} }
protected fun imageFromElement(element: Element): String? { protected open fun imageFromElement(element: Element): String? {
return when { return when {
element.hasAttr("data-src") -> element.attr("abs:data-src") element.hasAttr("data-src") -> element.attr("abs:data-src")
element.hasAttr("data-lazy-src") -> element.attr("abs:data-lazy-src") element.hasAttr("data-lazy-src") -> element.attr("abs:data-lazy-src")

View File

@ -32,6 +32,7 @@ class MadaraGenerator : ThemeSourceGenerator {
SingleLang("AYATOON", "https://ayatoon.com", "tr"), SingleLang("AYATOON", "https://ayatoon.com", "tr"),
SingleLang("Azora", "https://azoramanga.com", "ar", overrideVersionCode = 1), SingleLang("Azora", "https://azoramanga.com", "ar", overrideVersionCode = 1),
SingleLang("BL Manhwa Club", "https://blmanhwa.club", "pt-BR", isNsfw = true, className = "BlManhwaClub"), SingleLang("BL Manhwa Club", "https://blmanhwa.club", "pt-BR", isNsfw = true, className = "BlManhwaClub"),
SingleLang("Banana Mecânica", "https://leitorbm.com", "pt-BR", isNsfw = true, pkgName = "bananamecanica", className = "BananaMecanica"),
SingleLang("Bakaman", "https://bakaman.net", "th", overrideVersionCode = 1), SingleLang("Bakaman", "https://bakaman.net", "th", overrideVersionCode = 1),
SingleLang("BestManga", "https://bestmanga.club", "ru"), SingleLang("BestManga", "https://bestmanga.club", "ru"),
SingleLang("BestManhua", "https://bestmanhua.com", "en", overrideVersionCode = 1), SingleLang("BestManhua", "https://bestmanhua.com", "en", overrideVersionCode = 1),
@ -60,6 +61,7 @@ class MadaraGenerator : ThemeSourceGenerator {
SingleLang("FDM Scan", "https://fdmscan.com", "pt-BR", overrideVersionCode = 1), SingleLang("FDM Scan", "https://fdmscan.com", "pt-BR", overrideVersionCode = 1),
SingleLang("1st Kiss", "https://1stkissmanga.com", "en", className = "FirstKissManga", overrideVersionCode = 1), SingleLang("1st Kiss", "https://1stkissmanga.com", "en", className = "FirstKissManga", overrideVersionCode = 1),
SingleLang("1st Kiss Manhua", "https://1stkissmanhua.com", "en", className = "FirstKissManhua"), SingleLang("1st Kiss Manhua", "https://1stkissmanhua.com", "en", className = "FirstKissManhua"),
SingleLang("Fênix Scanlator", "https://fenixscanlator.xyz", "pt-BR", pkgName = "fenixscanlator", className = "FenixScanlator"),
SingleLang("FreeWebtoonCoins", "https://freewebtooncoins.com", "en"), SingleLang("FreeWebtoonCoins", "https://freewebtooncoins.com", "en"),
SingleLang("Furio Scans", "https://furioscans.com", "pt-BR", overrideVersionCode = 1), SingleLang("Furio Scans", "https://furioscans.com", "pt-BR", overrideVersionCode = 1),
SingleLang("موقع لترجمة المانجا", "https://golden-manga.com", "ar", className = "GoldenManga"), SingleLang("موقع لترجمة المانجا", "https://golden-manga.com", "ar", className = "GoldenManga"),
@ -223,6 +225,7 @@ class MadaraGenerator : ThemeSourceGenerator {
SingleLang("Spooky Scanlations", "https://spookyscanlations.xyz", "es"), SingleLang("Spooky Scanlations", "https://spookyscanlations.xyz", "es"),
SingleLang("StageComics", "https://stagecomics.com", "pt-BR", overrideVersionCode = 1), SingleLang("StageComics", "https://stagecomics.com", "pt-BR", overrideVersionCode = 1),
SingleLang("Sugar Babies", "https://sugarbscan.com", "en"), SingleLang("Sugar Babies", "https://sugarbscan.com", "en"),
SingleLang("Sweet Time Scan", "https://sweetscan.net", "pt-BR"),
SingleLang("TheTopComic", "https://thetopcomic.com", "en"), SingleLang("TheTopComic", "https://thetopcomic.com", "en"),
SingleLang("365Manga", "https://365manga.com", "en", className = "ThreeSixtyFiveManga"), SingleLang("365Manga", "https://365manga.com", "en", className = "ThreeSixtyFiveManga"),
SingleLang("ToonGod", "https://www.toongod.com", "en"), SingleLang("ToonGod", "https://www.toongod.com", "en"),