diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/epub.rs | 3 | ||||
| -rw-r--r-- | src/main.rs | 9 | ||||
| -rw-r--r-- | src/xml.rs | 21 |
3 files changed, 26 insertions, 7 deletions
diff --git a/src/epub.rs b/src/epub.rs index 1336115..96b1f2c 100644 --- a/src/epub.rs +++ b/src/epub.rs @@ -96,6 +96,7 @@ pub async fn download_one_file( /// Creates the EPUB archive (creates zip and includes all files in it). pub fn create_epub_archive( + bookid: &str, epub_data: &EpubResponse, epub_root: &Path, output_epub: &Path, @@ -154,7 +155,7 @@ pub fn create_epub_archive( &mut zip, )?; } else if entry.ourn == opf_entry.ourn { - write_modified_opf(buf_reader, &mut zip, &epub_data.descriptions.plain)?; + write_modified_opf(buf_reader, &mut zip, bookid, &epub_data.descriptions.plain)?; } else { std::io::copy(&mut buf_reader, &mut zip)?; } diff --git a/src/main.rs b/src/main.rs index 141fd12..5b0a2be 100644 --- a/src/main.rs +++ b/src/main.rs @@ -148,7 +148,14 @@ async fn main() -> Result<()> { .await?; } println!("Generating the EPUB file..."); - create_epub_archive(&epub_data, &epub_root, &epub_path, &file_entries, &chapters)?; + create_epub_archive( + &args.bookid, + &epub_data, + &epub_root, + &epub_path, + &file_entries, + &chapters, + )?; Ok(()) } @@ -124,6 +124,7 @@ pub fn build_epub_chapter<R: BufRead, W: Write>( pub fn write_modified_opf<R: BufRead, W: Write>( opf_input: R, mut out: &mut W, + bookid: &str, description: &str, ) -> Result<()> { // Setup the XML Reader and Writer. @@ -146,11 +147,21 @@ pub fn write_modified_opf<R: BufRead, W: Write>( writer.write_event(Event::Start(tag_data))?; } Ok(Event::End(tag_data)) => { - // Write description if end of metadata is reached without finding one. - if tag_data.name().as_ref() == b"metadata" && !desc_found { - writer.write_event(Event::Start(BytesStart::new("dc:description")))?; - writer.write_event(Event::Text(BytesText::new(description)))?; - writer.write_event(Event::End(BytesEnd::new("dc:description")))?; + // Extra attributes are added just before the closing metadata tag. + if tag_data.name().as_ref() == b"metadata" { + // A new dc:identifier records the O'Reilly resource ID used to obtain the book. + let mut start_elem = BytesStart::new("dc:identifier"); + start_elem.push_attribute(("id", "oreilly-id")); + writer.write_event(Event::Start(start_elem))?; + let oreilly_id = &format!("urn:orm:book:{bookid}"); + writer.write_event(Event::Text(BytesText::new(oreilly_id)))?; + writer.write_event(Event::End(BytesEnd::new("dc:identifier")))?; + // Write description if end of metadata is reached without finding one. + if !desc_found { + writer.write_event(Event::Start(BytesStart::new("dc:description")))?; + writer.write_event(Event::Text(BytesText::new(description)))?; + writer.write_event(Event::End(BytesEnd::new("dc:description")))?; + } } // Pass through unmodified. writer.write_event(Event::End(tag_data))?; |
