From 23b0c3305d7bfa80f577216fe71eb7a2d6e02a4e Mon Sep 17 00:00:00 2001 From: Jobobby04 Date: Sun, 26 Jul 2020 17:29:16 -0400 Subject: [PATCH] Parse more info when browsing E/ExHentai --- .../tachiyomi/source/online/all/EHentai.kt | 66 ++++++++++++++++++- .../metadata/base/RaisedSearchMetadata.kt | 8 ++- 2 files changed, 70 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/source/online/all/EHentai.kt b/app/src/main/java/eu/kanade/tachiyomi/source/online/all/EHentai.kt index c1469684b..3aa6289c6 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/source/online/all/EHentai.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/source/online/all/EHentai.kt @@ -39,6 +39,7 @@ import exh.metadata.metadata.EHentaiSearchMetadata.Companion.TAG_TYPE_LIGHT import exh.metadata.metadata.EHentaiSearchMetadata.Companion.TAG_TYPE_NORMAL import exh.metadata.metadata.EHentaiSearchMetadata.Companion.TAG_TYPE_WEAK import exh.metadata.metadata.base.RaisedSearchMetadata.Companion.TAG_TYPE_VIRTUAL +import exh.metadata.metadata.base.RaisedSearchMetadata.Companion.toGenreString import exh.metadata.metadata.base.RaisedTag import exh.metadata.nullIfBlank import exh.metadata.parseHumanReadableByteCount @@ -105,6 +106,7 @@ class EHentai( val thumbnailElement = it.selectFirst(".gl1e img, .gl2c .glthumb img") val column2 = it.selectFirst(".gl3e, .gl2c") val linkElement = it.selectFirst(".gl3c > a, .gl2e > div > a") + val infoElement = it.selectFirst(".gl3e") val favElement = column2.children().find { it.attr("style").startsWith("border-color") } @@ -119,7 +121,67 @@ class EHentai( // Get image thumbnail_url = thumbnailElement.attr("src") - // TODO Parse genre + uploader + tags + val tags = mutableListOf() + linkElement.select("div div").getOrNull(1)?.select("tr")?.forEach { row -> + val namespace = row.select(".tc").text().removeSuffix(":") + tags.addAll( + row.select("div").map { element -> + RaisedTag( + namespace, + element.text().trim(), + when { + element.hasClass("gtl") -> TAG_TYPE_LIGHT + element.hasClass("gtw") -> TAG_TYPE_WEAK + else -> TAG_TYPE_NORMAL + } + ) + } + ) + } + + val infoElements = infoElement.select("div") + + infoElements[1]?.attr("onclick").nullIfBlank()?.let { genre -> + tags += RaisedTag( + EH_GENRE_NAMESPACE, + genre.trim() + .substringAfterLast('/') + .removeSuffix("'"), + TAG_TYPE_NORMAL + ) + } + + infoElements[2]?.text()?.nullIfBlank()?.let { dateString -> + EX_DATE_FORMAT.parse(dateString)?.let { date -> + tags += RaisedTag( + EH_DATE_POSTED_NAMESPACE, + date.time.toString(), + TAG_TYPE_NORMAL + ) + } + } + + infoElements[3]?.attr("style")?.nullIfBlank()?.let { ratingStyle -> + val matches = "([0-9]*)px".toRegex().findAll(ratingStyle).mapNotNull { it.groupValues.getOrNull(1)?.toIntOrNull() }.toList() + if (matches.size != 2) return@let + var rate = 5 - matches[0] / 16 + tags += RaisedTag( + EH_RATING_NAMESPACE, + if (matches[1] == 21) { + rate-- + "$rate.5" + } else rate.toString(), + TAG_TYPE_NORMAL + ) + } + genre = tags.toGenreString() + + author = infoElements[4] + ?.select("a") + ?.attr("href") + ?.nullIfBlank() + ?.trim() + ?.substringAfterLast('/') } ) } @@ -845,6 +907,8 @@ class EHentai( private const val QUERY_PREFIX = "?f_apply=Apply+Filter" private const val TR_SUFFIX = "TR" private const val REVERSE_PARAM = "TEH_REVERSE" + private const val EH_DATE_POSTED_NAMESPACE = "date_posted" + private const val EH_RATING_NAMESPACE = "rating" private const val EH_API_BASE = "https://api.e-hentai.org/api.php" private val JSON = "application/json; charset=utf-8".toMediaTypeOrNull()!! diff --git a/app/src/main/java/exh/metadata/metadata/base/RaisedSearchMetadata.kt b/app/src/main/java/exh/metadata/metadata/base/RaisedSearchMetadata.kt index ce6728309..efc6e2e58 100644 --- a/app/src/main/java/exh/metadata/metadata/base/RaisedSearchMetadata.kt +++ b/app/src/main/java/exh/metadata/metadata/base/RaisedSearchMetadata.kt @@ -36,9 +36,7 @@ abstract class RaisedSearchMetadata { abstract fun copyTo(manga: SManga) - fun tagsToGenreString() = - tags.filter { it.type != TAG_TYPE_VIRTUAL } - .joinToString { (if (it.namespace != null) "${it.namespace}: " else "") + it.name } + fun tagsToGenreString() = tags.toGenreString() fun tagsToDescription() = StringBuilder("Tags:\n").apply { @@ -119,6 +117,10 @@ abstract class RaisedSearchMetadata { // Virtual tags allow searching of otherwise unindexed fields const val TAG_TYPE_VIRTUAL = -2 + fun MutableList.toGenreString() = + (this).filter { it.type != TAG_TYPE_VIRTUAL } + .joinToString { (if (it.namespace != null) "${it.namespace}: " else "") + it.name } + val raiseFlattenGson = GsonBuilder().create() fun titleDelegate(type: Int) = object : ReadWriteProperty {