From d02f1520893963890ce4c7ea5ba9bb48283283b9 Mon Sep 17 00:00:00 2001 From: Mike <51273546+SnakeDoc83@users.noreply.github.com> Date: Wed, 15 Jan 2020 17:26:52 -0500 Subject: [PATCH] Henchan - thumbnails (#2075) Henchan - thumbnails --- src/ru/henchan/build.gradle | 2 +- .../tachiyomi/extension/ru/henchan/Henchan.kt | 68 ++++++++++++------- 2 files changed, 45 insertions(+), 25 deletions(-) diff --git a/src/ru/henchan/build.gradle b/src/ru/henchan/build.gradle index e564ddb6c..f120e891e 100644 --- a/src/ru/henchan/build.gradle +++ b/src/ru/henchan/build.gradle @@ -5,7 +5,7 @@ ext { appName = 'Tachiyomi: Henchan' pkgNameSuffix = 'ru.henchan' extClass = '.Henchan' - extVersionCode = 11 + extVersionCode = 12 libVersion = '1.2' } dependencies { diff --git a/src/ru/henchan/src/eu/kanade/tachiyomi/extension/ru/henchan/Henchan.kt b/src/ru/henchan/src/eu/kanade/tachiyomi/extension/ru/henchan/Henchan.kt index de726e138..efd858551 100644 --- a/src/ru/henchan/src/eu/kanade/tachiyomi/extension/ru/henchan/Henchan.kt +++ b/src/ru/henchan/src/eu/kanade/tachiyomi/extension/ru/henchan/Henchan.kt @@ -5,6 +5,7 @@ import com.github.salomonbrys.kotson.array import com.github.salomonbrys.kotson.fromJson import com.github.salomonbrys.kotson.string import com.google.gson.Gson +import com.google.gson.JsonArray import com.google.gson.JsonObject import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.source.model.* @@ -17,7 +18,7 @@ import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element import java.text.SimpleDateFormat -import java.util.* +import java.util.Locale class Henchan : ParsedHttpSource() { @@ -92,10 +93,15 @@ class Henchan : ParsedHttpSource() { override fun searchMangaSelector() = ".content_row:not(:has(div.item:containsOwn(Тип)))" - private fun String.getHQThumbnail(): String = this - .replace("manganew_thumbs", "showfull_retina/manga") - .replace("img.", "imgcover.") - .replace("_henchan.me", "_hentaichan.ru") + private fun String.getHQThumbnail(): String? { + return if (this.isNotEmpty()) { + this.replace("manganew_thumbs", "showfull_retina/manga") + .replace("img.", "imgcover.") + .replace("_henchan.me", "_hentaichan.ru") + } else { + null + } + } override fun popularMangaFromElement(element: Element): SManga { val manga = SManga.create() @@ -120,10 +126,16 @@ class Henchan : ParsedHttpSource() { override fun searchMangaNextPageSelector() = "#nextlink, ${popularMangaNextPageSelector()}" - override fun mangaDetailsParse(document: Document): SManga { val manga = SManga.create() - manga.thumbnail_url = document.select("#cover").first().attr("src") + manga.thumbnail_url = document.select("#cover").first().attr("src").let { + if (it.isNotEmpty()) { + it + } else { + client.newCall(GET(document.select("div.extaraNavi p:last-child a").attr("abs:href") + "?development_access=true#page=1", headers)) + .execute().asJsoup().parseJsonArray()[0].string + "#" // # for later so we know where we got it from + } + } manga.author = document.select(".row .item2 h2")[1].text() manga.genre = document.select(".sidetag > a:eq(2)").joinToString { it.text() } manga.description = document.select("#description").text() @@ -131,12 +143,12 @@ class Henchan : ParsedHttpSource() { } override fun chapterListRequest(manga: SManga): Request { - val baseMangaUrl = baseUrl + manga.url - if(manga.thumbnail_url?.isBlank() ?: return GET(baseMangaUrl.replace("/manga/", "/related/"), headers)){ - return GET(baseMangaUrl, headers) - }else { - return GET(baseMangaUrl.replace("/manga/", "/related/"), headers) + val url = baseUrl + if (manga.thumbnail_url?.endsWith("#") == true) { + manga.url + } else { + manga.url.replace("/manga/", "/related/") } + return (GET(url, headers)) } override fun chapterListSelector() = ".related" @@ -145,9 +157,10 @@ class Henchan : ParsedHttpSource() { val responseUrl = response.request().url().toString() val document = response.asJsoup() + // exhentai chapter if(responseUrl.contains("/manga/")){ val chap = SChapter.create() - chap.setUrlWithoutDomain(responseUrl.removePrefix(baseUrl)) + chap.setUrlWithoutDomain(responseUrl) chap.name = document.select("a.title_top_a").text() chap.chapter_number = 1F @@ -158,6 +171,7 @@ class Henchan : ParsedHttpSource() { return listOf(chap) } + // one chapter, nothing related if (document.select("#right > div:nth-child(4)").text().contains(" похожий на ")) { val chap = SChapter.create() chap.setUrlWithoutDomain(document.select("#left > div > a").attr("href")) @@ -167,7 +181,7 @@ class Henchan : ParsedHttpSource() { return listOf(chap) } - + // has related chapters val result = mutableListOf() result.addAll(document.select(chapterListSelector()).map { chapterFromElement(it) @@ -201,22 +215,28 @@ class Henchan : ParsedHttpSource() { } override fun pageListRequest(chapter: SChapter): Request { - val url = exhentaiBaseUrl + chapter.url.replace("/manga/", "/online/") + "?development_access=true" + val url = if (chapter.url.contains("/manga/")) { + exhentaiBaseUrl + chapter.url.replace("/manga/", "/online/") + "?development_access=true" + } else { + baseUrl + chapter.url + } return GET(url, Headers.Builder().add("Accept", "image/webp,image/apng").build()) } override fun imageUrlParse(document: Document) = throw Exception("Not Used") - override fun pageListParse(document: Document): List { - val imgScript = document.select("script:containsData(fullimg)").first().toString() - val imgString = imgScript.substring(imgScript.indexOf('{'), imgScript.lastIndexOf('}') + 1) - val jsonArray = Gson().fromJson(imgString)["fullimg"].array + private val gson = Gson() - val resPages = mutableListOf() - jsonArray.forEachIndexed { index, imageUrl -> - resPages.add(Page(index, imageUrl = imageUrl.string.replace(".gif.webp", ".gif"))) + private fun Document.parseJsonArray(): JsonArray { + val imgScript = this.select("script:containsData(fullimg)").first().toString() + val imgString = imgScript.substring(imgScript.indexOf('{'), imgScript.lastIndexOf('}') + 1) + return gson.fromJson(imgString)["fullimg"].array + } + + override fun pageListParse(document: Document): List { + return document.parseJsonArray().mapIndexed { index, imageUrl -> + Page(index, imageUrl = imageUrl.string.replace(".gif.webp", ".gif")) } - return resPages } private class Genre(val id: String, name: String = id.replace('_', ' ').capitalize()) : Filter.TriState(name) @@ -226,7 +246,7 @@ class Henchan : ParsedHttpSource() { arrayOf("manga/new&n=dateasc" to "manga/new", "manga/new&n=favasc" to "mostfavorites&sort=manga", "manga/new&n=abcdesc" to "manga/new&n=abcasc")) private open class UriPartFilter(displayName: String, sortNames: Array, val withGenres: Array>, val withoutGenres: Array>) : - Filter.Sort(displayName, sortNames, Filter.Sort.Selection(1, false)) { + Filter.Sort(displayName, sortNames, Selection(1, false)) { fun toUriPartWithGenres() = if(state!!.ascending) withGenres[state!!.index].first else withGenres[state!!.index].second fun toUriPartWithoutGenres() = if(state!!.ascending) withoutGenres[state!!.index].first else withoutGenres[state!!.index].second }