Add : MangaTx.to - AlterkaiScans - StoneScape
Kalango - SolooScan - ErosScans - SolooScan RaysScan - TemakiMangas - ZinChanManga Urls Changes Add volume on some parser Fix ThunderScans close #818 NinjaScan close #753 Add Ngomik close #761 Remove dulicate source paragonscans Fix LuminousScans close #578 Fix YugenApp close #854 Fix KaiScans close #614 Add PeachBl Close #884 Fix GalinhaSamurai close #835 Fix RocksManga close #827 Fix CrystalComics close #792
This commit is contained in:
@@ -147,7 +147,8 @@ class TuMangaOnlineParser(context: MangaLoaderContext) : PagedMangaParser(
|
||||
return MangaChapter(
|
||||
id = generateUid(href),
|
||||
name = "One Shot",
|
||||
number = 1,
|
||||
number = 1f,
|
||||
volume = 0,
|
||||
url = href,
|
||||
scanlator = element.select("div.col-md-6.text-truncate").text(),
|
||||
branch = null,
|
||||
@@ -163,7 +164,8 @@ class TuMangaOnlineParser(context: MangaLoaderContext) : PagedMangaParser(
|
||||
return MangaChapter(
|
||||
id = generateUid(href),
|
||||
name = chName,
|
||||
number = number + 1,
|
||||
number = number + 1f,
|
||||
volume = 0,
|
||||
url = href,
|
||||
scanlator = element.select("div.col-md-6.text-truncate").text(),
|
||||
branch = null,
|
||||
|
||||
@@ -228,7 +228,8 @@ internal class BentomangaParser(context: MangaLoaderContext) : PagedMangaParser(
|
||||
MangaChapter(
|
||||
id = generateUid(href),
|
||||
name = if (name != null && name != title) "$title: $name" else title,
|
||||
number = href.substringAfterLast('/').toIntOrNull() ?: 0,
|
||||
number = href.substringAfterLast('/').toFloatOrNull() ?: 0f,
|
||||
volume = 0,
|
||||
url = href,
|
||||
scanlator = div.selectFirst(".team_link-name")?.textOrNull(),
|
||||
uploadDate = div.selectFirst(".component-chapter-date")
|
||||
|
||||
@@ -158,7 +158,8 @@ internal abstract class GalleryAdultsParser(
|
||||
MangaChapter(
|
||||
id = manga.id,
|
||||
name = manga.title,
|
||||
number = 1,
|
||||
number = 1f,
|
||||
volume = 0,
|
||||
url = urlChapters,
|
||||
scanlator = null,
|
||||
uploadDate = 0,
|
||||
|
||||
@@ -131,7 +131,8 @@ internal class HentaiEra(context: MangaLoaderContext) :
|
||||
MangaChapter(
|
||||
id = manga.id,
|
||||
name = manga.title,
|
||||
number = 1,
|
||||
number = 1f,
|
||||
volume = 0,
|
||||
url = urlChapters,
|
||||
scanlator = null,
|
||||
uploadDate = 0,
|
||||
|
||||
@@ -115,7 +115,8 @@ internal abstract class GattsuParser(
|
||||
MangaChapter(
|
||||
id = manga.id,
|
||||
name = manga.title,
|
||||
number = 1,
|
||||
number = 1f,
|
||||
volume = 0,
|
||||
url = urlChapter,
|
||||
scanlator = null,
|
||||
uploadDate = 0,
|
||||
|
||||
@@ -91,7 +91,8 @@ internal abstract class GuyaParser(
|
||||
MangaChapter(
|
||||
id = generateUid(url),
|
||||
name = chapter.getString("title"),
|
||||
number = i,
|
||||
number = i.toFloat(),
|
||||
volume = 0,
|
||||
url = url,
|
||||
scanlator = null,
|
||||
uploadDate = 0,
|
||||
|
||||
@@ -126,7 +126,8 @@ class DoujinDesuParser(context: MangaLoaderContext) : PagedMangaParser(context,
|
||||
MangaChapter(
|
||||
id = generateUid(url),
|
||||
name = titleTag.text(),
|
||||
number = index + 1,
|
||||
number = index + 1f,
|
||||
volume = 0,
|
||||
url = url,
|
||||
scanlator = null,
|
||||
uploadDate = chapterDateFormat.tryParse(element.select(".epsleft > .date").text()),
|
||||
|
||||
@@ -7,4 +7,4 @@ import org.koitharu.kotatsu.parsers.model.MangaSource
|
||||
@MangaSourceParser("MANGAWORLD", "MangaWorld", "it")
|
||||
internal class MangaWorld(
|
||||
context: MangaLoaderContext,
|
||||
) : MangaWorldParser(context, MangaSource.MANGAWORLD,"mangaworld.ac")
|
||||
) : MangaWorldParser(context, MangaSource.MANGAWORLD, "mangaworld.ac")
|
||||
|
||||
@@ -10,20 +10,27 @@ import java.text.SimpleDateFormat
|
||||
import java.util.*
|
||||
|
||||
abstract class MangaWorldParser(
|
||||
context: MangaLoaderContext,
|
||||
source: MangaSource,
|
||||
domain: String,
|
||||
pageSize: Int = 16
|
||||
context: MangaLoaderContext,
|
||||
source: MangaSource,
|
||||
domain: String,
|
||||
pageSize: Int = 16,
|
||||
) : PagedMangaParser(context, source, pageSize) {
|
||||
override val availableSortOrders: Set<SortOrder> =
|
||||
EnumSet.of(SortOrder.POPULARITY, SortOrder.ALPHABETICAL, SortOrder.NEWEST, SortOrder.ALPHABETICAL_DESC, SortOrder.UPDATED)
|
||||
EnumSet.of(
|
||||
SortOrder.POPULARITY,
|
||||
SortOrder.ALPHABETICAL,
|
||||
SortOrder.NEWEST,
|
||||
SortOrder.ALPHABETICAL_DESC,
|
||||
SortOrder.UPDATED,
|
||||
)
|
||||
|
||||
override val defaultSortOrder: SortOrder
|
||||
get() = SortOrder.ALPHABETICAL
|
||||
|
||||
override val configKeyDomain = ConfigKey.Domain(domain)
|
||||
|
||||
override val availableStates: Set<MangaState> = EnumSet.of(MangaState.ONGOING, MangaState.FINISHED, MangaState.ABANDONED, MangaState.PAUSED)
|
||||
override val availableStates: Set<MangaState> =
|
||||
EnumSet.of(MangaState.ONGOING, MangaState.FINISHED, MangaState.ABANDONED, MangaState.PAUSED)
|
||||
|
||||
override val isMultipleTagsSupported = true
|
||||
|
||||
@@ -43,7 +50,9 @@ abstract class MangaWorldParser(
|
||||
}
|
||||
|
||||
is MangaListFilter.Advanced -> {
|
||||
if(filter.tags.isEmpty() && filter.states.isEmpty() && filter.sortOrder == SortOrder.UPDATED) return parseMangaList(webClient.httpGet("https://$domain/?page=$page").parseHtml())
|
||||
if (filter.tags.isEmpty() && filter.states.isEmpty() && filter.sortOrder == SortOrder.UPDATED) return parseMangaList(
|
||||
webClient.httpGet("https://$domain/?page=$page").parseHtml(),
|
||||
)
|
||||
|
||||
if (filter.tags.isNotEmpty()) {
|
||||
filter.tags.joinTo(this, "&") { it.key.substringAfter("archive?") }
|
||||
|
||||
@@ -219,7 +219,8 @@ internal abstract class LikeMangaParser(
|
||||
MangaChapter(
|
||||
id = generateUid(url),
|
||||
name = li.selectFirstOrThrow("a").text(),
|
||||
number = chapNum.toInt(),
|
||||
number = chapNum.toFloat(),
|
||||
volume = 0,
|
||||
url = url,
|
||||
scanlator = null,
|
||||
uploadDate = parseChapterDate(
|
||||
|
||||
@@ -1,10 +1,49 @@
|
||||
package org.koitharu.kotatsu.parsers.site.madara.ar
|
||||
|
||||
import org.jsoup.nodes.Document
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.MangaChapter
|
||||
import org.koitharu.kotatsu.parsers.model.MangaSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
import org.koitharu.kotatsu.parsers.util.attrAsRelativeUrlOrNull
|
||||
import org.koitharu.kotatsu.parsers.util.generateUid
|
||||
import org.koitharu.kotatsu.parsers.util.mapChapters
|
||||
import org.koitharu.kotatsu.parsers.util.parseFailed
|
||||
import java.text.SimpleDateFormat
|
||||
|
||||
@MangaSourceParser("ROCKSMANGA", "RocksManga", "ar")
|
||||
internal class RocksManga(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaSource.ROCKSMANGA, "rocks-manga.com")
|
||||
MadaraParser(context, MangaSource.ROCKSMANGA, "rocks-manga.com") {
|
||||
override val selectChapter = "ul#chapter-list li.chapter-item"
|
||||
override val datePattern = "d MMMM yyyy"
|
||||
override val selectDate = ".ch-post-time"
|
||||
override val selectBodyPage = "div.reading-content"
|
||||
override val selectPage = "img"
|
||||
override val selectDesc = ".story"
|
||||
|
||||
override suspend fun loadChapters(mangaUrl: String, document: Document): List<MangaChapter> {
|
||||
val dateFormat = SimpleDateFormat(datePattern, sourceLocale)
|
||||
return document.select(selectChapter).mapChapters(reversed = true) { i, li ->
|
||||
val a = li.selectFirst("a")
|
||||
val href = a?.attrAsRelativeUrlOrNull("href") ?: li.parseFailed("Link is missing")
|
||||
val link = href + stylePage
|
||||
val dateText = li.selectFirst("a.c-new-tag")?.attr("title") ?: li.selectFirst(selectDate)?.text()
|
||||
val name = a.selectFirst(".ch-title")?.text() ?: a.ownText()
|
||||
MangaChapter(
|
||||
id = generateUid(href),
|
||||
url = link,
|
||||
name = name,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
branch = null,
|
||||
uploadDate = parseChapterDate(
|
||||
dateFormat,
|
||||
dateText,
|
||||
),
|
||||
scanlator = null,
|
||||
source = source,
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,8 +5,8 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.MangaSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@MangaSourceParser("PARAGONSCANS", "ParagonScans", "en")
|
||||
internal class Paragonscans(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaSource.PARAGONSCANS, "paragonscans.com", pageSize = 50) {
|
||||
override val datePattern = "MM/dd/yyyy"
|
||||
@MangaSourceParser("MANGATX_TO", "MangaTx.to", "en")
|
||||
internal class MangaTxTo(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaSource.MANGATX_TO, "mangatx.to", 10) {
|
||||
override val tagPrefix = "manhua-genre/"
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
package org.koitharu.kotatsu.parsers.site.madara.en
|
||||
|
||||
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
|
||||
|
||||
@MangaSourceParser("STONESCAPE", "StoneScape", "en")
|
||||
internal class StoneScape(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaSource.STONESCAPE, "stonescape.xyz", 10) {
|
||||
override val listUrl = "series/"
|
||||
override val tagPrefix = "series-genre/"
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
package org.koitharu.kotatsu.parsers.site.madara.en
|
||||
|
||||
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
|
||||
|
||||
@MangaSourceParser("TCBSCANSMANGA", "TcbScansManga", "en")
|
||||
internal class TcbScansManga(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaSource.TCBSCANSMANGA, "tcbscans-manga.com", 10) {
|
||||
override val selectPage = "img"
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package org.koitharu.kotatsu.parsers.site.madara.en
|
||||
|
||||
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
|
||||
|
||||
@MangaSourceParser("ZINCHANMANGA", "ZinChanManga", "en", ContentType.HENTAI)
|
||||
internal class ZinChanManga(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaSource.ZINCHANMANGA, "zinchanmanga.com", 10)
|
||||
@@ -5,6 +5,6 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.MangaSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@MangaSourceParser("CRYSTALSCAN", "CrystalScan", "pt")
|
||||
@MangaSourceParser("CRYSTALSCAN", "CrystalComics", "pt")
|
||||
internal class CrystalScan(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaSource.CRYSTALSCAN, "crystalscan.net")
|
||||
MadaraParser(context, MangaSource.CRYSTALSCAN, "crystalcomics.com")
|
||||
|
||||
@@ -5,8 +5,9 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.MangaSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@MangaSourceParser("GALINHASAMURAI", "Galinha Samurai", "pt")
|
||||
@MangaSourceParser("GALINHASAMURAI", "GalinhaSamurai", "pt")
|
||||
internal class GalinhaSamurai(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaSource.GALINHASAMURAI, "galinhasamurai.com") {
|
||||
override val datePattern = "dd/MM/yyyy"
|
||||
override val withoutAjax = true
|
||||
}
|
||||
|
||||
@@ -5,6 +5,6 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.MangaSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@MangaSourceParser("KAKUSEIPROJECT", "Kakusei Project", "pt")
|
||||
@MangaSourceParser("KAKUSEIPROJECT", "KakuseiProject", "pt")
|
||||
internal class KakuseiProject(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaSource.KAKUSEIPROJECT, "kakuseiproject.com", 10)
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
package org.koitharu.kotatsu.parsers.site.madara.pt
|
||||
|
||||
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
|
||||
import java.util.Locale
|
||||
|
||||
@MangaSourceParser("KALANGO", "Kalango", "pt")
|
||||
internal class Kalango(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaSource.KALANGO, "kalango.org") {
|
||||
override val datePattern: String = "dd 'de' MMMM 'de' yyyy"
|
||||
override val sourceLocale: Locale = Locale.ENGLISH
|
||||
}
|
||||
@@ -5,8 +5,8 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.MangaSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@MangaSourceParser("NINJASCAN", "NinjaScan", "pt")
|
||||
@MangaSourceParser("NINJASCAN", "NinjaComics", "pt")
|
||||
internal class NinjaScan(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaSource.NINJASCAN, "ninjascan.site") {
|
||||
MadaraParser(context, MangaSource.NINJASCAN, "ninjacomics.xyz") {
|
||||
override val datePattern: String = "dd 'de' MMMMM 'de' yyyy"
|
||||
}
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
package org.koitharu.kotatsu.parsers.site.madara.pt
|
||||
|
||||
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 // Not dead, changed template
|
||||
@MangaSourceParser("SINENSISSCANS", "SinensisScans", "pt")
|
||||
internal class SinensisScans(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaSource.SINENSISSCANS, "sinensistoon.com") {
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
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.ContentType
|
||||
import org.koitharu.kotatsu.parsers.model.MangaSource
|
||||
import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser
|
||||
import java.util.Locale
|
||||
|
||||
@MangaSourceParser("PEACHBL", "PeachBl", "ar", ContentType.HENTAI)
|
||||
internal class PeachBl(context: MangaLoaderContext) :
|
||||
MangaReaderParser(context, MangaSource.PEACHBL, "peach-bl.com", pageSize = 20, searchPageSize = 10) {
|
||||
override val sourceLocale: Locale = Locale.ENGLISH
|
||||
}
|
||||
@@ -9,4 +9,5 @@ import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser
|
||||
internal class ThunderScans(context: MangaLoaderContext) :
|
||||
MangaReaderParser(context, MangaSource.THUNDERSCANS, "thunderscans.com", pageSize = 32, searchPageSize = 10) {
|
||||
override val isTagsExclusionSupported = false
|
||||
override val selectChapter = ".eplister > ul > li"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
package org.koitharu.kotatsu.parsers.site.mangareader.en
|
||||
|
||||
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("EROSSCANS", "ErosScans", "en")
|
||||
internal class ErosScans(context: MangaLoaderContext) :
|
||||
MangaReaderParser(context, MangaSource.EROSSCANS, "erosscans.xyz", pageSize = 20, searchPageSize = 10)
|
||||
@@ -7,6 +7,6 @@ import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser
|
||||
|
||||
@MangaSourceParser("FLAMECOMICS", "FlameComics", "en")
|
||||
internal class FlameComics(context: MangaLoaderContext) :
|
||||
MangaReaderParser(context, MangaSource.FLAMECOMICS, "flamecomics.com", pageSize = 24, searchPageSize = 10) {
|
||||
MangaReaderParser(context, MangaSource.FLAMECOMICS, "flamecomics.me", pageSize = 24, searchPageSize = 10) {
|
||||
override val listUrl = "/series"
|
||||
}
|
||||
|
||||
@@ -8,6 +8,5 @@ import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser
|
||||
@MangaSourceParser("KAISCANS", "KaiScans", "en")
|
||||
internal class KaiScans(context: MangaLoaderContext) :
|
||||
MangaReaderParser(context, MangaSource.KAISCANS, "kaiscans.org", pageSize = 20, searchPageSize = 10) {
|
||||
override val listUrl = "/series"
|
||||
override val isTagsExclusionSupported = false
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@ import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser
|
||||
|
||||
@MangaSourceParser("LUMINOUSSCANS", "LuminousScans", "en")
|
||||
internal class LuminousScans(context: MangaLoaderContext) :
|
||||
MangaReaderParser(context, MangaSource.LUMINOUSSCANS, "lumitoon.com", pageSize = 20, searchPageSize = 10) {
|
||||
MangaReaderParser(context, MangaSource.LUMINOUSSCANS, "luminous-scans.com", pageSize = 20, searchPageSize = 10) {
|
||||
override val listUrl = "/series"
|
||||
override val isTagsExclusionSupported = false
|
||||
}
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
package org.koitharu.kotatsu.parsers.site.mangareader.id
|
||||
|
||||
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
|
||||
import java.util.Locale
|
||||
|
||||
@MangaSourceParser("ALTERKAISCANS", "AlterkaiScans", "id")
|
||||
internal class AlterkaiScans(context: MangaLoaderContext) :
|
||||
MangaReaderParser(context, MangaSource.ALTERKAISCANS, "alterkaiscans.my.id", pageSize = 20, searchPageSize = 10) {
|
||||
override val sourceLocale: Locale = Locale.ENGLISH
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
package org.koitharu.kotatsu.parsers.site.mangareader.id
|
||||
|
||||
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
|
||||
import java.util.Locale
|
||||
|
||||
@MangaSourceParser("NGOMIK", "Ngomik", "id")
|
||||
internal class Ngomik(context: MangaLoaderContext) :
|
||||
MangaReaderParser(context, MangaSource.NGOMIK, "ngomik.mom", pageSize = 20, searchPageSize = 5) {
|
||||
override val sourceLocale: Locale = Locale.ENGLISH
|
||||
}
|
||||
@@ -186,7 +186,8 @@ internal abstract class OtakuSanctuaryParser(
|
||||
MangaChapter(
|
||||
id = generateUid(url),
|
||||
name = name,
|
||||
number = i,
|
||||
number = i.toFloat(),
|
||||
volume = 0,
|
||||
url = url,
|
||||
scanlator = null,
|
||||
uploadDate = parseChapterDate(
|
||||
|
||||
@@ -6,6 +6,7 @@ import okhttp3.MediaType.Companion.toMediaTypeOrNull
|
||||
import okhttp3.Response
|
||||
import okhttp3.ResponseBody.Companion.toResponseBody
|
||||
import org.json.JSONArray
|
||||
import org.koitharu.kotatsu.parsers.Broken
|
||||
import org.koitharu.kotatsu.parsers.ErrorMessages
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.MangaParser
|
||||
@@ -16,13 +17,14 @@ import org.koitharu.kotatsu.parsers.util.*
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.zip.ZipInputStream
|
||||
|
||||
@MangaSourceParser("RANDOMSCANS", "Luratoon Scan", "pt")
|
||||
@Broken // Not dead but totally changed structure
|
||||
@MangaSourceParser("RANDOMSCANS", "LuratoonScan", "pt")
|
||||
internal class LuratoonScansParser(context: MangaLoaderContext) : MangaParser(context, MangaSource.RANDOMSCANS),
|
||||
Interceptor {
|
||||
|
||||
override val availableSortOrders = setOf(SortOrder.ALPHABETICAL)
|
||||
|
||||
override val configKeyDomain = ConfigKey.Domain("luratoon.com")
|
||||
override val configKeyDomain = ConfigKey.Domain("luratoons.com")
|
||||
|
||||
private val userAgentKey = ConfigKey.UserAgent(context.getDefaultUserAgent())
|
||||
|
||||
|
||||
@@ -12,11 +12,11 @@ import java.text.DateFormat
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.*
|
||||
|
||||
@MangaSourceParser("YUGENMANGAS", "YugenMangas.net.br", "pt")
|
||||
@MangaSourceParser("YUGENMANGAS", "YugenApp", "pt")
|
||||
class YugenMangas(context: MangaLoaderContext) : PagedMangaParser(context, MangaSource.YUGENMANGAS, 28) {
|
||||
|
||||
override val availableSortOrders: Set<SortOrder> = EnumSet.of(SortOrder.ALPHABETICAL, SortOrder.UPDATED)
|
||||
override val configKeyDomain = ConfigKey.Domain("yugenmangas.net.br")
|
||||
override val availableSortOrders: Set<SortOrder> = EnumSet.of(SortOrder.UPDATED)
|
||||
override val configKeyDomain = ConfigKey.Domain("yugenapp.lat")
|
||||
|
||||
override suspend fun getListPage(page: Int, filter: MangaListFilter?): List<Manga> {
|
||||
|
||||
@@ -32,7 +32,7 @@ class YugenMangas(context: MangaLoaderContext) : PagedMangaParser(context, Manga
|
||||
val url = buildString {
|
||||
append("https://api.")
|
||||
append(domain)
|
||||
append("/api/series/list/?query=")
|
||||
append("/api/series/?search=")
|
||||
append(filter.query.urlEncoded())
|
||||
}
|
||||
webClient.httpGet(url).parseJsonArray()
|
||||
@@ -41,22 +41,12 @@ class YugenMangas(context: MangaLoaderContext) : PagedMangaParser(context, Manga
|
||||
is MangaListFilter.Advanced -> {
|
||||
|
||||
|
||||
if (filter.sortOrder == SortOrder.UPDATED) {
|
||||
val url = buildString {
|
||||
append("https://api.")
|
||||
append(domain)
|
||||
append("/api/latest_updates/")
|
||||
}
|
||||
webClient.httpGet(url).parseJsonArray()
|
||||
} else {
|
||||
val url = buildString {
|
||||
append("https://api.")
|
||||
append(domain)
|
||||
append("/api/all_series/")
|
||||
}
|
||||
webClient.httpGet(url).parseJson().getJSONArray("series")
|
||||
val url = buildString {
|
||||
append("https://api.")
|
||||
append(domain)
|
||||
append("/api/latest_updates/")
|
||||
}
|
||||
|
||||
webClient.httpGet(url).parseJsonArray()
|
||||
}
|
||||
|
||||
null -> {
|
||||
@@ -73,7 +63,7 @@ class YugenMangas(context: MangaLoaderContext) : PagedMangaParser(context, Manga
|
||||
val slug = j.getString("slug")
|
||||
val cover = if (!j.getString("cover").startsWith("https://")) {
|
||||
// Some covers don't have the "/" so we ensure that the URL will be spelled correctly.
|
||||
"https://$domain/media/" + j.getString("cover").removePrefix("/")
|
||||
"https://api.$domain/media/" + j.getString("cover").removePrefix("/")
|
||||
} else {
|
||||
j.getString("cover")
|
||||
}
|
||||
@@ -97,11 +87,12 @@ class YugenMangas(context: MangaLoaderContext) : PagedMangaParser(context, Manga
|
||||
|
||||
override suspend fun getDetails(manga: Manga): Manga {
|
||||
val detailManga =
|
||||
webClient.httpPost("https://api.$domain/api/serie_details/${manga.url}", emptyMap()).parseJson()
|
||||
webClient.httpPost("https://api.$domain/api/serie/serie_details/${manga.url}", emptyMap()).parseJson()
|
||||
val body = JSONObject()
|
||||
body.put("serie_slug", manga.url)
|
||||
val chapterManga = webClient.httpPost("https://api.$domain/api/get_chapters_by_serie/", body).parseJson()
|
||||
.getJSONArray("chapters")
|
||||
val chapterManga =
|
||||
webClient.httpPost("https://api.$domain/api/chapters/get_chapters_by_serie/", body).parseJson()
|
||||
.getJSONArray("chapters")
|
||||
val dateFormat = SimpleDateFormat("dd/MM/yyyy", sourceLocale)
|
||||
return manga.copy(
|
||||
description = detailManga.getString("synopsis"),
|
||||
@@ -117,11 +108,12 @@ class YugenMangas(context: MangaLoaderContext) : PagedMangaParser(context, Manga
|
||||
}
|
||||
},
|
||||
chapters = chapterManga.mapJSON { j ->
|
||||
val url = "https://api.$domain/api/serie/${manga.url}/chapter/${j.getString("slug")}/images/imgs/"
|
||||
val url = "https://api.$domain/api/serie/${manga.url}/chapter/${j.getString("slug")}/images/imgs/get/"
|
||||
MangaChapter(
|
||||
id = generateUid(url),
|
||||
name = j.getString("name"),
|
||||
number = j.getString("name").removePrefix("Capítulo ").toInt(),
|
||||
number = j.getString("name").removePrefix("Capítulo ").toFloat(),
|
||||
volume = 0,
|
||||
url = url,
|
||||
scanlator = null,
|
||||
uploadDate = parseChapterDate(
|
||||
@@ -158,7 +150,7 @@ class YugenMangas(context: MangaLoaderContext) : PagedMangaParser(context, Manga
|
||||
val jsonPages = webClient.httpPost(chapter.url, emptyMap()).parseJson().getJSONArray("chapter_images")
|
||||
val pages = ArrayList<MangaPage>(jsonPages.length())
|
||||
for (i in 0 until jsonPages.length()) {
|
||||
val img = "https://$domain/${jsonPages.getString(i)}"
|
||||
val img = "https://api.$domain/${jsonPages.getString(i)}"
|
||||
pages.add(
|
||||
MangaPage(
|
||||
id = generateUid(img),
|
||||
|
||||
@@ -142,7 +142,8 @@ internal class AComics(context: MangaLoaderContext) :
|
||||
MangaChapter(
|
||||
id = manga.id,
|
||||
name = manga.title,
|
||||
number = 1,
|
||||
number = 1f,
|
||||
volume = 0,
|
||||
url = manga.url.replace("/about", "/"),
|
||||
scanlator = null,
|
||||
uploadDate = 0,
|
||||
|
||||
@@ -87,7 +87,7 @@ internal abstract class LibSocialParser(
|
||||
SortOrder.NEWEST -> "created_at"
|
||||
SortOrder.ALPHABETICAL,
|
||||
SortOrder.ALPHABETICAL_DESC,
|
||||
-> "rus_name"
|
||||
-> "rus_name"
|
||||
},
|
||||
)
|
||||
urlBuilder.addQueryParameter(
|
||||
@@ -98,7 +98,7 @@ internal abstract class LibSocialParser(
|
||||
SortOrder.RATING,
|
||||
SortOrder.NEWEST,
|
||||
SortOrder.ALPHABETICAL_DESC,
|
||||
-> "desc"
|
||||
-> "desc"
|
||||
|
||||
SortOrder.ALPHABETICAL -> "asc"
|
||||
},
|
||||
|
||||
@@ -197,7 +197,8 @@ class BlogTruyenParser(context: MangaLoaderContext) :
|
||||
MangaChapter(
|
||||
id = generateUid(id),
|
||||
name = name,
|
||||
number = index + 1,
|
||||
number = index + 1f,
|
||||
volume = 0,
|
||||
url = relativeUrl,
|
||||
scanlator = null,
|
||||
uploadDate = uploadDate,
|
||||
|
||||
@@ -244,7 +244,8 @@ class HentaiVNParser(context: MangaLoaderContext) : MangaParser(context, MangaSo
|
||||
MangaChapter(
|
||||
id = generateUid(titleEl.attrAsRelativeUrl("href")),
|
||||
name = titleEl.text(),
|
||||
number = index + 1,
|
||||
number = index + 1f,
|
||||
volume = 0,
|
||||
url = titleEl.attrAsRelativeUrl("href"),
|
||||
scanlator = null,
|
||||
uploadDate = chapterDateFormat.tryParse(dateStr),
|
||||
|
||||
@@ -142,7 +142,8 @@ internal class LxManga(context: MangaLoaderContext) : PagedMangaParser(context,
|
||||
MangaChapter(
|
||||
id = generateUid(href),
|
||||
name = name,
|
||||
number = i,
|
||||
number = i.toFloat(),
|
||||
volume = 0,
|
||||
url = href,
|
||||
scanlator = null,
|
||||
uploadDate = dateFormat.tryParse(date),
|
||||
|
||||
@@ -133,7 +133,8 @@ class TruyentranhLHParser(context: MangaLoaderContext) :
|
||||
MangaChapter(
|
||||
id = generateUid(element.attrAsRelativeUrl("href")),
|
||||
name = element.selectFirst(".chapter-name")?.text()?.trim().orEmpty(),
|
||||
number = index + 1,
|
||||
number = index + 1f,
|
||||
volume = 0,
|
||||
url = element.attrAsRelativeUrl("href"),
|
||||
scanlator = null,
|
||||
uploadDate = chapterDateFormat.tryParse(element.selectFirst(".chapter-time")?.text()),
|
||||
|
||||
@@ -122,7 +122,8 @@ internal abstract class VmpParser(
|
||||
MangaChapter(
|
||||
id = manga.id,
|
||||
name = manga.title,
|
||||
number = 1,
|
||||
number = 1f,
|
||||
volume = 0,
|
||||
url = manga.url,
|
||||
scanlator = null,
|
||||
uploadDate = 0,
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
package org.koitharu.kotatsu.parsers.site.zeistmanga.pt
|
||||
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
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.site.zeistmanga.ZeistMangaParser
|
||||
|
||||
@MangaSourceParser("RAYSSCAN", "RaysScan", "pt")
|
||||
internal class RaysScan(context: MangaLoaderContext) :
|
||||
ZeistMangaParser(context, MangaSource.RAYSSCAN, "raysscan.blogspot.com") {
|
||||
override val availableStates: Set<MangaState> = emptySet()
|
||||
override suspend fun getAvailableTags(): Set<MangaTag> = emptySet()
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
package org.koitharu.kotatsu.parsers.site.zeistmanga.pt
|
||||
|
||||
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.zeistmanga.ZeistMangaParser
|
||||
|
||||
@MangaSourceParser("SOLOOSCAN", "SolooScan", "pt")
|
||||
internal class SolooScan(context: MangaLoaderContext) :
|
||||
ZeistMangaParser(context, MangaSource.SOLOOSCAN, "solooscan.blogspot.com") {
|
||||
override val mangaCategory = "Recentes"
|
||||
override val sateOngoing: String = "Lançando"
|
||||
override val sateFinished: String = "Completo"
|
||||
override val sateAbandoned: String = "Dropado"
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
package org.koitharu.kotatsu.parsers.site.zeistmanga.pt
|
||||
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
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.site.zeistmanga.ZeistMangaParser
|
||||
|
||||
@MangaSourceParser("TEMAKIMANGAS", "TemakiMangas", "pt")
|
||||
internal class TemakiMangas(context: MangaLoaderContext) :
|
||||
ZeistMangaParser(context, MangaSource.TEMAKIMANGAS, "www.temakimangas.xyz") {
|
||||
override val availableStates: Set<MangaState> = emptySet()
|
||||
override suspend fun getAvailableTags(): Set<MangaTag> = emptySet()
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user