Small refactor

master
Koitharu 2 years ago
parent a0f9bc032d
commit 350bc0ad58
Signed by: Koitharu
GPG Key ID: 676DEE768C17A9D7

@ -1,6 +1,7 @@
package org.koitharu.kotatsu.parsers.bitmap
interface Bitmap {
val width: Int
val height: Int

@ -6,8 +6,10 @@ data class Rect(
val right: Int = 0,
val bottom: Int = 0,
) {
val width: Int
get() = right - left
val height: Int
get() = bottom - top
}

@ -1,11 +1,14 @@
package org.koitharu.kotatsu.parsers.site.all
import androidx.collection.MutableIntObjectMap
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.Interceptor
import okhttp3.Response
import org.jsoup.Jsoup
import org.jsoup.nodes.Document
import org.koitharu.kotatsu.parsers.*
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.PagedMangaParser
import org.koitharu.kotatsu.parsers.bitmap.Bitmap
import org.koitharu.kotatsu.parsers.bitmap.Rect
import org.koitharu.kotatsu.parsers.config.ConfigKey
@ -17,7 +20,8 @@ import javax.crypto.spec.SecretKeySpec
import kotlin.math.min
@MangaSourceParser("MANGAREADERTO", "MangaReader.To")
class MangaReaderToParser(context: MangaLoaderContext) : PagedMangaParser(context, MangaSource.MANGAREADERTO, 16), Interceptor {
class MangaReaderToParser(context: MangaLoaderContext) : PagedMangaParser(context, MangaSource.MANGAREADERTO, 16),
Interceptor {
override val configKeyDomain = ConfigKey.Domain("mangareader.to")
@ -26,7 +30,7 @@ class MangaReaderToParser(context: MangaLoaderContext) : PagedMangaParser(contex
SortOrder.RATING,
SortOrder.UPDATED,
SortOrder.NEWEST,
SortOrder.ALPHABETICAL
SortOrder.ALPHABETICAL,
)
override val availableStates: Set<MangaState> = EnumSet.allOf(MangaState::class.java)
@ -38,7 +42,7 @@ class MangaReaderToParser(context: MangaLoaderContext) : PagedMangaParser(contex
MangaTag(
title = it.ownText().trim(),
key = it.attr("data-id"),
source = source
source = source,
)
}.associateBy { it.title }
}
@ -57,6 +61,7 @@ class MangaReaderToParser(context: MangaLoaderContext) : PagedMangaParser(contex
addQueryParameter("keyword", filter.query)
addQueryParameter("page", page.toString())
}
is MangaListFilter.Advanced -> {
addPathSegment("filter")
addQueryParameter("page", page.toString())
@ -69,7 +74,7 @@ class MangaReaderToParser(context: MangaLoaderContext) : PagedMangaParser(contex
SortOrder.NEWEST -> "release-date"
SortOrder.ALPHABETICAL -> "name-az"
else -> "default"
}
},
)
addQueryParameter("genres", filter.tags.joinToString(",") { it.key })
addQueryParameter(
@ -81,9 +86,10 @@ class MangaReaderToParser(context: MangaLoaderContext) : PagedMangaParser(contex
MangaState.PAUSED -> "3"
MangaState.UPCOMING -> "5"
null -> ""
}
},
)
}
null -> {
addPathSegment("filter")
addQueryParameter("page", page.toString())
@ -108,14 +114,15 @@ class MangaReaderToParser(context: MangaLoaderContext) : PagedMangaParser(contex
isNsfw = false,
rating = RATING_UNKNOWN,
state = null,
tags = emptySet()
tags = emptySet(),
)
}
}
override suspend fun getRelatedManga(seed: Manga): List<Manga> {
val document = webClient.httpGet(seed.url.toAbsoluteUrl(domain)).parseHtml()
return document.select(".block_area_authors-other .manga_list-sbs .manga-poster, .featured-block-ul .manga-poster").map {
return document.select(".block_area_authors-other .manga_list-sbs .manga-poster, .featured-block-ul .manga-poster")
.map {
val mangaUrl = it.attrAsRelativeUrl("href")
val thumb = it.select("img")
Manga(
@ -130,7 +137,7 @@ class MangaReaderToParser(context: MangaLoaderContext) : PagedMangaParser(contex
isNsfw = false,
rating = RATING_UNKNOWN,
state = null,
tags = emptySet()
tags = emptySet(),
)
}
}
@ -165,16 +172,18 @@ class MangaReaderToParser(context: MangaLoaderContext) : PagedMangaParser(contex
else -> null
}
},
author = document.select("div.anisc-info a[href*=/author/]").joinToString { it.ownText().replace(", ", " ") },
author = document.select("div.anisc-info a[href*=/author/]")
.joinToString { it.ownText().replace(", ", " ") },
description = document.select("div.description").text(),
chapters = parseChapters(document),
source = source
source = source,
)
}
private fun parseChapters(document: Document): List<MangaChapter> {
val total = document.select(".chapters-list-ul > ul > li.chapter-item, .volume-list-ul div.lang-volumes > div.item").size
val chapters = ArrayList<MangaChapter>(total)
val total =
document.select(".chapters-list-ul > ul > li.chapter-item, .volume-list-ul div.lang-volumes > div.item").size
val chapters = ChaptersListBuilder(total)
document.select(".chapters-list-ul > ul").forEach { ul ->
ul.select("li.chapter-item").reversed().forEach { li ->
@ -190,8 +199,8 @@ class MangaReaderToParser(context: MangaLoaderContext) : PagedMangaParser(contex
scanlator = null,
uploadDate = 0L,
branch = createBranchName(ul.id().substringBefore("-chapters"), "Chapters"),
source = source
)
source = source,
),
)
}
}
@ -204,19 +213,19 @@ class MangaReaderToParser(context: MangaLoaderContext) : PagedMangaParser(contex
MangaChapter(
id = generateUid(url),
name = name,
number = numRegex.find(name)!!.groupValues[1].toFloat(),
number = numRegex.find(name)?.groupValues?.getOrNull(1)?.toFloatOrNull() ?: 0f,
volume = 0,
url = url,
scanlator = null,
uploadDate = 0L,
branch = createBranchName(div.id().substringBefore("-volumes"), "Volumes"),
source = source
)
source = source,
),
)
}
}
return chapters
return chapters.toList()
}
private fun createBranchName(lang: String, type: String): String {
@ -246,7 +255,7 @@ class MangaReaderToParser(context: MangaLoaderContext) : PagedMangaParser(contex
url
},
preview = null,
source = source
source = source,
)
}
}
@ -260,7 +269,7 @@ class MangaReaderToParser(context: MangaLoaderContext) : PagedMangaParser(contex
return context.redrawImageResponse(response, ::descramble)
}
private val memo = hashMapOf<Int, IntArray>()
private val memo = MutableIntObjectMap<IntArray>()
private fun descramble(bitmap: Bitmap): Bitmap {
val width = bitmap.width

@ -6,15 +6,15 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.*
import org.koitharu.kotatsu.parsers.site.heancms.HeanCms
import org.koitharu.kotatsu.parsers.util.*
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.unescapeJson
import org.koitharu.kotatsu.parsers.util.json.*
import java.text.SimpleDateFormat
import java.util.*
@MangaSourceParser("MODESCANLATOR", "ModeScanlator", "pt")
internal class ModeScanlator(context: MangaLoaderContext) : HeanCms(context, MangaSource.MODESCANLATOR, "modescanlator.com") {
internal class ModeScanlator(
context: MangaLoaderContext,
) : HeanCms(context, MangaSource.MODESCANLATOR, "modescanlator.com") {
override suspend fun getListPage(page: Int, filter: MangaListFilter?): List<Manga> {
val url = buildString {
append("https://api.")
@ -49,10 +49,11 @@ internal class ModeScanlator(context: MangaLoaderContext) : HeanCms(context, Man
SortOrder.ALPHABETICAL_DESC -> append("title&order=asc")
else -> append("latest&order=desc")
}
append("&series_type=All&perPage=$pageSize")
append("&series_type=All&perPage=")
append(pageSize)
append("&tags_ids=")
append("[".urlEncoded())
append(filter.tags.joinToString(",") { it.key })
filter.tags.joinTo(this, ",") { it.key }
append("]".urlEncoded())
}
@ -60,7 +61,7 @@ internal class ModeScanlator(context: MangaLoaderContext) : HeanCms(context, Man
null -> {}
}
append("&page=")
append(page.toString())
append(page)
}
val json = webClient.httpGet(url).parseJson()
return json.getJSONArray("data").mapJSON { j ->
@ -78,10 +79,10 @@ internal class ModeScanlator(context: MangaLoaderContext) : HeanCms(context, Man
url = urlManga.toRelativeUrl(domain),
publicUrl = urlManga,
rating = j.getFloatOrDefault("rating", RATING_UNKNOWN) / 5f,
isNsfw = true,
isNsfw = isNsfwSource,
coverUrl = cover,
tags = setOf(),
state = when (j.getString("status")) {
state = when (j.getStringOrNull("status")) {
"Ongoing" -> MangaState.ONGOING
"Completed" -> MangaState.FINISHED
"Dropped" -> MangaState.ABANDONED
@ -100,7 +101,8 @@ internal class ModeScanlator(context: MangaLoaderContext) : HeanCms(context, Man
val url = buildString {
append("https://api.")
append(domain)
append("/chapter/query?perPage=9999&series_id=" + manga.id)
append("/chapter/query?perPage=9999&series_id=")
append(manga.id)
}
val json = webClient.httpGet(url).parseJson()
val dateFormat = SimpleDateFormat(datePattern, Locale.ENGLISH)
@ -135,14 +137,12 @@ internal class ModeScanlator(context: MangaLoaderContext) : HeanCms(context, Man
val tags = doc.select("script").firstNotNullOf { script ->
regex.find(script.html())?.groupValues?.getOrNull(1)
}.unescapeJson()
return JSONArray(tags).mapJSON {
return JSONArray(tags).mapJSONToSet {
MangaTag(
key = it.getInt("id").toString(),
title = it.getString("name").toTitleCase(sourceLocale),
source = source,
)
}.toSet()
}
}
}

Loading…
Cancel
Save