diff --git a/multisrc/overrides/madara/bananamecanica/src/BananaMecanica.kt b/multisrc/overrides/madara/bananamecanica/src/BananaMecanica.kt new file mode 100644 index 000000000..5fdffea5a --- /dev/null +++ b/multisrc/overrides/madara/bananamecanica/src/BananaMecanica.kt @@ -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 = 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") + ) +} diff --git a/multisrc/overrides/madara/fenixscanlator/src/FenixScanlator.kt b/multisrc/overrides/madara/fenixscanlator/src/FenixScanlator.kt new file mode 100644 index 000000000..e90ab753b --- /dev/null +++ b/multisrc/overrides/madara/fenixscanlator/src/FenixScanlator.kt @@ -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 = 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") + ) +} diff --git a/multisrc/overrides/madara/sweettimescan/src/SweetTimeScan.kt b/multisrc/overrides/madara/sweettimescan/src/SweetTimeScan.kt new file mode 100644 index 000000000..fae9ab069 --- /dev/null +++ b/multisrc/overrides/madara/sweettimescan/src/SweetTimeScan.kt @@ -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 = 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) + } +} diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/madara/Madara.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/madara/Madara.kt index 656f98d9b..f31c3dae0 100644 --- a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/madara/Madara.kt +++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/madara/Madara.kt @@ -351,7 +351,7 @@ abstract class Madara( // I don't know what's the corresponding for COMPLETED and LICENSED // There's no support for "Canceled" or "On Hold" "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 } } @@ -397,7 +397,7 @@ abstract class Madara( return this.contains("Updating", true).not() } - protected fun imageFromElement(element: Element): String? { + protected open fun imageFromElement(element: Element): String? { return when { element.hasAttr("data-src") -> element.attr("abs:data-src") element.hasAttr("data-lazy-src") -> element.attr("abs:data-lazy-src") diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/madara/MadaraGenerator.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/madara/MadaraGenerator.kt index 0253caf61..11a9d4fec 100644 --- a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/madara/MadaraGenerator.kt +++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/madara/MadaraGenerator.kt @@ -32,6 +32,7 @@ class MadaraGenerator : ThemeSourceGenerator { SingleLang("AYATOON", "https://ayatoon.com", "tr"), SingleLang("Azora", "https://azoramanga.com", "ar", overrideVersionCode = 1), 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("BestManga", "https://bestmanga.club", "ru"), 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("1st Kiss", "https://1stkissmanga.com", "en", className = "FirstKissManga", overrideVersionCode = 1), 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("Furio Scans", "https://furioscans.com", "pt-BR", overrideVersionCode = 1), SingleLang("موقع لترجمة المانجا", "https://golden-manga.com", "ar", className = "GoldenManga"), @@ -223,6 +225,7 @@ class MadaraGenerator : ThemeSourceGenerator { SingleLang("Spooky Scanlations", "https://spookyscanlations.xyz", "es"), SingleLang("StageComics", "https://stagecomics.com", "pt-BR", overrideVersionCode = 1), SingleLang("Sugar Babies", "https://sugarbscan.com", "en"), + SingleLang("Sweet Time Scan", "https://sweetscan.net", "pt-BR"), SingleLang("TheTopComic", "https://thetopcomic.com", "en"), SingleLang("365Manga", "https://365manga.com", "en", className = "ThreeSixtyFiveManga"), SingleLang("ToonGod", "https://www.toongod.com", "en"),