diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index a28132855..7c025b5b7 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -14,6 +14,7 @@ -keep class androidx.viewpager.widget.ViewPager$LayoutParams { int position; } -keep class com.hippo.ehviewer.client.parser.Torrent { *; } +-keep class com.hippo.ehviewer.client.parser.TorrentResult { *; } -keepattributes LineNumberTable,SourceFile -renamesourcefileattribute SourceFile diff --git a/app/src/main/java/com/hippo/ehviewer/client/parser/TorrentParser.kt b/app/src/main/java/com/hippo/ehviewer/client/parser/TorrentParser.kt index 51c9d1872..4f80277f6 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/parser/TorrentParser.kt +++ b/app/src/main/java/com/hippo/ehviewer/client/parser/TorrentParser.kt @@ -1,11 +1,7 @@ package com.hippo.ehviewer.client.parser object TorrentParser { - fun parse(body: String) = run { - val list = mutableListOf() - parseTorrent(body, list) - list - } + fun parse(body: String) = parseTorrent(body) } class Torrent( @@ -20,6 +16,8 @@ class Torrent( fun format() = "[$posted] $name [$size] [↑$seeds ↓$peers ✓$downloads]" } -typealias TorrentResult = List +class TorrentResult( + val list: ArrayList, +) : List by list -private external fun parseTorrent(body: String, list: List) +private external fun parseTorrent(body: String): TorrentResult diff --git a/app/src/main/rust/src/lib.rs b/app/src/main/rust/src/lib.rs index b11e7ed56..9a1946a36 100644 --- a/app/src/main/rust/src/lib.rs +++ b/app/src/main/rust/src/lib.rs @@ -10,8 +10,8 @@ extern crate tl; use android_logger::Config; use apply::Also; -use jnix::jni::objects::{JClass, JList, JObject, JString}; -use jnix::jni::sys::{jint, jintArray, jobjectArray, JavaVM, JNI_VERSION_1_6}; +use jnix::jni::objects::{JClass, JString}; +use jnix::jni::sys::{jint, jintArray, jobject, jobjectArray, JavaVM, JNI_VERSION_1_6}; use jnix::jni::JNIEnv; use jnix::{IntoJava, JnixEnv}; use jnix_macros::IntoJava; @@ -38,6 +38,12 @@ pub struct Torrent { name: String, } +#[derive(Default, IntoJava)] +#[jnix(package = "com.hippo.ehviewer.client.parser")] +pub struct TorrentResult { + list: Vec, +} + fn parse_jni_string(env: &mut JNIEnv, str: &JString, mut f: F) -> Option where F: FnMut(&VDom, &Parser, &JNIEnv) -> Option, @@ -118,36 +124,19 @@ pub extern "system" fn Java_com_hippo_ehviewer_client_parser_TorrentParserKt_par mut env: JNIEnv, _class: JClass, input: JString, - list: JObject, -) { +) -> jobject { let env2 = JnixEnv::from(env); - let r = parse_jni_string(&mut env, &input, |dom, parser, _env| { - let vec: Vec = dom - .query_selector("table")? - .filter_map(|e| { + parse_jni_string(&mut env, &input, |dom, parser, _env| { + Some(TorrentResult { + list: dom.query_selector("table")?.filter_map(|e| { let html = e.get(parser)?.inner_html(parser); let reg = regex!(" ([0-9-]+) [0-9:]+[\\s\\S]+ ([0-9.]+ [KMGT]B)[\\s\\S]+ ([0-9]+)[\\s\\S]+ ([0-9]+)[\\s\\S]+ ([0-9]+)[\\s\\S]+([^<]+)[\\s\\S]+onclick=\"document.location='([^\"]+)'[^<]+>([^<]+)"); let grp = reg.captures(&html)?; let name = unescape(&grp[8]).ok()?; - Some( - Torrent { - posted: grp[1].to_string(), - size: grp[2].to_string(), - seeds: grp[3].parse().ok()?, - peers: grp[4].parse().ok()?, - downloads: grp[5].parse().ok()?, - url: grp[7].to_string(), - name: name.to_string(), - }.into_java(&env2).forget() - ) - }) - .collect(); - Some(vec) - }).unwrap(); - let list = JList::from_env(&env, list).ok().unwrap(); - for i in r { - list.add(i).ok().unwrap() - } + Some(Torrent { posted: grp[1].to_string(), size: grp[2].to_string(), seeds: grp[3].parse().ok()?, peers: grp[4].parse().ok()?, downloads: grp[5].parse().ok()?, url: grp[7].to_string(), name: name.to_string() }) + }).collect() + }) + }).unwrap().into_java(&env2).forget().into_inner() } #[no_mangle]