libwebnovel-storage 0.3.2

A complement to libwebnovel: this package handles downloading and organizing collections of followed webnovels
Documentation
# libwebnovel-storage

[![Crates.io Version](https://img.shields.io/crates/v/libwebnovel-storage)](https://crates.io/crates/libwebnovel-storage)
[![docs.rs](https://img.shields.io/docsrs/libwebnovel-storage)](https://docs.rs/libwebnovel-storage)

This is an implementation of a local repository of webnovels. It downloads
webnovels & places them in a coherent manner on the filesystem. It is also
capable of generating ebooks from these downloaded webnovels.

### What this does

Basically, it provides data structures and method easing the work of
implementing a program using [`libwebnovel`](https://crates.io/crates/libwebnovel). Said program would only have to make the "glue" between UI and this library's functions.

### Example

```rust
use libwebnovel_storage::{LibraryError, LocalLibrary};
fn main() -> Result<(), LibraryError> {
    let library_path = ".config/my_library/config.toml";
    let mut library = LocalLibrary::load(library_path)?;
    // Add to watchlist & download
    library.add("https://www.royalroad.com/fiction/21220/mother-of-learning")?;

    // update all novels
    let errors = library.update();
    // or, if you want to have more control over the update process
    // (for instance, printing a progress bar):
    for novel in library.novels_mut() {
        let novel_title = novel.title()?.clone();
        for (i, result) in novel.update_iter().enumerate() {
            if result.is_err() {
                eprintln!(
                    "Encountered an error while updating novel {}: {}",
                    novel_title,
                    result.unwrap_err()
                );
            }
            println!("novel {}: updated chapter {}", novel_title, i + 1);
        }
        #[cfg(feature = "epub")]
        println!(
            "Generated ebook path: {}",
            novel.generate_epub().unwrap().display()
        );
    }

    Ok(())
}
```

## `cargo` features

By default, the `epub` feature is active. If you do not wish to use this
feature, use the following in your `Cargo.toml`:

```toml
# Cargo.toml
[dependencies.libwebnovel-storage]
version = '0'
default-features = false
```

## TODO

- [x] a local filesystem representation for a novel library
- [x] bulk updates
  - [x] bulk updates with an iterator, to offer control over looping and get
    update information while they happen
- [x] add epub generation

### Legal

Without explicit refutation in the header of any file in this repository,
all files in this repository are considered under the terms of the AGPL-3
license (of which a copy can be found in the LICENSE file at the root of
this repository) and bearing the mention "Copyright (c) 2024 paulollivier &
contributors".

Basically, please do not use this code without crediting its writer(s) or
for a commercial project.

License: AGPL-3.0-or-later