Add @Broken on some Dead Sources
Urls Changes repair sources Remove Duplicate Source Add volume on some parser
This commit is contained in:
@@ -6,7 +6,6 @@ import okhttp3.Headers
|
|||||||
import org.koitharu.kotatsu.parsers.config.ConfigKey
|
import org.koitharu.kotatsu.parsers.config.ConfigKey
|
||||||
import org.koitharu.kotatsu.parsers.model.*
|
import org.koitharu.kotatsu.parsers.model.*
|
||||||
import org.koitharu.kotatsu.parsers.network.OkHttpWebClient
|
import org.koitharu.kotatsu.parsers.network.OkHttpWebClient
|
||||||
import org.koitharu.kotatsu.parsers.network.UserAgents
|
|
||||||
import org.koitharu.kotatsu.parsers.network.WebClient
|
import org.koitharu.kotatsu.parsers.network.WebClient
|
||||||
import org.koitharu.kotatsu.parsers.util.FaviconParser
|
import org.koitharu.kotatsu.parsers.util.FaviconParser
|
||||||
import org.koitharu.kotatsu.parsers.util.RelatedMangaFinder
|
import org.koitharu.kotatsu.parsers.util.RelatedMangaFinder
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ import org.koitharu.kotatsu.parsers.config.ConfigKey
|
|||||||
import org.koitharu.kotatsu.parsers.exception.ParseException
|
import org.koitharu.kotatsu.parsers.exception.ParseException
|
||||||
import org.koitharu.kotatsu.parsers.model.*
|
import org.koitharu.kotatsu.parsers.model.*
|
||||||
import org.koitharu.kotatsu.parsers.util.*
|
import org.koitharu.kotatsu.parsers.util.*
|
||||||
import org.koitharu.kotatsu.parsers.util.json.isNullOrEmpty
|
|
||||||
import java.nio.charset.StandardCharsets
|
import java.nio.charset.StandardCharsets
|
||||||
import java.security.MessageDigest
|
import java.security.MessageDigest
|
||||||
import java.util.*
|
import java.util.*
|
||||||
@@ -319,7 +318,8 @@ internal class BatoToParser(context: MangaLoaderContext) : PagedMangaParser(
|
|||||||
return MangaChapter(
|
return MangaChapter(
|
||||||
id = generateUid(href),
|
id = generateUid(href),
|
||||||
name = a.text(),
|
name = a.text(),
|
||||||
number = index + 1,
|
number = index + 1f,
|
||||||
|
volume = 0,
|
||||||
url = href,
|
url = href,
|
||||||
scanlator = extra?.getElementsByAttributeValueContaining("href", "/group/")?.text(),
|
scanlator = extra?.getElementsByAttributeValueContaining("href", "/group/")?.text(),
|
||||||
uploadDate = runCatching {
|
uploadDate = runCatching {
|
||||||
|
|||||||
@@ -212,7 +212,8 @@ internal class ExHentaiParser(
|
|||||||
chapters += MangaChapter(
|
chapters += MangaChapter(
|
||||||
id = generateUid(url),
|
id = generateUid(url),
|
||||||
name = "${manga.title} #$i",
|
name = "${manga.title} #$i",
|
||||||
number = i,
|
number = i.toFloat(),
|
||||||
|
volume = 0,
|
||||||
url = url,
|
url = url,
|
||||||
uploadDate = 0L,
|
uploadDate = 0L,
|
||||||
source = source,
|
source = source,
|
||||||
|
|||||||
@@ -540,7 +540,8 @@ class HitomiLaParser(context: MangaLoaderContext) : MangaParser(context, MangaSo
|
|||||||
url = manga.url,
|
url = manga.url,
|
||||||
name = json.getString("title"),
|
name = json.getString("title"),
|
||||||
scanlator = json.getString("type").toTitleCase(),
|
scanlator = json.getString("type").toTitleCase(),
|
||||||
number = 1,
|
number = 1f,
|
||||||
|
volume = 0,
|
||||||
branch = json.getString("language_localname"),
|
branch = json.getString("language_localname"),
|
||||||
source = source,
|
source = source,
|
||||||
uploadDate = dateFormat.tryParse(json.getString("date").substringBeforeLast("-")),
|
uploadDate = dateFormat.tryParse(json.getString("date").substringBeforeLast("-")),
|
||||||
|
|||||||
@@ -130,7 +130,8 @@ internal class ImHentai(context: MangaLoaderContext) :
|
|||||||
MangaChapter(
|
MangaChapter(
|
||||||
id = manga.id,
|
id = manga.id,
|
||||||
name = manga.title,
|
name = manga.title,
|
||||||
number = 1,
|
number = 1f,
|
||||||
|
volume = 0,
|
||||||
url = manga.url,
|
url = manga.url,
|
||||||
scanlator = null,
|
scanlator = null,
|
||||||
uploadDate = 0,
|
uploadDate = 0,
|
||||||
|
|||||||
@@ -94,7 +94,8 @@ internal abstract class LineWebtoonsParser(
|
|||||||
MangaChapter(
|
MangaChapter(
|
||||||
id = generateUid("$titleNo-$i"),
|
id = generateUid("$titleNo-$i"),
|
||||||
name = jo.getString("episodeTitle"),
|
name = jo.getString("episodeTitle"),
|
||||||
number = jo.getInt("episodeSeq"),
|
number = jo.getInt("episodeSeq").toFloat(),
|
||||||
|
volume = 0,
|
||||||
url = "$titleNo-${jo.get("episodeNo")}",
|
url = "$titleNo-${jo.get("episodeNo")}",
|
||||||
uploadDate = jo.getLong("modifyYmdt"),
|
uploadDate = jo.getLong("modifyYmdt"),
|
||||||
branch = null,
|
branch = null,
|
||||||
|
|||||||
@@ -23,8 +23,8 @@ private const val MIN_SPLIT_COUNT = 5
|
|||||||
internal abstract class MangaFireParser(
|
internal abstract class MangaFireParser(
|
||||||
context: MangaLoaderContext,
|
context: MangaLoaderContext,
|
||||||
source: MangaSource,
|
source: MangaSource,
|
||||||
private val siteLang: String
|
private val siteLang: String,
|
||||||
): PagedMangaParser(context, source, 30), Interceptor {
|
) : PagedMangaParser(context, source, 30), Interceptor {
|
||||||
|
|
||||||
override val configKeyDomain: ConfigKey.Domain = ConfigKey.Domain("mangafire.to")
|
override val configKeyDomain: ConfigKey.Domain = ConfigKey.Domain("mangafire.to")
|
||||||
|
|
||||||
@@ -44,7 +44,7 @@ internal abstract class MangaFireParser(
|
|||||||
MangaTag(
|
MangaTag(
|
||||||
title = it.selectFirstOrThrow("label").ownText().toTitleCase(sourceLocale),
|
title = it.selectFirstOrThrow("label").ownText().toTitleCase(sourceLocale),
|
||||||
key = it.selectFirstOrThrow("input").attr("value"),
|
key = it.selectFirstOrThrow("input").attr("value"),
|
||||||
source = source
|
source = source,
|
||||||
)
|
)
|
||||||
}.associateBy { it.title }
|
}.associateBy { it.title }
|
||||||
}
|
}
|
||||||
@@ -73,7 +73,7 @@ internal abstract class MangaFireParser(
|
|||||||
SortOrder.NEWEST -> "release_date"
|
SortOrder.NEWEST -> "release_date"
|
||||||
SortOrder.ALPHABETICAL -> "title_az"
|
SortOrder.ALPHABETICAL -> "title_az"
|
||||||
else -> ""
|
else -> ""
|
||||||
}
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -97,7 +97,7 @@ internal abstract class MangaFireParser(
|
|||||||
MangaState.ABANDONED -> "discontinued"
|
MangaState.ABANDONED -> "discontinued"
|
||||||
MangaState.PAUSED -> "on_hiatus"
|
MangaState.PAUSED -> "on_hiatus"
|
||||||
MangaState.UPCOMING -> "info"
|
MangaState.UPCOMING -> "info"
|
||||||
}
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
addQueryParameter(
|
addQueryParameter(
|
||||||
@@ -109,7 +109,7 @@ internal abstract class MangaFireParser(
|
|||||||
SortOrder.NEWEST -> "release_date"
|
SortOrder.NEWEST -> "release_date"
|
||||||
SortOrder.ALPHABETICAL -> "title_az"
|
SortOrder.ALPHABETICAL -> "title_az"
|
||||||
else -> ""
|
else -> ""
|
||||||
}
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -176,14 +176,14 @@ internal abstract class MangaFireParser(
|
|||||||
author = document.select("div.meta a[href*=/author/]")
|
author = document.select("div.meta a[href*=/author/]")
|
||||||
.joinToString { it.ownText().trim() },
|
.joinToString { it.ownText().trim() },
|
||||||
description = document.selectFirstOrThrow("#synopsis div.modal-content").html(),
|
description = document.selectFirstOrThrow("#synopsis div.modal-content").html(),
|
||||||
chapters = getChapters(manga.url, document)
|
chapters = getChapters(manga.url, document),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
private data class ChapterBranch(
|
private data class ChapterBranch(
|
||||||
val type: String,
|
val type: String,
|
||||||
val langCode: String,
|
val langCode: String,
|
||||||
val langTitle: String
|
val langTitle: String,
|
||||||
)
|
)
|
||||||
|
|
||||||
private suspend fun getChapters(mangaUrl: String, document: Document): List<MangaChapter> {
|
private suspend fun getChapters(mangaUrl: String, document: Document): List<MangaChapter> {
|
||||||
@@ -252,7 +252,7 @@ internal abstract class MangaFireParser(
|
|||||||
scanlator = null,
|
scanlator = null,
|
||||||
uploadDate = dateFormat.tryParse(it.attr("upload-date")),
|
uploadDate = dateFormat.tryParse(it.attr("upload-date")),
|
||||||
branch = "${branch.langTitle} ${branch.type.toTitleCase()}",
|
branch = "${branch.langTitle} ${branch.type.toTitleCase()}",
|
||||||
source = source
|
source = source,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -263,7 +263,7 @@ internal abstract class MangaFireParser(
|
|||||||
override suspend fun getRelatedManga(seed: Manga): List<Manga> = coroutineScope {
|
override suspend fun getRelatedManga(seed: Manga): List<Manga> = coroutineScope {
|
||||||
val document = webClient.httpGet(seed.url.toAbsoluteUrl(domain)).parseHtml()
|
val document = webClient.httpGet(seed.url.toAbsoluteUrl(domain)).parseHtml()
|
||||||
val total = document.select(
|
val total = document.select(
|
||||||
"section.m-related a[href*=/manga/], .side-manga:not(:has(.head:contains(trending))) .unit"
|
"section.m-related a[href*=/manga/], .side-manga:not(:has(.head:contains(trending))) .unit",
|
||||||
).size
|
).size
|
||||||
val mangas = ArrayList<Manga>(total)
|
val mangas = ArrayList<Manga>(total)
|
||||||
|
|
||||||
@@ -322,7 +322,7 @@ internal abstract class MangaFireParser(
|
|||||||
rating = RATING_UNKNOWN,
|
rating = RATING_UNKNOWN,
|
||||||
state = null,
|
state = null,
|
||||||
tags = emptySet(),
|
tags = emptySet(),
|
||||||
)
|
),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -366,8 +366,8 @@ internal abstract class MangaFireParser(
|
|||||||
"$url#scrambled_$offset"
|
"$url#scrambled_$offset"
|
||||||
},
|
},
|
||||||
preview = null,
|
preview = null,
|
||||||
source = source
|
source = source,
|
||||||
)
|
),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -193,7 +193,8 @@ internal class MangaPark(context: MangaLoaderContext) :
|
|||||||
MangaChapter(
|
MangaChapter(
|
||||||
id = generateUid(href),
|
id = generateUid(href),
|
||||||
name = a.text(),
|
name = a.text(),
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
url = href,
|
url = href,
|
||||||
uploadDate = parseChapterDate(
|
uploadDate = parseChapterDate(
|
||||||
dateFormat,
|
dateFormat,
|
||||||
|
|||||||
@@ -324,6 +324,6 @@ internal abstract class MangaPlusParser(
|
|||||||
class German(context: MangaLoaderContext) : MangaPlusParser(
|
class German(context: MangaLoaderContext) : MangaPlusParser(
|
||||||
context,
|
context,
|
||||||
MangaSource.MANGAPLUSPARSER_DE,
|
MangaSource.MANGAPLUSPARSER_DE,
|
||||||
"GERMAN"
|
"GERMAN",
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -145,7 +145,8 @@ internal abstract class NineMangaParser(
|
|||||||
MangaChapter(
|
MangaChapter(
|
||||||
id = generateUid(href),
|
id = generateUid(href),
|
||||||
name = a.text(),
|
name = a.text(),
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
url = href,
|
url = href,
|
||||||
uploadDate = parseChapterDateByLang(li.selectFirst("span")?.text().orEmpty()),
|
uploadDate = parseChapterDateByLang(li.selectFirst("span")?.text().orEmpty()),
|
||||||
source = source,
|
source = source,
|
||||||
|
|||||||
@@ -109,7 +109,8 @@ internal abstract class WebtoonsParser(
|
|||||||
MangaChapter(
|
MangaChapter(
|
||||||
id = generateUid("$titleNo-$i"),
|
id = generateUid("$titleNo-$i"),
|
||||||
name = jo.getString("episodeTitle"),
|
name = jo.getString("episodeTitle"),
|
||||||
number = jo.getInt("episodeSeq"),
|
number = jo.getInt("episodeSeq").toFloat(),
|
||||||
|
volume = 0,
|
||||||
url = "$titleNo-${jo.get("episodeNo")}",
|
url = "$titleNo-${jo.get("episodeNo")}",
|
||||||
uploadDate = jo.getLong("registerYmdt"),
|
uploadDate = jo.getLong("registerYmdt"),
|
||||||
branch = null,
|
branch = null,
|
||||||
@@ -223,7 +224,8 @@ internal abstract class WebtoonsParser(
|
|||||||
description = null,
|
description = null,
|
||||||
state = null,
|
state = null,
|
||||||
source = source,
|
source = source,
|
||||||
))
|
),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -146,7 +146,8 @@ internal abstract class AnimeBootstrapParser(
|
|||||||
MangaChapter(
|
MangaChapter(
|
||||||
id = generateUid(href),
|
id = generateUid(href),
|
||||||
name = a.text(),
|
name = a.text(),
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
url = href,
|
url = href,
|
||||||
uploadDate = 0,
|
uploadDate = 0,
|
||||||
source = source,
|
source = source,
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package org.koitharu.kotatsu.parsers.site.animebootstrap.fr
|
|||||||
import kotlinx.coroutines.async
|
import kotlinx.coroutines.async
|
||||||
import kotlinx.coroutines.coroutineScope
|
import kotlinx.coroutines.coroutineScope
|
||||||
import org.jsoup.nodes.Document
|
import org.jsoup.nodes.Document
|
||||||
|
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.*
|
import org.koitharu.kotatsu.parsers.model.*
|
||||||
@@ -12,6 +13,7 @@ import java.text.SimpleDateFormat
|
|||||||
import java.util.EnumSet
|
import java.util.EnumSet
|
||||||
import java.util.Locale
|
import java.util.Locale
|
||||||
|
|
||||||
|
@Broken
|
||||||
@MangaSourceParser("PAPSCAN", "PapScan", "fr")
|
@MangaSourceParser("PAPSCAN", "PapScan", "fr")
|
||||||
internal class PapScan(context: MangaLoaderContext) :
|
internal class PapScan(context: MangaLoaderContext) :
|
||||||
AnimeBootstrapParser(context, MangaSource.PAPSCAN, "papscan.com") {
|
AnimeBootstrapParser(context, MangaSource.PAPSCAN, "papscan.com") {
|
||||||
@@ -126,7 +128,8 @@ internal class PapScan(context: MangaLoaderContext) :
|
|||||||
MangaChapter(
|
MangaChapter(
|
||||||
id = generateUid(href),
|
id = generateUid(href),
|
||||||
name = li.selectFirstOrThrow("span em").text(),
|
name = li.selectFirstOrThrow("span em").text(),
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
url = href,
|
url = href,
|
||||||
uploadDate = dateFormat.tryParse(dateText),
|
uploadDate = dateFormat.tryParse(dateText),
|
||||||
source = source,
|
source = source,
|
||||||
|
|||||||
@@ -180,7 +180,8 @@ internal class FlixScans(context: MangaLoaderContext) : PagedMangaParser(context
|
|||||||
id = generateUid(url),
|
id = generateUid(url),
|
||||||
url = url,
|
url = url,
|
||||||
name = j.getString("slug").replace('-', ' '),
|
name = j.getString("slug").replace('-', ' '),
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
branch = null,
|
branch = null,
|
||||||
uploadDate = dateFormat.tryParse(date),
|
uploadDate = dateFormat.tryParse(date),
|
||||||
scanlator = null,
|
scanlator = null,
|
||||||
|
|||||||
@@ -101,7 +101,8 @@ internal class MangaStorm(context: MangaLoaderContext) : PagedMangaParser(contex
|
|||||||
MangaChapter(
|
MangaChapter(
|
||||||
id = generateUid(url),
|
id = generateUid(url),
|
||||||
name = a.text(),
|
name = a.text(),
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
url = url,
|
url = url,
|
||||||
scanlator = null,
|
scanlator = null,
|
||||||
uploadDate = 0,
|
uploadDate = 0,
|
||||||
|
|||||||
@@ -183,7 +183,8 @@ internal class TeamXNovel(context: MangaLoaderContext) : PagedMangaParser(contex
|
|||||||
MangaChapter(
|
MangaChapter(
|
||||||
id = generateUid(url),
|
id = generateUid(url),
|
||||||
name = li.selectFirstOrThrow(".epl-title").text(),
|
name = li.selectFirstOrThrow(".epl-title").text(),
|
||||||
number = url.substringAfterLast('/').toIntOrNull() ?: 0,
|
number = url.substringAfterLast('/').toFloatOrNull() ?: 0f,
|
||||||
|
volume = 0,
|
||||||
url = url,
|
url = url,
|
||||||
scanlator = null,
|
scanlator = null,
|
||||||
uploadDate = dateFormat.tryParse(li.selectFirstOrThrow(".epl-date").text()),
|
uploadDate = dateFormat.tryParse(li.selectFirstOrThrow(".epl-date").text()),
|
||||||
|
|||||||
@@ -144,7 +144,8 @@ internal class AnibelParser(context: MangaLoaderContext) : MangaParser(context,
|
|||||||
MangaChapter(
|
MangaChapter(
|
||||||
id = generateUid(jo.getString("id")),
|
id = generateUid(jo.getString("id")),
|
||||||
name = "Глава $number",
|
name = "Глава $number",
|
||||||
number = number,
|
number = number.toFloat(),
|
||||||
|
volume = 0,
|
||||||
url = "${manga.url}/read/$number",
|
url = "${manga.url}/read/$number",
|
||||||
scanlator = null,
|
scanlator = null,
|
||||||
uploadDate = jo.getLong("released"),
|
uploadDate = jo.getLong("released"),
|
||||||
|
|||||||
@@ -109,7 +109,8 @@ internal class BeeToon(context: MangaLoaderContext) :
|
|||||||
MangaChapter(
|
MangaChapter(
|
||||||
id = generateUid(url),
|
id = generateUid(url),
|
||||||
name = a.selectFirstOrThrow(".chap").text(),
|
name = a.selectFirstOrThrow(".chap").text(),
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
url = url,
|
url = url,
|
||||||
scanlator = null,
|
scanlator = null,
|
||||||
uploadDate = SimpleDateFormat("MM/dd/yyyy HH:mm:ss", Locale.ENGLISH)
|
uploadDate = SimpleDateFormat("MM/dd/yyyy HH:mm:ss", Locale.ENGLISH)
|
||||||
|
|||||||
@@ -76,7 +76,8 @@ internal class CloneMangaParser(context: MangaLoaderContext) : MangaParser(conte
|
|||||||
val chapter = MangaChapter(
|
val chapter = MangaChapter(
|
||||||
id = generateUid("$series&page=$i"),
|
id = generateUid("$series&page=$i"),
|
||||||
name = "Chapter ${i + 1}",
|
name = "Chapter ${i + 1}",
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
url = "$series&page=$i",
|
url = "$series&page=$i",
|
||||||
scanlator = null,
|
scanlator = null,
|
||||||
branch = null,
|
branch = null,
|
||||||
|
|||||||
@@ -149,7 +149,8 @@ internal class ComicExtra(context: MangaLoaderContext) : PagedMangaParser(contex
|
|||||||
MangaChapter(
|
MangaChapter(
|
||||||
id = generateUid(url),
|
id = generateUid(url),
|
||||||
name = name,
|
name = name,
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
url = url,
|
url = url,
|
||||||
scanlator = null,
|
scanlator = null,
|
||||||
uploadDate = dateFormat.tryParse(dateText),
|
uploadDate = dateFormat.tryParse(dateText),
|
||||||
|
|||||||
@@ -181,7 +181,8 @@ internal class DynastyScans(context: MangaLoaderContext) : PagedMangaParser(cont
|
|||||||
MangaChapter(
|
MangaChapter(
|
||||||
id = generateUid(href),
|
id = generateUid(href),
|
||||||
name = a.text(),
|
name = a.text(),
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
url = href,
|
url = href,
|
||||||
uploadDate = dateFormat.tryParse(dateText),
|
uploadDate = dateFormat.tryParse(dateText),
|
||||||
source = source,
|
source = source,
|
||||||
|
|||||||
@@ -165,7 +165,8 @@ internal class FlixScansOrg(context: MangaLoaderContext) : PagedMangaParser(cont
|
|||||||
id = generateUid(url),
|
id = generateUid(url),
|
||||||
url = url,
|
url = url,
|
||||||
name = j.getString("slug").replace('-', ' '),
|
name = j.getString("slug").replace('-', ' '),
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
branch = null,
|
branch = null,
|
||||||
uploadDate = dateFormat.tryParse(date),
|
uploadDate = dateFormat.tryParse(date),
|
||||||
scanlator = null,
|
scanlator = null,
|
||||||
|
|||||||
@@ -137,7 +137,8 @@ internal class MangaGeko(context: MangaLoaderContext) : PagedMangaParser(context
|
|||||||
MangaChapter(
|
MangaChapter(
|
||||||
id = generateUid(url),
|
id = generateUid(url),
|
||||||
name = name,
|
name = name,
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
url = url,
|
url = url,
|
||||||
scanlator = null,
|
scanlator = null,
|
||||||
uploadDate = dateFormat.tryParse(dateText),
|
uploadDate = dateFormat.tryParse(dateText),
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ internal class MangaTownParser(context: MangaLoaderContext) : PagedMangaParser(c
|
|||||||
|
|
||||||
override val isMultipleTagsSupported = false
|
override val isMultipleTagsSupported = false
|
||||||
|
|
||||||
override suspend fun getListPage(page: Int, filter: MangaListFilter?): List<Manga> {
|
override suspend fun getListPage(page: Int, filter: MangaListFilter?): List<Manga> {
|
||||||
val url = buildString {
|
val url = buildString {
|
||||||
append("https://")
|
append("https://")
|
||||||
append(domain)
|
append(domain)
|
||||||
@@ -157,7 +157,8 @@ internal class MangaTownParser(context: MangaLoaderContext) : PagedMangaParser(c
|
|||||||
id = generateUid(href),
|
id = generateUid(href),
|
||||||
url = href,
|
url = href,
|
||||||
source = MangaSource.MANGATOWN,
|
source = MangaSource.MANGATOWN,
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
uploadDate = parseChapterDate(
|
uploadDate = parseChapterDate(
|
||||||
dateFormat,
|
dateFormat,
|
||||||
li.selectFirst("span.time")?.text(),
|
li.selectFirst("span.time")?.text(),
|
||||||
@@ -176,7 +177,7 @@ internal class MangaTownParser(context: MangaLoaderContext) : PagedMangaParser(c
|
|||||||
val root = doc.body().selectFirstOrThrow("div.page_select")
|
val root = doc.body().selectFirstOrThrow("div.page_select")
|
||||||
val isManga = root.select("select")
|
val isManga = root.select("select")
|
||||||
|
|
||||||
if(isManga.isEmpty()){//Webtoon
|
if (isManga.isEmpty()) {//Webtoon
|
||||||
val imgElements = doc.select("div#viewer.read_img img.image")
|
val imgElements = doc.select("div#viewer.read_img img.image")
|
||||||
return imgElements.map {
|
return imgElements.map {
|
||||||
val href = it.attr("src")
|
val href = it.attr("src")
|
||||||
@@ -188,7 +189,7 @@ internal class MangaTownParser(context: MangaLoaderContext) : PagedMangaParser(c
|
|||||||
)
|
)
|
||||||
|
|
||||||
}
|
}
|
||||||
}else{ //Manga
|
} else { //Manga
|
||||||
return isManga.select("option").mapNotNull {
|
return isManga.select("option").mapNotNull {
|
||||||
val href = it.attrAsRelativeUrlOrNull("value")
|
val href = it.attrAsRelativeUrlOrNull("value")
|
||||||
if (href == null || href.endsWith("featured.html")) {
|
if (href == null || href.endsWith("featured.html")) {
|
||||||
@@ -205,7 +206,7 @@ internal class MangaTownParser(context: MangaLoaderContext) : PagedMangaParser(c
|
|||||||
}
|
}
|
||||||
|
|
||||||
override suspend fun getPageUrl(page: MangaPage): String {
|
override suspend fun getPageUrl(page: MangaPage): String {
|
||||||
if(page.url.startsWith("//")){//Webtoon
|
if (page.url.startsWith("//")) {//Webtoon
|
||||||
return page.url.toAbsoluteUrl(domain)
|
return page.url.toAbsoluteUrl(domain)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -253,7 +254,8 @@ internal class MangaTownParser(context: MangaLoaderContext) : PagedMangaParser(c
|
|||||||
id = generateUid(href),
|
id = generateUid(href),
|
||||||
url = href,
|
url = href,
|
||||||
source = MangaSource.MANGATOWN,
|
source = MangaSource.MANGATOWN,
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
uploadDate = parseChapterDate(
|
uploadDate = parseChapterDate(
|
||||||
dateFormat,
|
dateFormat,
|
||||||
li.selectFirst("span.time")?.text(),
|
li.selectFirst("span.time")?.text(),
|
||||||
|
|||||||
@@ -155,7 +155,8 @@ internal class Mangaowl(context: MangaLoaderContext) :
|
|||||||
MangaChapter(
|
MangaChapter(
|
||||||
id = generateUid(url),
|
id = generateUid(url),
|
||||||
name = name,
|
name = name,
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
url = url,
|
url = url,
|
||||||
uploadDate = dateFormat.tryParse(date),
|
uploadDate = dateFormat.tryParse(date),
|
||||||
source = source,
|
source = source,
|
||||||
|
|||||||
@@ -161,7 +161,8 @@ class Manhwa18Parser(context: MangaLoaderContext) :
|
|||||||
MangaChapter(
|
MangaChapter(
|
||||||
id = generateUid(chapterUrl),
|
id = generateUid(chapterUrl),
|
||||||
name = element.selectFirst(".chapter-name")?.text().orEmpty(),
|
name = element.selectFirst(".chapter-name")?.text().orEmpty(),
|
||||||
number = index + 1,
|
number = index + 1f,
|
||||||
|
volume = 0,
|
||||||
url = chapterUrl,
|
url = chapterUrl,
|
||||||
scanlator = null,
|
scanlator = null,
|
||||||
uploadDate = uploadDate,
|
uploadDate = uploadDate,
|
||||||
|
|||||||
@@ -113,7 +113,8 @@ class ManhwasMen(context: MangaLoaderContext) :
|
|||||||
MangaChapter(
|
MangaChapter(
|
||||||
id = generateUid(url),
|
id = generateUid(url),
|
||||||
name = li.selectFirstOrThrow(".flex-grow-1 span").text(),
|
name = li.selectFirstOrThrow(".flex-grow-1 span").text(),
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
url = url,
|
url = url,
|
||||||
scanlator = null,
|
scanlator = null,
|
||||||
uploadDate = parseChapterDate(
|
uploadDate = parseChapterDate(
|
||||||
|
|||||||
@@ -76,7 +76,8 @@ internal class Po2Scans(context: MangaLoaderContext) : MangaParser(context, Mang
|
|||||||
MangaChapter(
|
MangaChapter(
|
||||||
id = generateUid(url),
|
id = generateUid(url),
|
||||||
name = a.text(),
|
name = a.text(),
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
url = url,
|
url = url,
|
||||||
scanlator = null,
|
scanlator = null,
|
||||||
uploadDate = dateFormat.tryParse(div.select(".detail span").last()?.text()),
|
uploadDate = dateFormat.tryParse(div.select(".detail span").last()?.text()),
|
||||||
|
|||||||
@@ -126,7 +126,8 @@ internal class Pururin(context: MangaLoaderContext) :
|
|||||||
MangaChapter(
|
MangaChapter(
|
||||||
id = manga.id,
|
id = manga.id,
|
||||||
name = manga.title,
|
name = manga.title,
|
||||||
number = 1,
|
number = 1f,
|
||||||
|
volume = 0,
|
||||||
url = manga.url,
|
url = manga.url,
|
||||||
scanlator = null,
|
scanlator = null,
|
||||||
uploadDate = 0,
|
uploadDate = 0,
|
||||||
|
|||||||
@@ -96,7 +96,8 @@ internal class TempleScanEsp(context: MangaLoaderContext) :
|
|||||||
MangaChapter(
|
MangaChapter(
|
||||||
id = generateUid(href),
|
id = generateUid(href),
|
||||||
name = div.requireElementById("name").text(),
|
name = div.requireElementById("name").text(),
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
url = href,
|
url = href,
|
||||||
uploadDate = date,
|
uploadDate = date,
|
||||||
source = source,
|
source = source,
|
||||||
|
|||||||
@@ -203,7 +203,8 @@ internal abstract class FmreaderParser(
|
|||||||
MangaChapter(
|
MangaChapter(
|
||||||
id = generateUid(href),
|
id = generateUid(href),
|
||||||
name = a.selectFirstOrThrow("div.chapter-name").text(),
|
name = a.selectFirstOrThrow("div.chapter-name").text(),
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
url = href,
|
url = href,
|
||||||
uploadDate = parseChapterDate(
|
uploadDate = parseChapterDate(
|
||||||
dateFormat,
|
dateFormat,
|
||||||
|
|||||||
@@ -125,7 +125,8 @@ internal class Manhwa18Com(context: MangaLoaderContext) :
|
|||||||
MangaChapter(
|
MangaChapter(
|
||||||
id = generateUid(href),
|
id = generateUid(href),
|
||||||
name = a.selectFirstOrThrow("div.chapter-name").text(),
|
name = a.selectFirstOrThrow("div.chapter-name").text(),
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
url = href,
|
url = href,
|
||||||
uploadDate = parseChapterDate(
|
uploadDate = parseChapterDate(
|
||||||
dateFormat,
|
dateFormat,
|
||||||
|
|||||||
@@ -66,7 +66,8 @@ internal class Klz9(context: MangaLoaderContext) :
|
|||||||
MangaChapter(
|
MangaChapter(
|
||||||
id = generateUid(href),
|
id = generateUid(href),
|
||||||
name = a.selectFirstOrThrow("a").text(),
|
name = a.selectFirstOrThrow("a").text(),
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
url = href,
|
url = href,
|
||||||
uploadDate = parseChapterDate(
|
uploadDate = parseChapterDate(
|
||||||
dateFormat,
|
dateFormat,
|
||||||
|
|||||||
@@ -25,7 +25,8 @@ internal class WeLoveManga(context: MangaLoaderContext) :
|
|||||||
MangaChapter(
|
MangaChapter(
|
||||||
id = generateUid(href),
|
id = generateUid(href),
|
||||||
name = a.selectFirstOrThrow("a").text(),
|
name = a.selectFirstOrThrow("a").text(),
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
url = href,
|
url = href,
|
||||||
uploadDate = parseChapterDate(
|
uploadDate = parseChapterDate(
|
||||||
dateFormat,
|
dateFormat,
|
||||||
|
|||||||
@@ -155,7 +155,8 @@ internal abstract class FoolSlideParser(
|
|||||||
MangaChapter(
|
MangaChapter(
|
||||||
id = generateUid(href),
|
id = generateUid(href),
|
||||||
name = a.text(),
|
name = a.text(),
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
url = href,
|
url = href,
|
||||||
uploadDate = if (div.selectFirstOrThrow(selectDate).text().contains(", ")) {
|
uploadDate = if (div.selectFirstOrThrow(selectDate).text().contains(", ")) {
|
||||||
dateFormat.tryParse(dateText)
|
dateFormat.tryParse(dateText)
|
||||||
|
|||||||
@@ -5,9 +5,10 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser
|
|||||||
import org.koitharu.kotatsu.parsers.model.MangaSource
|
import org.koitharu.kotatsu.parsers.model.MangaSource
|
||||||
import org.koitharu.kotatsu.parsers.site.foolslide.FoolSlideParser
|
import org.koitharu.kotatsu.parsers.site.foolslide.FoolSlideParser
|
||||||
|
|
||||||
|
// The source has changed template so for the moment it is dead.
|
||||||
@MangaSourceParser("HNISCANTRAD", "HniScantrad", "fr")
|
@MangaSourceParser("HNISCANTRAD", "HniScantrad", "fr")
|
||||||
internal class HniScantrad(context: MangaLoaderContext) :
|
internal class HniScantrad(context: MangaLoaderContext) :
|
||||||
FoolSlideParser(context, MangaSource.HNISCANTRAD, "hni-scantrad.com") {
|
FoolSlideParser(context, MangaSource.HNISCANTRAD, "hni-scantrad.net") {
|
||||||
override val pagination = false
|
override val pagination = false
|
||||||
override val searchUrl = "lel/search/"
|
override val searchUrl = "lel/search/"
|
||||||
override val listUrl = "lel/directory/"
|
override val listUrl = "lel/directory/"
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import kotlinx.coroutines.awaitAll
|
|||||||
import kotlinx.coroutines.coroutineScope
|
import kotlinx.coroutines.coroutineScope
|
||||||
import okhttp3.Headers
|
import okhttp3.Headers
|
||||||
import org.jsoup.nodes.Element
|
import org.jsoup.nodes.Element
|
||||||
|
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.PagedMangaParser
|
import org.koitharu.kotatsu.parsers.PagedMangaParser
|
||||||
@@ -15,6 +16,7 @@ import org.koitharu.kotatsu.parsers.util.*
|
|||||||
import org.koitharu.kotatsu.parsers.util.json.getIntOrDefault
|
import org.koitharu.kotatsu.parsers.util.json.getIntOrDefault
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
|
@Broken
|
||||||
@MangaSourceParser("BENTOMANGA", "BentoManga", "fr")
|
@MangaSourceParser("BENTOMANGA", "BentoManga", "fr")
|
||||||
internal class BentomangaParser(context: MangaLoaderContext) : PagedMangaParser(context, MangaSource.BENTOMANGA, 10) {
|
internal class BentomangaParser(context: MangaLoaderContext) : PagedMangaParser(context, MangaSource.BENTOMANGA, 10) {
|
||||||
|
|
||||||
|
|||||||
@@ -109,7 +109,8 @@ internal class FuryoSociety(context: MangaLoaderContext) :
|
|||||||
MangaChapter(
|
MangaChapter(
|
||||||
id = generateUid(href),
|
id = generateUid(href),
|
||||||
name = div.selectFirstOrThrow("div.title").text() + " : " + div.selectFirstOrThrow("div.name").text(),
|
name = div.selectFirstOrThrow("div.title").text() + " : " + div.selectFirstOrThrow("div.name").text(),
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
url = href,
|
url = href,
|
||||||
uploadDate = parseChapterDate(
|
uploadDate = parseChapterDate(
|
||||||
dateFormat,
|
dateFormat,
|
||||||
|
|||||||
@@ -1,13 +1,11 @@
|
|||||||
package org.koitharu.kotatsu.parsers.site.fr
|
package org.koitharu.kotatsu.parsers.site.fr
|
||||||
|
|
||||||
import okhttp3.Headers
|
|
||||||
import org.json.JSONObject
|
import org.json.JSONObject
|
||||||
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.PagedMangaParser
|
import org.koitharu.kotatsu.parsers.PagedMangaParser
|
||||||
import org.koitharu.kotatsu.parsers.config.ConfigKey
|
import org.koitharu.kotatsu.parsers.config.ConfigKey
|
||||||
import org.koitharu.kotatsu.parsers.model.*
|
import org.koitharu.kotatsu.parsers.model.*
|
||||||
import org.koitharu.kotatsu.parsers.network.UserAgents
|
|
||||||
import org.koitharu.kotatsu.parsers.util.*
|
import org.koitharu.kotatsu.parsers.util.*
|
||||||
import org.koitharu.kotatsu.parsers.util.json.mapJSON
|
import org.koitharu.kotatsu.parsers.util.json.mapJSON
|
||||||
import java.text.SimpleDateFormat
|
import java.text.SimpleDateFormat
|
||||||
@@ -146,7 +144,8 @@ internal class LegacyScansParser(context: MangaLoaderContext) :
|
|||||||
MangaChapter(
|
MangaChapter(
|
||||||
id = generateUid(href),
|
id = generateUid(href),
|
||||||
name = name,
|
name = name,
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
url = href,
|
url = href,
|
||||||
scanlator = null,
|
scanlator = null,
|
||||||
uploadDate = dateFormat.tryParse(dateText),
|
uploadDate = dateFormat.tryParse(dateText),
|
||||||
|
|||||||
@@ -1,12 +1,11 @@
|
|||||||
package org.koitharu.kotatsu.parsers.site.fr
|
package org.koitharu.kotatsu.parsers.site.fr
|
||||||
|
|
||||||
import okhttp3.Headers
|
|
||||||
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.PagedMangaParser
|
import org.koitharu.kotatsu.parsers.PagedMangaParser
|
||||||
import org.koitharu.kotatsu.parsers.config.ConfigKey
|
import org.koitharu.kotatsu.parsers.config.ConfigKey
|
||||||
import org.koitharu.kotatsu.parsers.model.*
|
import org.koitharu.kotatsu.parsers.model.*
|
||||||
import org.koitharu.kotatsu.parsers.network.UserAgents
|
|
||||||
import org.koitharu.kotatsu.parsers.util.*
|
import org.koitharu.kotatsu.parsers.util.*
|
||||||
import java.text.SimpleDateFormat
|
import java.text.SimpleDateFormat
|
||||||
import java.util.*
|
import java.util.*
|
||||||
@@ -115,7 +114,8 @@ internal class LireScan(context: MangaLoaderContext) : PagedMangaParser(context,
|
|||||||
MangaChapter(
|
MangaChapter(
|
||||||
id = generateUid(href),
|
id = generateUid(href),
|
||||||
name = name,
|
name = name,
|
||||||
number = i,
|
number = i.toFloat(),
|
||||||
|
volume = 0,
|
||||||
url = href,
|
url = href,
|
||||||
scanlator = null,
|
scanlator = null,
|
||||||
uploadDate = dateFormat.tryParse(dateText),
|
uploadDate = dateFormat.tryParse(dateText),
|
||||||
|
|||||||
@@ -182,7 +182,8 @@ internal class LugnicaScans(context: MangaLoaderContext) : PagedMangaParser(cont
|
|||||||
MangaChapter(
|
MangaChapter(
|
||||||
id = generateUid(url),
|
id = generateUid(url),
|
||||||
name = "Chapitre : $id",
|
name = "Chapitre : $id",
|
||||||
number = i,
|
number = i.toFloat(),
|
||||||
|
volume = 0,
|
||||||
url = url,
|
url = url,
|
||||||
scanlator = null,
|
scanlator = null,
|
||||||
uploadDate = dateFormat.tryParse(date),
|
uploadDate = dateFormat.tryParse(date),
|
||||||
|
|||||||
@@ -138,7 +138,8 @@ internal class ScansMangasMe(context: MangaLoaderContext) :
|
|||||||
MangaChapter(
|
MangaChapter(
|
||||||
id = generateUid(href),
|
id = generateUid(href),
|
||||||
name = li.selectFirstOrThrow("span.mobile chapter").text(),
|
name = li.selectFirstOrThrow("span.mobile chapter").text(),
|
||||||
number = i + 1,
|
number = li.selectFirstOrThrow("span.mobile chapter").text().substringAfterLast(" ").toFloat(),
|
||||||
|
volume = 0,
|
||||||
url = href,
|
url = href,
|
||||||
uploadDate = 0,
|
uploadDate = 0,
|
||||||
source = source,
|
source = source,
|
||||||
|
|||||||
@@ -151,7 +151,8 @@ internal class ScantradUnion(context: MangaLoaderContext) : PagedMangaParser(con
|
|||||||
MangaChapter(
|
MangaChapter(
|
||||||
id = generateUid(href),
|
id = generateUid(href),
|
||||||
name = name,
|
name = name,
|
||||||
number = i,
|
number = i.toFloat(),
|
||||||
|
volume = 0,
|
||||||
url = href,
|
url = href,
|
||||||
scanlator = null,
|
scanlator = null,
|
||||||
uploadDate = dateFormat.tryParse(date),
|
uploadDate = dateFormat.tryParse(date),
|
||||||
|
|||||||
@@ -1,11 +1,9 @@
|
|||||||
package org.koitharu.kotatsu.parsers.site.heancms
|
package org.koitharu.kotatsu.parsers.site.heancms
|
||||||
|
|
||||||
import okhttp3.Headers
|
|
||||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||||
import org.koitharu.kotatsu.parsers.PagedMangaParser
|
import org.koitharu.kotatsu.parsers.PagedMangaParser
|
||||||
import org.koitharu.kotatsu.parsers.config.ConfigKey
|
import org.koitharu.kotatsu.parsers.config.ConfigKey
|
||||||
import org.koitharu.kotatsu.parsers.model.*
|
import org.koitharu.kotatsu.parsers.model.*
|
||||||
import org.koitharu.kotatsu.parsers.network.UserAgents
|
|
||||||
import org.koitharu.kotatsu.parsers.util.*
|
import org.koitharu.kotatsu.parsers.util.*
|
||||||
import org.koitharu.kotatsu.parsers.util.json.mapJSON
|
import org.koitharu.kotatsu.parsers.util.json.mapJSON
|
||||||
import java.text.SimpleDateFormat
|
import java.text.SimpleDateFormat
|
||||||
@@ -20,8 +18,16 @@ internal abstract class HeanCms(
|
|||||||
|
|
||||||
override val configKeyDomain = ConfigKey.Domain(domain)
|
override val configKeyDomain = ConfigKey.Domain(domain)
|
||||||
|
|
||||||
|
private val userAgentKey = ConfigKey.UserAgent(context.getDefaultUserAgent())
|
||||||
|
|
||||||
|
override fun onCreateConfig(keys: MutableCollection<ConfigKey<*>>) {
|
||||||
|
super.onCreateConfig(keys)
|
||||||
|
keys.add(userAgentKey)
|
||||||
|
}
|
||||||
|
|
||||||
override val availableSortOrders: Set<SortOrder> = EnumSet.of(
|
override val availableSortOrders: Set<SortOrder> = EnumSet.of(
|
||||||
SortOrder.ALPHABETICAL,
|
SortOrder.ALPHABETICAL,
|
||||||
|
SortOrder.ALPHABETICAL_DESC,
|
||||||
SortOrder.UPDATED,
|
SortOrder.UPDATED,
|
||||||
SortOrder.NEWEST,
|
SortOrder.NEWEST,
|
||||||
SortOrder.POPULARITY,
|
SortOrder.POPULARITY,
|
||||||
@@ -30,15 +36,11 @@ internal abstract class HeanCms(
|
|||||||
override val availableStates: Set<MangaState> =
|
override val availableStates: Set<MangaState> =
|
||||||
EnumSet.of(MangaState.ONGOING, MangaState.FINISHED, MangaState.PAUSED, MangaState.ABANDONED)
|
EnumSet.of(MangaState.ONGOING, MangaState.FINISHED, MangaState.PAUSED, MangaState.ABANDONED)
|
||||||
|
|
||||||
override val headers: Headers = Headers.Builder()
|
|
||||||
.add("User-Agent", UserAgents.CHROME_DESKTOP)
|
|
||||||
.build()
|
|
||||||
|
|
||||||
protected open val pathManga = "series"
|
protected open val pathManga = "series"
|
||||||
protected open val apiPath
|
protected open val apiPath
|
||||||
get() = getDomain("api")
|
get() = getDomain("api")
|
||||||
|
|
||||||
//For some sources, you need to send a json. For the moment, this part only works in Get. ( ex source need json gloriousscan.com , omegascans.org )
|
|
||||||
override suspend fun getListPage(page: Int, filter: MangaListFilter?): List<Manga> {
|
override suspend fun getListPage(page: Int, filter: MangaListFilter?): List<Manga> {
|
||||||
val url = buildString {
|
val url = buildString {
|
||||||
append("https://")
|
append("https://")
|
||||||
@@ -147,7 +149,8 @@ internal abstract class HeanCms(
|
|||||||
MangaChapter(
|
MangaChapter(
|
||||||
id = generateUid(url),
|
id = generateUid(url),
|
||||||
name = name,
|
name = name,
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
url = url,
|
url = url,
|
||||||
scanlator = null,
|
scanlator = null,
|
||||||
uploadDate = dateFormat.tryParse(date),
|
uploadDate = dateFormat.tryParse(date),
|
||||||
|
|||||||
@@ -45,8 +45,8 @@ internal class OmegaScans(context: MangaLoaderContext) : HeanCms(context, MangaS
|
|||||||
SortOrder.POPULARITY -> append("total_views&order=desc")
|
SortOrder.POPULARITY -> append("total_views&order=desc")
|
||||||
SortOrder.UPDATED -> append("latest&order=desc")
|
SortOrder.UPDATED -> append("latest&order=desc")
|
||||||
SortOrder.NEWEST -> append("created_at&order=desc")
|
SortOrder.NEWEST -> append("created_at&order=desc")
|
||||||
SortOrder.ALPHABETICAL -> append("title&order=desc")
|
SortOrder.ALPHABETICAL -> append("title&order=asc")
|
||||||
SortOrder.ALPHABETICAL_DESC -> append("title&order=asc")
|
SortOrder.ALPHABETICAL_DESC -> append("title&order=desc")
|
||||||
else -> append("latest&order=desc")
|
else -> append("latest&order=desc")
|
||||||
}
|
}
|
||||||
append("&series_type=All&perPage=$pageSize")
|
append("&series_type=All&perPage=$pageSize")
|
||||||
|
|||||||
@@ -43,8 +43,8 @@ internal class YugenMangasEs(context: MangaLoaderContext) :
|
|||||||
SortOrder.POPULARITY -> append("total_views&order=desc")
|
SortOrder.POPULARITY -> append("total_views&order=desc")
|
||||||
SortOrder.UPDATED -> append("latest&order=desc")
|
SortOrder.UPDATED -> append("latest&order=desc")
|
||||||
SortOrder.NEWEST -> append("created_at&order=desc")
|
SortOrder.NEWEST -> append("created_at&order=desc")
|
||||||
SortOrder.ALPHABETICAL -> append("title&order=desc")
|
SortOrder.ALPHABETICAL -> append("title&order=asc")
|
||||||
SortOrder.ALPHABETICAL_DESC -> append("title&order=asc")
|
SortOrder.ALPHABETICAL_DESC -> append("title&order=desc")
|
||||||
else -> append("latest&order=desc")
|
else -> append("latest&order=desc")
|
||||||
}
|
}
|
||||||
append("&series_type=Comic&perPage=12")
|
append("&series_type=Comic&perPage=12")
|
||||||
|
|||||||
@@ -1,10 +1,165 @@
|
|||||||
package org.koitharu.kotatsu.parsers.site.heancms.fr
|
package org.koitharu.kotatsu.parsers.site.heancms.fr
|
||||||
|
|
||||||
|
import org.json.JSONArray
|
||||||
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.Manga
|
||||||
|
import org.koitharu.kotatsu.parsers.model.MangaChapter
|
||||||
|
import org.koitharu.kotatsu.parsers.model.MangaListFilter
|
||||||
import org.koitharu.kotatsu.parsers.model.MangaSource
|
import org.koitharu.kotatsu.parsers.model.MangaSource
|
||||||
|
import org.koitharu.kotatsu.parsers.model.MangaState
|
||||||
|
import org.koitharu.kotatsu.parsers.model.MangaTag
|
||||||
|
import org.koitharu.kotatsu.parsers.model.RATING_UNKNOWN
|
||||||
|
import org.koitharu.kotatsu.parsers.model.SortOrder
|
||||||
import org.koitharu.kotatsu.parsers.site.heancms.HeanCms
|
import org.koitharu.kotatsu.parsers.site.heancms.HeanCms
|
||||||
|
import org.koitharu.kotatsu.parsers.util.domain
|
||||||
|
import org.koitharu.kotatsu.parsers.util.json.getFloatOrDefault
|
||||||
|
import org.koitharu.kotatsu.parsers.util.json.getStringOrNull
|
||||||
|
import org.koitharu.kotatsu.parsers.util.json.mapJSON
|
||||||
|
import org.koitharu.kotatsu.parsers.util.json.mapJSONToSet
|
||||||
|
import org.koitharu.kotatsu.parsers.util.json.unescapeJson
|
||||||
|
import org.koitharu.kotatsu.parsers.util.oneOrThrowIfMany
|
||||||
|
import org.koitharu.kotatsu.parsers.util.parseHtml
|
||||||
|
import org.koitharu.kotatsu.parsers.util.parseJson
|
||||||
|
import org.koitharu.kotatsu.parsers.util.toRelativeUrl
|
||||||
|
import org.koitharu.kotatsu.parsers.util.toTitleCase
|
||||||
|
import org.koitharu.kotatsu.parsers.util.tryParse
|
||||||
|
import org.koitharu.kotatsu.parsers.util.urlEncoded
|
||||||
|
import java.text.SimpleDateFormat
|
||||||
|
import java.util.Locale
|
||||||
|
|
||||||
@MangaSourceParser("PERF_SCAN", "PerfScan", "fr")
|
@MangaSourceParser("PERF_SCAN", "PerfScan", "fr")
|
||||||
internal class PerfScan(context: MangaLoaderContext) :
|
internal class PerfScan(context: MangaLoaderContext) :
|
||||||
HeanCms(context, MangaSource.PERF_SCAN, "perf-scan.fr")
|
HeanCms(context, MangaSource.PERF_SCAN, "perf-scan.fr") {
|
||||||
|
|
||||||
|
override suspend fun getListPage(page: Int, filter: MangaListFilter?): List<Manga> {
|
||||||
|
val url = buildString {
|
||||||
|
append("https://api.")
|
||||||
|
append(domain)
|
||||||
|
append("/query?adult=true&query_string=")
|
||||||
|
when (filter) {
|
||||||
|
is MangaListFilter.Search -> {
|
||||||
|
append(filter.query.urlEncoded())
|
||||||
|
}
|
||||||
|
|
||||||
|
is MangaListFilter.Advanced -> {
|
||||||
|
|
||||||
|
filter.states.oneOrThrowIfMany()?.let {
|
||||||
|
append("&status=")
|
||||||
|
append(
|
||||||
|
when (it) {
|
||||||
|
MangaState.ONGOING -> "Ongoing"
|
||||||
|
MangaState.FINISHED -> "Completed"
|
||||||
|
MangaState.ABANDONED -> "Dropped"
|
||||||
|
MangaState.PAUSED -> "Hiatus"
|
||||||
|
else -> ""
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
}
|
||||||
|
append("&orderBy=")
|
||||||
|
when (filter.sortOrder) {
|
||||||
|
SortOrder.POPULARITY -> append("total_views&order=desc")
|
||||||
|
SortOrder.UPDATED -> append("latest&order=desc")
|
||||||
|
SortOrder.NEWEST -> append("created_at&order=desc")
|
||||||
|
SortOrder.ALPHABETICAL -> append("title&order=asc")
|
||||||
|
SortOrder.ALPHABETICAL_DESC -> append("title&order=desc")
|
||||||
|
else -> append("latest&order=desc")
|
||||||
|
}
|
||||||
|
append("&series_type=All&perPage=")
|
||||||
|
append(pageSize)
|
||||||
|
append("&tags_ids=")
|
||||||
|
append("[".urlEncoded())
|
||||||
|
filter.tags.joinTo(this, ",") { it.key }
|
||||||
|
append("]".urlEncoded())
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
null -> {}
|
||||||
|
}
|
||||||
|
append("&page=")
|
||||||
|
append(page)
|
||||||
|
}
|
||||||
|
val json = webClient.httpGet(url).parseJson()
|
||||||
|
return json.getJSONArray("data").mapJSON { j ->
|
||||||
|
val slug = j.getString("series_slug")
|
||||||
|
val urlManga = "https://$domain/$pathManga/$slug"
|
||||||
|
val cover = if (j.getString("thumbnail").contains('/')) {
|
||||||
|
j.getString("thumbnail")
|
||||||
|
} else {
|
||||||
|
"https://api.$domain/${j.getString("thumbnail")}"
|
||||||
|
}
|
||||||
|
Manga(
|
||||||
|
id = j.getLong("id"),
|
||||||
|
title = j.getString("title"),
|
||||||
|
altTitle = null,
|
||||||
|
url = urlManga.toRelativeUrl(domain),
|
||||||
|
publicUrl = urlManga,
|
||||||
|
rating = j.getFloatOrDefault("rating", RATING_UNKNOWN) / 5f,
|
||||||
|
isNsfw = isNsfwSource,
|
||||||
|
coverUrl = cover,
|
||||||
|
tags = setOf(),
|
||||||
|
state = when (j.getStringOrNull("status")) {
|
||||||
|
"Ongoing" -> MangaState.ONGOING
|
||||||
|
"Completed" -> MangaState.FINISHED
|
||||||
|
"Dropped" -> MangaState.ABANDONED
|
||||||
|
"Hiatus" -> MangaState.PAUSED
|
||||||
|
else -> null
|
||||||
|
},
|
||||||
|
author = j.getStringOrNull("author"),
|
||||||
|
source = source,
|
||||||
|
description = j.getString("description"),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
override suspend fun getDetails(manga: Manga): Manga {
|
||||||
|
val url = buildString {
|
||||||
|
append("https://api.")
|
||||||
|
append(domain)
|
||||||
|
append("/chapter/query?perPage=9999&series_id=")
|
||||||
|
append(manga.id)
|
||||||
|
}
|
||||||
|
val json = webClient.httpGet(url).parseJson()
|
||||||
|
val dateFormat = SimpleDateFormat(datePattern, Locale.ENGLISH)
|
||||||
|
|
||||||
|
val chaptersJsonArray = json.getJSONArray("data")
|
||||||
|
var totalChapters = json.getJSONObject("meta").getInt("total")
|
||||||
|
val chapters = chaptersJsonArray.mapJSON { j ->
|
||||||
|
val slug = j.getJSONObject("series").getString("series_slug")
|
||||||
|
val chapterUrl = "https://$domain/$pathManga/$slug/${j.getString("chapter_slug")}"
|
||||||
|
val date = j.getString("created_at").substringBeforeLast("T")
|
||||||
|
MangaChapter(
|
||||||
|
id = j.getLong("id"),
|
||||||
|
url = chapterUrl,
|
||||||
|
name = j.getString("chapter_name"),
|
||||||
|
number = totalChapters--,
|
||||||
|
branch = null,
|
||||||
|
uploadDate = dateFormat.tryParse(date),
|
||||||
|
scanlator = null,
|
||||||
|
source = source,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
return manga.copy(
|
||||||
|
chapters = chapters.reversed(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
override suspend fun getAvailableTags(): Set<MangaTag> {
|
||||||
|
val doc = webClient.httpGet("https://$domain/comics").parseHtml()
|
||||||
|
|
||||||
|
val regex = Regex("\"tags\\\\.*?(\\[.+?])")
|
||||||
|
val tags = doc.select("script").firstNotNullOf { script ->
|
||||||
|
regex.find(script.html())?.groupValues?.getOrNull(1)
|
||||||
|
}.unescapeJson()
|
||||||
|
return JSONArray(tags).mapJSONToSet {
|
||||||
|
MangaTag(
|
||||||
|
key = it.getInt("id").toString(),
|
||||||
|
title = it.getString("name").toTitleCase(sourceLocale),
|
||||||
|
source = source,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -45,8 +45,8 @@ internal class ModeScanlator(
|
|||||||
SortOrder.POPULARITY -> append("total_views&order=desc")
|
SortOrder.POPULARITY -> append("total_views&order=desc")
|
||||||
SortOrder.UPDATED -> append("latest&order=desc")
|
SortOrder.UPDATED -> append("latest&order=desc")
|
||||||
SortOrder.NEWEST -> append("created_at&order=desc")
|
SortOrder.NEWEST -> append("created_at&order=desc")
|
||||||
SortOrder.ALPHABETICAL -> append("title&order=desc")
|
SortOrder.ALPHABETICAL -> append("title&order=asc")
|
||||||
SortOrder.ALPHABETICAL_DESC -> append("title&order=asc")
|
SortOrder.ALPHABETICAL_DESC -> append("title&order=desc")
|
||||||
else -> append("latest&order=desc")
|
else -> append("latest&order=desc")
|
||||||
}
|
}
|
||||||
append("&series_type=All&perPage=")
|
append("&series_type=All&perPage=")
|
||||||
|
|||||||
@@ -99,7 +99,8 @@ internal abstract class HeanCmsAlt(
|
|||||||
MangaChapter(
|
MangaChapter(
|
||||||
id = generateUid(url),
|
id = generateUid(url),
|
||||||
name = a.selectFirstOrThrow(selectChapterTitle).text(),
|
name = a.selectFirstOrThrow(selectChapterTitle).text(),
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
url = url,
|
url = url,
|
||||||
scanlator = null,
|
scanlator = null,
|
||||||
uploadDate = parseChapterDate(
|
uploadDate = parseChapterDate(
|
||||||
|
|||||||
@@ -41,7 +41,8 @@ internal class Brakeout(context: MangaLoaderContext) :
|
|||||||
MangaChapter(
|
MangaChapter(
|
||||||
id = generateUid(url),
|
id = generateUid(url),
|
||||||
name = div.selectFirstOrThrow(selectChapterTitle).text(),
|
name = div.selectFirstOrThrow(selectChapterTitle).text(),
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
url = url,
|
url = url,
|
||||||
scanlator = null,
|
scanlator = null,
|
||||||
uploadDate = parseChapterDate(
|
uploadDate = parseChapterDate(
|
||||||
|
|||||||
@@ -116,7 +116,8 @@ internal class MangaWorld(
|
|||||||
MangaChapter(
|
MangaChapter(
|
||||||
id = generateUid(url),
|
id = generateUid(url),
|
||||||
name = a.selectFirstOrThrow("span.d-inline-block").text(),
|
name = a.selectFirstOrThrow("span.d-inline-block").text(),
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
url = url,
|
url = url,
|
||||||
scanlator = null,
|
scanlator = null,
|
||||||
uploadDate =
|
uploadDate =
|
||||||
|
|||||||
@@ -126,7 +126,8 @@ class NicovideoSeigaParser(context: MangaLoaderContext) :
|
|||||||
MangaChapter(
|
MangaChapter(
|
||||||
id = generateUid(href),
|
id = generateUid(href),
|
||||||
name = li.select("div > div.description > div.title > a").text(),
|
name = li.select("div > div.description > div.title > a").text(),
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
url = href,
|
url = href,
|
||||||
scanlator = null,
|
scanlator = null,
|
||||||
branch = null,
|
branch = null,
|
||||||
|
|||||||
@@ -1,10 +0,0 @@
|
|||||||
package org.koitharu.kotatsu.parsers.site.likemanga.en
|
|
||||||
|
|
||||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
|
||||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
|
||||||
import org.koitharu.kotatsu.parsers.model.*
|
|
||||||
import org.koitharu.kotatsu.parsers.site.likemanga.LikeMangaParser
|
|
||||||
|
|
||||||
@MangaSourceParser("ZINMANGA_COM", "ZinManga.com", "en")
|
|
||||||
internal class ZinManga(context: MangaLoaderContext) :
|
|
||||||
LikeMangaParser(context, MangaSource.ZINMANGA_COM, "zinmanga.com")
|
|
||||||
@@ -472,7 +472,8 @@ internal abstract class MadaraParser(
|
|||||||
MangaChapter(
|
MangaChapter(
|
||||||
id = generateUid(href),
|
id = generateUid(href),
|
||||||
name = name,
|
name = name,
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
url = link,
|
url = link,
|
||||||
uploadDate = parseChapterDate(
|
uploadDate = parseChapterDate(
|
||||||
dateFormat,
|
dateFormat,
|
||||||
@@ -506,7 +507,8 @@ internal abstract class MadaraParser(
|
|||||||
id = generateUid(href),
|
id = generateUid(href),
|
||||||
url = link,
|
url = link,
|
||||||
name = name,
|
name = name,
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
branch = null,
|
branch = null,
|
||||||
uploadDate = parseChapterDate(
|
uploadDate = parseChapterDate(
|
||||||
dateFormat,
|
dateFormat,
|
||||||
|
|||||||
@@ -27,7 +27,8 @@ internal class Ero18x(context: MangaLoaderContext) :
|
|||||||
MangaChapter(
|
MangaChapter(
|
||||||
id = generateUid(href),
|
id = generateUid(href),
|
||||||
name = name,
|
name = name,
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
url = link,
|
url = link,
|
||||||
uploadDate = if (dateText == "Newly Published!") {
|
uploadDate = if (dateText == "Newly Published!") {
|
||||||
parseChapterDate(
|
parseChapterDate(
|
||||||
|
|||||||
@@ -31,7 +31,8 @@ internal class ManhwaRaw(context: MangaLoaderContext) :
|
|||||||
MangaChapter(
|
MangaChapter(
|
||||||
id = generateUid(href),
|
id = generateUid(href),
|
||||||
name = name,
|
name = name,
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
url = link,
|
url = link,
|
||||||
uploadDate = if (dateText == "Newly Published!") {
|
uploadDate = if (dateText == "Newly Published!") {
|
||||||
parseChapterDate(
|
parseChapterDate(
|
||||||
|
|||||||
@@ -36,7 +36,8 @@ internal class LekMangaCom(context: MangaLoaderContext) :
|
|||||||
id = generateUid(href),
|
id = generateUid(href),
|
||||||
url = link,
|
url = link,
|
||||||
name = name,
|
name = name,
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
branch = null,
|
branch = null,
|
||||||
uploadDate = parseChapterDate(
|
uploadDate = parseChapterDate(
|
||||||
dateFormat,
|
dateFormat,
|
||||||
|
|||||||
@@ -1,10 +1,12 @@
|
|||||||
package org.koitharu.kotatsu.parsers.site.madara.en
|
package org.koitharu.kotatsu.parsers.site.madara.en
|
||||||
|
|
||||||
|
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.MangaSource
|
import org.koitharu.kotatsu.parsers.model.MangaSource
|
||||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||||
|
|
||||||
|
@Broken
|
||||||
@MangaSourceParser("ANSHSCANS", "AnshScans", "en")
|
@MangaSourceParser("ANSHSCANS", "AnshScans", "en")
|
||||||
internal class AnshScans(context: MangaLoaderContext) :
|
internal class AnshScans(context: MangaLoaderContext) :
|
||||||
MadaraParser(context, MangaSource.ANSHSCANS, "anshscans.org", 10) {
|
MadaraParser(context, MangaSource.ANSHSCANS, "anshscans.org", 10) {
|
||||||
|
|||||||
@@ -28,7 +28,8 @@ internal class Hentaixdickgirl(context: MangaLoaderContext) :
|
|||||||
MangaChapter(
|
MangaChapter(
|
||||||
id = generateUid(href),
|
id = generateUid(href),
|
||||||
name = name,
|
name = name,
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
url = link,
|
url = link,
|
||||||
uploadDate = parseChapterDate(
|
uploadDate = parseChapterDate(
|
||||||
dateFormat,
|
dateFormat,
|
||||||
|
|||||||
@@ -121,7 +121,8 @@ internal class InstaManhwa(context: MangaLoaderContext) :
|
|||||||
id = generateUid(href),
|
id = generateUid(href),
|
||||||
url = link,
|
url = link,
|
||||||
name = name,
|
name = name,
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
branch = null,
|
branch = null,
|
||||||
uploadDate = parseChapterDate(
|
uploadDate = parseChapterDate(
|
||||||
dateFormat,
|
dateFormat,
|
||||||
|
|||||||
@@ -125,7 +125,8 @@ internal class IsekaiScan(context: MangaLoaderContext) :
|
|||||||
id = generateUid(href),
|
id = generateUid(href),
|
||||||
url = link,
|
url = link,
|
||||||
name = a.ownText(),
|
name = a.ownText(),
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
branch = null,
|
branch = null,
|
||||||
uploadDate = parseChapterDate(
|
uploadDate = parseChapterDate(
|
||||||
dateFormat,
|
dateFormat,
|
||||||
|
|||||||
@@ -161,7 +161,8 @@ internal class MangaDass(context: MangaLoaderContext) :
|
|||||||
MangaChapter(
|
MangaChapter(
|
||||||
id = generateUid(href),
|
id = generateUid(href),
|
||||||
name = name,
|
name = name,
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
url = link,
|
url = link,
|
||||||
uploadDate = parseChapterDate(
|
uploadDate = parseChapterDate(
|
||||||
dateFormat,
|
dateFormat,
|
||||||
|
|||||||
@@ -33,7 +33,8 @@ internal class MangaDistrict(context: MangaLoaderContext) :
|
|||||||
MangaChapter(
|
MangaChapter(
|
||||||
id = generateUid(href),
|
id = generateUid(href),
|
||||||
name = a.ownText(),
|
name = a.ownText(),
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
url = href,
|
url = href,
|
||||||
uploadDate = parseChapterDate(
|
uploadDate = parseChapterDate(
|
||||||
dateFormat,
|
dateFormat,
|
||||||
|
|||||||
@@ -151,7 +151,8 @@ internal class MangaDna(context: MangaLoaderContext) :
|
|||||||
MangaChapter(
|
MangaChapter(
|
||||||
id = generateUid(href),
|
id = generateUid(href),
|
||||||
name = name,
|
name = name,
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
url = link,
|
url = link,
|
||||||
uploadDate = parseChapterDate(
|
uploadDate = parseChapterDate(
|
||||||
dateFormat,
|
dateFormat,
|
||||||
|
|||||||
@@ -127,7 +127,8 @@ internal class MangaPure(context: MangaLoaderContext) :
|
|||||||
id = generateUid(href),
|
id = generateUid(href),
|
||||||
url = link,
|
url = link,
|
||||||
name = a.ownText(),
|
name = a.ownText(),
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
branch = null,
|
branch = null,
|
||||||
uploadDate = parseChapterDate(
|
uploadDate = parseChapterDate(
|
||||||
dateFormat,
|
dateFormat,
|
||||||
|
|||||||
@@ -39,7 +39,8 @@ internal class ManhwaTop(context: MangaLoaderContext) :
|
|||||||
id = generateUid(href),
|
id = generateUid(href),
|
||||||
url = link,
|
url = link,
|
||||||
name = name,
|
name = name,
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
branch = null,
|
branch = null,
|
||||||
uploadDate = parseChapterDate(
|
uploadDate = parseChapterDate(
|
||||||
dateFormat,
|
dateFormat,
|
||||||
|
|||||||
@@ -5,7 +5,8 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser
|
|||||||
import org.koitharu.kotatsu.parsers.model.MangaSource
|
import org.koitharu.kotatsu.parsers.model.MangaSource
|
||||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||||
|
|
||||||
@MangaSourceParser("ZINMANGA", "ZinManga.com", "en")
|
@MangaSourceParser("ZINMANGA", "ZinManga", "en")
|
||||||
internal class Zinmanga(context: MangaLoaderContext) : MadaraParser(context, MangaSource.ZINMANGA, "zinmanga.com") {
|
internal class Zinmanga(context: MangaLoaderContext) : MadaraParser(context, MangaSource.ZINMANGA, "zinmanga.net") {
|
||||||
override val datePattern = "MM/dd/yyyy"
|
override val datePattern = "MM/dd/yyyy"
|
||||||
|
override val withoutAjax = true
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,7 +27,8 @@ internal class ManhwaEs(context: MangaLoaderContext) :
|
|||||||
MangaChapter(
|
MangaChapter(
|
||||||
id = generateUid(href),
|
id = generateUid(href),
|
||||||
name = name,
|
name = name,
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
url = link,
|
url = link,
|
||||||
uploadDate = if (dateText == "¡Recién publicado!") {
|
uploadDate = if (dateText == "¡Recién publicado!") {
|
||||||
parseChapterDate(
|
parseChapterDate(
|
||||||
|
|||||||
@@ -35,7 +35,8 @@ internal class ManhwaLatino(context: MangaLoaderContext) :
|
|||||||
MangaChapter(
|
MangaChapter(
|
||||||
id = generateUid(href),
|
id = generateUid(href),
|
||||||
name = name,
|
name = name,
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
url = link,
|
url = link,
|
||||||
uploadDate = parseChapterDate(
|
uploadDate = parseChapterDate(
|
||||||
dateFormat,
|
dateFormat,
|
||||||
|
|||||||
@@ -99,7 +99,8 @@ internal class TmoManga(context: MangaLoaderContext) :
|
|||||||
MangaChapter(
|
MangaChapter(
|
||||||
id = generateUid(href),
|
id = generateUid(href),
|
||||||
name = name,
|
name = name,
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
url = link,
|
url = link,
|
||||||
uploadDate = 0,
|
uploadDate = 0,
|
||||||
source = source,
|
source = source,
|
||||||
|
|||||||
@@ -1,10 +1,12 @@
|
|||||||
package org.koitharu.kotatsu.parsers.site.madara.fr
|
package org.koitharu.kotatsu.parsers.site.madara.fr
|
||||||
|
|
||||||
|
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.MangaSource
|
import org.koitharu.kotatsu.parsers.model.MangaSource
|
||||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||||
|
|
||||||
|
@Broken
|
||||||
@MangaSourceParser("BLUESOLO", "BlueSolo", "fr")
|
@MangaSourceParser("BLUESOLO", "BlueSolo", "fr")
|
||||||
internal class BlueSolo(context: MangaLoaderContext) :
|
internal class BlueSolo(context: MangaLoaderContext) :
|
||||||
MadaraParser(context, MangaSource.BLUESOLO, "www1.bluesolo.org", 10) {
|
MadaraParser(context, MangaSource.BLUESOLO, "www1.bluesolo.org", 10) {
|
||||||
|
|||||||
@@ -32,7 +32,8 @@ internal class Hentaizone(context: MangaLoaderContext) :
|
|||||||
MangaChapter(
|
MangaChapter(
|
||||||
id = generateUid(href),
|
id = generateUid(href),
|
||||||
name = name,
|
name = name,
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
url = link,
|
url = link,
|
||||||
uploadDate = parseChapterDate(
|
uploadDate = parseChapterDate(
|
||||||
dateFormat,
|
dateFormat,
|
||||||
|
|||||||
@@ -1,11 +1,13 @@
|
|||||||
package org.koitharu.kotatsu.parsers.site.madara.fr
|
package org.koitharu.kotatsu.parsers.site.madara.fr
|
||||||
|
|
||||||
|
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.ContentType
|
import org.koitharu.kotatsu.parsers.model.ContentType
|
||||||
import org.koitharu.kotatsu.parsers.model.MangaSource
|
import org.koitharu.kotatsu.parsers.model.MangaSource
|
||||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||||
|
|
||||||
|
@Broken
|
||||||
@MangaSourceParser("LUNARHENTAI", "LunarHentai", "fr", ContentType.HENTAI)
|
@MangaSourceParser("LUNARHENTAI", "LunarHentai", "fr", ContentType.HENTAI)
|
||||||
internal class LunarHentai(context: MangaLoaderContext) :
|
internal class LunarHentai(context: MangaLoaderContext) :
|
||||||
MadaraParser(context, MangaSource.LUNARHENTAI, "hentai.lunarscans.fr") {
|
MadaraParser(context, MangaSource.LUNARHENTAI, "hentai.lunarscans.fr") {
|
||||||
|
|||||||
@@ -8,4 +8,4 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
|||||||
|
|
||||||
@MangaSourceParser("SCANHENTAIMENU", "ScanHentai.Menu", "fr", ContentType.HENTAI)
|
@MangaSourceParser("SCANHENTAIMENU", "ScanHentai.Menu", "fr", ContentType.HENTAI)
|
||||||
internal class ScanHentaiMenu(context: MangaLoaderContext) :
|
internal class ScanHentaiMenu(context: MangaLoaderContext) :
|
||||||
MadaraParser(context, MangaSource.SCANHENTAIMENU, "scan.hentai.menu")
|
MadaraParser(context, MangaSource.SCANHENTAIMENU, "x-manga.net")
|
||||||
|
|||||||
@@ -1,10 +1,12 @@
|
|||||||
package org.koitharu.kotatsu.parsers.site.madara.fr
|
package org.koitharu.kotatsu.parsers.site.madara.fr
|
||||||
|
|
||||||
|
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.MangaSource
|
import org.koitharu.kotatsu.parsers.model.MangaSource
|
||||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||||
|
|
||||||
|
@Broken
|
||||||
@MangaSourceParser("SCANTRADVF", "Scantrad-Vf", "fr")
|
@MangaSourceParser("SCANTRADVF", "Scantrad-Vf", "fr")
|
||||||
internal class ScantradVf(context: MangaLoaderContext) :
|
internal class ScantradVf(context: MangaLoaderContext) :
|
||||||
MadaraParser(context, MangaSource.SCANTRADVF, "scantrad-vf.me") {
|
MadaraParser(context, MangaSource.SCANTRADVF, "scantrad-vf.me") {
|
||||||
|
|||||||
@@ -32,7 +32,8 @@ internal class ToonFr(context: MangaLoaderContext) :
|
|||||||
id = generateUid(href),
|
id = generateUid(href),
|
||||||
url = href,
|
url = href,
|
||||||
name = a.text(),
|
name = a.text(),
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
branch = null,
|
branch = null,
|
||||||
uploadDate = parseChapterDate(
|
uploadDate = parseChapterDate(
|
||||||
dateFormat,
|
dateFormat,
|
||||||
|
|||||||
@@ -2,9 +2,7 @@ package org.koitharu.kotatsu.parsers.site.madara.id
|
|||||||
|
|
||||||
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.model.MangaSource
|
import org.koitharu.kotatsu.parsers.model.MangaSource
|
||||||
import org.koitharu.kotatsu.parsers.network.UserAgents
|
|
||||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
|
|||||||
@@ -28,7 +28,8 @@ internal class Neoxscans(context: MangaLoaderContext) :
|
|||||||
id = generateUid(href),
|
id = generateUid(href),
|
||||||
url = link,
|
url = link,
|
||||||
name = name,
|
name = name,
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
branch = null,
|
branch = null,
|
||||||
uploadDate = parseChapterDate(
|
uploadDate = parseChapterDate(
|
||||||
dateFormat,
|
dateFormat,
|
||||||
|
|||||||
@@ -24,7 +24,8 @@ internal class TitanManga(context: MangaLoaderContext) :
|
|||||||
id = generateUid(href),
|
id = generateUid(href),
|
||||||
url = link,
|
url = link,
|
||||||
name = name,
|
name = name,
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
branch = null,
|
branch = null,
|
||||||
uploadDate = 0,
|
uploadDate = 0,
|
||||||
scanlator = null,
|
scanlator = null,
|
||||||
|
|||||||
@@ -26,7 +26,8 @@ internal class TruyenTranhDamMyy(context: MangaLoaderContext) :
|
|||||||
id = generateUid(href),
|
id = generateUid(href),
|
||||||
url = link,
|
url = link,
|
||||||
name = name,
|
name = name,
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
branch = null,
|
branch = null,
|
||||||
uploadDate = 0, // Correct datePattern not found.
|
uploadDate = 0, // Correct datePattern not found.
|
||||||
scanlator = null,
|
scanlator = null,
|
||||||
|
|||||||
@@ -207,7 +207,8 @@ internal abstract class MadthemeParser(
|
|||||||
MangaChapter(
|
MangaChapter(
|
||||||
id = generateUid(href),
|
id = generateUid(href),
|
||||||
name = li.selectFirstOrThrow(".chapter-title").text(),
|
name = li.selectFirstOrThrow(".chapter-title").text(),
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
url = href,
|
url = href,
|
||||||
uploadDate = parseChapterDate(
|
uploadDate = parseChapterDate(
|
||||||
dateFormat,
|
dateFormat,
|
||||||
|
|||||||
@@ -26,7 +26,8 @@ internal class MangaJinx(context: MangaLoaderContext) :
|
|||||||
MangaChapter(
|
MangaChapter(
|
||||||
id = generateUid(href),
|
id = generateUid(href),
|
||||||
name = li.selectFirstOrThrow(".chapter-title").text(),
|
name = li.selectFirstOrThrow(".chapter-title").text(),
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
url = href,
|
url = href,
|
||||||
uploadDate = parseChapterDate(
|
uploadDate = parseChapterDate(
|
||||||
dateFormat,
|
dateFormat,
|
||||||
|
|||||||
@@ -108,7 +108,8 @@ internal class ManhuaScan(context: MangaLoaderContext) :
|
|||||||
MangaChapter(
|
MangaChapter(
|
||||||
id = generateUid(href),
|
id = generateUid(href),
|
||||||
name = li.selectFirstOrThrow(".chapter-title").text(),
|
name = li.selectFirstOrThrow(".chapter-title").text(),
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
url = href,
|
url = href,
|
||||||
uploadDate = parseChapterDate(
|
uploadDate = parseChapterDate(
|
||||||
dateFormat,
|
dateFormat,
|
||||||
|
|||||||
@@ -182,7 +182,8 @@ internal abstract class Manga18Parser(
|
|||||||
MangaChapter(
|
MangaChapter(
|
||||||
id = generateUid(href),
|
id = generateUid(href),
|
||||||
name = a.text(),
|
name = a.text(),
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
url = href,
|
url = href,
|
||||||
uploadDate = dateFormat.tryParse(dateText),
|
uploadDate = dateFormat.tryParse(dateText),
|
||||||
source = source,
|
source = source,
|
||||||
|
|||||||
@@ -24,7 +24,8 @@ internal class Hanman18(context: MangaLoaderContext) :
|
|||||||
MangaChapter(
|
MangaChapter(
|
||||||
id = generateUid(href),
|
id = generateUid(href),
|
||||||
name = a.text(),
|
name = a.text(),
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
url = href,
|
url = href,
|
||||||
uploadDate = 0,
|
uploadDate = 0,
|
||||||
source = source,
|
source = source,
|
||||||
|
|||||||
@@ -200,7 +200,8 @@ internal abstract class MangaboxParser(
|
|||||||
MangaChapter(
|
MangaChapter(
|
||||||
id = generateUid(href),
|
id = generateUid(href),
|
||||||
name = a.text(),
|
name = a.text(),
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
url = href,
|
url = href,
|
||||||
uploadDate = parseChapterDate(
|
uploadDate = parseChapterDate(
|
||||||
dateFormat,
|
dateFormat,
|
||||||
|
|||||||
@@ -125,7 +125,8 @@ internal class Mangakakalot(context: MangaLoaderContext) :
|
|||||||
MangaChapter(
|
MangaChapter(
|
||||||
id = generateUid(href),
|
id = generateUid(href),
|
||||||
name = a.text(),
|
name = a.text(),
|
||||||
number = i + 1,
|
number = i + 1f,
|
||||||
|
volume = 0,
|
||||||
url = href,
|
url = href,
|
||||||
uploadDate = parseChapterDate(
|
uploadDate = parseChapterDate(
|
||||||
dateFormat,
|
dateFormat,
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser
|
|||||||
import org.koitharu.kotatsu.parsers.model.Manga
|
import org.koitharu.kotatsu.parsers.model.Manga
|
||||||
import org.koitharu.kotatsu.parsers.model.MangaSource
|
import org.koitharu.kotatsu.parsers.model.MangaSource
|
||||||
import org.koitharu.kotatsu.parsers.site.mangadventure.MangAdventureParser
|
import org.koitharu.kotatsu.parsers.site.mangadventure.MangAdventureParser
|
||||||
import org.koitharu.kotatsu.parsers.util.urlEncoded
|
|
||||||
|
|
||||||
@MangaSourceParser("ARCRELIGHT", "Arc-Relight", "en")
|
@MangaSourceParser("ARCRELIGHT", "Arc-Relight", "en")
|
||||||
internal class ArcRelight(context: MangaLoaderContext) :
|
internal class ArcRelight(context: MangaLoaderContext) :
|
||||||
|
|||||||
@@ -29,6 +29,13 @@ internal abstract class MangaReaderParser(
|
|||||||
|
|
||||||
override val configKeyDomain = ConfigKey.Domain(domain)
|
override val configKeyDomain = ConfigKey.Domain(domain)
|
||||||
|
|
||||||
|
private val userAgentKey = ConfigKey.UserAgent(context.getDefaultUserAgent())
|
||||||
|
|
||||||
|
override fun onCreateConfig(keys: MutableCollection<ConfigKey<*>>) {
|
||||||
|
super.onCreateConfig(keys)
|
||||||
|
keys.add(userAgentKey)
|
||||||
|
}
|
||||||
|
|
||||||
override val availableSortOrders: Set<SortOrder>
|
override val availableSortOrders: Set<SortOrder>
|
||||||
get() = EnumSet.of(
|
get() = EnumSet.of(
|
||||||
SortOrder.UPDATED,
|
SortOrder.UPDATED,
|
||||||
@@ -156,7 +163,8 @@ internal abstract class MangaReaderParser(
|
|||||||
id = generateUid(url),
|
id = generateUid(url),
|
||||||
name = element.selectFirst(".chapternum")?.text() ?: "Chapter ${index + 1}",
|
name = element.selectFirst(".chapternum")?.text() ?: "Chapter ${index + 1}",
|
||||||
url = url,
|
url = url,
|
||||||
number = index + 1,
|
number = index + 1f,
|
||||||
|
volume = 0,
|
||||||
scanlator = null,
|
scanlator = null,
|
||||||
uploadDate = dateFormat.tryParse(element.selectFirst(".chapterdate")?.text()),
|
uploadDate = dateFormat.tryParse(element.selectFirst(".chapterdate")?.text()),
|
||||||
branch = null,
|
branch = null,
|
||||||
|
|||||||
@@ -9,4 +9,4 @@ import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser
|
|||||||
internal class ArAreaScans(context: MangaLoaderContext) :
|
internal class ArAreaScans(context: MangaLoaderContext) :
|
||||||
MangaReaderParser(context, MangaSource.ARAREASCANS, "ar.areascans.org", pageSize = 20, searchPageSize = 10) {
|
MangaReaderParser(context, MangaSource.ARAREASCANS, "ar.areascans.org", pageSize = 20, searchPageSize = 10) {
|
||||||
override val isTagsExclusionSupported = false
|
override val isTagsExclusionSupported = false
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +0,0 @@
|
|||||||
package org.koitharu.kotatsu.parsers.site.mangareader.ar
|
|
||||||
|
|
||||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
|
||||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
|
||||||
import org.koitharu.kotatsu.parsers.model.MangaSource
|
|
||||||
import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser
|
|
||||||
|
|
||||||
@MangaSourceParser("ELITON", "ThunderScans", "ar")
|
|
||||||
internal class Eliton(context: MangaLoaderContext) :
|
|
||||||
MangaReaderParser(context, MangaSource.ELITON, "thunderscans.com", pageSize = 20, searchPageSize = 10) {
|
|
||||||
override val isTagsExclusionSupported = false
|
|
||||||
}
|
|
||||||
@@ -9,4 +9,4 @@ import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser
|
|||||||
internal class MangaPro(context: MangaLoaderContext) :
|
internal class MangaPro(context: MangaLoaderContext) :
|
||||||
MangaReaderParser(context, MangaSource.MANGAPRO, "promanga.pro", pageSize = 20, searchPageSize = 10) {
|
MangaReaderParser(context, MangaSource.MANGAPRO, "promanga.pro", pageSize = 20, searchPageSize = 10) {
|
||||||
override val isTagsExclusionSupported = false
|
override val isTagsExclusionSupported = false
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,7 +25,8 @@ internal class Manjanoon(context: MangaLoaderContext) :
|
|||||||
id = generateUid(url),
|
id = generateUid(url),
|
||||||
name = element.selectFirst(".chapternum")?.text() ?: "Chapter ${index + 1}",
|
name = element.selectFirst(".chapternum")?.text() ?: "Chapter ${index + 1}",
|
||||||
url = url,
|
url = url,
|
||||||
number = index + 1,
|
number = index + 1f,
|
||||||
|
volume = 0,
|
||||||
scanlator = null,
|
scanlator = null,
|
||||||
uploadDate = 0,
|
uploadDate = 0,
|
||||||
branch = null,
|
branch = null,
|
||||||
|
|||||||
@@ -86,7 +86,8 @@ internal class Normoyun(context: MangaLoaderContext) :
|
|||||||
id = generateUid(url),
|
id = generateUid(url),
|
||||||
name = element.selectFirst("a")?.text() ?: "Chapter ${index + 1}",
|
name = element.selectFirst("a")?.text() ?: "Chapter ${index + 1}",
|
||||||
url = url,
|
url = url,
|
||||||
number = index + 1,
|
number = index + 1f,
|
||||||
|
volume = 0,
|
||||||
scanlator = null,
|
scanlator = null,
|
||||||
uploadDate = dateFormat.tryParse(element.selectFirst(".chapter-date")?.text()),
|
uploadDate = dateFormat.tryParse(element.selectFirst(".chapter-date")?.text()),
|
||||||
branch = null,
|
branch = null,
|
||||||
|
|||||||
@@ -7,4 +7,6 @@ import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser
|
|||||||
|
|
||||||
@MangaSourceParser("THUNDERSCANS", "ThunderScans", "ar")
|
@MangaSourceParser("THUNDERSCANS", "ThunderScans", "ar")
|
||||||
internal class ThunderScans(context: MangaLoaderContext) :
|
internal class ThunderScans(context: MangaLoaderContext) :
|
||||||
MangaReaderParser(context, MangaSource.THUNDERSCANS, "thunderscans.com", pageSize = 32, searchPageSize = 10)
|
MangaReaderParser(context, MangaSource.THUNDERSCANS, "thunderscans.com", pageSize = 32, searchPageSize = 10) {
|
||||||
|
override val isTagsExclusionSupported = false
|
||||||
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import org.koitharu.kotatsu.parsers.model.MangaSource
|
|||||||
import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser
|
import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser
|
||||||
|
|
||||||
@MangaSourceParser("UMIMANGA", "UmiManga", "ar")
|
@MangaSourceParser("UMIMANGA", "UmiManga", "ar")
|
||||||
internal class BeastScans(context: MangaLoaderContext) :
|
internal class UmiManga(context: MangaLoaderContext) :
|
||||||
MangaReaderParser(context, MangaSource.UMIMANGA, "www.umimanga.com", pageSize = 20, searchPageSize = 10) {
|
MangaReaderParser(context, MangaSource.UMIMANGA, "www.umimanga.com", pageSize = 20, searchPageSize = 10) {
|
||||||
override val isTagsExclusionSupported = false
|
override val isTagsExclusionSupported = false
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,7 +25,8 @@ internal class VexManga(context: MangaLoaderContext) :
|
|||||||
id = generateUid(url),
|
id = generateUid(url),
|
||||||
name = element.selectFirst(".chapternum")?.text() ?: "Chapter ${index + 1}",
|
name = element.selectFirst(".chapternum")?.text() ?: "Chapter ${index + 1}",
|
||||||
url = url,
|
url = url,
|
||||||
number = index + 1,
|
number = index + 1f,
|
||||||
|
volume = 0,
|
||||||
scanlator = null,
|
scanlator = null,
|
||||||
uploadDate = parseChapterDate(
|
uploadDate = parseChapterDate(
|
||||||
dateFormat,
|
dateFormat,
|
||||||
|
|||||||
@@ -20,7 +20,8 @@ internal class Constellarcomic(context: MangaLoaderContext) :
|
|||||||
id = generateUid(url),
|
id = generateUid(url),
|
||||||
name = element.selectFirst(".chapternum")?.textOrNull() ?: "Chapter ${index + 1}",
|
name = element.selectFirst(".chapternum")?.textOrNull() ?: "Chapter ${index + 1}",
|
||||||
url = url,
|
url = url,
|
||||||
number = index + 1,
|
number = index + 1f,
|
||||||
|
volume = 0,
|
||||||
scanlator = null,
|
scanlator = null,
|
||||||
uploadDate = 0,
|
uploadDate = 0,
|
||||||
branch = null,
|
branch = null,
|
||||||
|
|||||||
@@ -7,6 +7,6 @@ import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser
|
|||||||
|
|
||||||
@MangaSourceParser("MAGUSMANGA", "MagusManga", "en")
|
@MangaSourceParser("MAGUSMANGA", "MagusManga", "en")
|
||||||
internal class MagusManga(context: MangaLoaderContext) :
|
internal class MagusManga(context: MangaLoaderContext) :
|
||||||
MangaReaderParser(context, MangaSource.MAGUSMANGA, "vofeg.com", pageSize = 20, searchPageSize = 10){
|
MangaReaderParser(context, MangaSource.MAGUSMANGA, "vofeg.com", pageSize = 20, searchPageSize = 10) {
|
||||||
override val listUrl = "/series"
|
override val listUrl = "/series"
|
||||||
}
|
}
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user