Replace deprecated extensions

Koitharu 4 years ago
parent fb1499d3a7
commit b3905b66eb
No known key found for this signature in database
GPG Key ID: 8E861F8CE6E7CE27

@ -91,7 +91,7 @@ abstract class MangaParser @InternalParsersApi constructor(val source: MangaSour
/** /**
* Fetch direct link to the page image. * Fetch direct link to the page image.
*/ */
open suspend fun getPageUrl(page: MangaPage): String = page.url.withDomain() open suspend fun getPageUrl(page: MangaPage): String = page.url.toAbsoluteUrl(getDomain())
/** /**
* Fetch available tags (genres) for source * Fetch available tags (genres) for source

@ -11,6 +11,7 @@ import org.koitharu.kotatsu.parsers.model.*
import org.koitharu.kotatsu.parsers.util.json.mapJSON import org.koitharu.kotatsu.parsers.util.json.mapJSON
import org.koitharu.kotatsu.parsers.util.json.mapJSONIndexed import org.koitharu.kotatsu.parsers.util.json.mapJSONIndexed
import org.koitharu.kotatsu.parsers.util.json.stringIterator import org.koitharu.kotatsu.parsers.util.json.stringIterator
import org.koitharu.kotatsu.parsers.util.toAbsoluteUrl
import java.util.* import java.util.*
@MangaSourceParser("ANIBEL", "Anibel", "be") @MangaSourceParser("ANIBEL", "Anibel", "be")
@ -71,7 +72,7 @@ internal class AnibelParser(override val context: MangaLoaderContext) : MangaPar
id = generateUid(mediaId), id = generateUid(mediaId),
title = title.getString("be"), title = title.getString("be"),
coverUrl = jo.getString("poster").removePrefix("/cdn") coverUrl = jo.getString("poster").removePrefix("/cdn")
.withDomain("cdn") + "?width=200&height=280", .toAbsoluteUrl(getDomain(), "cdn") + "?width=200&height=280",
altTitle = title.getString("alt").takeUnless(String::isEmpty), altTitle = title.getString("alt").takeUnless(String::isEmpty),
author = null, author = null,
isNsfw = false, isNsfw = false,
@ -111,7 +112,7 @@ internal class AnibelParser(override val context: MangaLoaderContext) : MangaPar
).getJSONObject("media") ).getJSONObject("media")
val title = details.getJSONObject("title") val title = details.getJSONObject("title")
val poster = details.getString("poster").removePrefix("/cdn") val poster = details.getString("poster").removePrefix("/cdn")
.withDomain("cdn") .toAbsoluteUrl(getDomain(), "cdn")
val chapters = apiCall( val chapters = apiCall(
""" """
chapters(mediaId: "${details.getString("mediaId")}") { chapters(mediaId: "${details.getString("mediaId")}") {
@ -212,7 +213,7 @@ internal class AnibelParser(override val context: MangaLoaderContext) : MangaPar
id = generateUid(mediaId), id = generateUid(mediaId),
title = title.getString("be"), title = title.getString("be"),
coverUrl = jo.getString("poster").removePrefix("/cdn") coverUrl = jo.getString("poster").removePrefix("/cdn")
.withDomain("cdn") + "?width=200&height=280", .toAbsoluteUrl(getDomain(), "cdn") + "?width=200&height=280",
altTitle = title.getString("en").takeUnless(String::isEmpty), altTitle = title.getString("en").takeUnless(String::isEmpty),
author = null, author = null,
isNsfw = false, isNsfw = false,

@ -69,7 +69,7 @@ internal class BatoToParser(override val context: MangaLoaderContext) : MangaPar
} }
override suspend fun getDetails(manga: Manga): Manga { override suspend fun getDetails(manga: Manga): Manga {
val root = context.httpGet(manga.url.withDomain()).parseHtml() val root = context.httpGet(manga.url.toAbsoluteUrl(getDomain())).parseHtml()
.getElementById("mainer") ?: parseFailed("Cannot find root") .getElementById("mainer") ?: parseFailed("Cannot find root")
val details = root.selectFirst(".detail-set") ?: parseFailed("Cannot find detail-set") val details = root.selectFirst(".detail-set") ?: parseFailed("Cannot find detail-set")
val attrs = details.selectFirst(".attr-main")?.select(".attr-item")?.associate { val attrs = details.selectFirst(".attr-main")?.select(".attr-item")?.associate {
@ -100,7 +100,7 @@ internal class BatoToParser(override val context: MangaLoaderContext) : MangaPar
} }
override suspend fun getPages(chapter: MangaChapter): List<MangaPage> { override suspend fun getPages(chapter: MangaChapter): List<MangaPage> {
val fullUrl = chapter.url.withDomain() val fullUrl = chapter.url.toAbsoluteUrl(getDomain())
val scripts = context.httpGet(fullUrl).parseHtml().select("script") val scripts = context.httpGet(fullUrl).parseHtml().select("script")
for (script in scripts) { for (script in scripts) {
val scriptSrc = script.html() val scriptSrc = script.html()

@ -73,7 +73,7 @@ internal abstract class ChanParser(source: MangaSource) : MangaParser(source) {
} }
override suspend fun getDetails(manga: Manga): Manga { override suspend fun getDetails(manga: Manga): Manga {
val doc = context.httpGet(manga.url.withDomain()).parseHtml() val doc = context.httpGet(manga.url.toAbsoluteUrl(getDomain())).parseHtml()
val root = val root =
doc.body().getElementById("dle-content") ?: parseFailed("Cannot find root") doc.body().getElementById("dle-content") ?: parseFailed("Cannot find root")
val dateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.US) val dateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.US)
@ -98,7 +98,7 @@ internal abstract class ChanParser(source: MangaSource) : MangaParser(source) {
} }
override suspend fun getPages(chapter: MangaChapter): List<MangaPage> { override suspend fun getPages(chapter: MangaChapter): List<MangaPage> {
val fullUrl = chapter.url.withDomain() val fullUrl = chapter.url.toAbsoluteUrl(getDomain())
val doc = context.httpGet(fullUrl).parseHtml() val doc = context.httpGet(fullUrl).parseHtml()
val scripts = doc.select("script") val scripts = doc.select("script")
for (script in scripts) { for (script in scripts) {

@ -81,7 +81,7 @@ internal class DesuMeParser(override val context: MangaLoaderContext) : MangaPar
} }
override suspend fun getDetails(manga: Manga): Manga { override suspend fun getDetails(manga: Manga): Manga {
val url = manga.url.withDomain() val url = manga.url.toAbsoluteUrl(getDomain())
val json = context.httpGet(url).parseJson().getJSONObject("response") val json = context.httpGet(url).parseJson().getJSONObject("response")
?: throw ParseException("Invalid response") ?: throw ParseException("Invalid response")
val baseChapterUrl = manga.url + "/chapter/" val baseChapterUrl = manga.url + "/chapter/"
@ -116,7 +116,7 @@ internal class DesuMeParser(override val context: MangaLoaderContext) : MangaPar
} }
override suspend fun getPages(chapter: MangaChapter): List<MangaPage> { override suspend fun getPages(chapter: MangaChapter): List<MangaPage> {
val fullUrl = chapter.url.withDomain() val fullUrl = chapter.url.toAbsoluteUrl(getDomain())
val json = context.httpGet(fullUrl) val json = context.httpGet(fullUrl)
.parseJson() .parseJson()
.getJSONObject("response") ?: throw ParseException("Invalid response") .getJSONObject("response") ?: throw ParseException("Invalid response")

@ -134,7 +134,7 @@ internal class ExHentaiParser(
} }
override suspend fun getDetails(manga: Manga): Manga { override suspend fun getDetails(manga: Manga): Manga {
val doc = context.httpGet(manga.url.withDomain()).parseHtml() val doc = context.httpGet(manga.url.toAbsoluteUrl(getDomain())).parseHtml()
val root = doc.body().selectFirst("div.gm") ?: parseFailed("Cannot find root") val root = doc.body().selectFirst("div.gm") ?: parseFailed("Cannot find root")
val cover = root.getElementById("gd1")?.children()?.first() val cover = root.getElementById("gd1")?.children()?.first()
val title = root.getElementById("gd2") val title = root.getElementById("gd2")
@ -178,7 +178,7 @@ internal class ExHentaiParser(
} }
override suspend fun getPages(chapter: MangaChapter): List<MangaPage> { override suspend fun getPages(chapter: MangaChapter): List<MangaPage> {
val doc = context.httpGet(chapter.url.withDomain()).parseHtml() val doc = context.httpGet(chapter.url.toAbsoluteUrl(getDomain())).parseHtml()
val root = doc.body().getElementById("gdt") ?: parseFailed("Root not found") val root = doc.body().getElementById("gdt") ?: parseFailed("Root not found")
return root.select("a").map { a -> return root.select("a").map { a ->
val url = a.attrAsRelativeUrl("href") val url = a.attrAsRelativeUrl("href")
@ -193,7 +193,7 @@ internal class ExHentaiParser(
} }
override suspend fun getPageUrl(page: MangaPage): String { override suspend fun getPageUrl(page: MangaPage): String {
val doc = context.httpGet(page.url.withDomain()).parseHtml() val doc = context.httpGet(page.url.toAbsoluteUrl(getDomain())).parseHtml()
return doc.body().getElementById("img")?.absUrl("src") return doc.body().getElementById("img")?.absUrl("src")
?: parseFailed("Image not found") ?: parseFailed("Image not found")
} }

@ -121,7 +121,7 @@ internal abstract class GroupleParser(source: MangaSource, userAgent: String) :
} }
override suspend fun getDetails(manga: Manga): Manga { override suspend fun getDetails(manga: Manga): Manga {
val doc = context.httpGet(manga.url.withDomain(), headers).parseHtml() val doc = context.httpGet(manga.url.toAbsoluteUrl(getDomain()), headers).parseHtml()
val root = doc.body().getElementById("mangaBox")?.selectFirst("div.leftContent") val root = doc.body().getElementById("mangaBox")?.selectFirst("div.leftContent")
?: parseFailed("Cannot find root") ?: parseFailed("Cannot find root")
val dateFormat = SimpleDateFormat("dd.MM.yy", Locale.US) val dateFormat = SimpleDateFormat("dd.MM.yy", Locale.US)
@ -166,7 +166,7 @@ internal abstract class GroupleParser(source: MangaSource, userAgent: String) :
} }
override suspend fun getPages(chapter: MangaChapter): List<MangaPage> { override suspend fun getPages(chapter: MangaChapter): List<MangaPage> {
val doc = context.httpGet(chapter.url.withDomain() + "?mtr=1", headers).parseHtml() val doc = context.httpGet(chapter.url.toAbsoluteUrl(getDomain()) + "?mtr=1", headers).parseHtml()
val scripts = doc.select("script") val scripts = doc.select("script")
for (script in scripts) { for (script in scripts) {
val data = script.html() val data = script.html()

@ -7,6 +7,7 @@ import org.koitharu.kotatsu.parsers.exception.ParseException
import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.model.*
import org.koitharu.kotatsu.parsers.util.mapToSet import org.koitharu.kotatsu.parsers.util.mapToSet
import org.koitharu.kotatsu.parsers.util.parseHtml import org.koitharu.kotatsu.parsers.util.parseHtml
import org.koitharu.kotatsu.parsers.util.toAbsoluteUrl
import org.koitharu.kotatsu.parsers.util.toTitleCase import org.koitharu.kotatsu.parsers.util.toTitleCase
@MangaSourceParser("HENCHAN", "Хентай-тян", "ru") @MangaSourceParser("HENCHAN", "Хентай-тян", "ru")
@ -32,7 +33,7 @@ internal class HenChanParser(override val context: MangaLoaderContext) : ChanPar
} }
override suspend fun getDetails(manga: Manga): Manga { override suspend fun getDetails(manga: Manga): Manga {
val doc = context.httpGet(manga.url.withDomain()).parseHtml() val doc = context.httpGet(manga.url.toAbsoluteUrl(getDomain())).parseHtml()
val root = val root =
doc.body().getElementById("dle-content") ?: throw ParseException("Cannot find root") doc.body().getElementById("dle-content") ?: throw ParseException("Cannot find root")
val readLink = manga.url.replace("manga", "online") val readLink = manga.url.replace("manga", "online")

@ -115,7 +115,7 @@ internal abstract class MadaraParser(
} }
override suspend fun getDetails(manga: Manga): Manga { override suspend fun getDetails(manga: Manga): Manga {
val fullUrl = manga.url.withDomain() val fullUrl = manga.url.toAbsoluteUrl(getDomain())
val doc = context.httpGet(fullUrl).parseHtml() val doc = context.httpGet(fullUrl).parseHtml()
val root = doc.body().selectFirst("div.profile-manga") val root = doc.body().selectFirst("div.profile-manga")
?.selectFirst("div.summary_content") ?.selectFirst("div.summary_content")
@ -160,7 +160,7 @@ internal abstract class MadaraParser(
} }
override suspend fun getPages(chapter: MangaChapter): List<MangaPage> { override suspend fun getPages(chapter: MangaChapter): List<MangaPage> {
val fullUrl = chapter.url.withDomain() val fullUrl = chapter.url.toAbsoluteUrl(getDomain())
val doc = context.httpGet(fullUrl).parseHtml() val doc = context.httpGet(fullUrl).parseHtml()
val root = doc.body().selectFirst("div.main-col-inner") val root = doc.body().selectFirst("div.main-col-inner")
?.selectFirst("div.reading-content") ?.selectFirst("div.reading-content")

@ -35,11 +35,11 @@ class MangaInUaParser(override val context: MangaLoaderContext) : MangaParser(Ma
"&full_search=1" + "&full_search=1" +
"&story=$query" + "&story=$query" +
"&titleonly=3" "&titleonly=3"
).withDomain() ).toAbsoluteUrl(getDomain())
tags.isNullOrEmpty() -> "/mangas/page/$page".withDomain() tags.isNullOrEmpty() -> "/mangas/page/$page".toAbsoluteUrl(getDomain())
tags.size == 1 -> "${tags.first().key}/page/$page" tags.size == 1 -> "${tags.first().key}/page/$page"
tags.size > 1 -> throw IllegalArgumentException("This source supports only 1 genre") tags.size > 1 -> throw IllegalArgumentException("This source supports only 1 genre")
else -> "/mangas/page/$page".withDomain() else -> "/mangas/page/$page".toAbsoluteUrl(getDomain())
} }
val doc = context.httpGet(url).parseHtml() val doc = context.httpGet(url).parseHtml()
val container = doc.body().getElementById("dle-content") ?: parseFailed("Container not found") val container = doc.body().getElementById("dle-content") ?: parseFailed("Container not found")
@ -77,7 +77,7 @@ class MangaInUaParser(override val context: MangaLoaderContext) : MangaParser(Ma
} }
override suspend fun getDetails(manga: Manga): Manga { override suspend fun getDetails(manga: Manga): Manga {
val doc = context.httpGet(manga.url.withDomain()).parseHtml() val doc = context.httpGet(manga.url.toAbsoluteUrl(getDomain())).parseHtml()
val root = val root =
doc.body().getElementById("dle-content") ?: parseFailed("Cannot find root") doc.body().getElementById("dle-content") ?: parseFailed("Cannot find root")
val dateFormat = SimpleDateFormat("dd.MM.yyyy", Locale.US) val dateFormat = SimpleDateFormat("dd.MM.yyyy", Locale.US)
@ -118,7 +118,7 @@ class MangaInUaParser(override val context: MangaLoaderContext) : MangaParser(Ma
} }
override suspend fun getPages(chapter: MangaChapter): List<MangaPage> { override suspend fun getPages(chapter: MangaChapter): List<MangaPage> {
val fullUrl = chapter.url.withDomain() val fullUrl = chapter.url.toAbsoluteUrl(getDomain())
val doc = context.httpGet(fullUrl).parseHtml() val doc = context.httpGet(fullUrl).parseHtml()
val root = val root =
doc.body().getElementById("comics")?.selectFirst("ul.xfieldimagegallery") ?: parseFailed("Root not found") doc.body().getElementById("comics")?.selectFirst("ul.xfieldimagegallery") ?: parseFailed("Root not found")

@ -84,7 +84,7 @@ internal open class MangaLibParser(
} }
override suspend fun getDetails(manga: Manga): Manga { override suspend fun getDetails(manga: Manga): Manga {
val fullUrl = manga.url.withDomain() val fullUrl = manga.url.toAbsoluteUrl(getDomain())
val doc = context.httpGet("$fullUrl?section=info").parseHtml() val doc = context.httpGet("$fullUrl?section=info").parseHtml()
val root = doc.body().getElementById("main-page") ?: throw ParseException("Root not found") val root = doc.body().getElementById("main-page") ?: throw ParseException("Root not found")
val title = root.selectFirst("div.media-header__wrap")?.children() val title = root.selectFirst("div.media-header__wrap")?.children()
@ -165,7 +165,7 @@ internal open class MangaLibParser(
} }
override suspend fun getPages(chapter: MangaChapter): List<MangaPage> { override suspend fun getPages(chapter: MangaChapter): List<MangaPage> {
val fullUrl = chapter.url.withDomain() val fullUrl = chapter.url.toAbsoluteUrl(getDomain())
val doc = context.httpGet(fullUrl).parseHtml() val doc = context.httpGet(fullUrl).parseHtml()
if (doc.location().endsWith("/register")) { if (doc.location().endsWith("/register")) {
throw AuthRequiredException(source) throw AuthRequiredException(source)
@ -279,8 +279,8 @@ internal open class MangaLibParser(
state = null, state = null,
isNsfw = false, isNsfw = false,
source = source, source = source,
coverUrl = covers.getString("thumbnail").withDomain(), coverUrl = covers.getString("thumbnail").toAbsoluteUrl(domain),
largeCoverUrl = covers.getString("default").withDomain(), largeCoverUrl = covers.getString("default").toAbsoluteUrl(domain),
) )
} }
} }

@ -70,7 +70,7 @@ internal class MangaOwlParser(override val context: MangaLoaderContext) : MangaP
isNsfw = false, isNsfw = false,
tags = emptySet(), tags = emptySet(),
state = null, state = null,
publicUrl = href.withDomain(), publicUrl = href.toAbsoluteUrl(getDomain()),
source = source, source = source,
) )
} }
@ -130,7 +130,7 @@ internal class MangaOwlParser(override val context: MangaLoaderContext) : MangaP
} }
override suspend fun getPages(chapter: MangaChapter): List<MangaPage> { override suspend fun getPages(chapter: MangaChapter): List<MangaPage> {
val fullUrl = chapter.url.withDomain() val fullUrl = chapter.url.toAbsoluteUrl(getDomain())
val doc = context.httpGet(fullUrl).parseHtml() val doc = context.httpGet(fullUrl).parseHtml()
val root = doc.body().select("div.item img.owl-lazy") ?: throw ParseException("Root not found") val root = doc.body().select("div.item img.owl-lazy") ?: throw ParseException("Root not found")
return root.map { div -> return root.map { div ->

@ -43,12 +43,12 @@ internal class MangaTownParser(override val context: MangaLoaderContext) : Manga
if (offset != 0) { if (offset != 0) {
return emptyList() return emptyList()
} }
"/search?name=${query.urlEncoded()}".withDomain() "/search?name=${query.urlEncoded()}".toAbsoluteUrl(getDomain())
} }
tags.isNullOrEmpty() -> "/directory/$page.htm$sortKey".withDomain() tags.isNullOrEmpty() -> "/directory/$page.htm$sortKey".toAbsoluteUrl(getDomain())
tags.size == 1 -> "/directory/${tags.first().key}/$page.htm$sortKey".withDomain() tags.size == 1 -> "/directory/${tags.first().key}/$page.htm$sortKey".toAbsoluteUrl(getDomain())
else -> tags.joinToString( else -> tags.joinToString(
prefix = "/search?page=$page".withDomain(), prefix = "/search?page=$page".toAbsoluteUrl(getDomain()),
) { tag -> ) { tag ->
"&genres[${tag.key}]=1" "&genres[${tag.key}]=1"
} }
@ -94,7 +94,7 @@ internal class MangaTownParser(override val context: MangaLoaderContext) : Manga
} }
override suspend fun getDetails(manga: Manga): Manga { override suspend fun getDetails(manga: Manga): Manga {
val doc = context.httpGet(manga.url.withDomain()).parseHtml() val doc = context.httpGet(manga.url.toAbsoluteUrl(getDomain())).parseHtml()
val root = doc.body().selectFirst("section.main") val root = doc.body().selectFirst("section.main")
?.selectFirst("div.article_content") ?: throw ParseException("Cannot find root") ?.selectFirst("div.article_content") ?: throw ParseException("Cannot find root")
val info = root.selectFirst("div.detail_info")?.selectFirst("ul") val info = root.selectFirst("div.detail_info")?.selectFirst("ul")
@ -136,7 +136,7 @@ internal class MangaTownParser(override val context: MangaLoaderContext) : Manga
} }
override suspend fun getPages(chapter: MangaChapter): List<MangaPage> { override suspend fun getPages(chapter: MangaChapter): List<MangaPage> {
val fullUrl = chapter.url.withDomain() val fullUrl = chapter.url.toAbsoluteUrl(getDomain())
val doc = context.httpGet(fullUrl).parseHtml() val doc = context.httpGet(fullUrl).parseHtml()
val root = doc.body().selectFirst("div.page_select") val root = doc.body().selectFirst("div.page_select")
?: throw ParseException("Cannot find root") ?: throw ParseException("Cannot find root")
@ -156,12 +156,12 @@ internal class MangaTownParser(override val context: MangaLoaderContext) : Manga
} }
override suspend fun getPageUrl(page: MangaPage): String { override suspend fun getPageUrl(page: MangaPage): String {
val doc = context.httpGet(page.url.withDomain()).parseHtml() val doc = context.httpGet(page.url.toAbsoluteUrl(getDomain())).parseHtml()
return doc.getElementById("image")?.absUrl("src") ?: parseFailed("Image not found") return doc.getElementById("image")?.absUrl("src") ?: parseFailed("Image not found")
} }
override suspend fun getTags(): Set<MangaTag> { override suspend fun getTags(): Set<MangaTag> {
val doc = context.httpGet("/directory/".withDomain()).parseHtml() val doc = context.httpGet("/directory/".toAbsoluteUrl(getDomain())).parseHtml()
val root = doc.body().selectFirst("aside.right") val root = doc.body().selectFirst("aside.right")
?.getElementsContainingOwnText("Genres") ?.getElementsContainingOwnText("Genres")
?.first() ?.first()
@ -190,7 +190,7 @@ internal class MangaTownParser(override val context: MangaLoaderContext) : Manga
} }
private suspend fun bypassLicensedChapters(manga: Manga): List<MangaChapter> { private suspend fun bypassLicensedChapters(manga: Manga): List<MangaChapter> {
val doc = context.httpGet(manga.url.withDomain("m")).parseHtml() val doc = context.httpGet(manga.url.toAbsoluteUrl(getDomain(), "m")).parseHtml()
val list = doc.body().selectFirst("ul.detail-ch-list") ?: return emptyList() val list = doc.body().selectFirst("ul.detail-ch-list") ?: return emptyList()
val dateFormat = SimpleDateFormat("MMM dd,yyyy", Locale.US) val dateFormat = SimpleDateFormat("MMM dd,yyyy", Locale.US)
return list.select("li").asReversed().mapIndexedNotNull { i, li -> return list.select("li").asReversed().mapIndexedNotNull { i, li ->

@ -94,7 +94,7 @@ internal abstract class NineMangaParser(
override suspend fun getDetails(manga: Manga): Manga { override suspend fun getDetails(manga: Manga): Manga {
val doc = context.httpGet( val doc = context.httpGet(
manga.url.withDomain() + "?waring=1", manga.url.toAbsoluteUrl(getDomain()) + "?waring=1",
headers, headers,
).parseHtml() ).parseHtml()
val root = doc.body().selectFirst("div.manga") val root = doc.body().selectFirst("div.manga")
@ -134,13 +134,13 @@ internal abstract class NineMangaParser(
} }
override suspend fun getPages(chapter: MangaChapter): List<MangaPage> { override suspend fun getPages(chapter: MangaChapter): List<MangaPage> {
val doc = context.httpGet(chapter.url.withDomain(), headers).parseHtml() val doc = context.httpGet(chapter.url.toAbsoluteUrl(getDomain()), headers).parseHtml()
return doc.body().getElementById("page")?.select("option")?.map { option -> return doc.body().getElementById("page")?.select("option")?.map { option ->
val url = option.attr("value") val url = option.attr("value")
MangaPage( MangaPage(
id = generateUid(url), id = generateUid(url),
url = url, url = url,
referer = chapter.url.withDomain(), referer = chapter.url.toAbsoluteUrl(getDomain()),
preview = null, preview = null,
source = source, source = source,
) )
@ -148,7 +148,7 @@ internal abstract class NineMangaParser(
} }
override suspend fun getPageUrl(page: MangaPage): String { override suspend fun getPageUrl(page: MangaPage): String {
val doc = context.httpGet(page.url.withDomain(), headers).parseHtml() val doc = context.httpGet(page.url.toAbsoluteUrl(getDomain()), headers).parseHtml()
val root = doc.body() val root = doc.body()
return root.selectFirst("a.pic_download")?.absUrl("href") return root.selectFirst("a.pic_download")?.absUrl("href")
?: throw ParseException("Page image not found") ?: throw ParseException("Page image not found")

@ -100,7 +100,7 @@ internal class NudeMoonParser(
} }
override suspend fun getDetails(manga: Manga): Manga { override suspend fun getDetails(manga: Manga): Manga {
val body = context.httpGet(manga.url.withDomain()).parseHtml().body() val body = context.httpGet(manga.url.toAbsoluteUrl(getDomain())).parseHtml().body()
val root = body.selectFirst("table.shoutbox") val root = body.selectFirst("table.shoutbox")
?: parseFailed("Cannot find root") ?: parseFailed("Cannot find root")
val info = root.select("div.tbl2") val info = root.select("div.tbl2")
@ -136,7 +136,7 @@ internal class NudeMoonParser(
} }
override suspend fun getPages(chapter: MangaChapter): List<MangaPage> { override suspend fun getPages(chapter: MangaChapter): List<MangaPage> {
val fullUrl = chapter.url.withDomain() val fullUrl = chapter.url.toAbsoluteUrl(getDomain())
val doc = context.httpGet(fullUrl).parseHtml() val doc = context.httpGet(fullUrl).parseHtml()
val mangaId = chapter.url.substringAfterLast('/').substringBefore('-').toIntOrNull() val mangaId = chapter.url.substringAfterLast('/').substringBefore('-').toIntOrNull()

@ -171,7 +171,7 @@ internal class RemangaParser(
override suspend fun getPages(chapter: MangaChapter): List<MangaPage> { override suspend fun getPages(chapter: MangaChapter): List<MangaPage> {
val referer = "https://${getDomain()}/" val referer = "https://${getDomain()}/"
val content = context.httpGet(chapter.url.withDomain(subdomain = "api"), getApiHeaders()) val content = context.httpGet(chapter.url.toAbsoluteUrl(getDomain(), "api"), getApiHeaders())
.handle401() .handle401()
.parseJson() .parseJson()
.getJSONObject("content") .getJSONObject("content")

@ -9,6 +9,7 @@ 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.util.attrAsRelativeUrl import org.koitharu.kotatsu.parsers.util.attrAsRelativeUrl
import org.koitharu.kotatsu.parsers.util.parseHtml import org.koitharu.kotatsu.parsers.util.parseHtml
import org.koitharu.kotatsu.parsers.util.toAbsoluteUrl
@MangaSourceParser("YAOICHAN", "Яой-тян", "ru") @MangaSourceParser("YAOICHAN", "Яой-тян", "ru")
internal class YaoiChanParser(override val context: MangaLoaderContext) : ChanParser(MangaSource.YAOICHAN) { internal class YaoiChanParser(override val context: MangaLoaderContext) : ChanParser(MangaSource.YAOICHAN) {
@ -16,7 +17,7 @@ internal class YaoiChanParser(override val context: MangaLoaderContext) : ChanPa
override val configKeyDomain = ConfigKey.Domain("yaoi-chan.me", null) override val configKeyDomain = ConfigKey.Domain("yaoi-chan.me", null)
override suspend fun getDetails(manga: Manga): Manga { override suspend fun getDetails(manga: Manga): Manga {
val doc = context.httpGet(manga.url.withDomain()).parseHtml() val doc = context.httpGet(manga.url.toAbsoluteUrl(getDomain())).parseHtml()
val root = val root =
doc.body().getElementById("dle-content") ?: throw ParseException("Cannot find root") doc.body().getElementById("dle-content") ?: throw ParseException("Cannot find root")
return manga.copy( return manga.copy(

Loading…
Cancel
Save