]*width:(\\d+)[^<>]*height:(\\d+)[^<>]*\\((.+?)\\)[^<>]*-(\\d+)px[^<>]*>
]*href=\"(.+?)\"[^<>]*>![\"([\\d,]+)\"")]()
")
@@ -90,10 +92,7 @@ object GalleryDetailParser {
}
// Error info
- val m = PATTERN_ERROR.matcher(body)
- if (m.find()) {
- throw EhException(m.group(1))
- }
+ PATTERN_ERROR.find(body)?.run { throw EhException(groupValues[1]) }
val galleryDetail = GalleryDetail()
val document = Jsoup.parse(body)
parseDetail(galleryDetail, document, body)
@@ -109,63 +108,34 @@ object GalleryDetailParser {
@Throws(ParseException::class)
private fun parseDetail(gd: GalleryDetail, d: Document, body: String) {
- var matcher = PATTERN_DETAIL.matcher(body)
- if (matcher.find()) {
- gd.gid = NumberUtils.parseLongSafely(matcher.group(1), -1L)
- gd.token = matcher.group(2)
- gd.apiUid = NumberUtils.parseLongSafely(matcher.group(3), -1L)
- gd.apiKey = matcher.group(4)
- } else {
- throw ParseException("Can't parse gallery detail", body)
- }
+ PATTERN_DETAIL.find(body)?.apply {
+ gd.gid = groupValues[1].toLongOrNull() ?: -1L
+ gd.token = groupValues[2]
+ gd.apiUid = groupValues[3].toLongOrNull() ?: -1L
+ gd.apiKey = groupValues[4]
+ } ?: throw ParseException("Can't parse gallery detail", body)
if (gd.gid == -1L) {
throw ParseException("Can't parse gallery detail", body)
}
- matcher = PATTERN_TORRENT.matcher(body)
- if (matcher.find()) {
- gd.torrentUrl = StringUtils.unescapeXml(StringUtils.trim(matcher.group(1)))
- gd.torrentCount = NumberUtils.parseIntSafely(matcher.group(2), 0)
- } else {
- gd.torrentCount = 0
- gd.torrentUrl = ""
+ PATTERN_TORRENT.find(body)?.run {
+ gd.torrentUrl = groupValues[1].trim().unescapeXml()
+ gd.torrentCount = groupValues[2].toIntOrNull() ?: 0
}
- matcher = PATTERN_ARCHIVE.matcher(body)
- if (matcher.find()) {
- gd.archiveUrl = StringUtils.unescapeXml(StringUtils.trim(matcher.group(1)))
- } else {
- gd.archiveUrl = ""
+ PATTERN_ARCHIVE.find(body)?.run {
+ gd.archiveUrl = groupValues[1].trim().unescapeXml()
}
+ var matcher: Matcher
try {
- val gm = JsoupUtils.getElementByClass(d, "gm")
-
+ val gm = d.getElementsByClass("gm")[0]
// Thumb url
- val gd1 = gm!!.getElementById("gd1")
- try {
- gd.thumb = parseCoverStyle(
- StringUtils.trim(
- gd1!!.child(0).attr("style")
- )
- )
- } catch (e: Throwable) {
- ExceptionUtils.throwIfFatal(e)
- gd.thumb = ""
+ gm.getElementById("gd1")?.child(0)?.attr("style")?.trim()?.let {
+ gd.thumb = PATTERN_COVER.find(it)?.run {
+ handleThumbUrlResolution(groupValues[3])
+ }
}
- // Title
- val gn = gm.getElementById("gn")
- if (null != gn) {
- gd.title = StringUtils.trim(gn.text())
- } else {
- gd.title = ""
- }
-
- // Jpn title
- val gj = gm.getElementById("gj")
- if (null != gj) {
- gd.titleJpn = StringUtils.trim(gj.text())
- } else {
- gd.titleJpn = ""
- }
+ gd.title = gm.getElementById("gn")?.text()?.trim()
+ gd.titleJpn = gm.getElementById("gj")?.text()?.trim()
// Category
val gdc = gm.getElementById("gdc")
@@ -280,16 +250,6 @@ object GalleryDetailParser {
}
}
- // width:250px; height:356px; background:transparent url(https://exhentai.org/t/fe/1f/fe1fcfa9bf8fba2f03982eda0aa347cc9d6a6372-145921-1050-1492-jpg_250.jpg) 0 0 no-repeat
- private fun parseCoverStyle(str: String): String? {
- val matcher = PATTERN_COVER.matcher(str)
- return if (matcher.find()) {
- handleThumbUrlResolution(matcher.group(3))
- } else {
- ""
- }
- }
-
private fun parseDetailInfo(gd: GalleryDetail, e: Element) {
val es = e.children()
if (es.size < 2) {
@@ -520,15 +480,8 @@ object GalleryDetailParser {
@JvmStatic
@Throws(ParseException::class)
fun parsePreviewPages(body: String): Int {
- val m = PATTERN_PREVIEW_PAGES.matcher(body)
- var previewPages = -1
- if (m.find()) {
- previewPages = ParserUtils.parseInt(m.group(1), -1)
- }
- if (previewPages <= 0) {
- throw ParseException("Parse preview page count error", body)
- }
- return previewPages
+ return PATTERN_PREVIEW_PAGES.find(body)?.groupValues?.get(1)?.toIntOrNull()
+ ?: throw ParseException("Parse preview page count error", body)
}
/**
@@ -537,15 +490,8 @@ object GalleryDetailParser {
@JvmStatic
@Throws(ParseException::class)
fun parsePages(body: String): Int {
- var pages = -1
- val m = PATTERN_PAGES.matcher(body)
- if (m.find()) {
- pages = ParserUtils.parseInt(m.group(1), -1)
- }
- if (pages < 0) {
- throw ParseException("Parse pages error", body)
- }
- return pages
+ return PATTERN_PAGES.find(body)?.groupValues?.get(1)?.toIntOrNull()
+ ?: throw ParseException("Parse pages error", body)
}
@Throws(ParseException::class)
@@ -622,25 +568,15 @@ object GalleryDetailParser {
*/
@Throws(ParseException::class)
private fun parseNormalPreviewSet(body: String): NormalPreviewSet {
- val m = PATTERN_NORMAL_PREVIEW.matcher(body)
val normalPreviewSet = NormalPreviewSet()
- while (m.find()) {
- val position = ParserUtils.parseInt(m.group(6), 0) - 1
- if (position < 0) {
- continue
- }
- val imageUrl = ParserUtils.trim(m.group(3))
- val xOffset = ParserUtils.parseInt(m.group(4), 0)
+ PATTERN_NORMAL_PREVIEW.findAll(body).forEach {
+ val position = (it.groupValues[6].toIntOrNull() ?: return@forEach) - 1
+ val imageUrl = it.groupValues[3].trim()
+ val xOffset = it.groupValues[4].toIntOrNull() ?: 0
val yOffset = 0
- val width = ParserUtils.parseInt(m.group(1), 0)
- if (width <= 0) {
- continue
- }
- val height = ParserUtils.parseInt(m.group(2), 0)
- if (height <= 0) {
- continue
- }
- val pageUrl = ParserUtils.trim(m.group(5))
+ val width = it.groupValues[1].toIntOrNull() ?: return@forEach
+ val height = it.groupValues[2].toIntOrNull() ?: return@forEach
+ val pageUrl = it.groupValues[5].trim()
normalPreviewSet.addItem(position, imageUrl, xOffset, yOffset, width, height, pageUrl)
}
if (normalPreviewSet.size() == 0) {
@@ -648,4 +584,4 @@ object GalleryDetailParser {
}
return normalPreviewSet
}
-}
\ No newline at end of file
+}
diff --git a/app/src/main/java/com/hippo/yorozuya/StringUtils.kt b/app/src/main/java/com/hippo/yorozuya/StringUtils.kt
new file mode 100644
index 000000000..dd1138e1f
--- /dev/null
+++ b/app/src/main/java/com/hippo/yorozuya/StringUtils.kt
@@ -0,0 +1,5 @@
+package com.hippo.yorozuya
+
+fun String.unescapeXml(): String {
+ return StringUtils.unescapeXml(this)
+}