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.model.*
|
||||
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.util.FaviconParser
|
||||
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.model.*
|
||||
import org.koitharu.kotatsu.parsers.util.*
|
||||
import org.koitharu.kotatsu.parsers.util.json.isNullOrEmpty
|
||||
import java.nio.charset.StandardCharsets
|
||||
import java.security.MessageDigest
|
||||
import java.util.*
|
||||
@@ -319,7 +318,8 @@ internal class BatoToParser(context: MangaLoaderContext) : PagedMangaParser(
|
||||
return MangaChapter(
|
||||
id = generateUid(href),
|
||||
name = a.text(),
|
||||
number = index + 1,
|
||||
number = index + 1f,
|
||||
volume = 0,
|
||||
url = href,
|
||||
scanlator = extra?.getElementsByAttributeValueContaining("href", "/group/")?.text(),
|
||||
uploadDate = runCatching {
|
||||
|
||||
@@ -212,7 +212,8 @@ internal class ExHentaiParser(
|
||||
chapters += MangaChapter(
|
||||
id = generateUid(url),
|
||||
name = "${manga.title} #$i",
|
||||
number = i,
|
||||
number = i.toFloat(),
|
||||
volume = 0,
|
||||
url = url,
|
||||
uploadDate = 0L,
|
||||
source = source,
|
||||
|
||||
@@ -540,7 +540,8 @@ class HitomiLaParser(context: MangaLoaderContext) : MangaParser(context, MangaSo
|
||||
url = manga.url,
|
||||
name = json.getString("title"),
|
||||
scanlator = json.getString("type").toTitleCase(),
|
||||
number = 1,
|
||||
number = 1f,
|
||||
volume = 0,
|
||||
branch = json.getString("language_localname"),
|
||||
source = source,
|
||||
uploadDate = dateFormat.tryParse(json.getString("date").substringBeforeLast("-")),
|
||||
|
||||
@@ -130,7 +130,8 @@ internal class ImHentai(context: MangaLoaderContext) :
|
||||
MangaChapter(
|
||||
id = manga.id,
|
||||
name = manga.title,
|
||||
number = 1,
|
||||
number = 1f,
|
||||
volume = 0,
|
||||
url = manga.url,
|
||||
scanlator = null,
|
||||
uploadDate = 0,
|
||||
|
||||
@@ -94,7 +94,8 @@ internal abstract class LineWebtoonsParser(
|
||||
MangaChapter(
|
||||
id = generateUid("$titleNo-$i"),
|
||||
name = jo.getString("episodeTitle"),
|
||||
number = jo.getInt("episodeSeq"),
|
||||
number = jo.getInt("episodeSeq").toFloat(),
|
||||
volume = 0,
|
||||
url = "$titleNo-${jo.get("episodeNo")}",
|
||||
uploadDate = jo.getLong("modifyYmdt"),
|
||||
branch = null,
|
||||
|
||||
@@ -23,8 +23,8 @@ private const val MIN_SPLIT_COUNT = 5
|
||||
internal abstract class MangaFireParser(
|
||||
context: MangaLoaderContext,
|
||||
source: MangaSource,
|
||||
private val siteLang: String
|
||||
): PagedMangaParser(context, source, 30), Interceptor {
|
||||
private val siteLang: String,
|
||||
) : PagedMangaParser(context, source, 30), Interceptor {
|
||||
|
||||
override val configKeyDomain: ConfigKey.Domain = ConfigKey.Domain("mangafire.to")
|
||||
|
||||
@@ -44,7 +44,7 @@ internal abstract class MangaFireParser(
|
||||
MangaTag(
|
||||
title = it.selectFirstOrThrow("label").ownText().toTitleCase(sourceLocale),
|
||||
key = it.selectFirstOrThrow("input").attr("value"),
|
||||
source = source
|
||||
source = source,
|
||||
)
|
||||
}.associateBy { it.title }
|
||||
}
|
||||
@@ -73,7 +73,7 @@ internal abstract class MangaFireParser(
|
||||
SortOrder.NEWEST -> "release_date"
|
||||
SortOrder.ALPHABETICAL -> "title_az"
|
||||
else -> ""
|
||||
}
|
||||
},
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -97,7 +97,7 @@ internal abstract class MangaFireParser(
|
||||
MangaState.ABANDONED -> "discontinued"
|
||||
MangaState.PAUSED -> "on_hiatus"
|
||||
MangaState.UPCOMING -> "info"
|
||||
}
|
||||
},
|
||||
)
|
||||
}
|
||||
addQueryParameter(
|
||||
@@ -109,7 +109,7 @@ internal abstract class MangaFireParser(
|
||||
SortOrder.NEWEST -> "release_date"
|
||||
SortOrder.ALPHABETICAL -> "title_az"
|
||||
else -> ""
|
||||
}
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
@@ -176,14 +176,14 @@ internal abstract class MangaFireParser(
|
||||
author = document.select("div.meta a[href*=/author/]")
|
||||
.joinToString { it.ownText().trim() },
|
||||
description = document.selectFirstOrThrow("#synopsis div.modal-content").html(),
|
||||
chapters = getChapters(manga.url, document)
|
||||
chapters = getChapters(manga.url, document),
|
||||
)
|
||||
}
|
||||
|
||||
private data class ChapterBranch(
|
||||
val type: String,
|
||||
val langCode: String,
|
||||
val langTitle: String
|
||||
val langTitle: String,
|
||||
)
|
||||
|
||||
private suspend fun getChapters(mangaUrl: String, document: Document): List<MangaChapter> {
|
||||
@@ -252,7 +252,7 @@ internal abstract class MangaFireParser(
|
||||
scanlator = null,
|
||||
uploadDate = dateFormat.tryParse(it.attr("upload-date")),
|
||||
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 {
|
||||
val document = webClient.httpGet(seed.url.toAbsoluteUrl(domain)).parseHtml()
|
||||
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
|
||||
val mangas = ArrayList<Manga>(total)
|
||||
|
||||
@@ -322,7 +322,7 @@ internal abstract class MangaFireParser(
|
||||
rating = RATING_UNKNOWN,
|
||||
state = null,
|
||||
tags = emptySet(),
|
||||
)
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
@@ -366,8 +366,8 @@ internal abstract class MangaFireParser(
|
||||
"$url#scrambled_$offset"
|
||||
},
|
||||
preview = null,
|
||||
source = source
|
||||
)
|
||||
source = source,
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -193,7 +193,8 @@ internal class MangaPark(context: MangaLoaderContext) :
|
||||
MangaChapter(
|
||||
id = generateUid(href),
|
||||
name = a.text(),
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
url = href,
|
||||
uploadDate = parseChapterDate(
|
||||
dateFormat,
|
||||
|
||||
@@ -324,6 +324,6 @@ internal abstract class MangaPlusParser(
|
||||
class German(context: MangaLoaderContext) : MangaPlusParser(
|
||||
context,
|
||||
MangaSource.MANGAPLUSPARSER_DE,
|
||||
"GERMAN"
|
||||
"GERMAN",
|
||||
)
|
||||
}
|
||||
|
||||
@@ -145,7 +145,8 @@ internal abstract class NineMangaParser(
|
||||
MangaChapter(
|
||||
id = generateUid(href),
|
||||
name = a.text(),
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
url = href,
|
||||
uploadDate = parseChapterDateByLang(li.selectFirst("span")?.text().orEmpty()),
|
||||
source = source,
|
||||
|
||||
@@ -109,7 +109,8 @@ internal abstract class WebtoonsParser(
|
||||
MangaChapter(
|
||||
id = generateUid("$titleNo-$i"),
|
||||
name = jo.getString("episodeTitle"),
|
||||
number = jo.getInt("episodeSeq"),
|
||||
number = jo.getInt("episodeSeq").toFloat(),
|
||||
volume = 0,
|
||||
url = "$titleNo-${jo.get("episodeNo")}",
|
||||
uploadDate = jo.getLong("registerYmdt"),
|
||||
branch = null,
|
||||
@@ -223,7 +224,8 @@ internal abstract class WebtoonsParser(
|
||||
description = null,
|
||||
state = null,
|
||||
source = source,
|
||||
))
|
||||
),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -146,7 +146,8 @@ internal abstract class AnimeBootstrapParser(
|
||||
MangaChapter(
|
||||
id = generateUid(href),
|
||||
name = a.text(),
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
url = href,
|
||||
uploadDate = 0,
|
||||
source = source,
|
||||
|
||||
@@ -3,6 +3,7 @@ package org.koitharu.kotatsu.parsers.site.animebootstrap.fr
|
||||
import kotlinx.coroutines.async
|
||||
import kotlinx.coroutines.coroutineScope
|
||||
import org.jsoup.nodes.Document
|
||||
import org.koitharu.kotatsu.parsers.Broken
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.*
|
||||
@@ -12,6 +13,7 @@ import java.text.SimpleDateFormat
|
||||
import java.util.EnumSet
|
||||
import java.util.Locale
|
||||
|
||||
@Broken
|
||||
@MangaSourceParser("PAPSCAN", "PapScan", "fr")
|
||||
internal class PapScan(context: MangaLoaderContext) :
|
||||
AnimeBootstrapParser(context, MangaSource.PAPSCAN, "papscan.com") {
|
||||
@@ -126,7 +128,8 @@ internal class PapScan(context: MangaLoaderContext) :
|
||||
MangaChapter(
|
||||
id = generateUid(href),
|
||||
name = li.selectFirstOrThrow("span em").text(),
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
url = href,
|
||||
uploadDate = dateFormat.tryParse(dateText),
|
||||
source = source,
|
||||
|
||||
@@ -180,7 +180,8 @@ internal class FlixScans(context: MangaLoaderContext) : PagedMangaParser(context
|
||||
id = generateUid(url),
|
||||
url = url,
|
||||
name = j.getString("slug").replace('-', ' '),
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
branch = null,
|
||||
uploadDate = dateFormat.tryParse(date),
|
||||
scanlator = null,
|
||||
|
||||
@@ -101,7 +101,8 @@ internal class MangaStorm(context: MangaLoaderContext) : PagedMangaParser(contex
|
||||
MangaChapter(
|
||||
id = generateUid(url),
|
||||
name = a.text(),
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
url = url,
|
||||
scanlator = null,
|
||||
uploadDate = 0,
|
||||
|
||||
@@ -183,7 +183,8 @@ internal class TeamXNovel(context: MangaLoaderContext) : PagedMangaParser(contex
|
||||
MangaChapter(
|
||||
id = generateUid(url),
|
||||
name = li.selectFirstOrThrow(".epl-title").text(),
|
||||
number = url.substringAfterLast('/').toIntOrNull() ?: 0,
|
||||
number = url.substringAfterLast('/').toFloatOrNull() ?: 0f,
|
||||
volume = 0,
|
||||
url = url,
|
||||
scanlator = null,
|
||||
uploadDate = dateFormat.tryParse(li.selectFirstOrThrow(".epl-date").text()),
|
||||
|
||||
@@ -144,7 +144,8 @@ internal class AnibelParser(context: MangaLoaderContext) : MangaParser(context,
|
||||
MangaChapter(
|
||||
id = generateUid(jo.getString("id")),
|
||||
name = "Глава $number",
|
||||
number = number,
|
||||
number = number.toFloat(),
|
||||
volume = 0,
|
||||
url = "${manga.url}/read/$number",
|
||||
scanlator = null,
|
||||
uploadDate = jo.getLong("released"),
|
||||
|
||||
@@ -109,7 +109,8 @@ internal class BeeToon(context: MangaLoaderContext) :
|
||||
MangaChapter(
|
||||
id = generateUid(url),
|
||||
name = a.selectFirstOrThrow(".chap").text(),
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
url = url,
|
||||
scanlator = null,
|
||||
uploadDate = SimpleDateFormat("MM/dd/yyyy HH:mm:ss", Locale.ENGLISH)
|
||||
|
||||
@@ -76,7 +76,8 @@ internal class CloneMangaParser(context: MangaLoaderContext) : MangaParser(conte
|
||||
val chapter = MangaChapter(
|
||||
id = generateUid("$series&page=$i"),
|
||||
name = "Chapter ${i + 1}",
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
url = "$series&page=$i",
|
||||
scanlator = null,
|
||||
branch = null,
|
||||
|
||||
@@ -149,7 +149,8 @@ internal class ComicExtra(context: MangaLoaderContext) : PagedMangaParser(contex
|
||||
MangaChapter(
|
||||
id = generateUid(url),
|
||||
name = name,
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
url = url,
|
||||
scanlator = null,
|
||||
uploadDate = dateFormat.tryParse(dateText),
|
||||
|
||||
@@ -181,7 +181,8 @@ internal class DynastyScans(context: MangaLoaderContext) : PagedMangaParser(cont
|
||||
MangaChapter(
|
||||
id = generateUid(href),
|
||||
name = a.text(),
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
url = href,
|
||||
uploadDate = dateFormat.tryParse(dateText),
|
||||
source = source,
|
||||
|
||||
@@ -165,7 +165,8 @@ internal class FlixScansOrg(context: MangaLoaderContext) : PagedMangaParser(cont
|
||||
id = generateUid(url),
|
||||
url = url,
|
||||
name = j.getString("slug").replace('-', ' '),
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
branch = null,
|
||||
uploadDate = dateFormat.tryParse(date),
|
||||
scanlator = null,
|
||||
|
||||
@@ -137,7 +137,8 @@ internal class MangaGeko(context: MangaLoaderContext) : PagedMangaParser(context
|
||||
MangaChapter(
|
||||
id = generateUid(url),
|
||||
name = name,
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
url = url,
|
||||
scanlator = null,
|
||||
uploadDate = dateFormat.tryParse(dateText),
|
||||
|
||||
@@ -27,7 +27,7 @@ internal class MangaTownParser(context: MangaLoaderContext) : PagedMangaParser(c
|
||||
|
||||
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 {
|
||||
append("https://")
|
||||
append(domain)
|
||||
@@ -157,7 +157,8 @@ internal class MangaTownParser(context: MangaLoaderContext) : PagedMangaParser(c
|
||||
id = generateUid(href),
|
||||
url = href,
|
||||
source = MangaSource.MANGATOWN,
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
uploadDate = parseChapterDate(
|
||||
dateFormat,
|
||||
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 isManga = root.select("select")
|
||||
|
||||
if(isManga.isEmpty()){//Webtoon
|
||||
if (isManga.isEmpty()) {//Webtoon
|
||||
val imgElements = doc.select("div#viewer.read_img img.image")
|
||||
return imgElements.map {
|
||||
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 {
|
||||
val href = it.attrAsRelativeUrlOrNull("value")
|
||||
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 {
|
||||
if(page.url.startsWith("//")){//Webtoon
|
||||
if (page.url.startsWith("//")) {//Webtoon
|
||||
return page.url.toAbsoluteUrl(domain)
|
||||
}
|
||||
|
||||
@@ -253,7 +254,8 @@ internal class MangaTownParser(context: MangaLoaderContext) : PagedMangaParser(c
|
||||
id = generateUid(href),
|
||||
url = href,
|
||||
source = MangaSource.MANGATOWN,
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
uploadDate = parseChapterDate(
|
||||
dateFormat,
|
||||
li.selectFirst("span.time")?.text(),
|
||||
|
||||
@@ -155,7 +155,8 @@ internal class Mangaowl(context: MangaLoaderContext) :
|
||||
MangaChapter(
|
||||
id = generateUid(url),
|
||||
name = name,
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
url = url,
|
||||
uploadDate = dateFormat.tryParse(date),
|
||||
source = source,
|
||||
|
||||
@@ -161,7 +161,8 @@ class Manhwa18Parser(context: MangaLoaderContext) :
|
||||
MangaChapter(
|
||||
id = generateUid(chapterUrl),
|
||||
name = element.selectFirst(".chapter-name")?.text().orEmpty(),
|
||||
number = index + 1,
|
||||
number = index + 1f,
|
||||
volume = 0,
|
||||
url = chapterUrl,
|
||||
scanlator = null,
|
||||
uploadDate = uploadDate,
|
||||
|
||||
@@ -113,7 +113,8 @@ class ManhwasMen(context: MangaLoaderContext) :
|
||||
MangaChapter(
|
||||
id = generateUid(url),
|
||||
name = li.selectFirstOrThrow(".flex-grow-1 span").text(),
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
url = url,
|
||||
scanlator = null,
|
||||
uploadDate = parseChapterDate(
|
||||
|
||||
@@ -76,7 +76,8 @@ internal class Po2Scans(context: MangaLoaderContext) : MangaParser(context, Mang
|
||||
MangaChapter(
|
||||
id = generateUid(url),
|
||||
name = a.text(),
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
url = url,
|
||||
scanlator = null,
|
||||
uploadDate = dateFormat.tryParse(div.select(".detail span").last()?.text()),
|
||||
|
||||
@@ -126,7 +126,8 @@ internal class Pururin(context: MangaLoaderContext) :
|
||||
MangaChapter(
|
||||
id = manga.id,
|
||||
name = manga.title,
|
||||
number = 1,
|
||||
number = 1f,
|
||||
volume = 0,
|
||||
url = manga.url,
|
||||
scanlator = null,
|
||||
uploadDate = 0,
|
||||
|
||||
@@ -96,7 +96,8 @@ internal class TempleScanEsp(context: MangaLoaderContext) :
|
||||
MangaChapter(
|
||||
id = generateUid(href),
|
||||
name = div.requireElementById("name").text(),
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
url = href,
|
||||
uploadDate = date,
|
||||
source = source,
|
||||
|
||||
@@ -203,7 +203,8 @@ internal abstract class FmreaderParser(
|
||||
MangaChapter(
|
||||
id = generateUid(href),
|
||||
name = a.selectFirstOrThrow("div.chapter-name").text(),
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
url = href,
|
||||
uploadDate = parseChapterDate(
|
||||
dateFormat,
|
||||
|
||||
@@ -125,7 +125,8 @@ internal class Manhwa18Com(context: MangaLoaderContext) :
|
||||
MangaChapter(
|
||||
id = generateUid(href),
|
||||
name = a.selectFirstOrThrow("div.chapter-name").text(),
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
url = href,
|
||||
uploadDate = parseChapterDate(
|
||||
dateFormat,
|
||||
|
||||
@@ -66,7 +66,8 @@ internal class Klz9(context: MangaLoaderContext) :
|
||||
MangaChapter(
|
||||
id = generateUid(href),
|
||||
name = a.selectFirstOrThrow("a").text(),
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
url = href,
|
||||
uploadDate = parseChapterDate(
|
||||
dateFormat,
|
||||
|
||||
@@ -25,7 +25,8 @@ internal class WeLoveManga(context: MangaLoaderContext) :
|
||||
MangaChapter(
|
||||
id = generateUid(href),
|
||||
name = a.selectFirstOrThrow("a").text(),
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
url = href,
|
||||
uploadDate = parseChapterDate(
|
||||
dateFormat,
|
||||
|
||||
@@ -155,7 +155,8 @@ internal abstract class FoolSlideParser(
|
||||
MangaChapter(
|
||||
id = generateUid(href),
|
||||
name = a.text(),
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
url = href,
|
||||
uploadDate = if (div.selectFirstOrThrow(selectDate).text().contains(", ")) {
|
||||
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.site.foolslide.FoolSlideParser
|
||||
|
||||
// The source has changed template so for the moment it is dead.
|
||||
@MangaSourceParser("HNISCANTRAD", "HniScantrad", "fr")
|
||||
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 searchUrl = "lel/search/"
|
||||
override val listUrl = "lel/directory/"
|
||||
|
||||
@@ -5,6 +5,7 @@ import kotlinx.coroutines.awaitAll
|
||||
import kotlinx.coroutines.coroutineScope
|
||||
import okhttp3.Headers
|
||||
import org.jsoup.nodes.Element
|
||||
import org.koitharu.kotatsu.parsers.Broken
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
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 java.util.*
|
||||
|
||||
@Broken
|
||||
@MangaSourceParser("BENTOMANGA", "BentoManga", "fr")
|
||||
internal class BentomangaParser(context: MangaLoaderContext) : PagedMangaParser(context, MangaSource.BENTOMANGA, 10) {
|
||||
|
||||
|
||||
@@ -109,7 +109,8 @@ internal class FuryoSociety(context: MangaLoaderContext) :
|
||||
MangaChapter(
|
||||
id = generateUid(href),
|
||||
name = div.selectFirstOrThrow("div.title").text() + " : " + div.selectFirstOrThrow("div.name").text(),
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
url = href,
|
||||
uploadDate = parseChapterDate(
|
||||
dateFormat,
|
||||
|
||||
@@ -1,13 +1,11 @@
|
||||
package org.koitharu.kotatsu.parsers.site.fr
|
||||
|
||||
import okhttp3.Headers
|
||||
import org.json.JSONObject
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.PagedMangaParser
|
||||
import org.koitharu.kotatsu.parsers.config.ConfigKey
|
||||
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.json.mapJSON
|
||||
import java.text.SimpleDateFormat
|
||||
@@ -146,7 +144,8 @@ internal class LegacyScansParser(context: MangaLoaderContext) :
|
||||
MangaChapter(
|
||||
id = generateUid(href),
|
||||
name = name,
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
url = href,
|
||||
scanlator = null,
|
||||
uploadDate = dateFormat.tryParse(dateText),
|
||||
|
||||
@@ -1,12 +1,11 @@
|
||||
package org.koitharu.kotatsu.parsers.site.fr
|
||||
|
||||
import okhttp3.Headers
|
||||
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.PagedMangaParser
|
||||
import org.koitharu.kotatsu.parsers.config.ConfigKey
|
||||
import org.koitharu.kotatsu.parsers.model.*
|
||||
import org.koitharu.kotatsu.parsers.network.UserAgents
|
||||
import org.koitharu.kotatsu.parsers.util.*
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.*
|
||||
@@ -115,7 +114,8 @@ internal class LireScan(context: MangaLoaderContext) : PagedMangaParser(context,
|
||||
MangaChapter(
|
||||
id = generateUid(href),
|
||||
name = name,
|
||||
number = i,
|
||||
number = i.toFloat(),
|
||||
volume = 0,
|
||||
url = href,
|
||||
scanlator = null,
|
||||
uploadDate = dateFormat.tryParse(dateText),
|
||||
|
||||
@@ -182,7 +182,8 @@ internal class LugnicaScans(context: MangaLoaderContext) : PagedMangaParser(cont
|
||||
MangaChapter(
|
||||
id = generateUid(url),
|
||||
name = "Chapitre : $id",
|
||||
number = i,
|
||||
number = i.toFloat(),
|
||||
volume = 0,
|
||||
url = url,
|
||||
scanlator = null,
|
||||
uploadDate = dateFormat.tryParse(date),
|
||||
|
||||
@@ -138,7 +138,8 @@ internal class ScansMangasMe(context: MangaLoaderContext) :
|
||||
MangaChapter(
|
||||
id = generateUid(href),
|
||||
name = li.selectFirstOrThrow("span.mobile chapter").text(),
|
||||
number = i + 1,
|
||||
number = li.selectFirstOrThrow("span.mobile chapter").text().substringAfterLast(" ").toFloat(),
|
||||
volume = 0,
|
||||
url = href,
|
||||
uploadDate = 0,
|
||||
source = source,
|
||||
|
||||
@@ -151,7 +151,8 @@ internal class ScantradUnion(context: MangaLoaderContext) : PagedMangaParser(con
|
||||
MangaChapter(
|
||||
id = generateUid(href),
|
||||
name = name,
|
||||
number = i,
|
||||
number = i.toFloat(),
|
||||
volume = 0,
|
||||
url = href,
|
||||
scanlator = null,
|
||||
uploadDate = dateFormat.tryParse(date),
|
||||
|
||||
@@ -1,11 +1,9 @@
|
||||
package org.koitharu.kotatsu.parsers.site.heancms
|
||||
|
||||
import okhttp3.Headers
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.PagedMangaParser
|
||||
import org.koitharu.kotatsu.parsers.config.ConfigKey
|
||||
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.json.mapJSON
|
||||
import java.text.SimpleDateFormat
|
||||
@@ -20,8 +18,16 @@ internal abstract class HeanCms(
|
||||
|
||||
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(
|
||||
SortOrder.ALPHABETICAL,
|
||||
SortOrder.ALPHABETICAL_DESC,
|
||||
SortOrder.UPDATED,
|
||||
SortOrder.NEWEST,
|
||||
SortOrder.POPULARITY,
|
||||
@@ -30,15 +36,11 @@ internal abstract class HeanCms(
|
||||
override val availableStates: Set<MangaState> =
|
||||
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 apiPath
|
||||
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> {
|
||||
val url = buildString {
|
||||
append("https://")
|
||||
@@ -147,7 +149,8 @@ internal abstract class HeanCms(
|
||||
MangaChapter(
|
||||
id = generateUid(url),
|
||||
name = name,
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
url = url,
|
||||
scanlator = null,
|
||||
uploadDate = dateFormat.tryParse(date),
|
||||
|
||||
@@ -45,8 +45,8 @@ internal class OmegaScans(context: MangaLoaderContext) : HeanCms(context, MangaS
|
||||
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=desc")
|
||||
SortOrder.ALPHABETICAL_DESC -> append("title&order=asc")
|
||||
SortOrder.ALPHABETICAL -> append("title&order=asc")
|
||||
SortOrder.ALPHABETICAL_DESC -> append("title&order=desc")
|
||||
else -> append("latest&order=desc")
|
||||
}
|
||||
append("&series_type=All&perPage=$pageSize")
|
||||
|
||||
@@ -43,8 +43,8 @@ internal class YugenMangasEs(context: MangaLoaderContext) :
|
||||
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=desc")
|
||||
SortOrder.ALPHABETICAL_DESC -> append("title&order=asc")
|
||||
SortOrder.ALPHABETICAL -> append("title&order=asc")
|
||||
SortOrder.ALPHABETICAL_DESC -> append("title&order=desc")
|
||||
else -> append("latest&order=desc")
|
||||
}
|
||||
append("&series_type=Comic&perPage=12")
|
||||
|
||||
@@ -1,10 +1,165 @@
|
||||
package org.koitharu.kotatsu.parsers.site.heancms.fr
|
||||
|
||||
import org.json.JSONArray
|
||||
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.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.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")
|
||||
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.UPDATED -> append("latest&order=desc")
|
||||
SortOrder.NEWEST -> append("created_at&order=desc")
|
||||
SortOrder.ALPHABETICAL -> append("title&order=desc")
|
||||
SortOrder.ALPHABETICAL_DESC -> append("title&order=asc")
|
||||
SortOrder.ALPHABETICAL -> append("title&order=asc")
|
||||
SortOrder.ALPHABETICAL_DESC -> append("title&order=desc")
|
||||
else -> append("latest&order=desc")
|
||||
}
|
||||
append("&series_type=All&perPage=")
|
||||
|
||||
@@ -99,7 +99,8 @@ internal abstract class HeanCmsAlt(
|
||||
MangaChapter(
|
||||
id = generateUid(url),
|
||||
name = a.selectFirstOrThrow(selectChapterTitle).text(),
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
url = url,
|
||||
scanlator = null,
|
||||
uploadDate = parseChapterDate(
|
||||
|
||||
@@ -41,7 +41,8 @@ internal class Brakeout(context: MangaLoaderContext) :
|
||||
MangaChapter(
|
||||
id = generateUid(url),
|
||||
name = div.selectFirstOrThrow(selectChapterTitle).text(),
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
url = url,
|
||||
scanlator = null,
|
||||
uploadDate = parseChapterDate(
|
||||
|
||||
@@ -116,7 +116,8 @@ internal class MangaWorld(
|
||||
MangaChapter(
|
||||
id = generateUid(url),
|
||||
name = a.selectFirstOrThrow("span.d-inline-block").text(),
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
url = url,
|
||||
scanlator = null,
|
||||
uploadDate =
|
||||
|
||||
@@ -126,7 +126,8 @@ class NicovideoSeigaParser(context: MangaLoaderContext) :
|
||||
MangaChapter(
|
||||
id = generateUid(href),
|
||||
name = li.select("div > div.description > div.title > a").text(),
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
url = href,
|
||||
scanlator = 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(
|
||||
id = generateUid(href),
|
||||
name = name,
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
url = link,
|
||||
uploadDate = parseChapterDate(
|
||||
dateFormat,
|
||||
@@ -506,7 +507,8 @@ internal abstract class MadaraParser(
|
||||
id = generateUid(href),
|
||||
url = link,
|
||||
name = name,
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
branch = null,
|
||||
uploadDate = parseChapterDate(
|
||||
dateFormat,
|
||||
|
||||
@@ -27,7 +27,8 @@ internal class Ero18x(context: MangaLoaderContext) :
|
||||
MangaChapter(
|
||||
id = generateUid(href),
|
||||
name = name,
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
url = link,
|
||||
uploadDate = if (dateText == "Newly Published!") {
|
||||
parseChapterDate(
|
||||
|
||||
@@ -31,7 +31,8 @@ internal class ManhwaRaw(context: MangaLoaderContext) :
|
||||
MangaChapter(
|
||||
id = generateUid(href),
|
||||
name = name,
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
url = link,
|
||||
uploadDate = if (dateText == "Newly Published!") {
|
||||
parseChapterDate(
|
||||
|
||||
@@ -36,7 +36,8 @@ internal class LekMangaCom(context: MangaLoaderContext) :
|
||||
id = generateUid(href),
|
||||
url = link,
|
||||
name = name,
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
branch = null,
|
||||
uploadDate = parseChapterDate(
|
||||
dateFormat,
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
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.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.MangaSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@Broken
|
||||
@MangaSourceParser("ANSHSCANS", "AnshScans", "en")
|
||||
internal class AnshScans(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaSource.ANSHSCANS, "anshscans.org", 10) {
|
||||
|
||||
@@ -28,7 +28,8 @@ internal class Hentaixdickgirl(context: MangaLoaderContext) :
|
||||
MangaChapter(
|
||||
id = generateUid(href),
|
||||
name = name,
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
url = link,
|
||||
uploadDate = parseChapterDate(
|
||||
dateFormat,
|
||||
|
||||
@@ -121,7 +121,8 @@ internal class InstaManhwa(context: MangaLoaderContext) :
|
||||
id = generateUid(href),
|
||||
url = link,
|
||||
name = name,
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
branch = null,
|
||||
uploadDate = parseChapterDate(
|
||||
dateFormat,
|
||||
|
||||
@@ -125,7 +125,8 @@ internal class IsekaiScan(context: MangaLoaderContext) :
|
||||
id = generateUid(href),
|
||||
url = link,
|
||||
name = a.ownText(),
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
branch = null,
|
||||
uploadDate = parseChapterDate(
|
||||
dateFormat,
|
||||
|
||||
@@ -161,7 +161,8 @@ internal class MangaDass(context: MangaLoaderContext) :
|
||||
MangaChapter(
|
||||
id = generateUid(href),
|
||||
name = name,
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
url = link,
|
||||
uploadDate = parseChapterDate(
|
||||
dateFormat,
|
||||
|
||||
@@ -33,7 +33,8 @@ internal class MangaDistrict(context: MangaLoaderContext) :
|
||||
MangaChapter(
|
||||
id = generateUid(href),
|
||||
name = a.ownText(),
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
url = href,
|
||||
uploadDate = parseChapterDate(
|
||||
dateFormat,
|
||||
|
||||
@@ -151,7 +151,8 @@ internal class MangaDna(context: MangaLoaderContext) :
|
||||
MangaChapter(
|
||||
id = generateUid(href),
|
||||
name = name,
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
url = link,
|
||||
uploadDate = parseChapterDate(
|
||||
dateFormat,
|
||||
|
||||
@@ -127,7 +127,8 @@ internal class MangaPure(context: MangaLoaderContext) :
|
||||
id = generateUid(href),
|
||||
url = link,
|
||||
name = a.ownText(),
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
branch = null,
|
||||
uploadDate = parseChapterDate(
|
||||
dateFormat,
|
||||
|
||||
@@ -39,7 +39,8 @@ internal class ManhwaTop(context: MangaLoaderContext) :
|
||||
id = generateUid(href),
|
||||
url = link,
|
||||
name = name,
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
branch = null,
|
||||
uploadDate = parseChapterDate(
|
||||
dateFormat,
|
||||
|
||||
@@ -5,7 +5,8 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.MangaSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@MangaSourceParser("ZINMANGA", "ZinManga.com", "en")
|
||||
internal class Zinmanga(context: MangaLoaderContext) : MadaraParser(context, MangaSource.ZINMANGA, "zinmanga.com") {
|
||||
@MangaSourceParser("ZINMANGA", "ZinManga", "en")
|
||||
internal class Zinmanga(context: MangaLoaderContext) : MadaraParser(context, MangaSource.ZINMANGA, "zinmanga.net") {
|
||||
override val datePattern = "MM/dd/yyyy"
|
||||
override val withoutAjax = true
|
||||
}
|
||||
|
||||
@@ -27,7 +27,8 @@ internal class ManhwaEs(context: MangaLoaderContext) :
|
||||
MangaChapter(
|
||||
id = generateUid(href),
|
||||
name = name,
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
url = link,
|
||||
uploadDate = if (dateText == "¡Recién publicado!") {
|
||||
parseChapterDate(
|
||||
|
||||
@@ -35,7 +35,8 @@ internal class ManhwaLatino(context: MangaLoaderContext) :
|
||||
MangaChapter(
|
||||
id = generateUid(href),
|
||||
name = name,
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
url = link,
|
||||
uploadDate = parseChapterDate(
|
||||
dateFormat,
|
||||
|
||||
@@ -99,7 +99,8 @@ internal class TmoManga(context: MangaLoaderContext) :
|
||||
MangaChapter(
|
||||
id = generateUid(href),
|
||||
name = name,
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
url = link,
|
||||
uploadDate = 0,
|
||||
source = source,
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
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.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.MangaSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@Broken
|
||||
@MangaSourceParser("BLUESOLO", "BlueSolo", "fr")
|
||||
internal class BlueSolo(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaSource.BLUESOLO, "www1.bluesolo.org", 10) {
|
||||
|
||||
@@ -32,7 +32,8 @@ internal class Hentaizone(context: MangaLoaderContext) :
|
||||
MangaChapter(
|
||||
id = generateUid(href),
|
||||
name = name,
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
url = link,
|
||||
uploadDate = parseChapterDate(
|
||||
dateFormat,
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
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.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.ContentType
|
||||
import org.koitharu.kotatsu.parsers.model.MangaSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@Broken
|
||||
@MangaSourceParser("LUNARHENTAI", "LunarHentai", "fr", ContentType.HENTAI)
|
||||
internal class LunarHentai(context: MangaLoaderContext) :
|
||||
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)
|
||||
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
|
||||
|
||||
import org.koitharu.kotatsu.parsers.Broken
|
||||
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.madara.MadaraParser
|
||||
|
||||
@Broken
|
||||
@MangaSourceParser("SCANTRADVF", "Scantrad-Vf", "fr")
|
||||
internal class ScantradVf(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaSource.SCANTRADVF, "scantrad-vf.me") {
|
||||
|
||||
@@ -32,7 +32,8 @@ internal class ToonFr(context: MangaLoaderContext) :
|
||||
id = generateUid(href),
|
||||
url = href,
|
||||
name = a.text(),
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
branch = null,
|
||||
uploadDate = parseChapterDate(
|
||||
dateFormat,
|
||||
|
||||
@@ -2,9 +2,7 @@ package org.koitharu.kotatsu.parsers.site.madara.id
|
||||
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
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.network.UserAgents
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
import java.util.*
|
||||
|
||||
|
||||
@@ -28,7 +28,8 @@ internal class Neoxscans(context: MangaLoaderContext) :
|
||||
id = generateUid(href),
|
||||
url = link,
|
||||
name = name,
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
branch = null,
|
||||
uploadDate = parseChapterDate(
|
||||
dateFormat,
|
||||
|
||||
@@ -24,7 +24,8 @@ internal class TitanManga(context: MangaLoaderContext) :
|
||||
id = generateUid(href),
|
||||
url = link,
|
||||
name = name,
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
branch = null,
|
||||
uploadDate = 0,
|
||||
scanlator = null,
|
||||
|
||||
@@ -26,7 +26,8 @@ internal class TruyenTranhDamMyy(context: MangaLoaderContext) :
|
||||
id = generateUid(href),
|
||||
url = link,
|
||||
name = name,
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
branch = null,
|
||||
uploadDate = 0, // Correct datePattern not found.
|
||||
scanlator = null,
|
||||
|
||||
@@ -207,7 +207,8 @@ internal abstract class MadthemeParser(
|
||||
MangaChapter(
|
||||
id = generateUid(href),
|
||||
name = li.selectFirstOrThrow(".chapter-title").text(),
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
url = href,
|
||||
uploadDate = parseChapterDate(
|
||||
dateFormat,
|
||||
|
||||
@@ -26,7 +26,8 @@ internal class MangaJinx(context: MangaLoaderContext) :
|
||||
MangaChapter(
|
||||
id = generateUid(href),
|
||||
name = li.selectFirstOrThrow(".chapter-title").text(),
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
url = href,
|
||||
uploadDate = parseChapterDate(
|
||||
dateFormat,
|
||||
|
||||
@@ -108,7 +108,8 @@ internal class ManhuaScan(context: MangaLoaderContext) :
|
||||
MangaChapter(
|
||||
id = generateUid(href),
|
||||
name = li.selectFirstOrThrow(".chapter-title").text(),
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
url = href,
|
||||
uploadDate = parseChapterDate(
|
||||
dateFormat,
|
||||
|
||||
@@ -182,7 +182,8 @@ internal abstract class Manga18Parser(
|
||||
MangaChapter(
|
||||
id = generateUid(href),
|
||||
name = a.text(),
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
url = href,
|
||||
uploadDate = dateFormat.tryParse(dateText),
|
||||
source = source,
|
||||
|
||||
@@ -24,7 +24,8 @@ internal class Hanman18(context: MangaLoaderContext) :
|
||||
MangaChapter(
|
||||
id = generateUid(href),
|
||||
name = a.text(),
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
url = href,
|
||||
uploadDate = 0,
|
||||
source = source,
|
||||
|
||||
@@ -200,7 +200,8 @@ internal abstract class MangaboxParser(
|
||||
MangaChapter(
|
||||
id = generateUid(href),
|
||||
name = a.text(),
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
url = href,
|
||||
uploadDate = parseChapterDate(
|
||||
dateFormat,
|
||||
|
||||
@@ -125,7 +125,8 @@ internal class Mangakakalot(context: MangaLoaderContext) :
|
||||
MangaChapter(
|
||||
id = generateUid(href),
|
||||
name = a.text(),
|
||||
number = i + 1,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
url = href,
|
||||
uploadDate = parseChapterDate(
|
||||
dateFormat,
|
||||
|
||||
@@ -5,7 +5,6 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.Manga
|
||||
import org.koitharu.kotatsu.parsers.model.MangaSource
|
||||
import org.koitharu.kotatsu.parsers.site.mangadventure.MangAdventureParser
|
||||
import org.koitharu.kotatsu.parsers.util.urlEncoded
|
||||
|
||||
@MangaSourceParser("ARCRELIGHT", "Arc-Relight", "en")
|
||||
internal class ArcRelight(context: MangaLoaderContext) :
|
||||
|
||||
@@ -29,6 +29,13 @@ internal abstract class MangaReaderParser(
|
||||
|
||||
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>
|
||||
get() = EnumSet.of(
|
||||
SortOrder.UPDATED,
|
||||
@@ -156,7 +163,8 @@ internal abstract class MangaReaderParser(
|
||||
id = generateUid(url),
|
||||
name = element.selectFirst(".chapternum")?.text() ?: "Chapter ${index + 1}",
|
||||
url = url,
|
||||
number = index + 1,
|
||||
number = index + 1f,
|
||||
volume = 0,
|
||||
scanlator = null,
|
||||
uploadDate = dateFormat.tryParse(element.selectFirst(".chapterdate")?.text()),
|
||||
branch = null,
|
||||
|
||||
@@ -9,4 +9,4 @@ import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser
|
||||
internal class ArAreaScans(context: MangaLoaderContext) :
|
||||
MangaReaderParser(context, MangaSource.ARAREASCANS, "ar.areascans.org", pageSize = 20, searchPageSize = 10) {
|
||||
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) :
|
||||
MangaReaderParser(context, MangaSource.MANGAPRO, "promanga.pro", pageSize = 20, searchPageSize = 10) {
|
||||
override val isTagsExclusionSupported = false
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,7 +25,8 @@ internal class Manjanoon(context: MangaLoaderContext) :
|
||||
id = generateUid(url),
|
||||
name = element.selectFirst(".chapternum")?.text() ?: "Chapter ${index + 1}",
|
||||
url = url,
|
||||
number = index + 1,
|
||||
number = index + 1f,
|
||||
volume = 0,
|
||||
scanlator = null,
|
||||
uploadDate = 0,
|
||||
branch = null,
|
||||
|
||||
@@ -86,7 +86,8 @@ internal class Normoyun(context: MangaLoaderContext) :
|
||||
id = generateUid(url),
|
||||
name = element.selectFirst("a")?.text() ?: "Chapter ${index + 1}",
|
||||
url = url,
|
||||
number = index + 1,
|
||||
number = index + 1f,
|
||||
volume = 0,
|
||||
scanlator = null,
|
||||
uploadDate = dateFormat.tryParse(element.selectFirst(".chapter-date")?.text()),
|
||||
branch = null,
|
||||
|
||||
@@ -7,4 +7,6 @@ import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser
|
||||
|
||||
@MangaSourceParser("THUNDERSCANS", "ThunderScans", "ar")
|
||||
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
|
||||
|
||||
@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) {
|
||||
override val isTagsExclusionSupported = false
|
||||
}
|
||||
|
||||
@@ -25,7 +25,8 @@ internal class VexManga(context: MangaLoaderContext) :
|
||||
id = generateUid(url),
|
||||
name = element.selectFirst(".chapternum")?.text() ?: "Chapter ${index + 1}",
|
||||
url = url,
|
||||
number = index + 1,
|
||||
number = index + 1f,
|
||||
volume = 0,
|
||||
scanlator = null,
|
||||
uploadDate = parseChapterDate(
|
||||
dateFormat,
|
||||
|
||||
@@ -20,7 +20,8 @@ internal class Constellarcomic(context: MangaLoaderContext) :
|
||||
id = generateUid(url),
|
||||
name = element.selectFirst(".chapternum")?.textOrNull() ?: "Chapter ${index + 1}",
|
||||
url = url,
|
||||
number = index + 1,
|
||||
number = index + 1f,
|
||||
volume = 0,
|
||||
scanlator = null,
|
||||
uploadDate = 0,
|
||||
branch = null,
|
||||
|
||||
@@ -7,6 +7,6 @@ import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser
|
||||
|
||||
@MangaSourceParser("MAGUSMANGA", "MagusManga", "en")
|
||||
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"
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user