From af4978346d145ef106bc85642d305c0fe216f4e7 Mon Sep 17 00:00:00 2001 From: dyphire Date: Fri, 16 Oct 2026 20:11:04 +0800 Subject: [PATCH] chore: remove zh.se8 --- sources/zh.se8/.cargo/config.toml | 5 - sources/zh.se8/Cargo.lock | 327 ------------------------------ sources/zh.se8/Cargo.toml | 23 --- sources/zh.se8/res/filters.json | 13 -- sources/zh.se8/res/icon.png | Bin 8665 -> 0 bytes sources/zh.se8/res/source.json | 16 -- sources/zh.se8/src/html/mod.rs | 238 ---------------------- sources/zh.se8/src/lib.rs | 96 --------- sources/zh.se8/src/net/mod.rs | 124 ----------- 9 files changed, 842 deletions(-) delete mode 100644 sources/zh.se8/.cargo/config.toml delete mode 100644 sources/zh.se8/Cargo.lock delete mode 100644 sources/zh.se8/Cargo.toml delete mode 100644 sources/zh.se8/res/filters.json delete mode 100644 sources/zh.se8/res/icon.png delete mode 100644 sources/zh.se8/res/source.json delete mode 100644 sources/zh.se8/src/html/mod.rs delete mode 100644 sources/zh.se8/src/lib.rs delete mode 100644 sources/zh.se8/src/net/mod.rs diff --git a/sources/zh.se8/.cargo/config.toml b/sources/zh.se8/.cargo/config.toml deleted file mode 100644 index 1033ef098..000000000 --- a/sources/zh.se8/.cargo/config.toml +++ /dev/null @@ -1,5 +0,0 @@ -[build] -target = "wasm32-unknown-unknown" - -[target.wasm32-unknown-unknown] -runner = "aidoku-test-runner" diff --git a/sources/zh.se8/Cargo.lock b/sources/zh.se8/Cargo.lock deleted file mode 100644 index 4b7d1711b..000000000 --- a/sources/zh.se8/Cargo.lock +++ /dev/null @@ -1,327 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "aidoku" -version = "0.3.0" -source = "git+https://github.com/Aidoku/aidoku-rs.git#ae6485e3c14ecd1fd5497d170eae884c68d04a87" -dependencies = [ - "euclid", - "hashbrown", - "itoa", - "num-traits", - "paste", - "postcard", - "serde", - "talc", - "thiserror", -] - -[[package]] -name = "aidoku-test" -version = "1.0.0" -source = "git+https://github.com/Aidoku/aidoku-rs.git#ae6485e3c14ecd1fd5497d170eae884c68d04a87" -dependencies = [ - "quote", - "syn", -] - -[[package]] -name = "allocator-api2" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" - -[[package]] -name = "atomic-polyfill" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cf2bce30dfe09ef0bfaef228b9d414faaf7e563035494d7fe092dba54b300f4" -dependencies = [ - "critical-section", -] - -[[package]] -name = "autocfg" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "cobs" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" -dependencies = [ - "thiserror", -] - -[[package]] -name = "critical-section" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" - -[[package]] -name = "embedded-io" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" - -[[package]] -name = "embedded-io" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" - -[[package]] -name = "equivalent" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" - -[[package]] -name = "euclid" -version = "0.22.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df61bf483e837f88d5c2291dcf55c67be7e676b3a51acc48db3a7b163b91ed63" -dependencies = [ - "num-traits", -] - -[[package]] -name = "foldhash" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" - -[[package]] -name = "hash32" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" -dependencies = [ - "byteorder", -] - -[[package]] -name = "hashbrown" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" -dependencies = [ - "allocator-api2", - "equivalent", - "foldhash", - "serde", - "serde_core", -] - -[[package]] -name = "heapless" -version = "0.7.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f" -dependencies = [ - "atomic-polyfill", - "hash32", - "rustc_version", - "serde", - "spin", - "stable_deref_trait", -] - -[[package]] -name = "itoa" -version = "1.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" - -[[package]] -name = "libm" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" - -[[package]] -name = "lock_api" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" -dependencies = [ - "scopeguard", -] - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", - "libm", -] - -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - -[[package]] -name = "postcard" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6764c3b5dd454e283a30e6dfe78e9b31096d9e32036b5d1eaac7a6119ccb9a24" -dependencies = [ - "cobs", - "embedded-io 0.4.0", - "embedded-io 0.6.1", - "heapless", - "serde", -] - -[[package]] -name = "proc-macro2" -version = "1.0.106" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "rustc_version" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" -dependencies = [ - "semver", -] - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "se8" -version = "0.1.0" -dependencies = [ - "aidoku", - "aidoku-test", -] - -[[package]] -name = "semver" -version = "1.0.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" - -[[package]] -name = "serde" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" -dependencies = [ - "serde_core", - "serde_derive", -] - -[[package]] -name = "serde_core" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "spin" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3763264f6b73151db08c50ff20d7d8a0b8796e021cdea7ceedad07b80155fa0e" -dependencies = [ - "lock_api", -] - -[[package]] -name = "stable_deref_trait" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" - -[[package]] -name = "syn" -version = "2.0.117" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "talc" -version = "4.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3ae828aa394de34c7de08f522d1b86bd1c182c668d27da69caadda00590f26d" -dependencies = [ - "lock_api", -] - -[[package]] -name = "thiserror" -version = "2.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "2.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "unicode-ident" -version = "1.0.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" diff --git a/sources/zh.se8/Cargo.toml b/sources/zh.se8/Cargo.toml deleted file mode 100644 index 9f044303b..000000000 --- a/sources/zh.se8/Cargo.toml +++ /dev/null @@ -1,23 +0,0 @@ -[package] -name = "se8" -version = "0.1.0" -edition = "2024" - -[dependencies] -aidoku = { git = "https://github.com/Aidoku/aidoku-rs.git", version = "0.3.0" } - -[dev-dependencies] -aidoku = { git = "https://github.com/Aidoku/aidoku-rs.git", features = ["test"] } -aidoku-test = { git = "https://github.com/Aidoku/aidoku-rs.git" } - -[lib] -crate-type = ["cdylib"] - -[profile.dev] -panic = "abort" - -[profile.release] -panic = "abort" -opt-level = "s" -strip = true -lto = true diff --git a/sources/zh.se8/res/filters.json b/sources/zh.se8/res/filters.json deleted file mode 100644 index ffb8567c0..000000000 --- a/sources/zh.se8/res/filters.json +++ /dev/null @@ -1,13 +0,0 @@ -[ - { - "type": "sort", - "title": "排序", - "options": ["热门人气", "更新时间"] - }, - { - "type": "select", - "title": "进度", - "options": ["全部", "连载", "完结"], - "ids": ["", "1", "2"] - } -] diff --git a/sources/zh.se8/res/icon.png b/sources/zh.se8/res/icon.png deleted file mode 100644 index d2e72f2e20b55a688a90a914e0efd63acc80b7ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8665 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
a;wBPycq-Gq@w6HNuR=i zt+vXhlo`zH1aUDS<&dkal_(#XpnKgd&`FriAg`@Yp@m@Yn?v^<&k{9lCI%ckET`q)^#w7!Y?xpx|5u@am! zDkv6G36+rlA@|?fa$Oc+~LiIflrpu>jSvk1!_lJ;YJnf*M=?`5?=|Qa3hW%_C zdW7n)4J5FodrC{6VJaQ)eaPIpvdEXRN|9uv`$-*=l8*JdM5IIdp6;ZMxi90Y*_YNi zUtd=iy@t%HHBDi;aXrLcnc%`n!tdO9drsQrtHk(;Ec6ud-xOPsM~@*8oB*KE?fYdr zWxr#L?`FY;SjXpcUN7-Tc{XdIP^mrVxX$w2N=|wIy>AWCk zoqOwrLZBmLp1kQ+&Y8sOMUp?EuG?!35gugk*!r#qEgfsvOh0CtzciJ686~@?3F~tZ zIRonluyuYdb+hcH)&CjeQ6T!PaaC($6Hw!t2(O4lz4ExwSj3XY9~@nfRiTCIlV^a2_?hRJU{s5Sj)E$0n_f*%lyzKN~)-;RQF4YP^l_e$d@AUb*p3UrzrlDUF9?USuG!?*2AYgAlL8>%-CB=4T` zR}{Q~mligABYK#A4nw2UMfp}IQE+RCWUGzmMW*iqkYih`#P+um-{acx`A%upVc^F} z8r6+RroY}=<&3+;m438YHPze9KQIW>H?>>qU&;zVHq#{ed$kc%@L{UdT-~XoV$N+% zX>&GHGn%RT?8Q0E5Z?0!_{jvI9IU5udN|G7DQnNUC} z&UM;a_DyyccwX5!sADymE|VsjuZn$K-HG~V4|Ofy$69|t>{Su76w;FvTm%|^WU@qG z;9qJbr#3%v_raNr;M1#y&##mSY+IV({&(ekv5z{la|7uEv#u|`8w(COTo9Og9=%Am z2%HE{7nuzq3_#7! zb_bnzOEWaGd$LLS%^#jrkq8lVT6maWWi)R`@1`u1{<>`U#VzreuESYcSPPxArIhKW z&cTyzS=9H-)E%~!#>nXAtPx4sRzNycr(2tEc(Dfd6n1o-Z+@a*@HWZ{j^l2b5viXxGTmjPO$uw4>U*Nl{v)fvr}A8?T@$aQ_vnz&LRTsq zk2k;Ci?7uN0tu9T#)t1kfhV?xnBuCKfCR~`scKmF5s6!yMYP!ficBfs6B|0io8)k- zJScU27t7+N)eBBEh|Jnhi#p(@A&30iX-%0LYV9r$hzwk&O|~e2cf&^)#P1Lc-GW^T z#U=M`))!=UM9I(7bv_{&y#otHeNgNt=_TlTD_PcPPc( zS-!+vO(mAGtv2eGD7x|alSs}0MoWd`84tIzULvgrMFer_HsmAjPNsVr;b|}0 z_&bBZ%s+v6ItPB0kwn3wC))Se(^GeEOI1x(hk2iD($0(bU=!Yb7~%B607q{|4vdI! zL(elEB_FG1O+t5k<03R?aPkL|4|M07&+CO06Dak!z5GLEtP+Al3M0)ooy||4uL*9h zn-YaoJ!+?)#n0&9I`SDgi$~})adV{M9#98nngd{iy~Dwq>#wd_4Y&y?MBi-yqIYvs z_DLiSjt%IxaCWKRT&mH|>A$!QsQfIs5WKm6b9d1*F$BPAFAx5|Ap$be!G)y-VT{m3-;b2qAxk-+umrJd>B2GxT|A!U%-=sLs48kI JypgjC`yYG;vxEQu diff --git a/sources/zh.se8/res/source.json b/sources/zh.se8/res/source.json deleted file mode 100644 index 51de8740d..000000000 --- a/sources/zh.se8/res/source.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "info": { - "id": "zh.se8", - "name": "韩漫库", - "version": 1, - "url": "https://se8.us", - "contentRating": 2, - "languages": ["zh"], - "minAppVersion": "0.7.1" - }, - "config": { - "hidesFiltersWhileSearching": true, - "supportsAuthorSearch": false, - "supportsTagSearch": true - } -} diff --git a/sources/zh.se8/src/html/mod.rs b/sources/zh.se8/src/html/mod.rs deleted file mode 100644 index 3ebad33fe..000000000 --- a/sources/zh.se8/src/html/mod.rs +++ /dev/null @@ -1,238 +0,0 @@ -use crate::{BASE_URL, USER_AGENT}; -use aidoku::{ - Chapter, ContentRating, Manga, MangaPageResult, MangaStatus, Page, PageContent, Result, - SelectFilter, Viewer, - alloc::{String, Vec, borrow::Cow, string::ToString as _}, - imports::{html::Document, net::Request}, - prelude::*, -}; - -pub trait MangaListPage { - fn manga_page_result(&self) -> Result; -} - -pub trait MangaDetailPage { - fn manga_details(&self, url: String, key: String) -> Result; -} - -pub trait TagsPage { - fn tags_filter(&self) -> Result; -} - -impl MangaListPage for Document { - fn manga_page_result(&self) -> Result { - let mut mangas: Vec = Vec::new(); - - let items = self - .select(".common-comic-item") - .ok_or_else(|| error!("No manga items found"))?; - - for item in items { - let a_node = match item.select_first("a.cover") { - Some(n) => n, - None => continue, - }; - let href = a_node.attr("abs:href").unwrap_or_default(); - let key = href - .trim_end_matches('/') - .split('/') - .next_back() - .unwrap_or_default() - .to_string(); - if key.is_empty() { - continue; - } - - let cover = item - .select_first("img.lazy") - .and_then(|img| img.attr("data-original")); - - let title = item - .select_first("p.comic__title") - .and_then(|p| p.select_first("a")) - .and_then(|a| a.text()) - .unwrap_or_default(); - - mangas.push(Manga { - key, - cover, - title, - ..Default::default() - }); - } - - let has_next_page = self.select_first("a.next").is_some(); - - Ok(MangaPageResult { - entries: mangas, - has_next_page, - }) - } -} - -impl MangaDetailPage for Document { - fn manga_details(&self, url: String, key: String) -> Result { - let cover = self - .select_first(".de-info__cover img") - .and_then(|img| img.attr("src")); - - let title = self - .select_first("p.comic-title.j-comic-title") - .and_then(|n| n.text()) - .unwrap_or_default(); - - let author_raw = self - .select_first(".comic-author .name a") - .and_then(|n| n.text()) - .unwrap_or_default(); - let authors: Vec = author_raw - .split('&') - .map(|a| a.trim().to_string()) - .filter(|a| !a.is_empty()) - .collect(); - - let description = self - .select_first(".comic-intro p.intro-total") - .and_then(|n| n.text()) - .map(|s| s.trim().to_string()); - - let tags: Vec = self - .select(".comic-status .text b a") - .map(|nodes| nodes.filter_map(|n| n.text()).collect()) - .unwrap_or_default(); - - let status_text = self - .select_first(".de-chapter__title span") - .and_then(|n| n.text()) - .unwrap_or_default(); - let status = if status_text.contains("完结") { - MangaStatus::Completed - } else { - MangaStatus::Ongoing - }; - - Ok(Manga { - key, - cover, - title, - authors: Some(authors), - description, - url: Some(url), - tags: if tags.is_empty() { None } else { Some(tags) }, - status, - content_rating: ContentRating::NSFW, - viewer: Viewer::Webtoon, - ..Default::default() - }) - } -} - -pub fn parse_chapter_list(doc: &Document) -> Result> { - let mut chapters: Vec = Vec::new(); - - let items = match doc.select("li.j-chapter-item") { - Some(v) => v, - None => return Ok(chapters), - }; - - for (index, item) in items.enumerate() { - let a_node = match item.select_first("a.j-chapter-link") { - Some(n) => n, - None => continue, - }; - let href = a_node.attr("href").unwrap_or_default(); - let key = href - .trim_end_matches('/') - .split('/') - .next_back() - .unwrap_or_default() - .to_string(); - if key.is_empty() { - continue; - } - let title = a_node - .text() - .map(|s| s.trim().to_string()) - .filter(|s| !s.is_empty()); - let chapter_number = (index + 1) as f32; - - chapters.push(Chapter { - key, - title, - chapter_number: Some(chapter_number), - url: if href.is_empty() { - None - } else { - Some(href.to_string()) - }, - ..Default::default() - }); - } - - chapters.reverse(); - Ok(chapters) -} - -impl TagsPage for Document { - fn tags_filter(&self) -> Result { - let links = self - .select(".cate-item a") - .ok_or_else(|| error!("Failed to select tag links"))?; - - let (mut options, mut ids): (Vec>, Vec>) = links - .filter_map(|a| { - let href = a.attr("href")?; - let tags_pos = href.find("/tags/")?; - let id = href[tags_pos + "/tags/".len()..] - .trim_end_matches('/') - .split('/') - .next()? - .to_string(); - if id.is_empty() { - return None; - } - let name = a.text()?.trim().to_string(); - if name.is_empty() { - return None; - } - Some((Cow::Owned(name), Cow::Owned(id))) - }) - .unzip(); - - options.insert(0, Cow::Borrowed("全部")); - ids.insert(0, Cow::Borrowed("")); - - Ok(SelectFilter { - id: "标签".into(), - title: Some("标签".into()), - is_genre: true, - options, - ids: Some(ids), - ..Default::default() - }) - } -} - -pub fn get_page_list(chapter_key: &str) -> Result> { - let url = format!("{}/chapter/{}", BASE_URL, chapter_key); - let html = Request::get(url)?.header("User-Agent", USER_AGENT).html()?; - let mut pages: Vec = Vec::new(); - - if let Some(imgs) = html.select("img.lazy-read") { - for img in imgs { - let img_url = img - .attr("data-original") - .map(|s| s.trim().to_string()) - .unwrap_or_default(); - if img_url.is_empty() { - continue; - } - pages.push(Page { - content: PageContent::url(img_url), - ..Default::default() - }); - } - } - - Ok(pages) -} diff --git a/sources/zh.se8/src/lib.rs b/sources/zh.se8/src/lib.rs deleted file mode 100644 index 91c2324ee..000000000 --- a/sources/zh.se8/src/lib.rs +++ /dev/null @@ -1,96 +0,0 @@ -#![no_std] - -mod html; -mod net; - -use aidoku::{ - Chapter, DeepLinkHandler, DeepLinkResult, DynamicFilters, Filter, FilterValue, - ImageRequestProvider, Manga, MangaPageResult, Page, PageContext, Result, Source, - alloc::{String, Vec, string::ToString as _}, - imports::net::Request, - prelude::*, -}; -use html::{MangaDetailPage as _, MangaListPage as _, TagsPage as _, parse_chapter_list}; -use net::Url; - -pub const BASE_URL: &str = "https://se8.us/index.php"; -pub const USER_AGENT: &str = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36"; - -struct Se8; - -impl Source for Se8 { - fn new() -> Self { - Self - } - - fn get_search_manga_list( - &self, - query: Option, - page: i32, - filters: Vec, - ) -> Result { - let url = Url::from_query_or_filters(query.as_deref(), page, &filters)?; - let html = url.request()?.html()?; - html.manga_page_result() - } - - fn get_manga_update( - &self, - mut manga: Manga, - needs_details: bool, - needs_chapters: bool, - ) -> Result { - let detail_url = format!("{}/comic/{}", BASE_URL, manga.key); - - let html = Request::get(&detail_url)? - .header("User-Agent", USER_AGENT) - .html()?; - - if needs_details { - manga = html.manga_details(detail_url, manga.key.clone())?; - } - - if needs_chapters { - manga.chapters = Some(parse_chapter_list(&html)?); - } - - Ok(manga) - } - - fn get_page_list(&self, _manga: Manga, chapter: Chapter) -> Result> { - html::get_page_list(&chapter.key) - } -} - -impl ImageRequestProvider for Se8 { - fn get_image_request(&self, url: String, _context: Option) -> Result { - Ok(Request::get(url)?.header("User-Agent", USER_AGENT)) - } -} - -impl DeepLinkHandler for Se8 { - fn handle_deep_link(&self, url: String) -> Result> { - if url.contains("/comic/") { - let key = url - .trim_end_matches('/') - .split('/') - .next_back() - .unwrap_or_default() - .to_string(); - if !key.is_empty() { - return Ok(Some(DeepLinkResult::Manga { key })); - } - } - - Ok(None) - } -} - -impl DynamicFilters for Se8 { - fn get_dynamic_filters(&self) -> Result> { - let tags = Url::TagsPage.request()?.html()?.tags_filter()?.into(); - Ok([tags].into()) - } -} - -register_source!(Se8, ImageRequestProvider, DeepLinkHandler, DynamicFilters); diff --git a/sources/zh.se8/src/net/mod.rs b/sources/zh.se8/src/net/mod.rs deleted file mode 100644 index 68ba0a50a..000000000 --- a/sources/zh.se8/src/net/mod.rs +++ /dev/null @@ -1,124 +0,0 @@ -use crate::{BASE_URL, USER_AGENT, html::TagsPage as _}; -use aidoku::{ - FilterValue, Result, - alloc::{String, string::ToString as _}, - helpers::uri::encode_uri, - imports::net::Request, - prelude::{error, format}, -}; -use core::fmt::{Display, Formatter, Result as FmtResult}; - -const FILTER_ORDER: &[&str] = &["hits", "addtime"]; - -#[derive(Clone)] -pub enum Url { - Search { - query: String, - page: i32, - }, - Filter { - tag: String, - finish: String, - order: String, - page: i32, - }, - TagsPage, -} - -impl Url { - pub fn from_query_or_filters( - query: Option<&str>, - page: i32, - filters: &[FilterValue], - ) -> Result { - if let Some(q) = query { - return Ok(Self::Search { - query: encode_uri(q), - page, - }); - } - - let mut tag = String::new(); - let mut finish = String::new(); - let mut order = String::from("hits"); - - for filter in filters { - match filter { - FilterValue::Text { value, .. } => { - return Ok(Self::Search { - query: encode_uri(value), - page, - }); - } - FilterValue::Select { id, value } => match id.as_str() { - "标签" => tag = value.to_string(), - "进度" => finish = value.to_string(), - "genre" => { - let tags = Self::TagsPage.request()?.html()?.tags_filter()?; - let tag_id = tags - .options - .iter() - .position(|option| option == value) - .and_then(|index| tags.ids?.into_iter().nth(index)) - .ok_or_else(|| error!("Tag ID not found for option: `{value}`"))?; - tag = tag_id.into(); - } - _ => continue, - }, - FilterValue::Sort { - id, - index, - ascending: _, - } => { - if id == "排序" - && let Some(o) = FILTER_ORDER.get(*index as usize) - { - order = o.to_string(); - } - } - _ => continue, - } - } - - Ok(Self::Filter { - tag, - finish, - order, - page, - }) - } - - pub fn request(&self) -> Result { - let url = self.to_string(); - Ok(Request::get(url)?.header("User-Agent", USER_AGENT)) - } -} - -impl Display for Url { - fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult { - match self { - Url::Search { query, page } => { - write!(f, "{}/search/{}/{}", BASE_URL, query, page) - } - Url::Filter { - tag, - finish, - order, - page, - } => { - let mut url = format!("{}/category", BASE_URL); - if !tag.is_empty() { - url.push_str(&format!("/tags/{}", tag)); - } - if !finish.is_empty() { - url.push_str(&format!("/finish/{}", finish)); - } - url.push_str(&format!("/order/{}/page/{}", order, page)); - write!(f, "{}", url) - } - Url::TagsPage => { - write!(f, "{}/category", BASE_URL) - } - } - } -}