From 9e4fc2e7af7014b820c39fd4ba9382226ac32b32 Mon Sep 17 00:00:00 2001 From: tarsin Date: Fri, 16 Jun 2023 00:16:58 +0800 Subject: [PATCH] Spilt torrent.rs --- app/src/main/rust/src/lib.rs | 48 ++-------------------- app/src/main/rust/src/parser/mod.rs | 1 + app/src/main/rust/src/parser/torrent.rs | 53 +++++++++++++++++++++++++ 3 files changed, 57 insertions(+), 45 deletions(-) create mode 100644 app/src/main/rust/src/parser/mod.rs create mode 100644 app/src/main/rust/src/parser/torrent.rs diff --git a/app/src/main/rust/src/lib.rs b/app/src/main/rust/src/lib.rs index b98187ed5..c08b1ce09 100644 --- a/app/src/main/rust/src/lib.rs +++ b/app/src/main/rust/src/lib.rs @@ -1,3 +1,5 @@ +mod parser; + extern crate android_logger; extern crate apply; extern crate catch_panic; @@ -24,6 +26,7 @@ use quick_xml::escape::unescape; use std::ffi::c_void; use tl::{Node, Parser, VDom}; +#[macro_export] macro_rules! regex { ($re:literal $(,)?) => {{ static RE: once_cell::sync::OnceCell = once_cell::sync::OnceCell::new(); @@ -45,18 +48,6 @@ impl<'a> Anon for VDom<'a> { } } -#[derive(Default, IntoJava)] -#[jnix(package = "com.hippo.ehviewer.client.parser")] -pub struct Torrent { - posted: String, - size: String, - seeds: i32, - peers: i32, - downloads: i32, - url: String, - name: String, -} - #[derive(Default, IntoJava)] #[allow(non_snake_case)] #[jnix(package = "com.hippo.ehviewer.client.data")] @@ -84,12 +75,6 @@ pub struct BaseGalleryInfo { favoriteName: Option, } -#[derive(Default, IntoJava)] -#[jnix(package = "com.hippo.ehviewer.client.parser")] -pub struct TorrentResult { - list: Vec, -} - #[derive(Default, IntoJava)] #[allow(non_snake_case)] #[jnix(package = "com.hippo.ehviewer.client.parser")] @@ -175,33 +160,6 @@ pub fn parseFav(env: JNIEnv, _class: JClass, input: JString, str: jobjectArray) .also(|it| env.set_int_array_region(*it, 0, &vec).unwrap()) } -#[no_mangle] -#[catch_panic(default = "std::ptr::null_mut()")] -#[allow(non_snake_case)] -#[jni_fn("com.hippo.ehviewer.client.parser.TorrentParserKt")] -pub fn parseTorrent(env: JNIEnv, _class: JClass, input: JString) -> jobject { - let mut env = JnixEnv { env }; - 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() - }) - }).collect() - }) - }).unwrap().into_java(&env).forget().into_raw() -} - #[no_mangle] #[catch_panic(default = "std::ptr::null_mut()")] #[allow(non_snake_case)] diff --git a/app/src/main/rust/src/parser/mod.rs b/app/src/main/rust/src/parser/mod.rs new file mode 100644 index 000000000..57bc31658 --- /dev/null +++ b/app/src/main/rust/src/parser/mod.rs @@ -0,0 +1 @@ +mod torrent; diff --git a/app/src/main/rust/src/parser/torrent.rs b/app/src/main/rust/src/parser/torrent.rs new file mode 100644 index 000000000..923c0a96f --- /dev/null +++ b/app/src/main/rust/src/parser/torrent.rs @@ -0,0 +1,53 @@ +use catch_panic::catch_panic; +use jni_fn::jni_fn; +use jnix::jni::objects::{JClass, JString}; +use jnix::jni::sys::jobject; +use jnix::jni::JNIEnv; +use jnix::{IntoJava, JnixEnv}; +use jnix_macros::IntoJava; +use quick_xml::escape::unescape; +use {parse_jni_string, regex}; + +#[derive(Default, IntoJava)] +#[jnix(package = "com.hippo.ehviewer.client.parser")] +pub struct Torrent { + posted: String, + size: String, + seeds: i32, + peers: i32, + downloads: i32, + url: String, + name: String, +} + +#[derive(Default, IntoJava)] +#[jnix(package = "com.hippo.ehviewer.client.parser")] +pub struct TorrentResult { + list: Vec, +} +#[no_mangle] +#[catch_panic(default = "std::ptr::null_mut()")] +#[allow(non_snake_case)] +#[jni_fn("com.hippo.ehviewer.client.parser.TorrentParserKt")] +pub fn parseTorrent(env: JNIEnv, _class: JClass, input: JString) -> jobject { + let mut env = JnixEnv { env }; + 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() + }) + }).collect() + }) + }).unwrap().into_java(&env).forget().into_raw() +}