From 839d15d8202ab8bb3c31c79ebe8f5a266ddd3c52 Mon Sep 17 00:00:00 2001 From: Mike <51273546+SnakeDoc83@users.noreply.github.com> Date: Sun, 24 Nov 2019 10:52:04 -0500 Subject: [PATCH] Madara - add DoujinHentai (#1816) Madara - add DoujinHentai --- src/all/madara/build.gradle | 2 +- .../tachiyomi/extension/all/madara/Madara.kt | 2 +- .../extension/all/madara/MadaraFactory.kt | 105 ++++++++++++++++-- 3 files changed, 99 insertions(+), 10 deletions(-) diff --git a/src/all/madara/build.gradle b/src/all/madara/build.gradle index f11ab9d8d..f6ec985e4 100644 --- a/src/all/madara/build.gradle +++ b/src/all/madara/build.gradle @@ -5,7 +5,7 @@ ext { appName = 'Tachiyomi: Madara (multiple sources)' pkgNameSuffix = "all.madara" extClass = '.MadaraFactory' - extVersionCode = 29 + extVersionCode = 30 libVersion = '1.2' } diff --git a/src/all/madara/src/eu/kanade/tachiyomi/extension/all/madara/Madara.kt b/src/all/madara/src/eu/kanade/tachiyomi/extension/all/madara/Madara.kt index 940179566..5cf92494e 100644 --- a/src/all/madara/src/eu/kanade/tachiyomi/extension/all/madara/Madara.kt +++ b/src/all/madara/src/eu/kanade/tachiyomi/extension/all/madara/Madara.kt @@ -281,7 +281,7 @@ abstract class Madara( Tag("on-hold", "On Hold") ) - private open class UriPartFilter(displayName: String, val vals: Array>) : + open class UriPartFilter(displayName: String, val vals: Array>) : Filter.Select(displayName, vals.map { it.first }.toTypedArray()) { fun toUriPart() = vals[state].second } diff --git a/src/all/madara/src/eu/kanade/tachiyomi/extension/all/madara/MadaraFactory.kt b/src/all/madara/src/eu/kanade/tachiyomi/extension/all/madara/MadaraFactory.kt index b87f0324d..388bc2c24 100644 --- a/src/all/madara/src/eu/kanade/tachiyomi/extension/all/madara/MadaraFactory.kt +++ b/src/all/madara/src/eu/kanade/tachiyomi/extension/all/madara/MadaraFactory.kt @@ -7,10 +7,16 @@ import eu.kanade.tachiyomi.source.model.FilterList 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.source.model.Filter import eu.kanade.tachiyomi.util.asJsoup -import okhttp3.* +import okhttp3.Request +import okhttp3.Response +import okhttp3.HttpUrl +import okhttp3.Headers +import org.jsoup.nodes.Element import java.text.SimpleDateFormat -import java.util.* +import java.util.Locale class MadaraFactory : SourceFactory { override fun createSources(): List = listOf( @@ -33,7 +39,6 @@ class MadaraFactory : SourceFactory { MangazukiClubJP(), MangazukiClubKO(), FirstKissManga(), - MangaKomi(), MangaSY(), ManwhaClub(), WuxiaWorld(), @@ -51,7 +56,8 @@ class MadaraFactory : SourceFactory { AllPornComic(), Milftoon(), ToonManga(), - Hiperdex() + Hiperdex(), + DoujinHentai() ) } @@ -156,10 +162,6 @@ class FirstKissManga : Madara("1st Kiss", "https://1stkissmanga.com/", "en") { } } -class MangaKomi : Madara("MangaKomi", "https://mangakomi.com/", "en") { - override fun searchMangaNextPageSelector() = "nav.navigation-ajax" -} - class MangaSY : Madara("Manga SY", "https://www.mangasy.com/", "en") { override fun searchMangaNextPageSelector() = "nav.navigation-ajax" } @@ -274,3 +276,90 @@ class Hiperdex : Madara("Hiperdex", "https://hiperdex.com", "en") { Genre( "Yuri", "yuri") ) } + +class DoujinHentai : Madara("DoujinHentai", "https://doujinhentai.net", "es", SimpleDateFormat("d MMM. yyyy", Locale.ENGLISH)) { + override fun popularMangaRequest(page: Int): Request = GET("$baseUrl/lista-manga-hentai?orderby=views&page=$page", headers) + override fun popularMangaSelector() = "div.col-md-3 a" + override fun popularMangaFromElement(element: Element): SManga { + val manga = SManga.create() + + manga.setUrlWithoutDomain(element.attr("href")) + manga.title = element.select("h5").text() + manga.thumbnail_url = element.select("img").attr("abs:data-src") + + return manga + } + override fun popularMangaNextPageSelector() = "a[rel=next]" + override fun latestUpdatesRequest(page: Int): Request = GET("$baseUrl/lista-manga-hentai?orderby=last&page=$page", headers) + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { + val url = HttpUrl.parse(baseUrl)!!.newBuilder() + if (query.isNotBlank()) { + url.addPathSegment("search") + url.addQueryParameter("query", query) // query returns results all on one page + } else { + filters.forEach { filter -> + when (filter) { + is GenreSelectFilter -> { + if (filter.state != 0) { + url.addPathSegments("lista-manga-hentai/category/${filter.toUriPart()}") + url.addQueryParameter("page", page.toString()) + } + } + } + } + } + return GET(url.build().toString(), headers) + } + override fun searchMangaSelector() = "div.c-tabs-item__content > div.c-tabs-item__content, ${popularMangaSelector()}" + override fun searchMangaFromElement(element: Element): SManga { + return if (element.hasAttr("href")) { + popularMangaFromElement(element) // genre search results + } else { + super.searchMangaFromElement(element) // query search results + } + + } + override fun searchMangaNextPageSelector() = popularMangaNextPageSelector() + override fun chapterListSelector() = "ul.main.version-chap > li.wp-manga-chapter:not(:last-child)" // removing empty li + override val pageListParseSelector = "div#all > img.img-responsive" + override fun getFilterList() = FilterList( + Filter.Header("Solo funciona si la consulta está en blanco"), + GenreSelectFilter() + ) + class GenreSelectFilter : UriPartFilter("Búsqueda de género", arrayOf( + Pair("", ""), + Pair("Ecchi", "ecchi"), + Pair("Yaoi", "yaoi"), + Pair("Yuri", "yuri"), + Pair("Anal", "anal"), + Pair("Tetonas", "tetonas"), + Pair("Escolares", "escolares"), + Pair("Incesto", "incesto"), + Pair("Virgenes", "virgenes"), + Pair("Masturbacion", "masturbacion"), + Pair("Maduras", "maduras"), + Pair("Lolicon", "lolicon"), + Pair("Bikini", "bikini"), + Pair("Sirvientas", "sirvientas"), + Pair("Enfermera", "enfermera"), + Pair("Embarazada", "embarazada"), + Pair("Ahegao", "ahegao"), + Pair("Casadas", "casadas"), + Pair("Chica Con Pene", "chica-con-pene"), + Pair("Juguetes Sexuales", "juguetes-sexuales"), + Pair("Orgias", "orgias"), + Pair("Harem", "harem"), + Pair("Romance", "romance"), + Pair("Profesores", "profesores"), + Pair("Tentaculos", "tentaculos"), + Pair("Mamadas", "mamadas"), + Pair("Shota", "shota"), + Pair("Interracial", "interracial"), + Pair("Full Color", "full-colo"), + Pair("Sin Censura", "sin-censura"), + Pair("Futanari", "futanari"), + Pair("Doble Penetracion", "doble-penetracion"), + Pair("Cosplay", "cosplay") + ) + ) +}