diff --git a/src/pt/muitohentai/AndroidManifest.xml b/src/pt/muitohentai/AndroidManifest.xml new file mode 100644 index 000000000..568741e54 --- /dev/null +++ b/src/pt/muitohentai/AndroidManifest.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/src/pt/muitohentai/build.gradle b/src/pt/muitohentai/build.gradle new file mode 100644 index 000000000..9bb5f98ce --- /dev/null +++ b/src/pt/muitohentai/build.gradle @@ -0,0 +1,13 @@ +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' + +ext { + extName = 'Muito Hentai' + pkgNameSuffix = 'pt.muitohentai' + extClass = '.MuitoHentai' + extVersionCode = 1 + libVersion = '12' + containsNsfw = true +} + +apply from: "$rootDir/common.gradle" \ No newline at end of file diff --git a/src/pt/muitohentai/res/mipmap-hdpi/ic_launcher.png b/src/pt/muitohentai/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..8b939e21a Binary files /dev/null and b/src/pt/muitohentai/res/mipmap-hdpi/ic_launcher.png differ diff --git a/src/pt/muitohentai/res/mipmap-mdpi/ic_launcher.png b/src/pt/muitohentai/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..371312343 Binary files /dev/null and b/src/pt/muitohentai/res/mipmap-mdpi/ic_launcher.png differ diff --git a/src/pt/muitohentai/res/mipmap-xhdpi/ic_launcher.png b/src/pt/muitohentai/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..8a8803323 Binary files /dev/null and b/src/pt/muitohentai/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/src/pt/muitohentai/res/mipmap-xxhdpi/ic_launcher.png b/src/pt/muitohentai/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..bbd5b3bc4 Binary files /dev/null and b/src/pt/muitohentai/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/src/pt/muitohentai/res/mipmap-xxxhdpi/ic_launcher.png b/src/pt/muitohentai/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..68fc316be Binary files /dev/null and b/src/pt/muitohentai/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/src/pt/muitohentai/src/eu/kanade/tachiyomi/animeextension/pt/muitohentai/MuitoHentai.kt b/src/pt/muitohentai/src/eu/kanade/tachiyomi/animeextension/pt/muitohentai/MuitoHentai.kt new file mode 100644 index 000000000..462442d7d --- /dev/null +++ b/src/pt/muitohentai/src/eu/kanade/tachiyomi/animeextension/pt/muitohentai/MuitoHentai.kt @@ -0,0 +1,143 @@ +package eu.kanade.tachiyomi.animeextension.pt.muitohentai + +import eu.kanade.tachiyomi.animesource.model.AnimeFilterList +import eu.kanade.tachiyomi.animesource.model.AnimesPage +import eu.kanade.tachiyomi.animesource.model.SAnime +import eu.kanade.tachiyomi.animesource.model.SEpisode +import eu.kanade.tachiyomi.animesource.model.Video +import eu.kanade.tachiyomi.animesource.online.ParsedAnimeHttpSource +import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.util.asJsoup +import okhttp3.Request +import okhttp3.Response +import org.jsoup.nodes.Document +import org.jsoup.nodes.Element +import java.text.SimpleDateFormat + +class MuitoHentai : ParsedAnimeHttpSource() { + override val name = "Muito Hentai" + override val baseUrl = "https://www.muitohentai.com" + override val lang = "pt-BR" + override val supportsLatest = true + + // ============================== Popular =============================== + override fun popularAnimeSelector(): String = "ul.ul_sidebar > li" + override fun popularAnimeRequest(page: Int): Request = GET("$baseUrl/ranking-hentais/?paginacao=$page") + + override fun popularAnimeFromElement(element: Element): SAnime { + return SAnime.create().apply { + thumbnail_url = element.selectFirst("div.zeroleft > a > img")!!.attr("src") + val a = element.selectFirst("div.lefthentais > div > b:gt(0) > a.series")!! + url = a.attr("href") + title = a.text() + } + } + override fun popularAnimeNextPageSelector() = "div.paginacao > a:contains(»)" + override fun popularAnimeParse(response: Response): AnimesPage { + val document = response.asJsoup() + val animes = document.select(popularAnimeSelector()).map(::popularAnimeFromElement) + return AnimesPage(animes, document.selectFirst(popularAnimeNextPageSelector()) != null) + } + + // ============================== Episodes ============================== + override fun episodeListSelector(): String = "article.item" + override fun episodeListParse(response: Response): List { + val doc = response.asJsoup() + return doc + .select(episodeListSelector()) + .map(::episodeFromElement) + .reversed() + } + override fun episodeFromElement(element: Element): SEpisode { + return SEpisode.create().apply { + val data = element.selectFirst("div.data")!! + url = element.selectFirst("div.poster > div.season_m > a")!!.attr("href") + name = data.selectFirst("h3")!!.text().trim() + date_upload = parseDate(data.selectFirst("span")!!.text()) + } + } + + // ============================ Video Links ============================= + override fun videoListSelector() = "div.playex > div#option-0 > iframe" + override fun videoListParse(response: Response): List