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
master
devi 2 years ago
parent ad7c953d29
commit cd468df9ad

@ -147,7 +147,8 @@ class TuMangaOnlineParser(context: MangaLoaderContext) : PagedMangaParser(
return MangaChapter( return MangaChapter(
id = generateUid(href), id = generateUid(href),
name = "One Shot", name = "One Shot",
number = 1, number = 1f,
volume = 0,
url = href, url = href,
scanlator = element.select("div.col-md-6.text-truncate").text(), scanlator = element.select("div.col-md-6.text-truncate").text(),
branch = null, branch = null,
@ -163,7 +164,8 @@ class TuMangaOnlineParser(context: MangaLoaderContext) : PagedMangaParser(
return MangaChapter( return MangaChapter(
id = generateUid(href), id = generateUid(href),
name = chName, name = chName,
number = number + 1, number = number + 1f,
volume = 0,
url = href, url = href,
scanlator = element.select("div.col-md-6.text-truncate").text(), scanlator = element.select("div.col-md-6.text-truncate").text(),
branch = null, branch = null,

@ -228,7 +228,8 @@ internal class BentomangaParser(context: MangaLoaderContext) : PagedMangaParser(
MangaChapter( MangaChapter(
id = generateUid(href), id = generateUid(href),
name = if (name != null && name != title) "$title: $name" else title, name = if (name != null && name != title) "$title: $name" else title,
number = href.substringAfterLast('/').toIntOrNull() ?: 0, number = href.substringAfterLast('/').toFloatOrNull() ?: 0f,
volume = 0,
url = href, url = href,
scanlator = div.selectFirst(".team_link-name")?.textOrNull(), scanlator = div.selectFirst(".team_link-name")?.textOrNull(),
uploadDate = div.selectFirst(".component-chapter-date") uploadDate = div.selectFirst(".component-chapter-date")

@ -158,7 +158,8 @@ internal abstract class GalleryAdultsParser(
MangaChapter( MangaChapter(
id = manga.id, id = manga.id,
name = manga.title, name = manga.title,
number = 1, number = 1f,
volume = 0,
url = urlChapters, url = urlChapters,
scanlator = null, scanlator = null,
uploadDate = 0, uploadDate = 0,

@ -131,7 +131,8 @@ internal class HentaiEra(context: MangaLoaderContext) :
MangaChapter( MangaChapter(
id = manga.id, id = manga.id,
name = manga.title, name = manga.title,
number = 1, number = 1f,
volume = 0,
url = urlChapters, url = urlChapters,
scanlator = null, scanlator = null,
uploadDate = 0, uploadDate = 0,

@ -115,7 +115,8 @@ internal abstract class GattsuParser(
MangaChapter( MangaChapter(
id = manga.id, id = manga.id,
name = manga.title, name = manga.title,
number = 1, number = 1f,
volume = 0,
url = urlChapter, url = urlChapter,
scanlator = null, scanlator = null,
uploadDate = 0, uploadDate = 0,

@ -91,7 +91,8 @@ internal abstract class GuyaParser(
MangaChapter( MangaChapter(
id = generateUid(url), id = generateUid(url),
name = chapter.getString("title"), name = chapter.getString("title"),
number = i, number = i.toFloat(),
volume = 0,
url = url, url = url,
scanlator = null, scanlator = null,
uploadDate = 0, uploadDate = 0,

@ -126,7 +126,8 @@ class DoujinDesuParser(context: MangaLoaderContext) : PagedMangaParser(context,
MangaChapter( MangaChapter(
id = generateUid(url), id = generateUid(url),
name = titleTag.text(), name = titleTag.text(),
number = index + 1, number = index + 1f,
volume = 0,
url = url, url = url,
scanlator = null, scanlator = null,
uploadDate = chapterDateFormat.tryParse(element.select(".epsleft > .date").text()), uploadDate = chapterDateFormat.tryParse(element.select(".epsleft > .date").text()),

@ -7,4 +7,4 @@ import org.koitharu.kotatsu.parsers.model.MangaSource
@MangaSourceParser("MANGAWORLD", "MangaWorld", "it") @MangaSourceParser("MANGAWORLD", "MangaWorld", "it")
internal class MangaWorld( internal class MangaWorld(
context: MangaLoaderContext, 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.* import java.util.*
abstract class MangaWorldParser( abstract class MangaWorldParser(
context: MangaLoaderContext, context: MangaLoaderContext,
source: MangaSource, source: MangaSource,
domain: String, domain: String,
pageSize: Int = 16 pageSize: Int = 16,
) : PagedMangaParser(context, source, pageSize) { ) : PagedMangaParser(context, source, pageSize) {
override val availableSortOrders: Set<SortOrder> = 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 override val defaultSortOrder: SortOrder
get() = SortOrder.ALPHABETICAL get() = SortOrder.ALPHABETICAL
override val configKeyDomain = ConfigKey.Domain(domain) 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 override val isMultipleTagsSupported = true
@ -43,7 +50,9 @@ abstract class MangaWorldParser(
} }
is MangaListFilter.Advanced -> { 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()) { if (filter.tags.isNotEmpty()) {
filter.tags.joinTo(this, "&") { it.key.substringAfter("archive?") } filter.tags.joinTo(this, "&") { it.key.substringAfter("archive?") }

@ -219,7 +219,8 @@ internal abstract class LikeMangaParser(
MangaChapter( MangaChapter(
id = generateUid(url), id = generateUid(url),
name = li.selectFirstOrThrow("a").text(), name = li.selectFirstOrThrow("a").text(),
number = chapNum.toInt(), number = chapNum.toFloat(),
volume = 0,
url = url, url = url,
scanlator = null, scanlator = null,
uploadDate = parseChapterDate( uploadDate = parseChapterDate(

@ -1,10 +1,49 @@
package org.koitharu.kotatsu.parsers.site.madara.ar package org.koitharu.kotatsu.parsers.site.madara.ar
import org.jsoup.nodes.Document
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.MangaChapter
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
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") @MangaSourceParser("ROCKSMANGA", "RocksManga", "ar")
internal class RocksManga(context: MangaLoaderContext) : 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.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("PARAGONSCANS", "ParagonScans", "en") @MangaSourceParser("MANGATX_TO", "MangaTx.to", "en")
internal class Paragonscans(context: MangaLoaderContext) : internal class MangaTxTo(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.PARAGONSCANS, "paragonscans.com", pageSize = 50) { MadaraParser(context, MangaSource.MANGATX_TO, "mangatx.to", 10) {
override val datePattern = "MM/dd/yyyy" 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.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("CRYSTALSCAN", "CrystalScan", "pt") @MangaSourceParser("CRYSTALSCAN", "CrystalComics", "pt")
internal class CrystalScan(context: MangaLoaderContext) : 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.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("GALINHASAMURAI", "Galinha Samurai", "pt") @MangaSourceParser("GALINHASAMURAI", "GalinhaSamurai", "pt")
internal class GalinhaSamurai(context: MangaLoaderContext) : internal class GalinhaSamurai(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.GALINHASAMURAI, "galinhasamurai.com") { MadaraParser(context, MangaSource.GALINHASAMURAI, "galinhasamurai.com") {
override val datePattern = "dd/MM/yyyy" 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.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("KAKUSEIPROJECT", "Kakusei Project", "pt") @MangaSourceParser("KAKUSEIPROJECT", "KakuseiProject", "pt")
internal class KakuseiProject(context: MangaLoaderContext) : internal class KakuseiProject(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.KAKUSEIPROJECT, "kakuseiproject.com", 10) 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.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("NINJASCAN", "NinjaScan", "pt") @MangaSourceParser("NINJASCAN", "NinjaComics", "pt")
internal class NinjaScan(context: MangaLoaderContext) : 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" override val datePattern: String = "dd 'de' MMMMM 'de' yyyy"
} }

@ -1,10 +1,12 @@
package org.koitharu.kotatsu.parsers.site.madara.pt 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.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 // Not dead, changed template
@MangaSourceParser("SINENSISSCANS", "SinensisScans", "pt") @MangaSourceParser("SINENSISSCANS", "SinensisScans", "pt")
internal class SinensisScans(context: MangaLoaderContext) : internal class SinensisScans(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.SINENSISSCANS, "sinensistoon.com") { 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) : 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 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") @MangaSourceParser("FLAMECOMICS", "FlameComics", "en")
internal class FlameComics(context: MangaLoaderContext) : 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" override val listUrl = "/series"
} }

@ -8,6 +8,5 @@ import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser
@MangaSourceParser("KAISCANS", "KaiScans", "en") @MangaSourceParser("KAISCANS", "KaiScans", "en")
internal class KaiScans(context: MangaLoaderContext) : internal class KaiScans(context: MangaLoaderContext) :
MangaReaderParser(context, MangaSource.KAISCANS, "kaiscans.org", pageSize = 20, searchPageSize = 10) { MangaReaderParser(context, MangaSource.KAISCANS, "kaiscans.org", pageSize = 20, searchPageSize = 10) {
override val listUrl = "/series"
override val isTagsExclusionSupported = false override val isTagsExclusionSupported = false
} }

@ -7,7 +7,7 @@ import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser
@MangaSourceParser("LUMINOUSSCANS", "LuminousScans", "en") @MangaSourceParser("LUMINOUSSCANS", "LuminousScans", "en")
internal class LuminousScans(context: MangaLoaderContext) : 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 listUrl = "/series"
override val isTagsExclusionSupported = false 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( MangaChapter(
id = generateUid(url), id = generateUid(url),
name = name, name = name,
number = i, number = i.toFloat(),
volume = 0,
url = url, url = url,
scanlator = null, scanlator = null,
uploadDate = parseChapterDate( uploadDate = parseChapterDate(

@ -6,6 +6,7 @@ import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.Response import okhttp3.Response
import okhttp3.ResponseBody.Companion.toResponseBody import okhttp3.ResponseBody.Companion.toResponseBody
import org.json.JSONArray import org.json.JSONArray
import org.koitharu.kotatsu.parsers.Broken
import org.koitharu.kotatsu.parsers.ErrorMessages import org.koitharu.kotatsu.parsers.ErrorMessages
import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaParser import org.koitharu.kotatsu.parsers.MangaParser
@ -16,13 +17,14 @@ import org.koitharu.kotatsu.parsers.util.*
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.zip.ZipInputStream 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), internal class LuratoonScansParser(context: MangaLoaderContext) : MangaParser(context, MangaSource.RANDOMSCANS),
Interceptor { Interceptor {
override val availableSortOrders = setOf(SortOrder.ALPHABETICAL) 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()) private val userAgentKey = ConfigKey.UserAgent(context.getDefaultUserAgent())

@ -12,11 +12,11 @@ import java.text.DateFormat
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.* import java.util.*
@MangaSourceParser("YUGENMANGAS", "YugenMangas.net.br", "pt") @MangaSourceParser("YUGENMANGAS", "YugenApp", "pt")
class YugenMangas(context: MangaLoaderContext) : PagedMangaParser(context, MangaSource.YUGENMANGAS, 28) { class YugenMangas(context: MangaLoaderContext) : PagedMangaParser(context, MangaSource.YUGENMANGAS, 28) {
override val availableSortOrders: Set<SortOrder> = EnumSet.of(SortOrder.ALPHABETICAL, SortOrder.UPDATED) override val availableSortOrders: Set<SortOrder> = EnumSet.of(SortOrder.UPDATED)
override val configKeyDomain = ConfigKey.Domain("yugenmangas.net.br") override val configKeyDomain = ConfigKey.Domain("yugenapp.lat")
override suspend fun getListPage(page: Int, filter: MangaListFilter?): List<Manga> { override suspend fun getListPage(page: Int, filter: MangaListFilter?): List<Manga> {
@ -32,7 +32,7 @@ class YugenMangas(context: MangaLoaderContext) : PagedMangaParser(context, Manga
val url = buildString { val url = buildString {
append("https://api.") append("https://api.")
append(domain) append(domain)
append("/api/series/list/?query=") append("/api/series/?search=")
append(filter.query.urlEncoded()) append(filter.query.urlEncoded())
} }
webClient.httpGet(url).parseJsonArray() webClient.httpGet(url).parseJsonArray()
@ -41,22 +41,12 @@ class YugenMangas(context: MangaLoaderContext) : PagedMangaParser(context, Manga
is MangaListFilter.Advanced -> { is MangaListFilter.Advanced -> {
if (filter.sortOrder == SortOrder.UPDATED) { val url = buildString {
val url = buildString { append("https://api.")
append("https://api.") append(domain)
append(domain) append("/api/latest_updates/")
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")
} }
webClient.httpGet(url).parseJsonArray()
} }
null -> { null -> {
@ -73,7 +63,7 @@ class YugenMangas(context: MangaLoaderContext) : PagedMangaParser(context, Manga
val slug = j.getString("slug") val slug = j.getString("slug")
val cover = if (!j.getString("cover").startsWith("https://")) { val cover = if (!j.getString("cover").startsWith("https://")) {
// Some covers don't have the "/" so we ensure that the URL will be spelled correctly. // 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 { } else {
j.getString("cover") j.getString("cover")
} }
@ -97,11 +87,12 @@ class YugenMangas(context: MangaLoaderContext) : PagedMangaParser(context, Manga
override suspend fun getDetails(manga: Manga): Manga { override suspend fun getDetails(manga: Manga): Manga {
val detailManga = 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() val body = JSONObject()
body.put("serie_slug", manga.url) body.put("serie_slug", manga.url)
val chapterManga = webClient.httpPost("https://api.$domain/api/get_chapters_by_serie/", body).parseJson() val chapterManga =
.getJSONArray("chapters") webClient.httpPost("https://api.$domain/api/chapters/get_chapters_by_serie/", body).parseJson()
.getJSONArray("chapters")
val dateFormat = SimpleDateFormat("dd/MM/yyyy", sourceLocale) val dateFormat = SimpleDateFormat("dd/MM/yyyy", sourceLocale)
return manga.copy( return manga.copy(
description = detailManga.getString("synopsis"), description = detailManga.getString("synopsis"),
@ -117,11 +108,12 @@ class YugenMangas(context: MangaLoaderContext) : PagedMangaParser(context, Manga
} }
}, },
chapters = chapterManga.mapJSON { j -> 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( MangaChapter(
id = generateUid(url), id = generateUid(url),
name = j.getString("name"), name = j.getString("name"),
number = j.getString("name").removePrefix("Capítulo ").toInt(), number = j.getString("name").removePrefix("Capítulo ").toFloat(),
volume = 0,
url = url, url = url,
scanlator = null, scanlator = null,
uploadDate = parseChapterDate( 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 jsonPages = webClient.httpPost(chapter.url, emptyMap()).parseJson().getJSONArray("chapter_images")
val pages = ArrayList<MangaPage>(jsonPages.length()) val pages = ArrayList<MangaPage>(jsonPages.length())
for (i in 0 until 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( pages.add(
MangaPage( MangaPage(
id = generateUid(img), id = generateUid(img),

@ -142,7 +142,8 @@ internal class AComics(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.replace("/about", "/"), url = manga.url.replace("/about", "/"),
scanlator = null, scanlator = null,
uploadDate = 0, uploadDate = 0,

@ -87,7 +87,7 @@ internal abstract class LibSocialParser(
SortOrder.NEWEST -> "created_at" SortOrder.NEWEST -> "created_at"
SortOrder.ALPHABETICAL, SortOrder.ALPHABETICAL,
SortOrder.ALPHABETICAL_DESC, SortOrder.ALPHABETICAL_DESC,
-> "rus_name" -> "rus_name"
}, },
) )
urlBuilder.addQueryParameter( urlBuilder.addQueryParameter(
@ -98,7 +98,7 @@ internal abstract class LibSocialParser(
SortOrder.RATING, SortOrder.RATING,
SortOrder.NEWEST, SortOrder.NEWEST,
SortOrder.ALPHABETICAL_DESC, SortOrder.ALPHABETICAL_DESC,
-> "desc" -> "desc"
SortOrder.ALPHABETICAL -> "asc" SortOrder.ALPHABETICAL -> "asc"
}, },

@ -197,7 +197,8 @@ class BlogTruyenParser(context: MangaLoaderContext) :
MangaChapter( MangaChapter(
id = generateUid(id), id = generateUid(id),
name = name, name = name,
number = index + 1, number = index + 1f,
volume = 0,
url = relativeUrl, url = relativeUrl,
scanlator = null, scanlator = null,
uploadDate = uploadDate, uploadDate = uploadDate,

@ -244,7 +244,8 @@ class HentaiVNParser(context: MangaLoaderContext) : MangaParser(context, MangaSo
MangaChapter( MangaChapter(
id = generateUid(titleEl.attrAsRelativeUrl("href")), id = generateUid(titleEl.attrAsRelativeUrl("href")),
name = titleEl.text(), name = titleEl.text(),
number = index + 1, number = index + 1f,
volume = 0,
url = titleEl.attrAsRelativeUrl("href"), url = titleEl.attrAsRelativeUrl("href"),
scanlator = null, scanlator = null,
uploadDate = chapterDateFormat.tryParse(dateStr), uploadDate = chapterDateFormat.tryParse(dateStr),

@ -142,7 +142,8 @@ internal class LxManga(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(date), uploadDate = dateFormat.tryParse(date),

@ -133,7 +133,8 @@ class TruyentranhLHParser(context: MangaLoaderContext) :
MangaChapter( MangaChapter(
id = generateUid(element.attrAsRelativeUrl("href")), id = generateUid(element.attrAsRelativeUrl("href")),
name = element.selectFirst(".chapter-name")?.text()?.trim().orEmpty(), name = element.selectFirst(".chapter-name")?.text()?.trim().orEmpty(),
number = index + 1, number = index + 1f,
volume = 0,
url = element.attrAsRelativeUrl("href"), url = element.attrAsRelativeUrl("href"),
scanlator = null, scanlator = null,
uploadDate = chapterDateFormat.tryParse(element.selectFirst(".chapter-time")?.text()), uploadDate = chapterDateFormat.tryParse(element.selectFirst(".chapter-time")?.text()),

@ -122,7 +122,8 @@ internal abstract class VmpParser(
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,

@ -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()
}
Loading…
Cancel
Save