feat(misskon): split chapters into individual pages (#8800)
* feat(misskon): split chapters into individual pages - Migrate from single-chapter to per-page architecture - Fix long loading time issues * fix(misskon): Remove chapter_number configuration - Drop deprecated chapter_number field setup
This commit is contained in:
parent
314c5e0ed3
commit
c44aba3f1a
@ -1,7 +1,7 @@
|
|||||||
ext {
|
ext {
|
||||||
extName = 'MissKon'
|
extName = 'MissKon'
|
||||||
extClass = '.MissKon'
|
extClass = '.MissKon'
|
||||||
extVersionCode = 1
|
extVersionCode = 2
|
||||||
isNsfw = true
|
isNsfw = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -13,6 +13,7 @@ import keiyoushi.utils.firstInstance
|
|||||||
import keiyoushi.utils.tryParse
|
import keiyoushi.utils.tryParse
|
||||||
import okhttp3.HttpUrl.Companion.toHttpUrl
|
import okhttp3.HttpUrl.Companion.toHttpUrl
|
||||||
import okhttp3.Request
|
import okhttp3.Request
|
||||||
|
import okhttp3.Response
|
||||||
import org.jsoup.nodes.Document
|
import org.jsoup.nodes.Document
|
||||||
import org.jsoup.nodes.Element
|
import org.jsoup.nodes.Element
|
||||||
import java.text.SimpleDateFormat
|
import java.text.SimpleDateFormat
|
||||||
@ -76,46 +77,36 @@ class MissKon() : SimpleParsedHttpSource() {
|
|||||||
return SManga.create().apply {
|
return SManga.create().apply {
|
||||||
title = postInnerEl.select(".post-title").text()
|
title = postInnerEl.select(".post-title").text()
|
||||||
genre = postInnerEl.select(".post-tag > a").joinToString { it.text() }
|
genre = postInnerEl.select(".post-tag > a").joinToString { it.text() }
|
||||||
|
status = SManga.COMPLETED
|
||||||
|
update_strategy = UpdateStrategy.ONLY_FETCH_ONCE
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun chapterListSelector() = "html"
|
override fun chapterFromElement(element: Element) = throw UnsupportedOperationException()
|
||||||
|
override fun chapterListParse(response: Response): List<SChapter> {
|
||||||
override fun chapterFromElement(element: Element): SChapter {
|
val doc = response.asJsoup()
|
||||||
val dateStr = element.selectFirst(".entry img")?.absUrl("data-src")
|
val dateUploadStr = doc.selectFirst(".entry img")?.absUrl("data-src")
|
||||||
?.let { url ->
|
?.let { url ->
|
||||||
FULL_DATE_REGEX.find(url)?.groupValues?.get(1)
|
FULL_DATE_REGEX.find(url)?.groupValues?.get(1)
|
||||||
?: YEAR_MONTH_REGEX.find(url)?.groupValues?.get(1)?.let { "$it/01" }
|
?: YEAR_MONTH_REGEX.find(url)?.groupValues?.get(1)?.let { "$it/01" }
|
||||||
}
|
}
|
||||||
|
val dateUpload = FULL_DATE_FORMAT.tryParse(dateUploadStr)
|
||||||
return SChapter.create().apply {
|
val maxPage = doc.select("div.page-link:first-of-type a.post-page-numbers").last()?.text()?.toInt() ?: 1
|
||||||
chapter_number = 0F
|
val basePageUrl = response.request.url.toString()
|
||||||
setUrlWithoutDomain(element.selectFirst("link[rel=canonical]")!!.absUrl("href"))
|
return (maxPage downTo 1).map { page ->
|
||||||
name = "Gallery"
|
SChapter.create().apply {
|
||||||
date_upload = FULL_DATE_FORMAT.tryParse(dateStr)
|
setUrlWithoutDomain("$basePageUrl/$page")
|
||||||
|
name = "Page $page"
|
||||||
|
date_upload = dateUpload
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// endregion
|
// endregion
|
||||||
|
|
||||||
// region Pages
|
// region Pages
|
||||||
override fun pageListParse(document: Document): List<Page> {
|
override fun pageListParse(document: Document): List<Page> {
|
||||||
val basePageUrl = document.selectFirst("link[rel=canonical]")!!.absUrl("href")
|
return document.select("div.post-inner > div.entry > p > img")
|
||||||
|
.mapIndexed { i, imgEl -> Page(i, imageUrl = imgEl.absUrl("data-src")) }
|
||||||
val pages = mutableListOf<Page>()
|
|
||||||
document.select("div.post-inner div.page-link:nth-child(1) .post-page-numbers")
|
|
||||||
.forEachIndexed { index, pageEl ->
|
|
||||||
val doc = when (index) {
|
|
||||||
0 -> document
|
|
||||||
else -> {
|
|
||||||
val url = "$basePageUrl${pageEl.text()}/"
|
|
||||||
client.newCall(GET(url, headers)).execute().asJsoup()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
doc.select("div.post-inner > div.entry > p > img")
|
|
||||||
.map { it.absUrl("data-src") }
|
|
||||||
.forEach { pages.add(Page(pages.size, imageUrl = it)) }
|
|
||||||
}
|
|
||||||
return pages
|
|
||||||
}
|
}
|
||||||
// endregion
|
// endregion
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user