MangasProject split (#6455)
* Create MangasProject.kt * Create MangasProjectGenerator.kt * Added Override and icons * Deleted pre split files * Update MangaLivre.kt * Update Toonei.kt * Update LeitorNet.kt * Update MangasProject.kt * Update LeitorNet.kt * Update MangaLivre.kt * Update Toonei.kt
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 3.1 KiB |
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 4.2 KiB |
Before Width: | Height: | Size: 7.3 KiB After Width: | Height: | Size: 7.3 KiB |
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 48 KiB |
52
multisrc/overrides/mangasproject/leitornet/src/LeitorNet.kt
Normal file
@ -0,0 +1,52 @@
|
||||
package eu.kanade.tachiyomi.extension.pt.leitornet
|
||||
|
||||
import eu.kanade.tachiyomi.multisrc.mangasproject.MangasProject
|
||||
import eu.kanade.tachiyomi.network.GET
|
||||
import eu.kanade.tachiyomi.source.model.MangasPage
|
||||
import eu.kanade.tachiyomi.source.model.SChapter
|
||||
import okhttp3.Request
|
||||
import okhttp3.Response
|
||||
import okhttp3.OkHttpClient
|
||||
import okhttp3.FormBody
|
||||
import okhttp3.Headers
|
||||
import okhttp3.HttpUrl
|
||||
import java.util.concurrent.TimeUnit
|
||||
import eu.kanade.tachiyomi.lib.ratelimit.RateLimitInterceptor
|
||||
|
||||
class LeitorNet : MangasProject("Leitor.net", "https://leitor.net", "pt-br") {
|
||||
|
||||
// Use the old generated id when the source did have the name "mangásPROJECT" and
|
||||
// did have mangas in their catalogue. Now they "only have webtoons" and
|
||||
// became a different website, but they still use the same structure.
|
||||
// Existing mangas and other titles in the library still work.
|
||||
override val id: Long = 2225174659569980836
|
||||
|
||||
override val client: OkHttpClient = network.cloudflareClient.newBuilder()
|
||||
.addInterceptor(RateLimitInterceptor(5, 1, TimeUnit.SECONDS))
|
||||
.connectTimeout(1, TimeUnit.MINUTES)
|
||||
.readTimeout(1, TimeUnit.MINUTES)
|
||||
.writeTimeout(1, TimeUnit.MINUTES)
|
||||
.build()
|
||||
|
||||
/**
|
||||
* Temporary fix to bypass Cloudflare.
|
||||
*/
|
||||
override fun pageListRequest(chapter: SChapter): Request {
|
||||
val newHeaders = super.pageListRequest(chapter).headers().newBuilder()
|
||||
.set("Referer", "https://mangalivre.net/home")
|
||||
.build()
|
||||
|
||||
val newChapterUrl = chapter.url
|
||||
.replace("/manga/", "/ler/")
|
||||
.replace("/(\\d+)/capitulo-".toRegex(), "/online/$1/capitulo-")
|
||||
|
||||
return GET("https://mangalivre.net$newChapterUrl", newHeaders)
|
||||
}
|
||||
|
||||
override fun getChapterUrl(response: Response): String {
|
||||
return super.getChapterUrl(response)
|
||||
.replace("https://mangalivre.net", baseUrl)
|
||||
.replace("/ler/", "/manga/")
|
||||
.replace("/online/", "/")
|
||||
}
|
||||
}
|
@ -1,59 +1,31 @@
|
||||
package eu.kanade.tachiyomi.extension.pt.mangasproject
|
||||
package eu.kanade.tachiyomi.extension.pt.mangalivre
|
||||
|
||||
import eu.kanade.tachiyomi.annotations.Nsfw
|
||||
import eu.kanade.tachiyomi.multisrc.mangasproject.MangasProject
|
||||
import eu.kanade.tachiyomi.network.GET
|
||||
import eu.kanade.tachiyomi.source.Source
|
||||
import eu.kanade.tachiyomi.source.SourceFactory
|
||||
import eu.kanade.tachiyomi.source.model.Filter
|
||||
import eu.kanade.tachiyomi.source.model.FilterList
|
||||
import eu.kanade.tachiyomi.source.model.MangasPage
|
||||
import eu.kanade.tachiyomi.source.model.SChapter
|
||||
import okhttp3.Request
|
||||
import okhttp3.Response
|
||||
import org.jsoup.nodes.Document
|
||||
import okhttp3.OkHttpClient
|
||||
import okhttp3.FormBody
|
||||
import okhttp3.Headers
|
||||
import okhttp3.HttpUrl
|
||||
import java.util.concurrent.TimeUnit
|
||||
import eu.kanade.tachiyomi.lib.ratelimit.RateLimitInterceptor
|
||||
|
||||
@Nsfw
|
||||
class MangasProjectFactory : SourceFactory {
|
||||
override fun createSources(): List<Source> = listOf(
|
||||
LeitorNet(),
|
||||
MangaLivre(),
|
||||
Toonei()
|
||||
)
|
||||
}
|
||||
class MangaLivre : MangasProject("Mangá Livre", "https://mangalivre.net", "pt-br") {
|
||||
|
||||
class LeitorNet : MangasProject("Leitor.net", "https://leitor.net") {
|
||||
// Use the old generated id when the source did have the name "mangásPROJECT" and
|
||||
// did have mangas in their catalogue. Now they "only have webtoons" and
|
||||
// became a different website, but they still use the same structure.
|
||||
// Existing mangas and other titles in the library still work.
|
||||
override val id: Long = 2225174659569980836
|
||||
|
||||
/**
|
||||
* Temporary fix to bypass Cloudflare.
|
||||
*/
|
||||
override fun pageListRequest(chapter: SChapter): Request {
|
||||
val newHeaders = super.pageListRequest(chapter).headers().newBuilder()
|
||||
.set("Referer", "https://mangalivre.net/home")
|
||||
.build()
|
||||
|
||||
val newChapterUrl = chapter.url
|
||||
.replace("/manga/", "/ler/")
|
||||
.replace("/(\\d+)/capitulo-".toRegex(), "/online/$1/capitulo-")
|
||||
|
||||
return GET("https://mangalivre.net$newChapterUrl", newHeaders)
|
||||
}
|
||||
|
||||
override fun getChapterUrl(response: Response): String {
|
||||
return super.getChapterUrl(response)
|
||||
.replace("https://mangalivre.net", baseUrl)
|
||||
.replace("/ler/", "/manga/")
|
||||
.replace("/online/", "/")
|
||||
}
|
||||
}
|
||||
|
||||
class MangaLivre : MangasProject("Mangá Livre", "https://mangalivre.net") {
|
||||
// Hardcode the id because the language wasn't specific.
|
||||
override val id: Long = 4762777556012432014
|
||||
|
||||
override val client: OkHttpClient = network.cloudflareClient.newBuilder()
|
||||
.addInterceptor(RateLimitInterceptor(5, 1, TimeUnit.SECONDS))
|
||||
.connectTimeout(1, TimeUnit.MINUTES)
|
||||
.readTimeout(1, TimeUnit.MINUTES)
|
||||
.writeTimeout(1, TimeUnit.MINUTES)
|
||||
.build()
|
||||
|
||||
override fun popularMangaRequest(page: Int): Request {
|
||||
val originalRequestUrl = super.popularMangaRequest(page).url().toString()
|
||||
@ -109,13 +81,3 @@ class MangaLivre : MangasProject("Mangá Livre", "https://mangalivre.net") {
|
||||
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("\";")
|
||||
}
|
||||
}
|
29
multisrc/overrides/mangasproject/toonei/src/Toonei.kt
Normal file
@ -0,0 +1,29 @@
|
||||
package eu.kanade.tachiyomi.extension.pt.toonei
|
||||
|
||||
import eu.kanade.tachiyomi.multisrc.mangasproject.MangasProject
|
||||
import org.jsoup.nodes.Document
|
||||
import okhttp3.Request
|
||||
import okhttp3.Response
|
||||
import okhttp3.OkHttpClient
|
||||
import okhttp3.FormBody
|
||||
import okhttp3.Headers
|
||||
import okhttp3.HttpUrl
|
||||
import java.util.concurrent.TimeUnit
|
||||
import eu.kanade.tachiyomi.lib.ratelimit.RateLimitInterceptor
|
||||
|
||||
class Toonei : MangasProject("Toonei", "https://toonei.com", "pt-br") {
|
||||
|
||||
override val client: OkHttpClient = network.cloudflareClient.newBuilder()
|
||||
.addInterceptor(RateLimitInterceptor(5, 1, TimeUnit.SECONDS))
|
||||
.connectTimeout(1, TimeUnit.MINUTES)
|
||||
.readTimeout(1, TimeUnit.MINUTES)
|
||||
.writeTimeout(1, TimeUnit.MINUTES)
|
||||
.build()
|
||||
|
||||
override fun getReaderToken(document: Document): String? {
|
||||
return document.select("script:containsData(window.PAGES_KEY)").firstOrNull()
|
||||
?.data()
|
||||
?.substringAfter("\"")
|
||||
?.substringBefore("\";")
|
||||
}
|
||||
}
|
@ -1,11 +1,10 @@
|
||||
package eu.kanade.tachiyomi.extension.pt.mangasproject
|
||||
package eu.kanade.tachiyomi.multisrc.mangasproject
|
||||
|
||||
import com.github.salomonbrys.kotson.array
|
||||
import com.github.salomonbrys.kotson.obj
|
||||
import com.github.salomonbrys.kotson.string
|
||||
import com.google.gson.JsonObject
|
||||
import com.google.gson.JsonParser
|
||||
import eu.kanade.tachiyomi.lib.ratelimit.RateLimitInterceptor
|
||||
import eu.kanade.tachiyomi.network.GET
|
||||
import eu.kanade.tachiyomi.network.POST
|
||||
import eu.kanade.tachiyomi.source.model.FilterList
|
||||
@ -31,16 +30,16 @@ import java.util.concurrent.TimeUnit
|
||||
|
||||
abstract class MangasProject(
|
||||
override val name: String,
|
||||
override val baseUrl: String
|
||||
override val baseUrl: String,
|
||||
override val lang: String
|
||||
) : HttpSource() {
|
||||
|
||||
override val lang = "pt-BR"
|
||||
|
||||
override val supportsLatest = true
|
||||
|
||||
// Sometimes the site is slow.
|
||||
override val client: OkHttpClient = network.cloudflareClient.newBuilder()
|
||||
.addInterceptor(RateLimitInterceptor(5, 1, TimeUnit.SECONDS))
|
||||
//.addInterceptor(RateLimitInterceptor(5, 1, TimeUnit.SECONDS))
|
||||
.connectTimeout(1, TimeUnit.MINUTES)
|
||||
.readTimeout(1, TimeUnit.MINUTES)
|
||||
.writeTimeout(1, TimeUnit.MINUTES)
|
||||
@ -279,7 +278,7 @@ abstract class MangasProject(
|
||||
.mapIndexed { i, obj -> Page(i, chapterUrl, obj.string) }
|
||||
}
|
||||
|
||||
protected open fun getChapterUrl(response: Response): String {
|
||||
open fun getChapterUrl(response: Response): String {
|
||||
return response.request().url().toString()
|
||||
}
|
||||
|
@ -0,0 +1,26 @@
|
||||
package eu.kanade.tachiyomi.multisrc.mangasproject
|
||||
|
||||
import generator.ThemeSourceData.SingleLang
|
||||
import generator.ThemeSourceGenerator
|
||||
|
||||
class MangasProjectGenerator : ThemeSourceGenerator {
|
||||
|
||||
override val themePkg = "mangasproject"
|
||||
|
||||
override val themeClass = "MangasProject"
|
||||
|
||||
override val baseVersionCode: Int = 1
|
||||
|
||||
override val sources = listOf(
|
||||
SingleLang("Leitor.net", "https://leitor.net", "pt-br", className = "LeitorNet"),
|
||||
SingleLang("Mangá Livre", "https://mangalivre.net", "pt-br", className = "MangaLivre", isNsfw = true),
|
||||
SingleLang("Toonei", "https://toonei.com", "pt-br"),
|
||||
)
|
||||
|
||||
companion object {
|
||||
@JvmStatic
|
||||
fun main(args: Array<String>) {
|
||||
MangasProjectGenerator().createAll()
|
||||
}
|
||||
}
|
||||
}
|
@ -1,2 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest package="eu.kanade.tachiyomi.extension" />
|
@ -1,17 +0,0 @@
|
||||
apply plugin: 'com.android.application'
|
||||
apply plugin: 'kotlin-android'
|
||||
|
||||
ext {
|
||||
extName = 'mangásPROJECT'
|
||||
pkgNameSuffix = 'pt.mangasproject'
|
||||
extClass = '.MangasProjectFactory'
|
||||
extVersionCode = 18
|
||||
libVersion = '1.2'
|
||||
containsNsfw = true
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation project(':lib-ratelimit')
|
||||
}
|
||||
|
||||
apply from: "$rootDir/common.gradle"
|