[MyReadingManga] Fix tags + search

master
Draken 9 months ago committed by GitHub
parent 8ee46ad2d1
commit 9493ff1630
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -1,5 +1,6 @@
package org.koitharu.kotatsu.parsers.site.all package org.koitharu.kotatsu.parsers.site.all
import org.json.JSONObject
import org.jsoup.nodes.Document import org.jsoup.nodes.Document
import org.jsoup.nodes.Element import org.jsoup.nodes.Element
import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaLoaderContext
@ -11,9 +12,7 @@ import org.koitharu.kotatsu.parsers.util.*
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.regex.Pattern import java.util.regex.Pattern
import java.util.* import java.util.*
import org.koitharu.kotatsu.parsers.Broken
@Broken // TODO: Fix tags, genres
@MangaSourceParser("MYREADINGMANGA", "MyReadingManga") @MangaSourceParser("MYREADINGMANGA", "MyReadingManga")
internal class MyReadingManga(context: MangaLoaderContext) : PagedMangaParser(context, MangaParserSource.MYREADINGMANGA, 20) { internal class MyReadingManga(context: MangaLoaderContext) : PagedMangaParser(context, MangaParserSource.MYREADINGMANGA, 20) {
@ -96,7 +95,13 @@ internal class MyReadingManga(context: MangaLoaderContext) : PagedMangaParser(co
var paramIndex = 0 var paramIndex = 0
filter.locale?.let { filter.locale?.let {
append("&wpsolr_fq[$paramIndex]=lang_str:") append(
buildString {
append("&wpsolr_fq[")
append(paramIndex)
append("]=lang_str:")
}
)
append(getLanguageForFilter(it)) append(getLanguageForFilter(it))
paramIndex++ paramIndex++
} }
@ -104,7 +109,7 @@ internal class MyReadingManga(context: MangaLoaderContext) : PagedMangaParser(co
if (filter.tags.isNotEmpty()) { if (filter.tags.isNotEmpty()) {
filter.tags.forEach { tag -> filter.tags.forEach { tag ->
append("&wpsolr_fq[$paramIndex]=") append("&wpsolr_fq[$paramIndex]=")
append("tags:${tag.key}") append("genre_str:${tag.key}")
paramIndex++ paramIndex++
} }
} }
@ -126,7 +131,7 @@ internal class MyReadingManga(context: MangaLoaderContext) : PagedMangaParser(co
return parseMangaList(doc) return parseMangaList(doc)
} }
private suspend fun parseMangaList(doc: Document): List<Manga> { private fun parseMangaList(doc: Document): List<Manga> {
return doc.select("div.results-by-facets div[id*=res]").map { element -> return doc.select("div.results-by-facets div[id*=res]").map { element ->
val titleElement = element.selectFirst("a") ?: element.parseFailed("No title element found") val titleElement = element.selectFirst("a") ?: element.parseFailed("No title element found")
val thumbnailElement = element.selectFirst("img") val thumbnailElement = element.selectFirst("img")
@ -160,14 +165,13 @@ internal class MyReadingManga(context: MangaLoaderContext) : PagedMangaParser(co
source = source, source = source,
) )
} }
val basicDescription = title
val scanlatedBy = doc.select(".entry-terms:has(a[href*=group])") val scanlatedBy = doc.select(".entry-terms:has(a[href*=group])")
.firstOrNull()?.select("a[href*=group]") .firstOrNull()?.select("a[href*=group]")
?.joinToString(prefix = "Scanlated by: ") { it.text() } ?.joinToString(prefix = "Scanlated by: ") { it.text() }
val extendedDescription = doc.select(".entry-content p:not(p:containsOwn(|)):not(.chapter-class + p)") val extendedDescription = doc.select(".entry-content p:not(p:containsOwn(|)):not(.chapter-class + p)")
.joinToString("\n") { it.text() } .joinToString("\n") { it.text() }
val description = listOfNotNull(basicDescription, scanlatedBy, extendedDescription).joinToString("\n").trim() val description = listOfNotNull(title, scanlatedBy, extendedDescription).joinToString("\n").trim()
val state = when (doc.select("a[href*=status]").firstOrNull()?.text()) { val state = when (doc.select("a[href*=status]").firstOrNull()?.text()) {
"Ongoing" -> MangaState.ONGOING "Ongoing" -> MangaState.ONGOING
@ -193,7 +197,7 @@ internal class MyReadingManga(context: MangaLoaderContext) : PagedMangaParser(co
.mapNotNull { findImageSrc(it) } .mapNotNull { findImageSrc(it) }
.distinct() .distinct()
return images.mapIndexed { i, url -> return images.mapIndexed { _, url ->
MangaPage( MangaPage(
id = generateUid(url), id = generateUid(url),
url = url, url = url,
@ -203,18 +207,35 @@ internal class MyReadingManga(context: MangaLoaderContext) : PagedMangaParser(co
} }
} }
private suspend fun fetchTags(): Set<MangaTag> { private suspend fun fetchTags(): Set<MangaTag> {
val doc = webClient.httpGet("https://${domain}").parseHtml() val doc = webClient.httpGet("https://${domain}/search-6/").parseHtml()
return doc.select(".tagcloud a[href*=/genre/]").mapToSet {
MangaTag( return doc.select("div.select_opt").mapNotNull { element ->
title = it.text().toTitleCase(), val dataAttr = element.attr("data-wpsolr-facet-data")
key = it.attr("href").substringAfterLast("/").substringBefore("/"), val itemValue = dataAttr
source = source, .takeIf { it.isNotBlank() }
) ?.let { json ->
} try {
} val js = JSONObject(json)
val id = js.getString("id")
if (id != "genre_str") return@mapNotNull null
else js.getString("item_value")
} catch (e: Exception) {
null
}
}
itemValue?.let { value ->
MangaTag(
title = value,
key = value,
source = source,
)
}
}.toSet()
}
private val titleRegex = Pattern.compile("""\[[^]]*]""") private val titleRegex = Pattern.compile("""\[[^]]*]""")
private val imgRegex = Pattern.compile("""\.(jpg|png|jpeg|webp)""") private val imgRegex = Pattern.compile("""\.(jpg|png|jpeg|webp)""")
private fun findImageSrc(element: Element?): String? { private fun findImageSrc(element: Element?): String? {

Loading…
Cancel
Save