Update C&H (#473)
This commit is contained in:
parent
640344e5e2
commit
11e66824c4
|
@ -2,7 +2,7 @@ ext {
|
||||||
extName = 'Cyanide & Happiness'
|
extName = 'Cyanide & Happiness'
|
||||||
pkgNameSuffix = 'en.explosm'
|
pkgNameSuffix = 'en.explosm'
|
||||||
extClass = '.Explosm'
|
extClass = '.Explosm'
|
||||||
extVersionCode = 3
|
extVersionCode = 4
|
||||||
}
|
}
|
||||||
|
|
||||||
apply from: "$rootDir/common.gradle"
|
apply from: "$rootDir/common.gradle"
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package eu.kanade.tachiyomi.extension.en.explosm
|
package eu.kanade.tachiyomi.extension.en.explosm
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.network.GET
|
import eu.kanade.tachiyomi.network.GET
|
||||||
|
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
|
||||||
|
@ -8,11 +9,16 @@ 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.HttpSource
|
import eu.kanade.tachiyomi.source.online.HttpSource
|
||||||
import eu.kanade.tachiyomi.util.asJsoup
|
import eu.kanade.tachiyomi.util.asJsoup
|
||||||
|
import kotlinx.serialization.decodeFromString
|
||||||
|
import kotlinx.serialization.json.Json
|
||||||
|
import kotlinx.serialization.json.JsonElement
|
||||||
|
import kotlinx.serialization.json.JsonObject
|
||||||
|
import kotlinx.serialization.json.jsonArray
|
||||||
|
import kotlinx.serialization.json.jsonObject
|
||||||
|
import kotlinx.serialization.json.jsonPrimitive
|
||||||
import okhttp3.OkHttpClient
|
import okhttp3.OkHttpClient
|
||||||
import okhttp3.Request
|
import okhttp3.Request
|
||||||
import okhttp3.Response
|
import okhttp3.Response
|
||||||
import org.jsoup.nodes.Document
|
|
||||||
import org.jsoup.nodes.Element
|
|
||||||
import rx.Observable
|
import rx.Observable
|
||||||
import java.text.SimpleDateFormat
|
import java.text.SimpleDateFormat
|
||||||
import java.util.Locale
|
import java.util.Locale
|
||||||
|
@ -29,23 +35,39 @@ class Explosm : HttpSource() {
|
||||||
|
|
||||||
override val client: OkHttpClient = network.cloudflareClient
|
override val client: OkHttpClient = network.cloudflareClient
|
||||||
|
|
||||||
private fun createManga(element: Element): SManga {
|
private val archivePage = "$baseUrl/comics"
|
||||||
return SManga.create().apply {
|
|
||||||
initialized = true
|
private fun getArchiveAllYears(response: Response): JsonObject {
|
||||||
title = "C&H ${element.attr("id").substringAfter("panel")}" // year
|
val jsonPath = response.asJsoup()
|
||||||
setUrlWithoutDomain(element.select("li a").first()!!.attr("href")) // January
|
.select("head > script").last()?.attr("src")
|
||||||
thumbnail_url = "https://vhx.imgix.net/vitalyuncensored/assets/13ea3806-5ebf-4987-bcf1-82af2b689f77/S2E4_Still1.jpg"
|
?.replace("static", "data")
|
||||||
}
|
?.replaceAfterLast("/", "comics.json")
|
||||||
|
?: throw Exception("Error at last() in getArchiveAllYears")
|
||||||
|
val json = client.newCall(GET(baseUrl + jsonPath, headers)).execute().body.string()
|
||||||
|
return Json.decodeFromString<JsonObject>(json)["pageProps"]
|
||||||
|
?.jsonObject?.get("comicArchiveData")
|
||||||
|
?.jsonObject
|
||||||
|
?: throw Exception("Error while returning getArchiveAllYears")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Popular
|
// Popular
|
||||||
|
|
||||||
override fun popularMangaRequest(page: Int): Request {
|
override fun popularMangaRequest(page: Int): Request {
|
||||||
return (GET("$baseUrl/comics/archive", headers))
|
return (GET(archivePage, headers))
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun popularMangaParse(response: Response): MangasPage {
|
override fun popularMangaParse(response: Response): MangasPage {
|
||||||
val eachYearAsAManga = response.asJsoup().select("dd.accordion-navigation > div").map { createManga(it) }
|
val eachYearAsAManga = getArchiveAllYears(response)
|
||||||
|
.map { year ->
|
||||||
|
SManga.create().apply {
|
||||||
|
initialized = true
|
||||||
|
title = "C&H " + year.key // year
|
||||||
|
url = year.key // need key here
|
||||||
|
thumbnail_url = "https://vhx.imgix.net/vitalyuncensored/assets/13ea3806-5ebf-4987-bcf1-82af2b689f77/S2E4_Still1.jpg"
|
||||||
|
author = "Explosm.net"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.reversed()
|
||||||
|
|
||||||
return MangasPage(eachYearAsAManga, false)
|
return MangasPage(eachYearAsAManga, false)
|
||||||
}
|
}
|
||||||
|
@ -66,49 +88,63 @@ class Explosm : HttpSource() {
|
||||||
|
|
||||||
// Details
|
// Details
|
||||||
|
|
||||||
override fun mangaDetailsParse(response: Response): SManga {
|
override fun fetchMangaDetails(manga: SManga): Observable<SManga> {
|
||||||
return createManga(response.asJsoup().select("div.content.active").first()!!)
|
return Observable.just(manga)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// for webview
|
||||||
|
override fun mangaDetailsRequest(manga: SManga): Request {
|
||||||
|
return GET("$baseUrl/comics#${manga.url}-01")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun mangaDetailsParse(response: Response): SManga = throw UnsupportedOperationException()
|
||||||
|
|
||||||
// Chapters
|
// Chapters
|
||||||
|
|
||||||
override fun chapterListParse(response: Response): List<SChapter> {
|
private val date = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US)
|
||||||
val document = response.asJsoup()
|
|
||||||
|
|
||||||
val januaryChapters = document.chaptersFromDocument() // should be at bottom of final returned list
|
private fun JsonElement?.getContent(key: String): String {
|
||||||
|
return this?.jsonObject?.get(key)?.jsonPrimitive?.content ?: throw Exception("Error getting chapter content from $key")
|
||||||
// get the rest of the year
|
|
||||||
val chapters = document.select("div.content.active li:not(.active) a").reversed().map {
|
|
||||||
client.newCall(GET(it.attr("abs:href"), headers)).execute().asJsoup().chaptersFromDocument()
|
|
||||||
}.flatten()
|
|
||||||
|
|
||||||
return chapters + januaryChapters
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun Document.chaptersFromDocument(): List<SChapter> {
|
override fun fetchChapterList(manga: SManga): Observable<List<SChapter>> {
|
||||||
return this.select("div.inner-wrap > div.row div.row.collapse").map { element ->
|
var chapterCount = 0F
|
||||||
SChapter.create().apply {
|
return client.newCall(GET(archivePage, headers))
|
||||||
setUrlWithoutDomain(element.select("a").attr("href"))
|
.asObservableSuccess()
|
||||||
element.select("div#comic-author").text().let { cName ->
|
.map { response ->
|
||||||
name = cName
|
getArchiveAllYears(response)[manga.url]?.jsonObject
|
||||||
date_upload = SimpleDateFormat("yyyy.MM.dd", Locale.getDefault())
|
?.map { month ->
|
||||||
.parse(cName.substringBefore(" "))?.time ?: 0L
|
month.value.jsonArray.map { comic ->
|
||||||
}
|
chapterCount++
|
||||||
|
SChapter.create().apply {
|
||||||
|
name = comic.getContent("slug")
|
||||||
|
// we get the url for page.imageurl here
|
||||||
|
url = if (comic.getContent("file_static") != "null") {
|
||||||
|
comic.getContent("file_static")
|
||||||
|
} else {
|
||||||
|
"https://files.explosm.net/comics/${comic.getContent("file")}"
|
||||||
|
}
|
||||||
|
date_upload = date.parse(comic.getContent("publish_at"))?.time ?: 0L
|
||||||
|
scanlator = comic.getContent("author_name")
|
||||||
|
chapter_number = chapterCount // so no "missing chapters" warning in app
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?.flatten()
|
||||||
|
?.reversed()
|
||||||
|
?: throw Exception("Error with main jsonObject")
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun chapterListParse(response: Response): List<SChapter> = throw UnsupportedOperationException()
|
||||||
|
|
||||||
// Pages
|
// Pages
|
||||||
|
|
||||||
override fun fetchPageList(chapter: SChapter): Observable<List<Page>> {
|
override fun fetchPageList(chapter: SChapter): Observable<List<Page>> {
|
||||||
return Observable.just(listOf(Page(0, baseUrl + chapter.url)))
|
return Observable.just(listOf(Page(0, "", chapter.url)))
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun pageListParse(response: Response): List<Page> = throw UnsupportedOperationException()
|
override fun pageListParse(response: Response): List<Page> = throw UnsupportedOperationException()
|
||||||
|
|
||||||
override fun imageUrlParse(response: Response): String {
|
override fun imageUrlParse(response: Response): String = throw UnsupportedOperationException()
|
||||||
return response.asJsoup().select("div#comic-wrap img").attr("abs:src")
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getFilterList() = FilterList()
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue