aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main.rs24
-rw-r--r--src/models.rs30
2 files changed, 6 insertions, 48 deletions
diff --git a/src/main.rs b/src/main.rs
index 7b73bf3..8712d4f 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -9,7 +9,7 @@ use std::path::PathBuf;
use crate::epub::{create_epub_archive, download_all_files};
use crate::http_client::build_authenticated_client;
-use crate::models::{Chapter, EpubResponse, FileEntry, Paginated, SpineItem, TocNode};
+use crate::models::{Chapter, EpubResponse, FileEntry, Paginated};
use anyhow::{Context, Result, anyhow};
use clap::Parser;
use directories::{BaseDirs, UserDirs};
@@ -44,24 +44,8 @@ async fn fetch_epub_data(client: &Client, bookid: &str) -> Result<EpubResponse>
Ok(response)
}
-/// Fetches a direct array endpoint (no pagination, simple list).
-async fn fetch_direct_array<T>(client: &Client, url: &str) -> Result<Vec<T>>
-where
- T: serde::de::DeserializeOwned,
-{
- let response = client
- .get(url)
- .send()
- .await?
- .error_for_status()?
- .json::<Vec<T>>()
- .await
- .context("Failed to deserialize API response")?;
- Ok(response)
-}
-
/// Fetch a paginated API.
-async fn fetch_all_pages<T>(client: &reqwest::Client, mut url: String) -> Result<Vec<T>>
+async fn fetch_all_pages<T>(client: &reqwest::Client, mut url: url::Url) -> Result<Vec<T>>
where
T: serde::de::DeserializeOwned,
{
@@ -69,7 +53,7 @@ where
loop {
// GET current URL and deserialize into Paginated<T>.
let response = client
- .get(&url)
+ .get(url)
.send()
.await?
.error_for_status()?
@@ -144,8 +128,6 @@ async fn main() -> Result<()> {
let chapters: HashMap<String, Chapter> =
chapters.into_iter().map(|c| (c.ourn.clone(), c)).collect();
let file_entries: Vec<FileEntry> = fetch_all_pages(&client, epub_data.files.clone()).await?;
- let spine_items: Vec<SpineItem> = fetch_all_pages(&client, epub_data.spine.clone()).await?;
- let toc_vec: Vec<TocNode> = fetch_direct_array(&client, &epub_data.table_of_contents).await?;
let epub_root = data_root.join("files").join(&args.bookid);
if !args.skip_download {
diff --git a/src/models.rs b/src/models.rs
index 5f92d03..806d746 100644
--- a/src/models.rs
+++ b/src/models.rs
@@ -5,7 +5,7 @@ use url::Url;
/// Generic Model for paginated API.
#[derive(Debug, serde::Deserialize)]
pub struct Paginated<T> {
- pub next: Option<String>,
+ pub next: Option<Url>,
pub results: Vec<T>,
}
@@ -15,10 +15,8 @@ pub struct EpubResponse {
pub publication_date: String,
pub title: String,
pub descriptions: Descriptions,
- pub chapters: String, // This is a URL to the chapters list
- pub files: String, // This is a URL to the resource files
- pub spine: String, // This is a URL to the spine list
- pub table_of_contents: String, // This is a URL to the table of contents
+ pub chapters: Url,
+ pub files: Url,
pub language: String,
}
@@ -34,7 +32,6 @@ pub struct Descriptions {
pub struct Chapter {
pub ourn: String,
pub title: String,
- pub is_skippable: bool,
pub related_assets: ChapRelAssets,
}
@@ -51,26 +48,5 @@ pub struct FileEntry {
pub url: Url,
pub full_path: RelativePathBuf,
pub media_type: String,
- pub filename: String,
pub filename_ext: String,
- pub kind: String,
-}
-
-/// Model for spine API.
-#[derive(Debug, Deserialize)]
-pub struct SpineItem {
- pub ourn: String,
- pub reference_id: String,
- pub title: String,
-}
-
-/// Model for table of contents API.
-#[derive(Debug, Deserialize)]
-pub struct TocNode {
- pub depth: u32,
- pub reference_id: String,
- pub ourn: String,
- pub fragment: String,
- pub title: String,
- pub children: Vec<TocNode>,
}