Remove WeComics (#9695)
This commit is contained in:
parent
fd927c254d
commit
f546b99eff
|
@ -1,2 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest package="eu.kanade.tachiyomi.extension" />
|
|
@ -1,15 +0,0 @@
|
|||
apply plugin: 'com.android.application'
|
||||
apply plugin: 'kotlin-android'
|
||||
|
||||
ext {
|
||||
extName = 'WeComics'
|
||||
pkgNameSuffix = 'en.wecomics'
|
||||
extClass = '.WeComics'
|
||||
extVersionCode = 2
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation 'org.xxtea:xxtea-java:1.0.5'
|
||||
}
|
||||
|
||||
apply from: "$rootDir/common.gradle"
|
Binary file not shown.
Before Width: | Height: | Size: 2.5 KiB |
Binary file not shown.
Before Width: | Height: | Size: 1.6 KiB |
Binary file not shown.
Before Width: | Height: | Size: 3.6 KiB |
Binary file not shown.
Before Width: | Height: | Size: 6.2 KiB |
Binary file not shown.
Before Width: | Height: | Size: 9.5 KiB |
|
@ -1,188 +0,0 @@
|
|||
package eu.kanade.tachiyomi.extension.en.wecomics
|
||||
|
||||
import android.util.Base64
|
||||
import com.github.salomonbrys.kotson.fromJson
|
||||
import com.github.salomonbrys.kotson.get
|
||||
import com.google.gson.Gson
|
||||
import com.google.gson.JsonObject
|
||||
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.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 okhttp3.Request
|
||||
import okhttp3.Response
|
||||
import org.xxtea.XXTEA
|
||||
import rx.Observable
|
||||
import java.net.URLEncoder
|
||||
|
||||
class WeComics : HttpSource() {
|
||||
|
||||
override val name = "WeComics"
|
||||
|
||||
override val baseUrl = "https://m.wecomics.com"
|
||||
|
||||
override val lang = "en"
|
||||
|
||||
override val supportsLatest = true
|
||||
|
||||
private val gson = Gson()
|
||||
|
||||
private fun getMangaId(url: String): String? =
|
||||
Regex("""^/comic/index/id/\d+\?id=(\d+)""").find(url)?.groupValues?.get(1)
|
||||
|
||||
private fun getChapterId(url: String): Pair<String, String> {
|
||||
val pattern = Regex("""^/chapter/index\?id=(\d+)&cid=(\d+)""")
|
||||
val matches = pattern.find(url)?.groupValues!!
|
||||
return Pair(matches[1], matches[2])
|
||||
}
|
||||
|
||||
private fun Int.toStatus() = when (this) {
|
||||
1 -> SManga.ONGOING
|
||||
2 -> SManga.COMPLETED
|
||||
else -> SManga.UNKNOWN
|
||||
}
|
||||
|
||||
// Popular
|
||||
|
||||
override fun popularMangaRequest(page: Int): Request =
|
||||
GET("$baseUrl/h5/rank/getAllComicList/page/$page?plain=1")
|
||||
|
||||
override fun popularMangaParse(response: Response): MangasPage {
|
||||
val jsonObject = gson.fromJson<JsonObject>(response.body!!.string())
|
||||
|
||||
val mangas = jsonObject["data"]["comic_list"].asJsonArray.map {
|
||||
SManga.create().apply {
|
||||
url = "/comic/index/id/${it["comic_id"].asInt}?id=${it["comic_id"].asInt}"
|
||||
title = it["title"].asString
|
||||
author = it["artist_name"][0].asString.split(",,").joinToString()
|
||||
description = it["brief_intrd"].asString
|
||||
genre = it["tag"].asJsonArray.joinToString { it["name"].asString }
|
||||
status = it["finish_state"].asInt.toStatus()
|
||||
thumbnail_url = it["cover_v_url"].asString
|
||||
}
|
||||
}
|
||||
return MangasPage(mangas, jsonObject["data"]["has_next_page"].asInt == 1)
|
||||
}
|
||||
|
||||
// Latest
|
||||
|
||||
override fun latestUpdatesRequest(page: Int): Request =
|
||||
GET("$baseUrl/h5/rank/getNewComicList/page/$page?plain=1", headers)
|
||||
|
||||
override fun latestUpdatesParse(response: Response): MangasPage =
|
||||
popularMangaParse(response)
|
||||
|
||||
// Search
|
||||
|
||||
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
|
||||
val queryEncoded = URLEncoder.encode(query, "UTF-8")
|
||||
return GET("$baseUrl/h5/search/smart/word/$queryEncoded?plain=1", headers)
|
||||
}
|
||||
|
||||
override fun searchMangaParse(response: Response): MangasPage {
|
||||
val jsonObject = gson.fromJson<JsonObject>(response.body!!.string())
|
||||
|
||||
return MangasPage(
|
||||
jsonObject["data"].asJsonArray.map {
|
||||
SManga.create().apply {
|
||||
url = "/comic/index/id/${it["comic_id"].asInt}?id=${it["comic_id"].asInt}"
|
||||
title = it["title"].asString
|
||||
author = it["artist_name"][0].asString.split(",,").joinToString()
|
||||
status = SManga.UNKNOWN
|
||||
thumbnail_url = it["cover_v_url"].asString
|
||||
}
|
||||
},
|
||||
false
|
||||
)
|
||||
}
|
||||
|
||||
// Details
|
||||
|
||||
// mangaDetailsRequest is used for WebView
|
||||
override fun fetchMangaDetails(manga: SManga): Observable<SManga> {
|
||||
return client.newCall(chapterListRequest(manga))
|
||||
.asObservableSuccess()
|
||||
.map { response ->
|
||||
mangaDetailsParse(response).apply { initialized = true }
|
||||
}
|
||||
}
|
||||
|
||||
// For WebView
|
||||
override fun mangaDetailsRequest(manga: SManga): Request =
|
||||
GET("${baseUrl}${manga.url}&type=search", headers)
|
||||
|
||||
override fun mangaDetailsParse(response: Response): SManga {
|
||||
val jsonObject = gson.fromJson<JsonObject>(response.body!!.string())
|
||||
|
||||
val it = jsonObject["data"]["comic"].asJsonObject
|
||||
return SManga.create().apply {
|
||||
url = "/comic/index/id/${it["comic_id"].asInt}?id=${it["comic_id"].asInt}"
|
||||
title = it["title"].asString
|
||||
author = it["artist_name"][0].asString.split(",,").joinToString()
|
||||
description = it["brief_intrd"].asString
|
||||
genre = it["tag"].asJsonArray.joinToString { it["name"].asString }
|
||||
status = it["finish_state"].asInt.toStatus()
|
||||
thumbnail_url = it["cover_v_url"].asString
|
||||
}
|
||||
}
|
||||
|
||||
// Chapters
|
||||
|
||||
override fun chapterListRequest(manga: SManga): Request =
|
||||
GET("https://m.wecomics.com/h5/comic/detail/id/${getMangaId(manga.url)}?plain=1", headers)
|
||||
|
||||
override fun chapterListParse(response: Response): List<SChapter> {
|
||||
val jsonObject = gson.fromJson<JsonObject>(response.body!!.string())
|
||||
val mangaId = jsonObject["data"]["comic"]["comic_id"].asInt
|
||||
|
||||
return jsonObject["data"]["chapter_list"].asJsonArray.map {
|
||||
SChapter.create().apply {
|
||||
url = "/chapter/index?id=$mangaId&cid=${it["chapter_id"]}"
|
||||
name = it["title"].asString
|
||||
date_upload = it["publish_time"].asLong * 1000
|
||||
chapter_number = it["seq_no"].asFloat
|
||||
if (it["vip_state"].asInt == 2) scanlator = "Premium"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Pages
|
||||
|
||||
override fun pageListRequest(chapter: SChapter): Request {
|
||||
val (mangaId, chapterId) = getChapterId(chapter.url)
|
||||
return GET("$baseUrl/h5/comic/getPictureList/id/$mangaId/cid/$chapterId?plain=1", headers)
|
||||
}
|
||||
|
||||
override fun pageListParse(response: Response): List<Page> {
|
||||
val url = response.request.url.toString()
|
||||
|
||||
// Error code 401 when not logged in and data is empty when logged in,
|
||||
// assuming this is populated after a purchase
|
||||
val jsonObject = gson.fromJson<JsonObject>(response.body!!.string())
|
||||
if (jsonObject["error_code"].asInt == 401 ||
|
||||
jsonObject["data"]["chapter"]["data"].asString == ""
|
||||
)
|
||||
throw Exception("Chapter is currently not available.\nLog in through WebView if purchased.")
|
||||
|
||||
val data = jsonObject["data"]["chapter"]["data"].asString
|
||||
val key = data.substring(0, 8)
|
||||
val encrypted = Base64.decode(data.substring(8), Base64.DEFAULT)
|
||||
val chData = XXTEA.decryptToString(encrypted, key)
|
||||
|
||||
val jsonObjectInner = gson.fromJson<JsonObject>(chData)
|
||||
val cdnUrl = jsonObjectInner["cdn_base_url"].asString
|
||||
|
||||
// The inner JSON contains a list of parts of files,
|
||||
// the parts appear to be split at a fixed size
|
||||
return jsonObjectInner["picture_list"].asJsonArray.mapIndexed { i, it ->
|
||||
Page(i, url, cdnUrl + it["picture_url"].asString)
|
||||
}
|
||||
}
|
||||
|
||||
override fun imageUrlParse(response: Response): String =
|
||||
throw UnsupportedOperationException("Not used")
|
||||
}
|
Loading…
Reference in New Issue