diff --git a/app/src/main/java/com/hippo/ehviewer/client/parser/ArchiveParser.kt b/app/src/main/java/com/hippo/ehviewer/client/parser/ArchiveParser.kt index 924797737..ce37500da 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/parser/ArchiveParser.kt +++ b/app/src/main/java/com/hippo/ehviewer/client/parser/ArchiveParser.kt @@ -15,90 +15,72 @@ */ package com.hippo.ehviewer.client.parser -import com.hippo.ehviewer.R import com.hippo.ehviewer.client.exception.NoHAtHClientException import org.jsoup.Jsoup -import java.util.function.IntFunction -import java.util.regex.Pattern object ArchiveParser { private val PATTERN_ARCHIVE_URL = - Pattern.compile("(.*).*Click Here To Start Downloading") + Regex("(.*).*Click Here To Start Downloading") private val PATTERN_CURRENT_FUNDS = - Pattern.compile("

([\\d,]+) GP \\[[^]]*]   ([\\d,]+) Credits \\[[^]]*]

") + Regex("

([\\d,]+) GP \\[[^]]*]   ([\\d,]+) Credits \\[[^]]*]

") private val PATTERN_FUNDS = - Pattern.compile("Available: ([\\d,]+) Credits.*Available: ([\\d,]+) kGP", Pattern.DOTALL) + Regex("Available: ([\\d,]+) Credits.*Available: ([\\d,]+) kGP", RegexOption.DOT_MATCHES_ALL) private val PATTERN_HATH_FORM = - Pattern.compile("
") + Regex("") private val PATTERN_HATH_ARCHIVE = - Pattern.compile("

([^<]+)

\\s*

([\\w. ]+)

\\s*

([\\w. ]+)

") + Regex("

([^<]+)

\\s*

([\\w. ]+)

\\s*

([\\w. ]+)

") private val PATTERN_NEED_HATH_CLIENT = - Pattern.compile("You must have a H@H client assigned to your account to use this feature\\.") + Regex("You must have a H@H client assigned to your account to use this feature\\.") fun parse(body: String): Result? { - var m = PATTERN_HATH_FORM.matcher(body) - if (!m.find()) { - return null - } - val paramOr = m.group(1) + val m = PATTERN_HATH_FORM.find(body) ?: return null + val paramOr = m.groupValues[1] val archiveList = ArrayList() - val d = Jsoup.parse(body) - val es = d.select("#db>div>div") - for (e in es) { - if (e.childrenSize() > 0 && !e.attr("style").contains("color:#CCCCCC")) { - try { - val res = e.selectFirst("form>input")!!.attr("value") - val name = e.selectFirst("form>div>input")!!.attr("value") - val size = e.selectFirst("p>strong")!!.text() - val cost = e.selectFirst("div>strong")!!.text().replace(",", "") - val item = Archive(res, name, size, cost, false) - archiveList.add(item) - } catch (ex: NullPointerException) { - ex.printStackTrace() + Jsoup.parse(body).select("#db>div>div").forEach { element -> + if (element.childrenSize() > 0 && !element.attr("style").contains("color:#CCCCCC")) { + runCatching { + val res = element.selectFirst("form>input")!!.attr("value") + val name = element.selectFirst("form>div>input")!!.attr("value") + val size = element.selectFirst("p>strong")!!.text() + val cost = element.selectFirst("div>strong")!!.text().replace(",", "") + Archive(res, name, size, cost, false) + }.onSuccess { + archiveList.add(it) + }.onFailure { + it.printStackTrace() } } } - m = PATTERN_HATH_ARCHIVE.matcher(body) - while (m.find()) { - val res = ParserUtils.trim(m.group(1)) - val name = ParserUtils.trim(m.group(2)) - val size = ParserUtils.trim(m.group(3)) - val cost = ParserUtils.trim(m.group(4)) + PATTERN_HATH_ARCHIVE.findAll(body).forEach { matchResult -> + val (res, name, size, cost) = matchResult.groupValues.slice(1..4) + .map { ParserUtils.trim(it) } val item = Archive(res, name, size, cost, true) archiveList.add(item) } - var funds: Funds? = null - m = PATTERN_CURRENT_FUNDS.matcher(body) - if (m.find()) { - val fundsGP = ParserUtils.parseInt(m.group(1), 0) - val fundsC = ParserUtils.parseInt(m.group(2), 0) - funds = Funds(fundsGP, fundsC) + val result = Result(paramOr, archiveList, null) + PATTERN_CURRENT_FUNDS.find(body)?.groupValues?.run { + val fundsGP = ParserUtils.parseInt(get(1), 0) + val fundsC = ParserUtils.parseInt(get(2), 0) + val funds = Funds(fundsGP, fundsC) + result.funds = funds } - return Result(paramOr, archiveList, funds) + return result } @Throws(NoHAtHClientException::class) fun parseArchiveUrl(body: String): String? { - val m = PATTERN_NEED_HATH_CLIENT.matcher(body) - if (m.find()) { - throw NoHAtHClientException("No H@H client") - } - val d = Jsoup.parse(body) - val a = d.selectFirst("#continue>a[href]") - return if (a != null) { - a.attr("href") + "?start=1" - } else null - + if (PATTERN_NEED_HATH_CLIENT.containsMatchIn(body)) throw NoHAtHClientException("No H@H client") + return Jsoup.parse(body).selectFirst("#continue>a[href]") + ?.let { it.attr("href") + "?start=1" } // TODO: Check more errors } fun parseFunds(body: String): Funds? { - val m = PATTERN_FUNDS.matcher(body) - return if (m.find()) { - val fundsC = ParserUtils.parseInt(m.group(1), 0) - val fundsGP = ParserUtils.parseInt(m.group(2), 0) * 1000 + return PATTERN_FUNDS.find(body)?.groupValues?.run { + val fundsC = ParserUtils.parseInt(get(1), 0) + val fundsGP = ParserUtils.parseInt(get(2), 0) * 1000 return Funds(fundsGP, fundsC) - } else null + } } class Archive( @@ -107,21 +89,9 @@ object ArchiveParser { val size: String, val cost: String, val isHAtH: Boolean - ) { - fun format(getString: IntFunction): String { - return if (isHAtH) { - val costStr = if (cost == "Free") getString.apply(R.string.archive_free) else cost - "[H@H] $name [$size] [$costStr]" - } else { - val nameStr = - getString.apply(if (res == "org") R.string.archive_original else R.string.archive_resample) - val costStr = if (cost == "Free!") getString.apply(R.string.archive_free) else cost - "$nameStr [$size] [$costStr]" - } - } - } + ) class Funds(var fundsGP: Int, var fundsC: Int) class Result(val paramOr: String?, val archiveList: List, var funds: Funds?) -} \ No newline at end of file +} diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.kt b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.kt index 3e6c8e787..30849f63e 100755 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.kt @@ -1460,9 +1460,19 @@ class GalleryDetailScene : CollapsingToolbarScene(), View.OnClickListener, Downl mListView!!.visibility = View.GONE mErrorText!!.setText(R.string.no_archives) } else { - val nameArray = data.stream().map { archive: ArchiveParser.Archive -> - archive.format { id: Int -> - resources.getString(id) + val nameArray = data.stream().map { + it.run { + if (isHAtH) { + val costStr = + if (cost == "Free") resources.getString(R.string.archive_free) else cost + "[H@H] $name [$size] [$costStr]" + } else { + val nameStr = + resources.getString(if (res == "org") R.string.archive_original else R.string.archive_resample) + val costStr = + if (cost == "Free!") resources.getString(R.string.archive_free) else cost + "$nameStr [$size] [$costStr]" + } } }.toArray() mProgressView!!.visibility = View.GONE