diff --git a/src/es/manhwasnet/AndroidManifest.xml b/src/es/manhwasnet/AndroidManifest.xml new file mode 100644 index 000000000..30deb7f79 --- /dev/null +++ b/src/es/manhwasnet/AndroidManifest.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest package="eu.kanade.tachiyomi.extension" /> diff --git a/src/es/manhwasnet/build.gradle b/src/es/manhwasnet/build.gradle new file mode 100644 index 000000000..136ff9750 --- /dev/null +++ b/src/es/manhwasnet/build.gradle @@ -0,0 +1,12 @@ +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' + +ext { + extName = 'Manhwas.net' + pkgNameSuffix = 'es.manhwasnet' + extClass = '.ManhwasNet' + extVersionCode = 1 + isNsfw = true +} + +apply from: "$rootDir/common.gradle" diff --git a/src/es/manhwasnet/res/mipmap-hdpi/ic_launcher.png b/src/es/manhwasnet/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..f5eb4d69a Binary files /dev/null and b/src/es/manhwasnet/res/mipmap-hdpi/ic_launcher.png differ diff --git a/src/es/manhwasnet/res/mipmap-mdpi/ic_launcher.png b/src/es/manhwasnet/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..8097a616a Binary files /dev/null and b/src/es/manhwasnet/res/mipmap-mdpi/ic_launcher.png differ diff --git a/src/es/manhwasnet/res/mipmap-xhdpi/ic_launcher.png b/src/es/manhwasnet/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..38ec0e743 Binary files /dev/null and b/src/es/manhwasnet/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/src/es/manhwasnet/res/mipmap-xxhdpi/ic_launcher.png b/src/es/manhwasnet/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..08ca2faa4 Binary files /dev/null and b/src/es/manhwasnet/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/src/es/manhwasnet/res/mipmap-xxxhdpi/ic_launcher.png b/src/es/manhwasnet/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..cb4393678 Binary files /dev/null and b/src/es/manhwasnet/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/src/es/manhwasnet/res/web_hi_res_512.png b/src/es/manhwasnet/res/web_hi_res_512.png new file mode 100644 index 000000000..ee58d99ff Binary files /dev/null and b/src/es/manhwasnet/res/web_hi_res_512.png differ diff --git a/src/es/manhwasnet/src/eu/kanade/tachiyomi/extension/es/manhwasnet/ManhwasNet.kt b/src/es/manhwasnet/src/eu/kanade/tachiyomi/extension/es/manhwasnet/ManhwasNet.kt new file mode 100644 index 000000000..a763cc7a1 --- /dev/null +++ b/src/es/manhwasnet/src/eu/kanade/tachiyomi/extension/es/manhwasnet/ManhwasNet.kt @@ -0,0 +1,129 @@ +package eu.kanade.tachiyomi.extension.es.manhwasnet + +import eu.kanade.tachiyomi.network.GET +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.online.HttpSource +import eu.kanade.tachiyomi.util.asJsoup +import okhttp3.HttpUrl.Companion.toHttpUrlOrNull +import okhttp3.Request +import okhttp3.Response +import org.jsoup.nodes.Document +import org.jsoup.nodes.Element + +class ManhwasNet : HttpSource() { + override val baseUrl: String = "https://manhwas.net" + override val lang: String = "es" + override val name: String = "Manhwas.net" + override val supportsLatest: Boolean = true + + override fun chapterListParse(response: Response): List<SChapter> { + val document = response.asJsoup() + return document.select(".eplister a").map { chapterEl -> + val chapterUrl = getUrlWithoutDomain(chapterEl.attr("href")) + val chapterName = chapterUrl.substringAfterLast("-") + val chapter = SChapter.create() + chapter.url = chapterUrl + chapter.name = chapterName + chapter.chapter_number = chapterName.toFloat() + chapter + } + } + + override fun imageUrlParse(response: Response): String { + throw UnsupportedOperationException("Not used.") + } + + override fun latestUpdatesParse(response: Response): MangasPage { + val document = response.asJsoup() + val bixbox = document.selectFirst(".bixbox") + val manhwas = parseManhwas(bixbox) + return MangasPage(manhwas, false) + } + + override fun latestUpdatesRequest(page: Int): Request { + return GET("$baseUrl/es") + } + + override fun mangaDetailsParse(response: Response): SManga { + val document = response.asJsoup() + + val manhwa = SManga.create() + + manhwa.title = document.selectFirst(".entry-title").text() + manhwa.thumbnail_url = document.selectFirst(".thumb img").attr("src") + manhwa.description = document.selectFirst(".entry-content").text() + + val estado = document.select(".imptdt a")[1] + manhwa.status = SManga.ONGOING + if (estado.text() == "Finalizado") manhwa.status = SManga.COMPLETED + + return manhwa + } + + override fun pageListParse(response: Response): List<Page> { + val document = response.asJsoup() + return document.select("#imgs img").mapIndexed { i, img -> + val url = img.attr("src") + Page(i, imageUrl = url) + } + } + + override fun popularMangaParse(response: Response): MangasPage { + val document = response.asJsoup() + val manhwas = parseManhwas(document) + val hasNextPage = document.selectFirst(".wpag-li.page-item [rel=\"next\"]") != null + return MangasPage(manhwas, hasNextPage) + } + + override fun popularMangaRequest(page: Int): Request { + val url = "$baseUrl/biblioteca".toHttpUrlOrNull()!!.newBuilder() + if (page > 1) { + url.addQueryParameter("page", page.toString()) + } + return GET(url.build().toString()) + } + + override fun searchMangaParse(response: Response): MangasPage { + val document = response.asJsoup() + val manhwas = parseManhwas(document) + val hasNextPage = document.selectFirst(".wpag-li.page-item [rel=\"next\"]") != null + return MangasPage(manhwas, hasNextPage) + } + + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { + val url = "$baseUrl/biblioteca".toHttpUrlOrNull()!!.newBuilder() + url.addQueryParameter("buscar", query) + if (page > 1) { + url.addQueryParameter("page", page.toString()) + } + return GET(url.build().toString()) + } + + private fun parseManhwas(element: Element): List<SManga> { + return element.select(".bsx").map { bxs -> + val manhwa = SManga.create() + manhwa.url = getUrlWithoutDomain( + transformUrl(bxs.selectFirst("a").attr("href")) + ) + manhwa.title = bxs.selectFirst(".tt").text().trim() + manhwa.thumbnail_url = bxs.selectFirst(".ts-post-image").attr("src") + manhwa + } + } + + private fun parseManhwas(document: Document): List<SManga> { + return parseManhwas(document.body()) + } + + private fun transformUrl(url: String): String { + if (!url.contains("/leer/")) return url + val name = url.substringAfter("/leer/").substringBeforeLast("-") + return "$baseUrl/manga/$name" + } + + private fun getUrlWithoutDomain(url: String) = url.substringAfter(baseUrl) +}