Japscan: fix browse, thumbnail, pagination (#3157)

Also removed the 'page number' filter - would have to reimplement it
with the new format, which seems like effort. Also, such features are
better suited for the app to implement directly.
This commit is contained in:
Vetle Ledaal 2024-05-22 05:32:04 +00:00 committed by Draff
parent 986683e93d
commit 608a2c5d2a
2 changed files with 10 additions and 76 deletions

View File

@ -1,7 +1,7 @@
ext { ext {
extName = 'Japscan' extName = 'Japscan'
extClass = '.Japscan' extClass = '.Japscan'
extVersionCode = 44 extVersionCode = 45
} }
apply from: "$rootDir/common.gradle" apply from: "$rootDir/common.gradle"

View File

@ -10,7 +10,6 @@ import android.webkit.JavascriptInterface
import android.webkit.WebView import android.webkit.WebView
import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.network.POST import eu.kanade.tachiyomi.network.POST
import eu.kanade.tachiyomi.network.asObservableSuccess
import eu.kanade.tachiyomi.network.interceptor.rateLimit import eu.kanade.tachiyomi.network.interceptor.rateLimit
import eu.kanade.tachiyomi.source.ConfigurableSource import eu.kanade.tachiyomi.source.ConfigurableSource
import eu.kanade.tachiyomi.source.model.Filter import eu.kanade.tachiyomi.source.model.Filter
@ -33,7 +32,6 @@ import okhttp3.Request
import okhttp3.Response import okhttp3.Response
import org.jsoup.nodes.Document import org.jsoup.nodes.Document
import org.jsoup.nodes.Element import org.jsoup.nodes.Element
import rx.Observable
import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get import uy.kohesive.injekt.api.get
import uy.kohesive.injekt.injectLazy import uy.kohesive.injekt.injectLazy
@ -81,23 +79,12 @@ class Japscan : ConfigurableSource, ParsedHttpSource() {
// Popular // Popular
override fun popularMangaRequest(page: Int): Request { override fun popularMangaRequest(page: Int): Request {
return GET("$baseUrl/mangas/", headers) return GET("$baseUrl/mangas/?sort=popular&p=$page", headers)
} }
override fun popularMangaParse(response: Response): MangasPage { override fun popularMangaNextPageSelector() = ".pagination > li:last-child:not(.disabled)"
val document = response.asJsoup()
pageNumberDoc = document
val mangas = document.select(popularMangaSelector()).map { element -> override fun popularMangaSelector() = ".mangas-list .manga-block:not(:has(a[href='']))"
popularMangaFromElement(element)
}
val hasNextPage = false
return MangasPage(mangas, hasNextPage)
}
override fun popularMangaNextPageSelector(): String? = null
override fun popularMangaSelector() = "#top_mangas_week li"
override fun popularMangaFromElement(element: Element): SManga { override fun popularMangaFromElement(element: Element): SManga {
val manga = SManga.create() val manga = SManga.create()
@ -110,47 +97,15 @@ class Japscan : ConfigurableSource, ParsedHttpSource() {
} }
// Latest // Latest
private lateinit var latestDirectory: List<Element>
override fun fetchLatestUpdates(page: Int): Observable<MangasPage> {
return if (page == 1) {
client.newCall(latestUpdatesRequest(page))
.asObservableSuccess()
.map { latestUpdatesParse(it) }
} else {
Observable.just(parseLatestDirectory(page))
}
}
override fun latestUpdatesRequest(page: Int): Request { override fun latestUpdatesRequest(page: Int): Request {
return GET(baseUrl, headers) return GET("$baseUrl/mangas/?sort=updated&p=$page", headers)
} }
override fun latestUpdatesParse(response: Response): MangasPage { override fun latestUpdatesSelector() = popularMangaSelector()
val document = response.asJsoup()
latestDirectory = document.select(latestUpdatesSelector())
.distinctBy { element -> element.select("a").attr("href") }
return parseLatestDirectory(1)
}
private fun parseLatestDirectory(page: Int): MangasPage {
val manga = mutableListOf<SManga>()
val end = ((page * 24) - 1).let { if (it <= latestDirectory.lastIndex) it else latestDirectory.lastIndex }
for (i in (((page - 1) * 24)..end)) {
manga.add(latestUpdatesFromElement(latestDirectory[i]))
}
return MangasPage(manga, end < latestDirectory.lastIndex)
}
override fun latestUpdatesSelector() = "#chapters h3.mb-0"
override fun latestUpdatesFromElement(element: Element): SManga = popularMangaFromElement(element) override fun latestUpdatesFromElement(element: Element): SManga = popularMangaFromElement(element)
override fun latestUpdatesNextPageSelector(): String = throw UnsupportedOperationException() override fun latestUpdatesNextPageSelector(): String = popularMangaNextPageSelector()
// Search // Search
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
@ -180,7 +135,7 @@ class Japscan : ConfigurableSource, ParsedHttpSource() {
} }
} }
override fun searchMangaNextPageSelector(): String = "li.page-item:last-child:not(li.active)" override fun searchMangaNextPageSelector(): String = popularMangaSelector()
override fun searchMangaSelector(): String = "div.card div.p-2" override fun searchMangaSelector(): String = "div.card div.p-2"
@ -225,7 +180,8 @@ class Japscan : ConfigurableSource, ParsedHttpSource() {
val infoElement = document.selectFirst("#main .card-body")!! val infoElement = document.selectFirst("#main .card-body")!!
val manga = SManga.create() val manga = SManga.create()
manga.thumbnail_url = infoElement.select("img").attr("abs:src") val path = document.location().replaceFirst("$baseUrl/", "")
manga.thumbnail_url = "$baseUrl/imgs/${path.replace(Regex("/$"),".jpg").replace("manga","mangas")}".lowercase(Locale.ROOT)
val infoRows = infoElement.select(".row, .d-flex") val infoRows = infoElement.select(".row, .d-flex")
infoRows.select("p").forEach { el -> infoRows.select("p").forEach { el ->
@ -341,28 +297,6 @@ class Japscan : ConfigurableSource, ParsedHttpSource() {
private class PageList(pages: Array<Int>) : Filter.Select<Int>("Page #", arrayOf(0, *pages)) private class PageList(pages: Array<Int>) : Filter.Select<Int>("Page #", arrayOf(0, *pages))
override fun getFilterList(): FilterList {
val totalPages = pageNumberDoc?.select("li.page-item:last-child a")?.text()
val pageList = mutableListOf<Int>()
return if (!totalPages.isNullOrEmpty()) {
for (i in 0 until totalPages.toInt()) {
pageList.add(i + 1)
}
FilterList(
Filter.Header("Page alphabétique"),
PageList(pageList.toTypedArray()),
)
} else {
FilterList(
Filter.Header("Page alphabétique"),
TextField("Page #"),
Filter.Header("Appuyez sur reset pour la liste"),
)
}
}
private var pageNumberDoc: Document? = null
// Prefs // Prefs
override fun setupPreferenceScreen(screen: androidx.preference.PreferenceScreen) { override fun setupPreferenceScreen(screen: androidx.preference.PreferenceScreen) {
val chapterListPref = androidx.preference.ListPreference(screen.context).apply { val chapterListPref = androidx.preference.ListPreference(screen.context).apply {