diff --git a/src/fr/japscan/build.gradle b/src/fr/japscan/build.gradle index 3426cc0c5..4be82f5e6 100644 --- a/src/fr/japscan/build.gradle +++ b/src/fr/japscan/build.gradle @@ -5,7 +5,7 @@ ext { appName = 'Tachiyomi: Japscan' pkgNameSuffix = 'fr.japscan' extClass = '.Japscan' - extVersionCode = 12 + extVersionCode = 13 libVersion = '1.2' } diff --git a/src/fr/japscan/src/eu/kanade/tachiyomi/extension/fr/japscan/Japscan.kt b/src/fr/japscan/src/eu/kanade/tachiyomi/extension/fr/japscan/Japscan.kt index 7217578d7..3eea1ce39 100644 --- a/src/fr/japscan/src/eu/kanade/tachiyomi/extension/fr/japscan/Japscan.kt +++ b/src/fr/japscan/src/eu/kanade/tachiyomi/extension/fr/japscan/Japscan.kt @@ -4,17 +4,15 @@ import android.graphics.Bitmap import android.graphics.BitmapFactory import android.graphics.Canvas import android.graphics.Rect -import com.google.gson.JsonObject -import com.google.gson.JsonParser import eu.kanade.tachiyomi.network.GET -import eu.kanade.tachiyomi.network.POST +import eu.kanade.tachiyomi.network.asObservableSuccess 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.ParsedHttpSource -import okhttp3.FormBody +import eu.kanade.tachiyomi.util.asJsoup import okhttp3.MediaType import okhttp3.OkHttpClient import okhttp3.Request @@ -23,6 +21,7 @@ import okhttp3.ResponseBody import org.apache.commons.lang3.StringUtils import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import rx.Observable import java.io.ByteArrayOutputStream import java.io.InputStream import java.text.ParseException @@ -100,37 +99,57 @@ class Japscan : ParsedHttpSource() { override fun latestUpdatesNextPageSelector() = "#theresnone" - override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { - val form = FormBody.Builder().apply { - add("search", StringUtils.stripAccents(query)) - } - return POST("$baseUrl/search/", headers, form.build()) + override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable { + val stripped = StringUtils.stripAccents(query) + return client.newCall(searchMangaRequest(stripped[0], page)) + .asObservableSuccess() + .map { response -> + searchMangaParse(response, stripped) + } } - override fun searchMangaParse(response: Response): MangasPage { - val result = JsonParser().parse(response.body()!!.string()).asJsonArray + private fun searchMangaRequest(char: Char, page: Int): Request { + return if (char.isLetter()) GET("$baseUrl/mangas/${char.toUpperCase()}/$page", headers) else GET("$baseUrl/mangas/0-9/$page", headers) + } - if (!result!!.isJsonArray) - return MangasPage(emptyList(), false) + override fun searchMangaRequest(page: Int, query: String, filters: FilterList) = throw Exception("Not used") - val searchMangas = result.map { - searchMangaItemParse(it.asJsonObject) + private fun searchMangaParse(response: Response, query: String): MangasPage { + val mangas = mutableListOf() + var document = response.asJsoup() + var continueSearch = true + var page = 1 + + while (continueSearch) { + document.select(searchMangaSelector()) + .filter { it.select("p a").text().contains(query, ignoreCase = true) } + .map { mangas.add(searchMangaFromElement(it)) } + if (document.select(searchMangaNextPageSelector()).isNotEmpty()) { + page++ + document = client.newCall(searchMangaRequest(query[0], page)).execute().asJsoup() + } else { + continueSearch = false + } } - return MangasPage(searchMangas, false) + return MangasPage(mangas, false) } - private fun searchMangaItemParse(obj: JsonObject) = SManga.create().apply { - title = obj["name"]!!.asString - thumbnail_url = "$baseUrl/${obj["image"]!!.asString}" - url = obj["url"]!!.asString + override fun searchMangaSelector() = "div.row div.flex-wrap div" + + override fun searchMangaFromElement(element: Element): SManga { + val manga = SManga.create() + + element.select("p a").let{ + manga.title = it.text() + manga.setUrlWithoutDomain(it.attr("href")) + } + manga.thumbnail_url = element.select("img").attr("abs:src") + + return manga } - override fun searchMangaSelector() = "#theresnone" - - override fun searchMangaFromElement(element: Element) = popularMangaFromElement(element) - - override fun searchMangaNextPageSelector() = "#theresnone" + override fun searchMangaNextPageSelector() = "ul.pagination li.active + li" override fun mangaDetailsParse(document: Document): SManga { val infoElement = document.select("div#main > .card > .card-body").first()