aboutsummaryrefslogtreecommitdiff
path: root/src/epub.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/epub.rs')
-rw-r--r--src/epub.rs23
1 files changed, 21 insertions, 2 deletions
diff --git a/src/epub.rs b/src/epub.rs
index e993c31..7eb47f3 100644
--- a/src/epub.rs
+++ b/src/epub.rs
@@ -1,7 +1,10 @@
use crate::models::FileEntry;
use anyhow::{Context, Result};
use reqwest::Client;
-use std::{io::Write, path::Path};
+use std::{
+ io::{Read, Write},
+ path::Path,
+};
use tokio::{
fs::{self, File},
io::AsyncWriteExt,
@@ -9,7 +12,10 @@ use tokio::{
use zip::{CompressionMethod, ZipWriter, write::FileOptions};
/// Creates and writes container.xml.
-fn write_container_xml_to_zip(zip: &mut ZipWriter<std::fs::File>, opf_full_path: &str) -> Result<()> {
+fn write_container_xml_to_zip(
+ zip: &mut ZipWriter<std::fs::File>,
+ opf_full_path: &str,
+) -> Result<()> {
// Prepare file contents.
let contents = format!(
r#"<?xml version="1.0" encoding="UTF-8"?>
@@ -77,5 +83,18 @@ pub fn create_epub_archive(
.context("No OPF file with the correct MIME type was found.")?;
write_container_xml_to_zip(&mut zip, &opf_entry.full_path)?;
+ // Add the rest of the files according to file_entries.
+ let options: FileOptions<()> =
+ FileOptions::default().compression_method(CompressionMethod::Deflated);
+ for entry in file_entries {
+ zip.start_file(&entry.full_path, options)?;
+ let mut src_file = std::fs::File::open(epub_root.join(&entry.full_path))?;
+ let mut buffer = Vec::new();
+ src_file.read_to_end(&mut buffer)?;
+ zip.write_all(&buffer)?;
+ }
+
+ zip.finish()?;
+
Ok(())
}