Compare commits
No commits in common. '7f98a7fb5c2f2178b2d6d9d246985b0ce208459f' and 'fe5534b006322188080f6a8fa1d3f04bddb3b6c1' have entirely different histories.
7f98a7fb5c
...
fe5534b006
@ -1 +1 @@
|
|||||||
total: 1255
|
total: 1251
|
||||||
Binary file not shown.
@ -1,7 +1,6 @@
|
|||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-9.0.0-bin.zip
|
distributionSha256Sum=bd71102213493060956ec229d946beee57158dbd89d0e62b91bca0fa2c5f3531
|
||||||
networkTimeout=10000
|
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip
|
||||||
validateDistributionUrl=true
|
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
|
|||||||
@ -1,7 +0,0 @@
|
|||||||
dependencyResolutionManagement {
|
|
||||||
versionCatalogs {
|
|
||||||
create("libs") {
|
|
||||||
from(files("../gradle/libs.versions.toml"))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,15 +1,9 @@
|
|||||||
## Following this blog:
|
# Following this blog:
|
||||||
# https://proandroiddev.com/how-we-reduced-our-gradle-build-times-by-over-80-51f2b6d6b05b
|
# https://proandroiddev.com/how-we-reduced-our-gradle-build-times-by-over-80-51f2b6d6b05b
|
||||||
kotlin.code.style=official
|
kotlin.code.style=official
|
||||||
systemProp.org.gradle.unsafe.configuration-cache=false
|
|
||||||
org.gradle.jvmargs=-Xmx4g -XX:MaxMetaspaceSize=4096m -XX:+UseParallelGC
|
org.gradle.jvmargs=-Xmx4g -XX:MaxMetaspaceSize=4096m -XX:+UseParallelGC
|
||||||
|
org.gradle.vfs.watch=true
|
||||||
org.gradle.configureondemand=true
|
org.gradle.configureondemand=true
|
||||||
org.gradle.configuration-cache.problems=warn
|
org.gradle.parallel=true
|
||||||
|
org.gradle.caching=true
|
||||||
## Use these flags on local machine for faster build time
|
org.gradle.unsafe.configuration-cache=true
|
||||||
# org.gradle.caching=true
|
|
||||||
# org.gradle.configuration-cache=true
|
|
||||||
# org.gradle.vfs.watch=true
|
|
||||||
# org.gradle.parallel=true
|
|
||||||
# org.gradle.workers.max=8
|
|
||||||
# org.gradle.configuration-cache.max-problems=8
|
|
||||||
Binary file not shown.
@ -1,7 +1,7 @@
|
|||||||
|
#Wed Aug 27 01:56:37 ICT 2025
|
||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-9.0.0-bin.zip
|
distributionSha256Sum=bd71102213493060956ec229d946beee57158dbd89d0e62b91bca0fa2c5f3531
|
||||||
networkTimeout=10000
|
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip
|
||||||
validateDistributionUrl=true
|
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
|
|||||||
@ -1,2 +0,0 @@
|
|||||||
jdk:
|
|
||||||
- openjdk17
|
|
||||||
@ -1,12 +1,11 @@
|
|||||||
package org.koitharu.kotatsu.parsers.site.en.mtl
|
package org.koitharu.kotatsu.parsers.site.en.MTL
|
||||||
|
|
||||||
import org.koitharu.kotatsu.parsers.Broken
|
|
||||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||||
import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
||||||
import org.koitharu.kotatsu.parsers.model.ContentType
|
import org.koitharu.kotatsu.parsers.model.ContentType
|
||||||
|
import org.koitharu.kotatsu.parsers.site.en.MTL.MTLParser
|
||||||
|
|
||||||
@Broken
|
|
||||||
@MangaSourceParser("SNOWMTL", "SnowMTL", "en", type = ContentType.OTHER)
|
@MangaSourceParser("SNOWMTL", "SnowMTL", "en", type = ContentType.OTHER)
|
||||||
internal class SnowMTL(context: MangaLoaderContext):
|
internal class SnowMTL(context: MangaLoaderContext):
|
||||||
MTLParser(context, source = MangaParserSource.SNOWMTL, "snowmtl.ru")
|
MTLParser(context, source = MangaParserSource.SNOWMTL, "snowmtl.ru")
|
||||||
@ -1,12 +1,11 @@
|
|||||||
package org.koitharu.kotatsu.parsers.site.en.mtl
|
package org.koitharu.kotatsu.parsers.site.en.MTL
|
||||||
|
|
||||||
import org.koitharu.kotatsu.parsers.Broken
|
|
||||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||||
import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
||||||
import org.koitharu.kotatsu.parsers.model.ContentType
|
import org.koitharu.kotatsu.parsers.model.ContentType
|
||||||
|
import org.koitharu.kotatsu.parsers.site.en.MTL.MTLParser
|
||||||
|
|
||||||
@Broken
|
|
||||||
@MangaSourceParser("SOLARMTL", "SolarMTL", "en", type = ContentType.MANGA)
|
@MangaSourceParser("SOLARMTL", "SolarMTL", "en", type = ContentType.MANGA)
|
||||||
internal class SolarMTL(context: MangaLoaderContext):
|
internal class SolarMTL(context: MangaLoaderContext):
|
||||||
MTLParser(context, source = MangaParserSource.SOLARMTL, "solarmtl.com")
|
MTLParser(context, source = MangaParserSource.SOLARMTL, "solarmtl.com")
|
||||||
@ -1,230 +0,0 @@
|
|||||||
package org.koitharu.kotatsu.parsers.site.fr
|
|
||||||
|
|
||||||
import org.koitharu.kotatsu.parsers.Broken
|
|
||||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
|
||||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
|
||||||
import org.koitharu.kotatsu.parsers.model.Manga
|
|
||||||
import org.koitharu.kotatsu.parsers.model.MangaChapter
|
|
||||||
import org.koitharu.kotatsu.parsers.model.MangaListFilter
|
|
||||||
import org.koitharu.kotatsu.parsers.model.MangaListFilterCapabilities
|
|
||||||
import org.koitharu.kotatsu.parsers.model.MangaListFilterOptions
|
|
||||||
import org.koitharu.kotatsu.parsers.model.MangaPage
|
|
||||||
import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
|
||||||
import org.koitharu.kotatsu.parsers.model.MangaState
|
|
||||||
import org.koitharu.kotatsu.parsers.model.RATING_UNKNOWN
|
|
||||||
import org.koitharu.kotatsu.parsers.model.SortOrder
|
|
||||||
import org.koitharu.kotatsu.parsers.util.generateUid
|
|
||||||
import org.koitharu.kotatsu.parsers.util.parseHtml
|
|
||||||
import org.koitharu.kotatsu.parsers.util.toAbsoluteUrl
|
|
||||||
import org.koitharu.kotatsu.parsers.config.ConfigKey
|
|
||||||
import org.koitharu.kotatsu.parsers.core.SinglePageMangaParser
|
|
||||||
import java.util.EnumSet
|
|
||||||
import java.util.Locale
|
|
||||||
|
|
||||||
@Broken
|
|
||||||
@MangaSourceParser("MANGAMOINS", "MangaMoins", "fr")
|
|
||||||
internal class MangaMoins(context: MangaLoaderContext) :
|
|
||||||
SinglePageMangaParser(context, MangaParserSource.MANGAMOINS) {
|
|
||||||
|
|
||||||
override val configKeyDomain = ConfigKey.Domain("mangamoins.com")
|
|
||||||
override val availableSortOrders: Set<SortOrder> = EnumSet.of(SortOrder.UPDATED)
|
|
||||||
override val filterCapabilities = MangaListFilterCapabilities()
|
|
||||||
|
|
||||||
override suspend fun getFilterOptions(): MangaListFilterOptions = MangaListFilterOptions()
|
|
||||||
|
|
||||||
override suspend fun getList(order: SortOrder, filter: MangaListFilter): List<Manga> {
|
|
||||||
return listOf(
|
|
||||||
Manga(
|
|
||||||
id = generateUid("OP"),
|
|
||||||
title = "One Piece",
|
|
||||||
altTitles = emptySet(),
|
|
||||||
url = "OP",
|
|
||||||
publicUrl = "https://mangamoins.com/",
|
|
||||||
rating = RATING_UNKNOWN,
|
|
||||||
contentRating = null,
|
|
||||||
coverUrl = "https://mangamoins.com/files/scans/OP1161/thumbnail.png",
|
|
||||||
tags = emptySet(),
|
|
||||||
state = MangaState.ONGOING,
|
|
||||||
authors = setOf("Eiichiro Oda"),
|
|
||||||
source = source,
|
|
||||||
),
|
|
||||||
Manga(
|
|
||||||
id = generateUid("LCDL"),
|
|
||||||
title = "Les Carnets de l'Apothicaire",
|
|
||||||
altTitles = emptySet(),
|
|
||||||
url = "LCDL",
|
|
||||||
publicUrl = "https://mangamoins.com/",
|
|
||||||
rating = RATING_UNKNOWN,
|
|
||||||
contentRating = null,
|
|
||||||
coverUrl = "https://mangamoins.com/files/scans/LCDL76.2/thumbnail.png",
|
|
||||||
tags = emptySet(),
|
|
||||||
state = MangaState.ONGOING,
|
|
||||||
authors = setOf("Itsuki Nanao", "Nekokurage"),
|
|
||||||
source = source,
|
|
||||||
),
|
|
||||||
Manga(
|
|
||||||
id = generateUid("JKM"),
|
|
||||||
title = "Jujutsu Kaisen Modulo",
|
|
||||||
altTitles = emptySet(),
|
|
||||||
url = "JKM",
|
|
||||||
publicUrl = "https://mangamoins.com/",
|
|
||||||
rating = RATING_UNKNOWN,
|
|
||||||
contentRating = null,
|
|
||||||
coverUrl = "https://mangamoins.com/files/scans/JKM1/thumbnail.png",
|
|
||||||
tags = emptySet(),
|
|
||||||
state = MangaState.ONGOING,
|
|
||||||
authors = setOf("Gege Akutami", "Yuji Iwasaki"),
|
|
||||||
source = source,
|
|
||||||
),
|
|
||||||
Manga(
|
|
||||||
id = generateUid("OPC"),
|
|
||||||
title = "One Piece Colo",
|
|
||||||
altTitles = emptySet(),
|
|
||||||
url = "OPC",
|
|
||||||
publicUrl = "https://mangamoins.com/",
|
|
||||||
rating = RATING_UNKNOWN,
|
|
||||||
contentRating = null,
|
|
||||||
coverUrl = "https://mangamoins.com/files/scans/OPC1160/thumbnail.png",
|
|
||||||
tags = emptySet(),
|
|
||||||
state = MangaState.ONGOING,
|
|
||||||
authors = setOf("Eiichiro Oda"),
|
|
||||||
source = source,
|
|
||||||
),
|
|
||||||
Manga(
|
|
||||||
id = generateUid("LDS"),
|
|
||||||
title = "L'Atelier des Sorciers",
|
|
||||||
altTitles = emptySet(),
|
|
||||||
url = "LDS",
|
|
||||||
publicUrl = "https://mangamoins.com/",
|
|
||||||
rating = RATING_UNKNOWN,
|
|
||||||
contentRating = null,
|
|
||||||
coverUrl = "https://sceneario.com/wp-content/uploads/2023/05/9782811641344-1.jpg",
|
|
||||||
tags = emptySet(),
|
|
||||||
state = MangaState.ONGOING,
|
|
||||||
authors = setOf("Kamome Shirahama"),
|
|
||||||
source = source,
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
override suspend fun getDetails(manga: Manga): Manga {
|
|
||||||
val doc = webClient.httpGet("https://$domain").parseHtml()
|
|
||||||
val prefix = manga.url
|
|
||||||
val latestSiteChapterNumber = doc.select("div.sortie a").mapNotNull { a ->
|
|
||||||
val href = a.attr("href")
|
|
||||||
if (href.startsWith("?scan=$prefix")) {
|
|
||||||
href.substringAfter(prefix).toFloatOrNull()
|
|
||||||
} else {
|
|
||||||
null
|
|
||||||
}
|
|
||||||
}.maxOrNull()
|
|
||||||
|
|
||||||
if (latestSiteChapterNumber == null) return manga
|
|
||||||
|
|
||||||
val cachedChapters = manga.chapters
|
|
||||||
val lastKnownChapterNumber = cachedChapters?.maxByOrNull { it.number }?.number
|
|
||||||
|
|
||||||
if (lastKnownChapterNumber != null && cachedChapters.isNotEmpty()) {
|
|
||||||
// INCREMENTAL SCAN (CACHE EXISTS)
|
|
||||||
if (latestSiteChapterNumber <= lastKnownChapterNumber) {
|
|
||||||
return manga.copy(chapters = cachedChapters.sortedBy { it.number })
|
|
||||||
}
|
|
||||||
|
|
||||||
val newChapters = mutableListOf<MangaChapter>()
|
|
||||||
var currentChapterInt = latestSiteChapterNumber.toInt()
|
|
||||||
|
|
||||||
while (currentChapterInt > lastKnownChapterNumber.toInt()) {
|
|
||||||
val chaptersForGroup = doChecks(prefix, currentChapterInt)
|
|
||||||
newChapters.addAll(chaptersForGroup)
|
|
||||||
currentChapterInt--
|
|
||||||
}
|
|
||||||
|
|
||||||
val combinedChapters = (cachedChapters + newChapters).distinctBy { it.number }
|
|
||||||
return manga.copy(chapters = combinedChapters.sortedBy { it.number })
|
|
||||||
|
|
||||||
} else {
|
|
||||||
// FULL SCAN (NO CACHE)
|
|
||||||
val allChapters = mutableListOf<MangaChapter>()
|
|
||||||
var currentChapterInt = latestSiteChapterNumber.toInt()
|
|
||||||
var misses = 0
|
|
||||||
|
|
||||||
while (currentChapterInt >= 1 && misses < 4) {
|
|
||||||
val chaptersForGroup = doChecks(prefix, currentChapterInt)
|
|
||||||
if (chaptersForGroup.isNotEmpty()) {
|
|
||||||
misses = 0
|
|
||||||
allChapters.addAll(chaptersForGroup)
|
|
||||||
} else {
|
|
||||||
misses++
|
|
||||||
}
|
|
||||||
currentChapterInt--
|
|
||||||
}
|
|
||||||
return manga.copy(chapters = allChapters.sortedBy { it.number })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private suspend fun doChecks(prefix: String, chapterInt: Int): List<MangaChapter> {
|
|
||||||
val foundChapters = mutableListOf<MangaChapter>()
|
|
||||||
|
|
||||||
// Check for integer chapter
|
|
||||||
val integerChapter = checkChapter(prefix, chapterInt.toString(), chapterInt.toFloat())
|
|
||||||
if (integerChapter != null) {
|
|
||||||
foundChapters.add(integerChapter)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Conditionally and sequentially check for decimal chapters
|
|
||||||
if (prefix == "LCDL") {
|
|
||||||
// Start from 2 because .1 never exists
|
|
||||||
for (i in 2..9) {
|
|
||||||
val decimalNum = chapterInt + (i / 10.0f)
|
|
||||||
val decimalNumStr = String.format(Locale.US, "%.1f", decimalNum)
|
|
||||||
val decimalChapter = checkChapter(prefix, decimalNumStr, decimalNum)
|
|
||||||
if (decimalChapter != null) {
|
|
||||||
foundChapters.add(decimalChapter)
|
|
||||||
} else {
|
|
||||||
break // Stop if there's a gap
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return foundChapters
|
|
||||||
}
|
|
||||||
|
|
||||||
private suspend fun checkChapter(prefix: String, chapterNumStr: String, chapterNumFloat: Float): MangaChapter? {
|
|
||||||
val thumbUrl = "https://mangamoins.com/files/scans/$prefix$chapterNumStr/thumbnail.png"
|
|
||||||
return try {
|
|
||||||
val response = webClient.httpHead(thumbUrl)
|
|
||||||
if (response.isSuccessful) {
|
|
||||||
response.close()
|
|
||||||
val chapterUrl = "https://mangamoins.com/?scan=$prefix$chapterNumStr"
|
|
||||||
MangaChapter(
|
|
||||||
id = generateUid(chapterUrl),
|
|
||||||
title = null,
|
|
||||||
number = chapterNumFloat,
|
|
||||||
volume = 0,
|
|
||||||
url = chapterUrl,
|
|
||||||
scanlator = null,
|
|
||||||
uploadDate = 0,
|
|
||||||
branch = null,
|
|
||||||
source = source
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
response.close()
|
|
||||||
null
|
|
||||||
}
|
|
||||||
} catch (_: Exception) {
|
|
||||||
null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override suspend fun getPages(chapter: MangaChapter): List<MangaPage> {
|
|
||||||
val doc = webClient.httpGet(chapter.url).parseHtml()
|
|
||||||
return doc.select("link[rel=preload][as=image]").map { element ->
|
|
||||||
val url = element.attr("href").toAbsoluteUrl(domain)
|
|
||||||
MangaPage(
|
|
||||||
id = generateUid(url),
|
|
||||||
url = url,
|
|
||||||
preview = null,
|
|
||||||
source = source
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,90 +1,15 @@
|
|||||||
package org.koitharu.kotatsu.parsers.site.madara.en
|
package org.koitharu.kotatsu.parsers.site.madara.en
|
||||||
|
|
||||||
import okhttp3.HttpUrl.Companion.toHttpUrl
|
|
||||||
import okhttp3.Interceptor
|
|
||||||
import okhttp3.Response
|
|
||||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||||
import org.koitharu.kotatsu.parsers.config.ConfigKey
|
|
||||||
import org.koitharu.kotatsu.parsers.exception.ParseException
|
|
||||||
import org.koitharu.kotatsu.parsers.model.ContentType
|
import org.koitharu.kotatsu.parsers.model.ContentType
|
||||||
import org.koitharu.kotatsu.parsers.model.MangaChapter
|
|
||||||
import org.koitharu.kotatsu.parsers.model.MangaPage
|
|
||||||
import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
||||||
import org.koitharu.kotatsu.parsers.network.UserAgents
|
|
||||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||||
import org.koitharu.kotatsu.parsers.util.*
|
|
||||||
|
|
||||||
private const val F_URL = "fullUrl="
|
|
||||||
|
|
||||||
@MangaSourceParser("MADARADEX", "MadaraDex", "en", ContentType.HENTAI)
|
@MangaSourceParser("MADARADEX", "MadaraDex", "en", ContentType.HENTAI)
|
||||||
internal class MadaraDex(context: MangaLoaderContext) :
|
internal class MadaraDex(context: MangaLoaderContext) :
|
||||||
MadaraParser(context, MangaParserSource.MADARADEX, "madaradex.org") {
|
MadaraParser(context, MangaParserSource.MADARADEX, "madaradex.org") {
|
||||||
|
|
||||||
init {
|
|
||||||
context.cookieJar.insertCookies(domain, "wpmanga-adault=1")
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onCreateConfig(keys: MutableCollection<ConfigKey<*>>) {
|
|
||||||
super.onCreateConfig(keys)
|
|
||||||
keys.remove(userAgentKey)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getRequestHeaders() = super.getRequestHeaders().newBuilder()
|
|
||||||
.set("User-Agent", UserAgents.CHROME_DESKTOP)
|
|
||||||
.build()
|
|
||||||
|
|
||||||
override val authUrl: String
|
|
||||||
get() = "https://${domain}"
|
|
||||||
|
|
||||||
override suspend fun isAuthorized(): Boolean {
|
|
||||||
return context.cookieJar.getCookies(domain).any {
|
|
||||||
it.name.contains("cm_uaid")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override val listUrl = "title/"
|
override val listUrl = "title/"
|
||||||
override val tagPrefix = "genre/"
|
override val tagPrefix = "genre/"
|
||||||
override val postReq = true
|
override val postReq = true
|
||||||
|
|
||||||
override suspend fun getPages(chapter: MangaChapter): List<MangaPage> {
|
|
||||||
val fullUrl = chapter.url.toAbsoluteUrl(domain)
|
|
||||||
val doc = webClient.httpGet(fullUrl).parseHtml()
|
|
||||||
val root = doc.body().selectFirst(selectBodyPage)
|
|
||||||
?: throw ParseException("No image found, try to log in", fullUrl)
|
|
||||||
|
|
||||||
return root.select(selectPage).flatMap { div ->
|
|
||||||
div.selectOrThrow("img").map { img ->
|
|
||||||
val fragUrl = img.requireSrc().toRelativeUrl(domain).toHttpUrl().newBuilder()
|
|
||||||
.fragment(F_URL + fullUrl)
|
|
||||||
.build()
|
|
||||||
val cleanUrl = fragUrl.newBuilder().fragment(null).build()
|
|
||||||
MangaPage(
|
|
||||||
id = generateUid(cleanUrl.toString()),
|
|
||||||
url = fragUrl.toString(),
|
|
||||||
preview = null,
|
|
||||||
source = source,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun intercept(chain: Interceptor.Chain): Response {
|
|
||||||
val request = chain.request()
|
|
||||||
val url = request.url
|
|
||||||
val fullUrl = url.fragment?.substringAfter(F_URL, "")
|
|
||||||
return if (!fullUrl.isNullOrEmpty()) {
|
|
||||||
copyCookies()
|
|
||||||
val cleanUrl = url.newBuilder().fragment(null).toString()
|
|
||||||
val newReq = request.newBuilder()
|
|
||||||
.header("Referer", fullUrl)
|
|
||||||
.url(cleanUrl)
|
|
||||||
.build()
|
|
||||||
chain.proceed(newReq)
|
|
||||||
} else {
|
|
||||||
super.intercept(chain)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun copyCookies() = context.cookieJar.copyCookies(domain, "cdn.$domain")
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,12 +0,0 @@
|
|||||||
package org.koitharu.kotatsu.parsers.site.madara.es
|
|
||||||
|
|
||||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
|
||||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
|
||||||
import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
|
||||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
|
||||||
|
|
||||||
@MangaSourceParser("DRAGONTRANSLATIONORG", "DragonTranslation.org", "es")
|
|
||||||
internal class DragonTranslationOrg(context: MangaLoaderContext) :
|
|
||||||
MadaraParser(context, MangaParserSource.DRAGONTRANSLATIONORG, "dragontranslation.org", 16) {
|
|
||||||
override val datePattern = "dd/MM/yyyy"
|
|
||||||
}
|
|
||||||
@ -1,12 +1,14 @@
|
|||||||
package org.koitharu.kotatsu.parsers.site.madara.es
|
package org.koitharu.kotatsu.parsers.site.madara.es
|
||||||
|
|
||||||
|
import org.koitharu.kotatsu.parsers.Broken
|
||||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||||
import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
||||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||||
|
|
||||||
|
@Broken
|
||||||
@MangaSourceParser("LEGENDSCANLATIONS", "LegendScanlations", "es")
|
@MangaSourceParser("LEGENDSCANLATIONS", "LegendScanlations", "es")
|
||||||
internal class LegendScanlations(context: MangaLoaderContext) :
|
internal class LegendScanlations(context: MangaLoaderContext) :
|
||||||
MadaraParser(context, MangaParserSource.LEGENDSCANLATIONS, "escaneodeleyendas.com", 10) {
|
MadaraParser(context, MangaParserSource.LEGENDSCANLATIONS, "legendscanlations.com", 10) {
|
||||||
override val datePattern = "dd/MM/yyyy"
|
override val datePattern = "dd/MM/yyyy"
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,13 +1,15 @@
|
|||||||
package org.koitharu.kotatsu.parsers.site.madara.es
|
package org.koitharu.kotatsu.parsers.site.madara.es
|
||||||
|
|
||||||
|
import org.koitharu.kotatsu.parsers.Broken
|
||||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||||
import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
||||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||||
|
|
||||||
|
@Broken
|
||||||
@MangaSourceParser("MANTRAZSCAN", "MantrazScan", "es")
|
@MangaSourceParser("MANTRAZSCAN", "MantrazScan", "es")
|
||||||
internal class MantrazScan(context: MangaLoaderContext) :
|
internal class MantrazScan(context: MangaLoaderContext) :
|
||||||
MadaraParser(context, MangaParserSource.MANTRAZSCAN, "mantrazscan.org") {
|
MadaraParser(context, MangaParserSource.MANTRAZSCAN, "artessupremas.com") {
|
||||||
override val datePattern = "dd/MM/yyyy"
|
override val datePattern = "dd/MM/yyyy"
|
||||||
override val tagPrefix = "generos-de-manga/"
|
override val tagPrefix = "generos-de-manga/"
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,14 +0,0 @@
|
|||||||
package org.koitharu.kotatsu.parsers.site.madara.vi
|
|
||||||
|
|
||||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
|
||||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
|
||||||
import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
|
||||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
|
||||||
|
|
||||||
@MangaSourceParser("TRUYENTRANHFULL", "Truyện Tranh Full", "vi")
|
|
||||||
internal class TruyenTranhFull(context: MangaLoaderContext) :
|
|
||||||
MadaraParser(context, MangaParserSource.TRUYENTRANHFULL, "truyentranhfull.net", 20) {
|
|
||||||
override val listUrl = "truyen-tranh/"
|
|
||||||
override val tagPrefix = "the-loai/"
|
|
||||||
override val datePattern = "dd/MM/yyyy"
|
|
||||||
}
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue