OneManhua - now OhManhua (#3065)
This commit is contained in:
parent
49d40d6eda
commit
37c186c6a4
@ -2,10 +2,10 @@ apply plugin: 'com.android.application'
|
|||||||
apply plugin: 'kotlin-android'
|
apply plugin: 'kotlin-android'
|
||||||
|
|
||||||
ext {
|
ext {
|
||||||
appName = 'Tachiyomi: OneManHua'
|
appName = 'Tachiyomi: OhManhua (OneManHua)'
|
||||||
pkgNameSuffix = 'zh.onemanhua'
|
pkgNameSuffix = 'zh.onemanhua'
|
||||||
extClass = '.Onemanhua'
|
extClass = '.Onemanhua'
|
||||||
extVersionCode = 1
|
extVersionCode = 2
|
||||||
libVersion = '1.2'
|
libVersion = '1.2'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package eu.kanade.tachiyomi.extension.zh.onemanhua
|
package eu.kanade.tachiyomi.extension.zh.onemanhua
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint
|
||||||
import android.util.Base64
|
import android.util.Base64
|
||||||
import eu.kanade.tachiyomi.network.GET
|
import eu.kanade.tachiyomi.network.GET
|
||||||
import eu.kanade.tachiyomi.source.model.Filter
|
import eu.kanade.tachiyomi.source.model.Filter
|
||||||
@ -18,20 +19,21 @@ import org.jsoup.nodes.Document
|
|||||||
import org.jsoup.nodes.Element
|
import org.jsoup.nodes.Element
|
||||||
|
|
||||||
class Onemanhua : ParsedHttpSource() {
|
class Onemanhua : ParsedHttpSource() {
|
||||||
|
override val id = 6859784796898756729 // name used to be "One漫画"
|
||||||
override val lang = "zh"
|
override val lang = "zh"
|
||||||
override val supportsLatest = true
|
override val supportsLatest = true
|
||||||
override val name = "One漫画"
|
override val name = "OH漫画 (One漫画)"
|
||||||
override val baseUrl = "https://www.onemanhua.com"
|
override val baseUrl = "https://www.ohmanhua.com/"
|
||||||
|
|
||||||
private var decryptKey = "JRUIFMVJDIWE569j"
|
private var decryptKey = "JRUIFMVJDIWE569j"
|
||||||
private var imageServerUrl = "https://img.onemanhua.com/comic/"
|
private var imageServerUrl = "https://img.ohmanhua.com/comic/"
|
||||||
|
|
||||||
// Common
|
// Common
|
||||||
private var commonSelector = "li.fed-list-item"
|
private var commonSelector = "li.fed-list-item"
|
||||||
private var commonNextPageSelector = "a:contains(下页):not(.fed-btns-disad)"
|
private var commonNextPageSelector = "a:contains(下页):not(.fed-btns-disad)"
|
||||||
private fun commonMangaFromElement(element: Element): SManga {
|
private fun commonMangaFromElement(element: Element): SManga {
|
||||||
var picElement = element.select("a.fed-list-pics").first()
|
val picElement = element.select("a.fed-list-pics").first()
|
||||||
var manga = SManga.create().apply {
|
val manga = SManga.create().apply {
|
||||||
title = element.select("a.fed-list-title").first().text()
|
title = element.select("a.fed-list-title").first().text()
|
||||||
thumbnail_url = picElement.attr("data-original")
|
thumbnail_url = picElement.attr("data-original")
|
||||||
}
|
}
|
||||||
@ -91,8 +93,8 @@ class Onemanhua : ParsedHttpSource() {
|
|||||||
return commonMangaFromElement(element)
|
return commonMangaFromElement(element)
|
||||||
}
|
}
|
||||||
|
|
||||||
var picElement = element.select("a.fed-list-pics").first()
|
val picElement = element.select("a.fed-list-pics").first()
|
||||||
var manga = SManga.create().apply {
|
val manga = SManga.create().apply {
|
||||||
title = element.select("h1.fed-part-eone a").first().text()
|
title = element.select("h1.fed-part-eone a").first().text()
|
||||||
thumbnail_url = picElement.attr("data-original")
|
thumbnail_url = picElement.attr("data-original")
|
||||||
}
|
}
|
||||||
@ -103,9 +105,9 @@ class Onemanhua : ParsedHttpSource() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun mangaDetailsParse(document: Document): SManga {
|
override fun mangaDetailsParse(document: Document): SManga {
|
||||||
var picElement = document.select("a.fed-list-pics").first()
|
val picElement = document.select("a.fed-list-pics").first()
|
||||||
var detailElements = document.select("ul.fed-part-rows li.fed-col-xs12")
|
val detailElements = document.select("ul.fed-part-rows li.fed-col-xs12")
|
||||||
var manga = SManga.create().apply {
|
return SManga.create().apply {
|
||||||
title = document.select("h1.fed-part-eone").first().text().trim()
|
title = document.select("h1.fed-part-eone").first().text().trim()
|
||||||
thumbnail_url = picElement.attr("data-original")
|
thumbnail_url = picElement.attr("data-original")
|
||||||
status = when (detailElements[0].select("a").first().text()) {
|
status = when (detailElements[0].select("a").first().text()) {
|
||||||
@ -118,8 +120,6 @@ class Onemanhua : ParsedHttpSource() {
|
|||||||
genre = detailElements[4].select("a").joinToString { it.text() }
|
genre = detailElements[4].select("a").joinToString { it.text() }
|
||||||
description = detailElements[5].select(".fed-part-esan").first().text().trim()
|
description = detailElements[5].select(".fed-part-esan").first().text().trim()
|
||||||
}
|
}
|
||||||
|
|
||||||
return manga
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun chapterListSelector(): String = "div:not(.fed-hidden) > div.all_data_list > ul.fed-part-rows a"
|
override fun chapterListSelector(): String = "div:not(.fed-hidden) > div.all_data_list > ul.fed-part-rows a"
|
||||||
@ -136,18 +136,18 @@ class Onemanhua : ParsedHttpSource() {
|
|||||||
|
|
||||||
override fun pageListParse(document: Document): List<Page> {
|
override fun pageListParse(document: Document): List<Page> {
|
||||||
// 1. get C_DATA from HTML
|
// 1. get C_DATA from HTML
|
||||||
var encodedData = getEncodedMangaData(document)
|
val encodedData = getEncodedMangaData(document)
|
||||||
// 2. decode C_DATA by Base64
|
// 2. decode C_DATA by Base64
|
||||||
var decodedData = String(Base64.decode(encodedData, Base64.NO_WRAP))
|
val decodedData = String(Base64.decode(encodedData, Base64.NO_WRAP))
|
||||||
// 3. decrypt C_DATA
|
// 3. decrypt C_DATA
|
||||||
var decryptedData = decryptAES(decodedData, decryptKey)
|
val decryptedData = decryptAES(decodedData, decryptKey)
|
||||||
|
|
||||||
val result = ArrayList<Page>()
|
val result = ArrayList<Page>()
|
||||||
|
|
||||||
if (decryptedData != null) {
|
if (decryptedData != null) {
|
||||||
var imgRelativePath = getImgRelativePath(decryptedData)
|
val imgRelativePath = getImgRelativePath(decryptedData)
|
||||||
var startImg = getStartImg(decryptedData)
|
val startImg = getStartImg(decryptedData)
|
||||||
var totalPages = getTotalPages(decryptedData)
|
val totalPages = getTotalPages(decryptedData)
|
||||||
|
|
||||||
for (i in startImg..totalPages) {
|
for (i in startImg..totalPages) {
|
||||||
result.add(Page(i, "", "${imageServerUrl}${imgRelativePath}${"%04d".format(i)}.jpg"))
|
result.add(Page(i, "", "${imageServerUrl}${imgRelativePath}${"%04d".format(i)}.jpg"))
|
||||||
@ -172,6 +172,7 @@ class Onemanhua : ParsedHttpSource() {
|
|||||||
throw Error("Unable to match for C_DATA")
|
throw Error("Unable to match for C_DATA")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressLint("GetInstance")
|
||||||
private fun decryptAES(value: String, key: String): String? {
|
private fun decryptAES(value: String, key: String): String? {
|
||||||
val secretKey = SecretKeySpec(key.toByteArray(), "AES")
|
val secretKey = SecretKeySpec(key.toByteArray(), "AES")
|
||||||
val cipher = Cipher.getInstance("AES/ECB/PKCS5Padding")
|
val cipher = Cipher.getInstance("AES/ECB/PKCS5Padding")
|
||||||
@ -184,7 +185,7 @@ class Onemanhua : ParsedHttpSource() {
|
|||||||
|
|
||||||
private fun getImgRelativePath(mangaData: String): String {
|
private fun getImgRelativePath(mangaData: String): String {
|
||||||
val pattern = Pattern.compile("imgpath:\"(.+?)\"")
|
val pattern = Pattern.compile("imgpath:\"(.+?)\"")
|
||||||
var matcher = pattern.matcher(mangaData)
|
val matcher = pattern.matcher(mangaData)
|
||||||
if (matcher.find()) {
|
if (matcher.find()) {
|
||||||
return matcher.group(1)
|
return matcher.group(1)
|
||||||
}
|
}
|
||||||
@ -194,7 +195,7 @@ class Onemanhua : ParsedHttpSource() {
|
|||||||
|
|
||||||
private fun getTotalPages(mangaData: String): Int {
|
private fun getTotalPages(mangaData: String): Int {
|
||||||
val pattern = Pattern.compile("totalimg:([0-9]+?),")
|
val pattern = Pattern.compile("totalimg:([0-9]+?),")
|
||||||
var matcher = pattern.matcher(mangaData)
|
val matcher = pattern.matcher(mangaData)
|
||||||
if (matcher.find()) {
|
if (matcher.find()) {
|
||||||
return Integer.parseInt(matcher.group(1))
|
return Integer.parseInt(matcher.group(1))
|
||||||
}
|
}
|
||||||
@ -204,7 +205,7 @@ class Onemanhua : ParsedHttpSource() {
|
|||||||
|
|
||||||
private fun getStartImg(mangaData: String): Int {
|
private fun getStartImg(mangaData: String): Int {
|
||||||
val pattern = Pattern.compile("startimg:([0-9]+?),")
|
val pattern = Pattern.compile("startimg:([0-9]+?),")
|
||||||
var matcher = pattern.matcher(mangaData)
|
val matcher = pattern.matcher(mangaData)
|
||||||
if (matcher.find()) {
|
if (matcher.find()) {
|
||||||
return Integer.parseInt(matcher.group(1))
|
return Integer.parseInt(matcher.group(1))
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user