Parse favorite categories from user config page

This commit is contained in:
FooIbar committed 2024-04-28 18:09:17 +08:00
1 parent 7b84c74abf
commit 050bfea8f2
4 files changed
+39 -4

No files matched your search

@@ -46,6 +46,7 @@ import com.hippo.ehviewer.client.parser.ProfileParser
import com.hippo.ehviewer.client.parser.RateGalleryResult
import com.hippo.ehviewer.client.parser.TorrentParser
import com.hippo.ehviewer.client.parser.TorrentResult
import com.hippo.ehviewer.client.parser.UserConfigParser
import com.hippo.ehviewer.client.parser.VoteCommentResult
import com.hippo.ehviewer.client.parser.VoteTagParser
import com.hippo.ehviewer.dailycheck.showEventNotification
@@ -80,8 +81,6 @@ private const val MAX_REQUEST_SIZE = 25
private const val MAX_SEQUENTIAL_REQUESTS = 5
private const val REQUEST_INTERVAL = 5000L
private const val U_CONFIG_TEXT = "Selected Profile"
fun Either<String, ByteBuffer>.saveParseError(e: Throwable) {
val dir = AppConfig.externalParseErrorDir ?: return
val file = File(dir, ReadableTime.getFilenamableTime(System.currentTimeMillis()) + ".txt")
@@ -197,12 +196,12 @@ object EhEngine {
suspend fun getUConfig(url: String = EhUrl.uConfigUrl) {
runSuspendCatching {
ehRequest(url).fetchUsingAsText { check(U_CONFIG_TEXT in this) { "Unable to load config from $url!" } }
ehRequest(url).fetchUsingAsByteBuffer(UserConfigParser::parse)
}.onFailure { throwable ->
// It may get redirected when accessing ex for the first time
if (url == EhUrl.URL_UCONFIG_EX) {
logcat(throwable)
ehRequest(url).fetchUsingAsText { check(U_CONFIG_TEXT in this) { "Unable to load config from $url!" } }
ehRequest(url).fetchUsingAsByteBuffer(UserConfigParser::parse)
} else {
throw throwable
}
@@ -0,0 +1,16 @@
package com.hippo.ehviewer.client.parser
import com.hippo.ehviewer.Settings
import com.hippo.ehviewer.client.exception.ParseException
import java.nio.ByteBuffer
object UserConfigParser {
private external fun parseFavCat(body: ByteBuffer, size: Int = body.limit()): Int
fun parse(body: ByteBuffer) = runCatching {
val favCat = unmarshalParsingAs<Array<String>>(body, ::parseFavCat)
Settings.favCat = favCat
}.onFailure {
throw ParseException("Can't parse user config", it)
}
}
+19
View File
@@ -0,0 +1,19 @@
use jni::objects::{JByteBuffer, JClass};
use jni::sys::jint;
use jni::JNIEnv;
use jni_fn::jni_fn;
use quick_xml::escape::unescape;
use {parse_marshal_inplace, regex};
#[no_mangle]
#[allow(non_snake_case)]
#[jni_fn("com.hippo.ehviewer.client.parser.UserConfigParser")]
pub fn parseFavCat(mut env: JNIEnv, _class: JClass, buffer: JByteBuffer, limit: jint) -> jint {
parse_marshal_inplace(&mut env, buffer, limit, |_, body| {
let cat = regex!("<input type=\"text\" name=\"favorite_\\d\" value=\"([^\"]+)\"")
.captures_iter(body)
.filter_map(|c| unescape(&c[1]).map(|s| s.to_string()).ok())
.collect::<Vec<_>>();
Ok(cat)
})
}
+1
View File
@@ -1,3 +1,4 @@
mod config;
mod fav;
mod home;
mod list;