diff --git a/src/es/lectormanga/build.gradle b/src/es/lectormanga/build.gradle index e346eca87..a7acf1568 100755 --- a/src/es/lectormanga/build.gradle +++ b/src/es/lectormanga/build.gradle @@ -5,7 +5,7 @@ ext { extName = 'LectorManga' pkgNameSuffix = 'es.lectormanga' extClass = '.LectorManga' - extVersionCode = 12 + extVersionCode = 13 libVersion = '1.2' } diff --git a/src/es/lectormanga/src/eu/kanade/tachiyomi/extension/es/lectormanga/LectorManga.kt b/src/es/lectormanga/src/eu/kanade/tachiyomi/extension/es/lectormanga/LectorManga.kt index 46066709c..380564018 100755 --- a/src/es/lectormanga/src/eu/kanade/tachiyomi/extension/es/lectormanga/LectorManga.kt +++ b/src/es/lectormanga/src/eu/kanade/tachiyomi/extension/es/lectormanga/LectorManga.kt @@ -219,7 +219,7 @@ class LectorManga : ConfigurableSource, ParsedHttpSource() { override fun pageListParse(document: Document): List = mutableListOf().apply { if (getPageMethod() == "cascade") { - document.select("img.viewer-img").forEach { + document.select("div.viewer-container img").forEach { add(Page(size, "", it.let { if (it.hasAttr("data-src")) it.attr("abs:data-src") else it.attr("abs:src") diff --git a/src/es/plottwistnofansub/build.gradle b/src/es/plottwistnofansub/build.gradle new file mode 100644 index 000000000..d926ff3a0 --- /dev/null +++ b/src/es/plottwistnofansub/build.gradle @@ -0,0 +1,17 @@ +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' + +ext { + extName = 'Plot Twist No Fansub' + pkgNameSuffix = 'es.plottwistnofansub' + extClass = '.PlotTwistNoFansub' + extVersionCode = 1 + libVersion = '1.2' +} + +dependencies { + compileOnly 'com.google.code.gson:gson:2.8.5' + compileOnly 'com.github.salomonbrys.kotson:kotson:2.5.0' +} + +apply from: "$rootDir/common.gradle" diff --git a/src/es/plottwistnofansub/res/ic_launcher.png b/src/es/plottwistnofansub/res/ic_launcher.png new file mode 100644 index 000000000..08fcd44f4 Binary files /dev/null and b/src/es/plottwistnofansub/res/ic_launcher.png differ diff --git a/src/es/plottwistnofansub/res/mipmap-hdpi/ic_launcher.png b/src/es/plottwistnofansub/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..1745430fb Binary files /dev/null and b/src/es/plottwistnofansub/res/mipmap-hdpi/ic_launcher.png differ diff --git a/src/es/plottwistnofansub/res/mipmap-mdpi/ic_launcher.png b/src/es/plottwistnofansub/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..a7ff93a08 Binary files /dev/null and b/src/es/plottwistnofansub/res/mipmap-mdpi/ic_launcher.png differ diff --git a/src/es/plottwistnofansub/res/mipmap-xhdpi/ic_launcher.png b/src/es/plottwistnofansub/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..85030762f Binary files /dev/null and b/src/es/plottwistnofansub/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/src/es/plottwistnofansub/res/mipmap-xxhdpi/ic_launcher.png b/src/es/plottwistnofansub/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..5387c4000 Binary files /dev/null and b/src/es/plottwistnofansub/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/src/es/plottwistnofansub/res/mipmap-xxxhdpi/ic_launcher.png b/src/es/plottwistnofansub/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..e5bd7358b Binary files /dev/null and b/src/es/plottwistnofansub/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/src/es/plottwistnofansub/src/eu/kanade/tachiyomi/extension/es/plottwistnofansub/PlotTwistNoFansub.kt b/src/es/plottwistnofansub/src/eu/kanade/tachiyomi/extension/es/plottwistnofansub/PlotTwistNoFansub.kt new file mode 100644 index 000000000..73849d83d --- /dev/null +++ b/src/es/plottwistnofansub/src/eu/kanade/tachiyomi/extension/es/plottwistnofansub/PlotTwistNoFansub.kt @@ -0,0 +1,173 @@ +package eu.kanade.tachiyomi.extension.es.plottwistnofansub + +import com.github.salomonbrys.kotson.array +import com.github.salomonbrys.kotson.get +import com.github.salomonbrys.kotson.string +import com.google.gson.JsonArray +import com.google.gson.JsonElement +import com.google.gson.JsonParser +import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.network.POST +import eu.kanade.tachiyomi.source.model.FilterList +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.ParsedHttpSource +import eu.kanade.tachiyomi.util.asJsoup +import okhttp3.FormBody +import okhttp3.Response +import org.jsoup.nodes.Document +import org.jsoup.nodes.Element + +class PlotTwistNoFansub : ParsedHttpSource() { + + override val baseUrl = "https://www.plot-twistnf-scans.com" + + override val lang = "es" + + override val name = "Plot Twist No Fansub" + + override val supportsLatest = true + + override fun popularMangaRequest(page: Int) = GET("$baseUrl/page/$page/?s", headers) + + override fun popularMangaSelector() = "div.td-module-thumb [href*=\"archivos\"]" + + override fun popularMangaFromElement(element: Element) = SManga.create().apply { + element.select("a").let { + setUrlWithoutDomain(it.attr("href")) + title = it.attr("title") + thumbnail_url = it.select("img").attr("src").replace("-150x150", "") + } + } + + private fun mangaUrlBuilderFromChapterUrl(chapterUrl: String): String { + val postName = chapterUrl.substringAfter("read/").substringBefore("/chapter") + return "/archivos/manga/$postName/" + } + + override fun popularMangaNextPageSelector() = "div.page-nav a:has(i)" + + override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/ulti/", headers) + + override fun latestUpdatesSelector() = "div.row.last-updates div.item" + + override fun latestUpdatesFromElement(element: Element) = SManga.create().apply { + element.select("div.item").let { + setUrlWithoutDomain(mangaUrlBuilderFromChapterUrl(it.select("a.lastup").attr("href"))) + title = it.select("a.lastup").text() + thumbnail_url = it.select("img.lazy.imgigh").attr("data-lazy-src") + } + } + + override fun latestUpdatesNextPageSelector(): String? = null + + override fun mangaDetailsParse(document: Document) = SManga.create().apply { + document.select("article[id^=post-]").let { it -> + thumbnail_url = it.select("img.entry-thumb").attr("src") + description = it.select("strong")?.text() + genre = it.select("div.mangaInfo a").joinToString(", ") { + it.text() + } + } + } + + override fun chapterListSelector() = throw Exception("Not Used") + + private fun chapterUrlBuilder(postName: String, chapterNumber: String): String { + return "/read/$postName/chapter-$chapterNumber/" + } + + private fun paginationFormBuilder(page: Int, mangaId: Int) = FormBody.Builder().apply { + add("action", "lcap") + add("manga_id", mangaId.toString()) + add("pageNumber", page.toString()) + } + + private fun parseJson(json: String): JsonElement { + return JsonParser().parse(json) + } + + private fun fetchChaptersPertPage(page: Int, mangaId: Int): JsonArray { + val res = client.newCall(POST("$baseUrl/wp-admin/admin-ajax.php", headers, paginationFormBuilder(page, mangaId).build())).execute().body()!!.string() + return parseJson(res.toString()).array + } + + private fun chapterFromJsonElement(jsonElement: JsonElement) = SChapter.create().apply { + val nameStr = jsonElement["chapter_name"].string + val chapterNumber = jsonElement["chapter_number"].string + + name = if (nameStr.contains("Capitulo") || nameStr.contains("Capítulo")) { + nameStr + } else if (nameStr.contains("apítulo")) { + nameStr.replace("í", "í") + } else { + "Capítulo $chapterNumber: $nameStr" + } + + url = chapterUrlBuilder(jsonElement["post_name"].string, chapterNumber) + scanlator = "Plot Twist No Fansub" + } + + override fun chapterListParse(response: Response): List = mutableListOf().apply { + val document = response.asJsoup() + val mangaId = document.select("link[rel=shortlink]") + .attr("href") + .substringAfter("?p=") + .toIntOrNull() + + if (mangaId != null) { + var page = 1 + var moreChapters = true + + // This source uses an AJAX paginated plugin to get the chapter list (5 chapters per page), + // if there are no more chapters it returns [], knowing that: + var currentPageChaptersList: JsonArray + val allChaptersList = JsonArray() + + while (moreChapters) { + currentPageChaptersList = fetchChaptersPertPage(page, mangaId) + allChaptersList.addAll(currentPageChaptersList) + + if (currentPageChaptersList.size() == 5) page++ + else moreChapters = false + } + + allChaptersList.forEach { + add(chapterFromJsonElement(it)) + } + } else throw Exception("No fue posible obtener la lista capítulos") + } + + override fun chapterFromElement(element: Element) = throw Exception("Not Used") + + private fun imageUrlBuilder(postName: String, mangaId: String, chapterNumber: String, imgName: String): String { + return "$baseUrl/wp-manga/${postName}_$mangaId/ch_$chapterNumber/$imgName" + } + + override fun pageListParse(document: Document): List = mutableListOf().apply { + val jsonStr = document.select("script:containsData(var obj =)") + .toString() + .substringAfter("obj =") + .substringBeforeLast(";").trim() + + val jsonObject = parseJson(jsonStr) + val imagesList = jsonObject["images"].array + val mangaPostName = jsonObject["title"].string + val chapterNumber = jsonObject["actual"].string + + imagesList.forEach { + add(Page(size, "", imageUrlBuilder(mangaPostName, it["manga_id"].string, chapterNumber, it["image_name"].string))) + } + } + + override fun imageUrlParse(document: Document) = throw Exception("Not Used") + + override fun searchMangaRequest(page: Int, query: String, filters: FilterList) = GET("$baseUrl/page/$page/?s=$query") + + override fun searchMangaFromElement(element: Element) = popularMangaFromElement(element) + + override fun searchMangaNextPageSelector() = popularMangaNextPageSelector() + + override fun searchMangaSelector() = popularMangaSelector() +} diff --git a/src/es/tumangaonline/build.gradle b/src/es/tumangaonline/build.gradle index 2e17f3a3e..188c5b42a 100644 --- a/src/es/tumangaonline/build.gradle +++ b/src/es/tumangaonline/build.gradle @@ -5,7 +5,7 @@ ext { extName = 'TuMangaOnline' pkgNameSuffix = 'es.tumangaonline' extClass = '.TuMangaOnline' - extVersionCode = 27 + extVersionCode = 28 libVersion = '1.2' } diff --git a/src/es/tumangaonline/src/eu/kanade/tachiyomi/extension/es/tumangaonline/TuMangaOnline.kt b/src/es/tumangaonline/src/eu/kanade/tachiyomi/extension/es/tumangaonline/TuMangaOnline.kt index b8b0b1828..e3c5c8db3 100644 --- a/src/es/tumangaonline/src/eu/kanade/tachiyomi/extension/es/tumangaonline/TuMangaOnline.kt +++ b/src/es/tumangaonline/src/eu/kanade/tachiyomi/extension/es/tumangaonline/TuMangaOnline.kt @@ -229,7 +229,7 @@ class TuMangaOnline : ConfigurableSource, ParsedHttpSource() { override fun pageListParse(document: Document): List = mutableListOf().apply { if (getPageMethod() == "cascade") { - document.select("img.viewer-img").forEach { + document.select("div.viewer-container img").forEach { add(Page(size, "", it.let { if (it.hasAttr("data-src")) it.attr("abs:data-src") else it.attr("abs:src")