From 34a43ff929ed667b7ee2cffd8b03cb09cc2331d3 Mon Sep 17 00:00:00 2001 From: kantan <31490942+kkantan@users.noreply.github.com> Date: Sat, 21 Jun 2025 12:23:05 -0500 Subject: [PATCH] feat(mangareader): add more sources (incomplete) --- sources/en.manganow/.cargo/config.toml | 5 + sources/en.manganow/Cargo.lock | 367 ++++++++++++++++++ sources/en.manganow/Cargo.toml | 24 ++ sources/en.manganow/res/filters.json | 171 ++++++++ sources/en.manganow/res/icon.png | Bin 0 -> 10002 bytes sources/en.manganow/res/source.json | 31 ++ sources/en.manganow/src/lib.rs | 54 +++ .../multi.mangareaderto/.cargo/config.toml | 5 + sources/multi.mangareaderto/Cargo.lock | 367 ++++++++++++++++++ sources/multi.mangareaderto/Cargo.toml | 24 ++ sources/multi.mangareaderto/res/filters.json | 180 +++++++++ sources/multi.mangareaderto/res/icon.png | Bin 0 -> 14553 bytes sources/multi.mangareaderto/res/source.json | 31 ++ sources/multi.mangareaderto/src/lib.rs | 87 +++++ 14 files changed, 1346 insertions(+) create mode 100644 sources/en.manganow/.cargo/config.toml create mode 100644 sources/en.manganow/Cargo.lock create mode 100644 sources/en.manganow/Cargo.toml create mode 100644 sources/en.manganow/res/filters.json create mode 100644 sources/en.manganow/res/icon.png create mode 100644 sources/en.manganow/res/source.json create mode 100644 sources/en.manganow/src/lib.rs create mode 100644 sources/multi.mangareaderto/.cargo/config.toml create mode 100644 sources/multi.mangareaderto/Cargo.lock create mode 100644 sources/multi.mangareaderto/Cargo.toml create mode 100644 sources/multi.mangareaderto/res/filters.json create mode 100644 sources/multi.mangareaderto/res/icon.png create mode 100644 sources/multi.mangareaderto/res/source.json create mode 100644 sources/multi.mangareaderto/src/lib.rs diff --git a/sources/en.manganow/.cargo/config.toml b/sources/en.manganow/.cargo/config.toml new file mode 100644 index 000000000..f137b5a99 --- /dev/null +++ b/sources/en.manganow/.cargo/config.toml @@ -0,0 +1,5 @@ +[build] +target = "wasm32-unknown-unknown" + +[target.wasm32-unknown-unknown] +runner = "aidoku-test-runner" diff --git a/sources/en.manganow/Cargo.lock b/sources/en.manganow/Cargo.lock new file mode 100644 index 000000000..6aed6128f --- /dev/null +++ b/sources/en.manganow/Cargo.lock @@ -0,0 +1,367 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aidoku" +version = "0.3.0" +source = "git+https://github.com/Aidoku/aidoku-rs.git?branch=next#99eeb7e5906160f7c0d21003dd5a7a0b7c6be507" +dependencies = [ + "chrono", + "euclid", + "hashbrown", + "num-traits", + "postcard", + "serde", + "serde_json", + "talc", +] + +[[package]] +name = "aidoku-test" +version = "1.0.0" +source = "git+https://github.com/Aidoku/aidoku-rs.git?branch=next#99eeb7e5906160f7c0d21003dd5a7a0b7c6be507" +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 = "cfg-if" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" + +[[package]] +name = "chrono" +version = "0.4.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" +dependencies = [ + "num-traits", +] + +[[package]] +name = "cobs" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67ba02a97a2bd10f4b59b25c7973101c79642302776489e030cd13cdab09ed15" + +[[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 = "euclid" +version = "0.22.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad9cdb4b747e485a12abb0e6566612956c7a1bafa3bdb8d682c5b6d403589e48" +dependencies = [ + "num-traits", +] + +[[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.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", + "allocator-api2", + "serde", +] + +[[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.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "libm" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" + +[[package]] +name = "lock_api" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "manganow" +version = "0.1.0" +dependencies = [ + "aidoku", + "aidoku-test", + "mangareader", +] + +[[package]] +name = "mangareader" +version = "0.1.0" +dependencies = [ + "aidoku", + "serde", + "serde_json", +] + +[[package]] +name = "memchr" +version = "2.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" + +[[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 = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "postcard" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "170a2601f67cc9dba8edd8c4870b15f71a6a2dc196daec8c83f72b59dff628a8" +dependencies = [ + "cobs", + "embedded-io 0.4.0", + "embedded-io 0.6.1", + "heapless", + "serde", +] + +[[package]] +name = "proc-macro2" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +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 = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "semver" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "syn" +version = "2.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" +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 = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "zerocopy" +version = "0.8.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/sources/en.manganow/Cargo.toml b/sources/en.manganow/Cargo.toml new file mode 100644 index 000000000..01406af6f --- /dev/null +++ b/sources/en.manganow/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "manganow" +version = "0.1.0" +edition = "2021" + +[dependencies] +aidoku = { git = "https://github.com/Aidoku/aidoku-rs.git", branch = "next", version = "0.3.0" } +mangareader = { path = "../../templates/mangareader" } + +[dev-dependencies] +aidoku = { git = "https://github.com/Aidoku/aidoku-rs.git", branch = "next", features = ["test"] } +aidoku-test = { git = "https://github.com/Aidoku/aidoku-rs.git", branch = "next" } + +[lib] +crate-type = ["cdylib"] + +[profile.dev] +panic = "abort" + +[profile.release] +panic = "abort" +opt-level = "s" +strip = true +lto = true diff --git a/sources/en.manganow/res/filters.json b/sources/en.manganow/res/filters.json new file mode 100644 index 000000000..e0f8f1977 --- /dev/null +++ b/sources/en.manganow/res/filters.json @@ -0,0 +1,171 @@ +[ + { + "id": "sort", + "title": "Sort", + "type": "sort", + "canAscend": false, + "options": [ + "Default", + "Latest Updated", + "Score", + "Name A-Z", + "Release Date", + "Most Viewed" + ] + }, + { + "id": "type", + "title": "Type", + "type": "select", + "options": [ + "All", + "Manga", + "One-shot", + "Doujinshi", + "Light Novel", + "Manhwa", + "Manhua", + "Comic" + ], + "ids": ["", "1", "2", "3", "4", "5", "6", "8"] + }, + { + "id": "status", + "title": "Status", + "type": "select", + "options": [ + "All", + "Finished", + "Publishing", + "On Hiatus", + "Discontinued", + "Not yet published" + ], + "ids": ["", "1", "2", "3", "4", "5"] + }, + { + "id": "score", + "title": "Score", + "type": "select", + "options": [ + "All", + "(1) Apalling", + "(2) Horrible", + "(3) Very Bad", + "(4) Bad", + "(5) Average", + "(6) Fine", + "(7) Good", + "(8) Very Good", + "(9) Great", + "(10) Masterpiece" + ], + "ids": ["", "1", "2", "3", "4", "5", "6", "8", "9", "10"] + }, + { + "id": "genre", + "title": "Genres", + "type": "multi-select", + "isGenre": true, + "options": [ + "Action", + "Adventure", + "Animated", + "Anime", + "Cartoon", + "Comedy", + "Comic", + "Completed", + "Cooking", + "Detective", + "Doujinshi", + "Drama", + "Ecchi", + "Fantasy", + "Gender Bender", + "Harem", + "Historical", + "Horror", + "Isekai", + "Josei", + "Magic", + "Manga", + "Manhua", + "Manhwa", + "Martial Arts", + "Mature", + "Mecha", + "Military", + "Mystery", + "One shot", + "Psychological", + "Reincarnation", + "Romance", + "School Life", + "Sci-fi", + "Seinen", + "Shoujo", + "Shoujo Ai", + "Shounen", + "Shounen Ai", + "Slice of Life", + "Smut", + "Sports", + "Super Power", + "Supernatural", + "Thriller", + "Tragedy", + "Webtoon" + ], + "ids": [ + "1", + "2", + "641", + "375", + "463", + "3", + "200", + "326", + "133", + "386", + "534", + "10", + "41", + "17", + "89", + "11", + "30", + "21", + "70", + "67", + "420", + "137", + "51", + "79", + "12", + "22", + "72", + "1180", + "44", + "721", + "23", + "1603", + "13", + "4", + "24", + "25", + "33", + "123", + "5", + "680", + "14", + "734", + "142", + "28", + "6", + "1816", + "97", + "60" + ] + } +] diff --git a/sources/en.manganow/res/icon.png b/sources/en.manganow/res/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e03ba345d8cfef0dc6e1e19ea1e972a790185a9e GIT binary patch literal 10002 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 ceZUt=j;(TSykS4 Self { + Self + } + + fn params(&self) -> Params { + Params { + base_url: BASE_URL.into(), + page_selector: ".container-reader-chapter > .iv-card:not([data-url$=manganow.jpg])" + .into(), + ..Default::default() + } + } + + // same handler as mangabox + fn handle_deep_link(&self, params: &Params, url: String) -> Result> { + let Some(path) = url.strip_prefix(params.base_url.as_ref()) else { + return Ok(None); + }; + + const MANGA_PATH: &str = "manga/"; + if !path.starts_with(MANGA_PATH) { + return Ok(None); + } + + if let Some(idx) = path.rfind("/chapter-") { + // ex: https://manganow.to/manga/i-was-reincarnated-as-an-evil-noble-in-a-game-and-became-unparalleled-with-my-overpowered-muscles/chapter-4 + let manga_key = &path[..idx]; + Ok(Some(DeepLinkResult::Chapter { + manga_key: manga_key.into(), + key: path.into(), + })) + } else { + // ex: https://manganow.to/manga/i-was-reincarnated-as-an-evil-noble-in-a-game-and-became-unparalleled-with-my-overpowered-muscles + Ok(Some(DeepLinkResult::Manga { key: path.into() })) + } + } +} + +register_source!( + MangaReader, + ListingProvider, + Home, + ImageRequestProvider, + DeepLinkHandler +); diff --git a/sources/multi.mangareaderto/.cargo/config.toml b/sources/multi.mangareaderto/.cargo/config.toml new file mode 100644 index 000000000..f137b5a99 --- /dev/null +++ b/sources/multi.mangareaderto/.cargo/config.toml @@ -0,0 +1,5 @@ +[build] +target = "wasm32-unknown-unknown" + +[target.wasm32-unknown-unknown] +runner = "aidoku-test-runner" diff --git a/sources/multi.mangareaderto/Cargo.lock b/sources/multi.mangareaderto/Cargo.lock new file mode 100644 index 000000000..9f6ae3dcd --- /dev/null +++ b/sources/multi.mangareaderto/Cargo.lock @@ -0,0 +1,367 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aidoku" +version = "0.3.0" +source = "git+https://github.com/Aidoku/aidoku-rs.git?branch=next#99eeb7e5906160f7c0d21003dd5a7a0b7c6be507" +dependencies = [ + "chrono", + "euclid", + "hashbrown", + "num-traits", + "postcard", + "serde", + "serde_json", + "talc", +] + +[[package]] +name = "aidoku-test" +version = "1.0.0" +source = "git+https://github.com/Aidoku/aidoku-rs.git?branch=next#99eeb7e5906160f7c0d21003dd5a7a0b7c6be507" +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 = "cfg-if" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" + +[[package]] +name = "chrono" +version = "0.4.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" +dependencies = [ + "num-traits", +] + +[[package]] +name = "cobs" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67ba02a97a2bd10f4b59b25c7973101c79642302776489e030cd13cdab09ed15" + +[[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 = "euclid" +version = "0.22.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad9cdb4b747e485a12abb0e6566612956c7a1bafa3bdb8d682c5b6d403589e48" +dependencies = [ + "num-traits", +] + +[[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.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", + "allocator-api2", + "serde", +] + +[[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.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "libm" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" + +[[package]] +name = "lock_api" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "mangareader" +version = "0.1.0" +dependencies = [ + "aidoku", + "serde", + "serde_json", +] + +[[package]] +name = "mangareaderto" +version = "0.1.0" +dependencies = [ + "aidoku", + "aidoku-test", + "mangareader", +] + +[[package]] +name = "memchr" +version = "2.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" + +[[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 = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "postcard" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "170a2601f67cc9dba8edd8c4870b15f71a6a2dc196daec8c83f72b59dff628a8" +dependencies = [ + "cobs", + "embedded-io 0.4.0", + "embedded-io 0.6.1", + "heapless", + "serde", +] + +[[package]] +name = "proc-macro2" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +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 = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "semver" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "syn" +version = "2.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" +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 = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "zerocopy" +version = "0.8.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/sources/multi.mangareaderto/Cargo.toml b/sources/multi.mangareaderto/Cargo.toml new file mode 100644 index 000000000..0276843b7 --- /dev/null +++ b/sources/multi.mangareaderto/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "mangareaderto" +version = "0.1.0" +edition = "2021" + +[dependencies] +aidoku = { git = "https://github.com/Aidoku/aidoku-rs.git", branch = "next", version = "0.3.0" } +mangareader = { path = "../../templates/mangareader" } + +[dev-dependencies] +aidoku = { git = "https://github.com/Aidoku/aidoku-rs.git", branch = "next", features = ["test"] } +aidoku-test = { git = "https://github.com/Aidoku/aidoku-rs.git", branch = "next" } + +[lib] +crate-type = ["cdylib"] + +[profile.dev] +panic = "abort" + +[profile.release] +panic = "abort" +opt-level = "s" +strip = true +lto = true diff --git a/sources/multi.mangareaderto/res/filters.json b/sources/multi.mangareaderto/res/filters.json new file mode 100644 index 000000000..ac6754a26 --- /dev/null +++ b/sources/multi.mangareaderto/res/filters.json @@ -0,0 +1,180 @@ +[ + { + "id": "sort", + "title": "Sort", + "type": "sort", + "canAscend": false, + "options": [ + "Default", + "Latest Updated", + "Score", + "Name A-Z", + "Release Date", + "Most Viewed" + ] + }, + { + "id": "type", + "title": "Type", + "type": "select", + "options": [ + "All", + "Manga", + "One-shot", + "Doujinshi", + "Light Novel", + "Manhwa", + "Manhua", + "Comic" + ], + "ids": ["", "1", "2", "3", "4", "5", "6", "8"] + }, + { + "id": "status", + "title": "Status", + "type": "select", + "options": [ + "All", + "Finished", + "Publishing", + "On Hiatus", + "Discontinued", + "Not yet published" + ], + "ids": ["", "1", "2", "3", "4", "5"] + }, + { + "id": "rating_type", + "title": "Rating Type", + "type": "select", + "options": [ + "All", + "G - All Ages", + "PG - Children", + "PG-13 - Teens 13 or older", + "R - 17+ (violence & profanity)", + "R+ - Mild Nudity", + "Rx - Hentai" + ], + "ids": ["", "1", "2", "3", "4", "5", "6"] + }, + { + "id": "score", + "title": "Score", + "type": "select", + "options": [ + "All", + "(1) Apalling", + "(2) Horrible", + "(3) Very Bad", + "(4) Bad", + "(5) Average", + "(6) Fine", + "(7) Good", + "(8) Very Good", + "(9) Great", + "(10) Masterpiece" + ], + "ids": ["", "1", "2", "3", "4", "5", "6", "8", "9", "10"] + }, + { + "id": "genre", + "title": "Genres", + "type": "multi-select", + "isGenre": true, + "options": [ + "Action", + "Adventure", + "Cars", + "Comedy", + "Dementia", + "Demons", + "Doujinshi", + "Drama", + "Ecchi", + "Fantasy", + "Game", + "Gender Bender", + "Harem", + "Hentai", + "Historical", + "Horror", + "Josei", + "Kids", + "Magic", + "Martial Arts", + "Mecha", + "Military", + "Music", + "Mystery", + "Parody", + "Police", + "Psychological", + "Romance", + "Samurai", + "School", + "Sci-Fi", + "Seinen", + "Shoujo", + "Shoujo Ai", + "Shounen", + "Shounen Ai", + "Slice of Life", + "Space", + "Sports", + "Super Power", + "Supernatural", + "Thriller", + "Vampire", + "Yaoi", + "Yuri" + ], + "ids": [ + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15", + "16", + "17", + "18", + "19", + "20", + "21", + "22", + "23", + "24", + "25", + "26", + "27", + "28", + "29", + "30", + "31", + "32", + "33", + "34", + "35", + "36", + "37", + "38", + "39", + "40", + "41", + "42", + "43", + "44", + "45" + ] + } +] diff --git a/sources/multi.mangareaderto/res/icon.png b/sources/multi.mangareaderto/res/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..311cd3ff29744c549798b8757a737b79f98e7101 GIT binary patch literal 14553 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 Self { + Self + } + + fn params(&self) -> Params { + Params { + base_url: BASE_URL.into(), + page_selector: ".iv-card".into(), + get_chapter_selector: || { + defaults_get::>("languages") + .map(|langs| { + langs + .iter() + .map(|lang| format!("#{lang}-chapters > li")) + .collect::>() + .join(", ") + .into() + }) + .unwrap_or_else(|| "#en-chapters > li".into()) + }, + get_chapter_language: |element| { + element + .parent() + .map(|p| match p.id().unwrap_or_default().as_str() { + "en-chapters" => "en", + "ja-chapters" => "ja", + _ => "en", + }) + .map(|lang| lang.into()) + .unwrap_or_else(|| "en".into()) + }, + get_page_url_path: |chapter_id| { + format!("/ajax/image/list/chap/{chapter_id}?mode=vertical") + }, + ..Default::default() + } + } + + fn process_page_image( + &self, + _params: &Params, + response: aidoku::ImageResponse, + context: Option, + ) -> Result { + if response.code == 404 { + bail!("Missing image"); + } + + let shuffled = context.is_some_and(|c| c.get("shuffled").is_some()); + if !shuffled { + return Ok(response.image); + }; + + let width = response.image.width(); + let height = response.image.height(); + + let mut canvas = Canvas::new(width, height); + + let img_rect = Rect::new(0.0, 0.0, width, height); + canvas.draw_image(&response.image, img_rect); + + Ok(canvas.get_image()) + } +} + +register_source!( + MangaReader, + ListingProvider, + Home, + DeepLinkHandler, + PageImageProcessor +);