From 9a95cf1684fcd8bfc81efcac7676532413d35328 Mon Sep 17 00:00:00 2001 From: A Farzat Date: Tue, 3 Mar 2026 13:11:57 +0300 Subject: Start with the create_epub_archive function For now, only mimetype is added. Next step is adding all the other files in epub_root. --- Cargo.lock | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 1 + src/epub.rs | 16 ++++++++++++- 3 files changed, 96 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index 216b302..fca495c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,12 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + [[package]] name = "anstream" version = "0.6.21" @@ -260,6 +266,15 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + [[package]] name = "deranged" version = "0.5.8" @@ -326,6 +341,16 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" +[[package]] +name = "flate2" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" +dependencies = [ + "miniz_oxide", + "zlib-rs", +] + [[package]] name = "fnv" version = "1.0.7" @@ -779,6 +804,16 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + [[package]] name = "mio" version = "1.1.1" @@ -824,6 +859,7 @@ dependencies = [ "serde", "serde_json", "tokio", + "zip", ] [[package]] @@ -1274,6 +1310,12 @@ dependencies = [ "libc", ] +[[package]] +name = "simd-adler32" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" + [[package]] name = "slab" version = "0.4.12" @@ -1583,6 +1625,12 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" +[[package]] +name = "typed-path" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e28f89b80c87b8fb0cf04ab448d5dd0dd0ade2f8891bae878de66a75a28600e" + [[package]] name = "unicode-ident" version = "1.0.24" @@ -2128,8 +2176,40 @@ dependencies = [ "syn", ] +[[package]] +name = "zip" +version = "8.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e499faf5c6b97a0d086f4a8733de6d47aee2252b8127962439d8d4311a73f72" +dependencies = [ + "crc32fast", + "flate2", + "indexmap", + "memchr", + "typed-path", + "zopfli", +] + +[[package]] +name = "zlib-rs" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be3d40e40a133f9c916ee3f9f4fa2d9d63435b5fbe1bfc6d9dae0aa0ada1513" + [[package]] name = "zmij" version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" + +[[package]] +name = "zopfli" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f05cd8797d63865425ff89b5c4a48804f35ba0ce8d125800027ad6017d2b5249" +dependencies = [ + "bumpalo", + "crc32fast", + "log", + "simd-adler32", +] diff --git a/Cargo.toml b/Cargo.toml index 46034d8..9966c5a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,3 +10,4 @@ reqwest = { version = "0.13.2", features = ["cookies", "json"] } serde = { version = "1.0.228", features = ["derive"] } serde_json = "1.0.149" tokio = { version = "1.49.0", features = ["full"] } +zip = { version = "8.1.0", default-features = false, features = ["deflate"] } diff --git a/src/epub.rs b/src/epub.rs index d86fa35..e71e3ca 100644 --- a/src/epub.rs +++ b/src/epub.rs @@ -1,11 +1,12 @@ use crate::models::FileEntry; use anyhow::Result; use reqwest::Client; -use std::path::Path; +use std::{io::Write, path::Path}; use tokio::{ fs::{self, File}, io::AsyncWriteExt, }; +use zip::{CompressionMethod, ZipWriter, write::FileOptions}; /// Creates and writes container.xml. pub async fn write_container_xml(dest_root: &Path, opf_full_path: &str) -> Result<()> { @@ -58,3 +59,16 @@ pub async fn download_all_files( } Ok(()) } + +/// Creates the EPUB archive (creates zip and includes all files in it). +pub fn create_epub_archive(epub_root: &Path, output_epub: &Path) -> Result<()> { + let out_file = std::fs::File::create(output_epub)?; + let mut zip = ZipWriter::new(out_file); + + let mimetype_options: FileOptions<()> = + FileOptions::default().compression_method(CompressionMethod::Stored); + zip.start_file("mimetype", mimetype_options)?; + zip.write_all(b"application/epub+zip")?; + + Ok(()) +} -- cgit v1.2.3-70-g09d2