Cleanup TorrentParser

This commit is contained in:
tarsin committed 2023-07-28 12:30:43 +08:00
1 parent 69bba560f0
commit 8c10836e6e
4 files changed
+29 -42

No files matched your search

@@ -12,12 +12,10 @@ class Torrent(
val downloads: Int,
val url: String,
val name: String,
) {
fun format() = "[$posted] $name [$size] [↑$seeds ↓$peers ✓$downloads]"
}
)
class TorrentResult(
val list: ArrayList<Torrent>,
) : List<Torrent> by list
fun Torrent.format() = "[$posted] $name [$size] [↑$seeds ↓$peers ✓$downloads]"
private external fun parseTorrent(body: String): TorrentResult
typealias TorrentResult = ArrayList<Torrent>
private external fun parseTorrent(body: String): ArrayList<Torrent>
@@ -125,6 +125,7 @@ import com.hippo.ehviewer.client.exception.NoHAtHClientException
import com.hippo.ehviewer.client.parser.ArchiveParser
import com.hippo.ehviewer.client.parser.HomeParser
import com.hippo.ehviewer.client.parser.TorrentResult
import com.hippo.ehviewer.client.parser.format
import com.hippo.ehviewer.coil.justDownload
import com.hippo.ehviewer.dao.DownloadInfo
import com.hippo.ehviewer.dao.Filter
+9 -12
View File
@@ -57,8 +57,7 @@ fn to_category_i32(category: &str) -> i32 {
}
fn parse_rating(str: &str) -> f32 {
let reg = regex!("\\d+px");
let mut iter = reg.find_iter(str);
let mut iter = regex!("\\d+px").find_iter(str);
let mut next = || iter.next()?.as_str().replace("px", "").parse::<i32>().ok();
match (next(), next()) {
(Some(num1), Some(num2)) => {
@@ -81,20 +80,19 @@ fn get_thumb_key(url: &str) -> String {
}
fn parse_token_and_gid(str: &str) -> Option<(i64, String)> {
let reg =
regex!("https?://(?:exhentai.org|e-hentai.org(?:/lofi)?)/(?:g|mpv)/(\\d+)/([0-9a-f]{10})");
let grp = reg.captures(str)?;
let grp =
regex!("https?://(?:exhentai.org|e-hentai.org(?:/lofi)?)/(?:g|mpv)/(\\d+)/([0-9a-f]{10})")
.captures(str)?;
let token = &grp[2];
let gid = grp[1].parse().ok()?;
Some((gid, token.to_string()))
}
fn parse_uploader_and_pages(str: &str) -> (Option<String>, bool, i32) {
let reg_uploader =
regex!(r#"<div><a href="https://e[x-]hentai.org/uploader/.*?">(.*?)</a></div>"#);
let reg_pages = regex!(r"<div>(\d+) pages</div>");
let uploader = reg_uploader.captures(str).map(|grp| grp[1].to_string());
let pages = match reg_pages.captures(str) {
let uploader = regex!(r#"<div><a href="https://e[x-]hentai.org/uploader/.*?">(.*?)</a></div>"#)
.captures(str)
.map(|grp| grp[1].to_string());
let pages = match regex!(r"<div>(\d+) pages</div>").captures(str) {
None => 0,
Some(grp) => grp[1].parse().unwrap(),
};
@@ -102,8 +100,7 @@ fn parse_uploader_and_pages(str: &str) -> (Option<String>, bool, i32) {
}
fn parse_thumb_resolution(str: &str) -> (i32, i32) {
let reg = regex!(r"height:(\d+)px;width:(\d+)px");
match reg.captures(str) {
match regex!(r"height:(\d+)px;width:(\d+)px").captures(str) {
None => (0, 0),
Some(grp) => (grp[1].parse().unwrap(), grp[2].parse().unwrap()),
}
+14 -23
View File
@@ -20,12 +20,6 @@ pub struct Torrent {
name: String,
}
#[derive(Default, IntoJava)]
#[jnix(package = "com.hippo.ehviewer.client.parser")]
pub struct TorrentResult {
list: Vec<Torrent>,
}
#[no_mangle]
#[catch_panic(default = "std::ptr::null_mut()")]
#[allow(non_snake_case)]
@@ -33,22 +27,19 @@ pub struct TorrentResult {
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!("</span> ([0-9-]+) [0-9:]+</td>[\\s\\S]+</span> ([0-9.]+ [KMGT]B)</td>[\\s\\S]+</span> ([0-9]+)</td>[\\s\\S]+</span> ([0-9]+)</td>[\\s\\S]+</span> ([0-9]+)</td>[\\s\\S]+</span>([^<]+)</td>[\\s\\S]+onclick=\"document.location='([^\"]+)'[^<]+>([^<]+)</a>");
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()
})
Some(dom.query_selector("table")?.filter_map(|e| {
let html = e.get(parser)?.inner_html(parser);
let grp = regex!("</span> ([0-9-]+) [0-9:]+</td>[\\s\\S]+</span> ([0-9.]+ [KMGT]B)</td>[\\s\\S]+</span> ([0-9]+)</td>[\\s\\S]+</span> ([0-9]+)</td>[\\s\\S]+</span> ([0-9]+)</td>[\\s\\S]+</span>([^<]+)</td>[\\s\\S]+onclick=\"document.location='([^\"]+)'[^<]+>([^<]+)</a>").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::<Vec<Torrent>>())
}).unwrap().into_java(&env).forget().into_raw()
}