Add Toonei. ()

Add Toonei
This commit is contained in:
Alessandro Jean 2020-09-28 00:03:55 -03:00 committed by GitHub
parent 3e311640ec
commit 2ef94affe4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 29 additions and 24 deletions
src/pt/mangasproject
build.gradle
src/eu/kanade/tachiyomi/extension/pt/mangasproject

View File

@ -5,7 +5,7 @@ ext {
extName = 'mangásPROJECT' extName = 'mangásPROJECT'
pkgNameSuffix = 'pt.mangasproject' pkgNameSuffix = 'pt.mangasproject'
extClass = '.MangasProjectFactory' extClass = '.MangasProjectFactory'
extVersionCode = 13 extVersionCode = 14
libVersion = '1.2' libVersion = '1.2'
} }

View File

@ -17,10 +17,10 @@ import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.FormBody import okhttp3.FormBody
import okhttp3.Headers import okhttp3.Headers
import okhttp3.HttpUrl import okhttp3.HttpUrl
import okhttp3.Interceptor
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 org.jsoup.nodes.Element
import rx.Observable import rx.Observable
import java.text.ParseException import java.text.ParseException
@ -42,7 +42,6 @@ abstract class MangasProject(
.connectTimeout(1, TimeUnit.MINUTES) .connectTimeout(1, TimeUnit.MINUTES)
.readTimeout(1, TimeUnit.MINUTES) .readTimeout(1, TimeUnit.MINUTES)
.writeTimeout(1, TimeUnit.MINUTES) .writeTimeout(1, TimeUnit.MINUTES)
.addInterceptor { pageListIntercept(it) }
.build() .build()
override fun headersBuilder(): Headers.Builder = Headers.Builder() override fun headersBuilder(): Headers.Builder = Headers.Builder()
@ -265,31 +264,25 @@ abstract class MangasProject(
return GET("$baseUrl/leitor/pages/$id.json?key=$token", newHeaders) return GET("$baseUrl/leitor/pages/$id.json?key=$token", newHeaders)
} }
private fun pageListIntercept(chain: Interceptor.Chain): Response {
val request = chain.request()
val result = chain.proceed(request)
if (!request.url().toString().contains("capitulo-"))
return result
val document = result.asJsoup()
val token = document.select("script[src*=\"reader.\"]").firstOrNull()
?.attr("abs:src")
?.let { HttpUrl.parse(it)!!.queryParameter("token") }
?: throw Exception(TOKEN_NOT_FOUND)
return chain.proceed(pageListApiRequest(request.url().toString(), token))
}
override fun pageListParse(response: Response): List<Page> { override fun pageListParse(response: Response): List<Page> {
val result = response.asJsonObject() val document = response.asJsoup()
val chapterUrl = response.request().header("Referer")!! val readerToken = getReaderToken(document) ?: throw Exception(TOKEN_NOT_FOUND)
val chapterUrl = response.request().url().toString()
return result["images"].array val apiRequest = pageListApiRequest(chapterUrl, readerToken)
val apiResponse = client.newCall(apiRequest).execute().asJsonObject()
return apiResponse["images"].array
.filter { it.string.startsWith("http") } .filter { it.string.startsWith("http") }
.mapIndexed { i, obj -> Page(i, chapterUrl, obj.string) } .mapIndexed { i, obj -> Page(i, chapterUrl, obj.string) }
} }
protected open fun getReaderToken(document: Document): String? {
return document.select("script[src*=\"reader.\"]").firstOrNull()
?.attr("abs:src")
?.let { HttpUrl.parse(it)!!.queryParameter("token") }
}
override fun fetchImageUrl(page: Page): Observable<String> = Observable.just(page.imageUrl!!) override fun fetchImageUrl(page: Page): Observable<String> = Observable.just(page.imageUrl!!)
override fun imageUrlParse(response: Response): String = "" override fun imageUrlParse(response: Response): String = ""
@ -314,7 +307,7 @@ abstract class MangasProject(
companion object { companion object {
private const val ACCEPT_JSON = "application/json, text/javascript, */*; q=0.01" private const val ACCEPT_JSON = "application/json, text/javascript, */*; q=0.01"
private const val USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36" private const val USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36"
private val JSON_PARSER by lazy { JsonParser() } private val JSON_PARSER by lazy { JsonParser() }

View File

@ -8,11 +8,13 @@ import eu.kanade.tachiyomi.source.model.FilterList
import eu.kanade.tachiyomi.source.model.MangasPage import eu.kanade.tachiyomi.source.model.MangasPage
import okhttp3.Request import okhttp3.Request
import okhttp3.Response import okhttp3.Response
import org.jsoup.nodes.Document
class MangasProjectFactory : SourceFactory { class MangasProjectFactory : SourceFactory {
override fun createSources(): List<Source> = listOf( override fun createSources(): List<Source> = listOf(
LeitorNet(), LeitorNet(),
MangaLivre() MangaLivre(),
Toonei()
) )
} }
@ -82,3 +84,13 @@ class MangaLivre : MangasProject("Mangá Livre", "https://mangalivre.net") {
private const val DEFAULT_TYPE = "manga" private const val DEFAULT_TYPE = "manga"
} }
} }
class Toonei : MangasProject("Toonei", "https://toonei.com") {
override fun getReaderToken(document: Document): String? {
return document.select("script:containsData(window.PAGES_KEY)").firstOrNull()
?.data()
?.substringAfter("\"")
?.substringBefore("\";")
}
}