Japscan search (#1688)

Japscan search
This commit is contained in:
Mike 2019-10-22 07:22:38 -04:00 committed by arkon
parent 261560afd9
commit cf9087506f
2 changed files with 45 additions and 26 deletions

View File

@ -5,7 +5,7 @@ ext {
appName = 'Tachiyomi: Japscan' appName = 'Tachiyomi: Japscan'
pkgNameSuffix = 'fr.japscan' pkgNameSuffix = 'fr.japscan'
extClass = '.Japscan' extClass = '.Japscan'
extVersionCode = 12 extVersionCode = 13
libVersion = '1.2' libVersion = '1.2'
} }

View File

@ -4,17 +4,15 @@ import android.graphics.Bitmap
import android.graphics.BitmapFactory import android.graphics.BitmapFactory
import android.graphics.Canvas import android.graphics.Canvas
import android.graphics.Rect 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.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.FilterList
import eu.kanade.tachiyomi.source.model.MangasPage import eu.kanade.tachiyomi.source.model.MangasPage
import eu.kanade.tachiyomi.source.model.Page import eu.kanade.tachiyomi.source.model.Page
import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import okhttp3.FormBody import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.MediaType import okhttp3.MediaType
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
@ -23,6 +21,7 @@ import okhttp3.ResponseBody
import org.apache.commons.lang3.StringUtils import org.apache.commons.lang3.StringUtils
import org.jsoup.nodes.Document import org.jsoup.nodes.Document
import org.jsoup.nodes.Element import org.jsoup.nodes.Element
import rx.Observable
import java.io.ByteArrayOutputStream import java.io.ByteArrayOutputStream
import java.io.InputStream import java.io.InputStream
import java.text.ParseException import java.text.ParseException
@ -100,37 +99,57 @@ class Japscan : ParsedHttpSource() {
override fun latestUpdatesNextPageSelector() = "#theresnone" override fun latestUpdatesNextPageSelector() = "#theresnone"
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable<MangasPage> {
val form = FormBody.Builder().apply { val stripped = StringUtils.stripAccents(query)
add("search", StringUtils.stripAccents(query)) return client.newCall(searchMangaRequest(stripped[0], page))
.asObservableSuccess()
.map { response ->
searchMangaParse(response, stripped)
} }
return POST("$baseUrl/search/", headers, form.build())
} }
override fun searchMangaParse(response: Response): MangasPage { private fun searchMangaRequest(char: Char, page: Int): Request {
val result = JsonParser().parse(response.body()!!.string()).asJsonArray 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)
val searchMangas = result.map {
searchMangaItemParse(it.asJsonObject)
} }
return MangasPage(searchMangas, false) override fun searchMangaRequest(page: Int, query: String, filters: FilterList) = throw Exception("Not used")
private fun searchMangaParse(response: Response, query: String): MangasPage {
val mangas = mutableListOf<SManga>()
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
}
} }
private fun searchMangaItemParse(obj: JsonObject) = SManga.create().apply { return MangasPage(mangas, false)
title = obj["name"]!!.asString
thumbnail_url = "$baseUrl/${obj["image"]!!.asString}"
url = obj["url"]!!.asString
} }
override fun searchMangaSelector() = "#theresnone" override fun searchMangaSelector() = "div.row div.flex-wrap div"
override fun searchMangaFromElement(element: Element) = popularMangaFromElement(element) override fun searchMangaFromElement(element: Element): SManga {
val manga = SManga.create()
override fun searchMangaNextPageSelector() = "#theresnone" 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 searchMangaNextPageSelector() = "ul.pagination li.active + li"
override fun mangaDetailsParse(document: Document): SManga { override fun mangaDetailsParse(document: Document): SManga {
val infoElement = document.select("div#main > .card > .card-body").first() val infoElement = document.select("div#main > .card > .card-body").first()