Add Ciayo Comics (#2394)

[New] Ciayo Comics
This commit is contained in:
happywillow0 2020-03-09 10:45:16 -04:00 committed by GitHub
parent 53bc937198
commit 92e46f4aa9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 221 additions and 0 deletions

View File

@ -0,0 +1,17 @@
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
ext {
appName = 'Tachiyomi: Ciayo Comics'
pkgNameSuffix = 'all.ciayo'
extClass = '.CiayoFactory'
extVersionCode = 1
libVersion = '1.2'
}
dependencies {
compileOnly 'com.google.code.gson:gson:2.8.2'
compileOnly 'com.github.salomonbrys.kotson:kotson:2.5.0'
}
apply from: "$rootDir/common.gradle"

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

View File

@ -0,0 +1,187 @@
package eu.kanade.tachiyomi.extension.all.ciayo
import com.github.salomonbrys.kotson.get
import com.github.salomonbrys.kotson.long
import com.github.salomonbrys.kotson.nullString
import com.github.salomonbrys.kotson.string
import com.google.gson.JsonElement
import com.google.gson.JsonParser
import eu.kanade.tachiyomi.network.GET
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.HttpSource
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.Request
import okhttp3.Response
import org.jsoup.nodes.Element
abstract class Ciayo(override val lang: String) : HttpSource() {
//Info
override val name: String = "Ciayo Comics"
override val baseUrl: String = "https://www.ciayo.com"
private val apiUrl = "https://vueserion.ciayo.com/3.3/comics"
override val supportsLatest: Boolean = true
//Page Helpers
private var next: String? = ""
private var previous: String? = ""
//Popular
override fun popularMangaParse(response: Response): MangasPage {
val body = response.body()!!.string()
val json = JsonParser().parse(body)["c"]
val data = json["data"].asJsonArray
val mangas = data.map { jsonObject ->
popularMangaFromJson(jsonObject)
}
previous = next
next = json["meta"]["cursor"]["next"].nullString
val hasNextPage = json["meta"]["more"].string == "true"
return MangasPage(mangas, hasNextPage)
}
override fun popularMangaRequest(page: Int): Request {
when (page) {
1 -> {
previous = ""
next = ""
}
2 -> previous = "null"
}
val url =
"$apiUrl/?current=$next&previous=$previous&app=desktop&type=comic&count=15&language=$lang&with=image,genres"
return GET(url)
}
private fun popularMangaFromJson(json: JsonElement): SManga = SManga.create().apply {
title = json["title"].string
setUrlWithoutDomain(json["share_url"].string)
thumbnail_url = json["image"]["cover"].string
}
//Latest
override fun latestUpdatesParse(response: Response): MangasPage {
val body = response.body()!!.string()
val json = JsonParser().parse(body)["c"]
val data = json["data"].asJsonArray
val mangas = data.map { jsonObject ->
latestUpdatesFromJson(jsonObject)
}
previous = next
next = json["meta"]["cursor"]["next"].nullString
val hasNextPage = json["meta"]["more"].string == "true"
return MangasPage(mangas, hasNextPage)
}
override fun latestUpdatesRequest(page: Int): Request {
when (page) {
1 -> {
previous = ""
next = ""
}
2 -> previous = "null"
}
val url =
"$apiUrl/new-release?app=desktop&language=$lang&current=$next&previous=$previous&count=10&with=image,genres&type=comic"
return GET(url)
}
private fun latestUpdatesFromJson(json: JsonElement): SManga = popularMangaFromJson(json)
//Search
override fun searchMangaParse(response: Response): MangasPage {
val document = response.asJsoup()
val mangas = document.select(searchMangaSelector()).map { element ->
searchMangaFromElement(element)
}
val hasNextPage = searchMangaNextPageSelector().let { selector ->
document.select(selector).first()
} != null
return MangasPage(mangas, hasNextPage)
}
private fun searchMangaSelector() = "div.ais-Hits li.ais-Hits-item"
private fun searchMangaNextPageSelector() = "a[aria-label=Next page]"
private fun searchMangaFromElement(element: Element): SManga = SManga.create().apply {
thumbnail_url = element.select("img").attr("abs:src")
element.select("a.comic-link").apply {
title = this.text().trim()
url = this.attr("href")
}
}
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
return GET("$baseUrl/$lang/search?query=$query&page=$page")
}
//Details
override fun mangaDetailsParse(response: Response): SManga {
val document = response.asJsoup()
val script = document.select("script:containsdata(NEXT_DATA)").html()
val data = script.substringAfter("__NEXT_DATA__ =").substringBefore("};").trim() + "}"
val json = JsonParser().parse(data)["props"]["pageProps"]["comicProfile"]
return SManga.create().apply {
title = json["title"].string
author = json["author"].string
artist = author
description = json["description"].string
genre = json["genres"].asJsonArray.joinToString(", ") { it["name"].string }
thumbnail_url = json["image"]["cover"].string
}
}
//Chapters
override fun chapterListRequest(manga: SManga): Request {
val slug = manga.url.substringAfterLast("/")
return GET("$apiUrl/$slug/chapters?current=&count=999&app=desktop&language=$lang&with=image,comic&sort=desc")
}
override fun chapterListParse(response: Response): List<SChapter> {
val body = response.body()!!.string()
val json = JsonParser().parse(body)["c"]
val data = json["data"].asJsonArray
return data.filterNot { it["status"].string == "coming-soon" }.map {
SChapter.create().apply {
name = "${it["episode"].string} - ${it["name"].string}"
scanlator = "[${it["status"].string}]"
setUrlWithoutDomain(it["share_url"].string)
date_upload = it["release_date"].long * 1000
}
}
}
//Pages
override fun pageListParse(response: Response): List<Page> = mutableListOf<Page>().apply {
val document = response.asJsoup()
document.select("div.chapterViewer img").forEach {
add(Page(size, "", it.attr("abs:src")))
}
}
override fun imageUrlParse(response: Response): String = throw Exception("ImgParse Not Used")
}

View File

@ -0,0 +1,17 @@
package eu.kanade.tachiyomi.extension.all.ciayo
import eu.kanade.tachiyomi.source.Source
import eu.kanade.tachiyomi.source.SourceFactory
class CiayoFactory : SourceFactory {
override fun createSources(): List<Source> = listOf(
CiayoID(),
CiayoEN()
)
}
class CiayoID : Ciayo("id")
class CiayoEN : Ciayo("en")