diff --git a/multisrc/overrides/gattsu/universohentai/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/gattsu/universohentai/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..c1b123201 Binary files /dev/null and b/multisrc/overrides/gattsu/universohentai/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gattsu/universohentai/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/gattsu/universohentai/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..641fa93cb Binary files /dev/null and b/multisrc/overrides/gattsu/universohentai/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gattsu/universohentai/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/gattsu/universohentai/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..0612ac358 Binary files /dev/null and b/multisrc/overrides/gattsu/universohentai/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gattsu/universohentai/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/gattsu/universohentai/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..8175ce30f Binary files /dev/null and b/multisrc/overrides/gattsu/universohentai/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gattsu/universohentai/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/gattsu/universohentai/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..33c0d4b0a Binary files /dev/null and b/multisrc/overrides/gattsu/universohentai/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gattsu/universohentai/res/web_hi_res_512.png b/multisrc/overrides/gattsu/universohentai/res/web_hi_res_512.png new file mode 100644 index 000000000..9ea229683 Binary files /dev/null and b/multisrc/overrides/gattsu/universohentai/res/web_hi_res_512.png differ diff --git a/multisrc/overrides/gattsu/universohentai/src/UniversoHentai.kt b/multisrc/overrides/gattsu/universohentai/src/UniversoHentai.kt new file mode 100644 index 000000000..2a34f5790 --- /dev/null +++ b/multisrc/overrides/gattsu/universohentai/src/UniversoHentai.kt @@ -0,0 +1,69 @@ +package eu.kanade.tachiyomi.extension.pt.universohentai + +import eu.kanade.tachiyomi.annotations.Nsfw +import eu.kanade.tachiyomi.lib.ratelimit.RateLimitInterceptor +import eu.kanade.tachiyomi.multisrc.gattsu.Gattsu +import eu.kanade.tachiyomi.source.model.SChapter +import eu.kanade.tachiyomi.source.model.SManga +import eu.kanade.tachiyomi.util.asJsoup +import okhttp3.OkHttpClient +import okhttp3.Response +import org.jsoup.nodes.Document +import org.jsoup.nodes.Element +import java.util.concurrent.TimeUnit + +@Nsfw +class UniversoHentai : Gattsu( + "Universo Hentai", + "https://universohentai.com", + "pt-BR" +) { + + override val client: OkHttpClient = super.client.newBuilder() + .addInterceptor(RateLimitInterceptor(1, 2, TimeUnit.SECONDS)) + .build() + + override fun latestUpdatesSelector() = "div.meio div.videos div.video a[href^=$baseUrl]:not(:has(span.selo-hd))" + + override fun latestUpdatesFromElement(element: Element): SManga = SManga.create().apply { + title = element.selectFirst("span.video-titulo").text().trim() + thumbnail_url = element.selectFirst("img.wp-post-image").attr("src") + setUrlWithoutDomain(element.attr("href")) + } + + override fun latestUpdatesNextPageSelector() = searchMangaNextPageSelector() + + override fun mangaDetailsParse(document: Document): SManga = SManga.create().apply { + val postBox = document.selectFirst(chapterListSelector())!! + + title = postBox.select("h1.post-titulo").first()!!.text() + author = postBox.select("ul.paginaPostItens li:contains(Artista) a").firstOrNull()?.text() + genre = postBox.select("ul.paginaPostItens li:contains(Categorias) a") + .joinToString(", ") { it.text() } + status = SManga.COMPLETED + thumbnail_url = postBox.select("div.paginaPostThumb > img.wp-post-image") + .attr("src") + .withoutSize() + } + + override fun chapterListParse(response: Response): List<SChapter> { + val document = response.asJsoup() + + return document.select(chapterListSelector()) + .map { chapterFromElement(it) } + } + + override fun chapterListSelector() = "div.meio div.post[itemscope]:has(a[title=Abrir galeria])" + + override fun chapterFromElement(element: Element): SChapter = SChapter.create().apply { + name = "CapĂtulo Ășnico" + scanlator = element.select("ul.paginaPostItens li:contains(Tradutor) a").firstOrNull()?.text() + date_upload = element.ownerDocument().select("meta[property=article:published_time]").firstOrNull() + ?.attr("content") + .orEmpty() + .toDate() + setUrlWithoutDomain(element.selectFirst("a[title=Abrir galeria]").attr("href")) + } + + override fun pageListSelector() = "div.meio div.galeria div.galeria-foto a img" +} diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/gattsu/Gattsu.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/gattsu/Gattsu.kt index a36ec3e86..24a06b050 100644 --- a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/gattsu/Gattsu.kt +++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/gattsu/Gattsu.kt @@ -129,7 +129,7 @@ abstract class Gattsu( return GET(page.imageUrl!!, imageHeaders) } - private fun String.toDate(): Long { + protected fun String.toDate(): Long { return try { DATE_FORMATTER.parse(this.substringBefore("T"))?.time ?: 0L } catch (e: ParseException) { @@ -137,7 +137,7 @@ abstract class Gattsu( } } - private fun String.withoutSize(): String = this.replace(THUMB_SIZE_REGEX, ".") + protected fun String.withoutSize(): String = this.replace(THUMB_SIZE_REGEX, ".") companion object { private const val ACCEPT = "text/html,application/xhtml+xml,application/xml;q=0.9," + diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/gattsu/GattsuGenerator.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/gattsu/GattsuGenerator.kt index 10b51567d..7f1f08fbb 100644 --- a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/gattsu/GattsuGenerator.kt +++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/gattsu/GattsuGenerator.kt @@ -13,7 +13,8 @@ class GattsuGenerator : ThemeSourceGenerator { override val sources = listOf( SingleLang("Hentai Kai", "https://hentaikai.com", "pt-BR", isNsfw = true), - SingleLang("Hentai Season", "https://hentaiseason.com", "pt-BR", isNsfw = true) + SingleLang("Hentai Season", "https://hentaiseason.com", "pt-BR", isNsfw = true), + SingleLang("Universo Hentai", "https://universohentai.com", "pt-BR", isNsfw = true) ) companion object {