From 8f2b44b50ce4540160009e0f96508324f019fcc6 Mon Sep 17 00:00:00 2001 From: NotAShelf Date: Wed, 11 Mar 2026 17:08:02 +0300 Subject: [PATCH] pinakes-core: unify book metadata extraction; remove ExtractedBookMetadata Signed-off-by: NotAShelf Change-Id: Ifd6e66515b9ff78a4bb13eba47b9b2cf6a6a6964 --- crates/pinakes-core/src/metadata/document.rs | 4 +- crates/pinakes-core/src/metadata/mod.rs | 4 +- crates/pinakes-core/src/model.rs | 42 ++++++++++++-------- 3 files changed, 30 insertions(+), 20 deletions(-) diff --git a/crates/pinakes-core/src/metadata/document.rs b/crates/pinakes-core/src/metadata/document.rs index f284c51..4994020 100644 --- a/crates/pinakes-core/src/metadata/document.rs +++ b/crates/pinakes-core/src/metadata/document.rs @@ -32,7 +32,7 @@ fn extract_pdf(path: &Path) -> Result { .map_err(|e| PinakesError::MetadataExtraction(format!("PDF load: {e}")))?; let mut meta = ExtractedMetadata::default(); - let mut book_meta = crate::model::ExtractedBookMetadata::default(); + let mut book_meta = crate::model::BookMetadata::default(); // Find the Info dictionary via the trailer if let Ok(info_ref) = doc.trailer.get(b"Info") { @@ -145,7 +145,7 @@ fn extract_epub(path: &Path) -> Result { ..Default::default() }; - let mut book_meta = crate::model::ExtractedBookMetadata::default(); + let mut book_meta = crate::model::BookMetadata::default(); // Extract basic metadata if let Some(lang) = doc.mdata("language") { diff --git a/crates/pinakes-core/src/metadata/mod.rs b/crates/pinakes-core/src/metadata/mod.rs index ddb601e..8fcc8b7 100644 --- a/crates/pinakes-core/src/metadata/mod.rs +++ b/crates/pinakes-core/src/metadata/mod.rs @@ -9,7 +9,7 @@ use std::{collections::HashMap, path::Path}; use crate::{ error::Result, media_type::MediaType, - model::ExtractedBookMetadata, + model::BookMetadata, }; #[derive(Debug, Clone, Default)] @@ -22,7 +22,7 @@ pub struct ExtractedMetadata { pub duration_secs: Option, pub description: Option, pub extra: HashMap, - pub book_metadata: Option, + pub book_metadata: Option, // Photo-specific metadata pub date_taken: Option>, diff --git a/crates/pinakes-core/src/model.rs b/crates/pinakes-core/src/model.rs index cedf0ef..19d6e8e 100644 --- a/crates/pinakes-core/src/model.rs +++ b/crates/pinakes-core/src/model.rs @@ -417,6 +417,10 @@ pub struct SavedSearch { // Book Management Types /// Metadata for book-type media. +/// +/// Used both as a DB record (with populated `media_id`, `created_at`, +/// `updated_at`) and as an extraction result (with placeholder values for +/// those fields when the record has not yet been persisted). #[derive(Debug, Clone, Serialize, Deserialize)] pub struct BookMetadata { pub media_id: MediaId, @@ -435,6 +439,28 @@ pub struct BookMetadata { pub updated_at: DateTime, } +impl Default for BookMetadata { + fn default() -> Self { + let now = Utc::now(); + Self { + media_id: MediaId(uuid::Uuid::nil()), + isbn: None, + isbn13: None, + publisher: None, + language: None, + page_count: None, + publication_date: None, + series_name: None, + series_index: None, + format: None, + authors: Vec::new(), + identifiers: HashMap::new(), + created_at: now, + updated_at: now, + } + } +} + /// Information about a book author. #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] pub struct AuthorInfo { @@ -476,22 +502,6 @@ impl AuthorInfo { } } -/// Book metadata extracted from files (without database-specific fields) -#[derive(Debug, Clone, Default, Serialize, Deserialize)] -pub struct ExtractedBookMetadata { - pub isbn: Option, - pub isbn13: Option, - pub publisher: Option, - pub language: Option, - pub page_count: Option, - pub publication_date: Option, - pub series_name: Option, - pub series_index: Option, - pub format: Option, - pub authors: Vec, - pub identifiers: HashMap>, -} - /// Reading progress for a book. #[derive(Debug, Clone, Serialize, Deserialize)] pub struct ReadingProgress {